From 22367c1f190681eee39f4d878dbd8f42e9f723cb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 9 Sep 2023 23:56:24 +1000 Subject: [PATCH 001/109] Business classification --- app/DataMapper/CompanySettings.php | 20 ++++++++++++++++++++ app/Services/Pdf/PdfBuilder.php | 1 - app/Services/PdfMaker/Design.php | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 5a957a8f8fcd..ee9afae8ec9a 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -481,7 +481,14 @@ class CompanySettings extends BaseSettings public $enable_e_invoice = false; + public $statement_design_id = 'VolejRejNm'; + + public $delivery_note_design_id = 'VolejRejNm'; + + public $classification = ''; // individual, business, partnership, trust, charity, government, other + public static $casts = [ + 'classification' => 'string', 'enable_e_invoice' => 'bool', 'default_expense_payment_type_id' => 'string', 'e_invoice_type' => 'string', @@ -711,6 +718,8 @@ class CompanySettings extends BaseSettings 'portal_custom_js' => 'string', 'client_portal_enable_uploads' => 'bool', 'purchase_order_number_counter' => 'integer', + 'statement_design_id' => 'string', + 'delivery_note_design_id' => 'string', ]; public static $free_plan_casts = [ @@ -765,6 +774,8 @@ class CompanySettings extends BaseSettings 'quote_design_id', 'credit_design_id', 'purchase_order_design_id', + 'statement_design_id', + 'delivery_note_design_id', ]; // /** @@ -977,6 +988,15 @@ class CompanySettings extends BaseSettings '$total', '$credit.balance', ], + 'statement_details' => [ + '$statement_date', + '$balance' + ], + 'delivery_note_columns' => [ + '$product.item', + '$product.description', + '$product.quantity', + ], ]; return json_decode(json_encode($variables)); diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 8a8226e09e1d..2852345f2f7a 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -1318,7 +1318,6 @@ class PdfBuilder { $elements = []; - foreach ($variables as $variable) { $_variable = explode('.', $variable)[1]; $_customs = ['custom1', 'custom2', 'custom3', 'custom4']; diff --git a/app/Services/PdfMaker/Design.php b/app/Services/PdfMaker/Design.php index d0e54a9b1891..9f90a9a2fa25 100644 --- a/app/Services/PdfMaker/Design.php +++ b/app/Services/PdfMaker/Design.php @@ -322,8 +322,9 @@ class Design extends BaseDesign public function entityDetails(): array { if ($this->type === 'statement') { - // $s_date = $this->translateDate(now(), $this->client->date_format(), $this->client->locale()); + $variables = $this->context['pdf_variables']['statement_details'] ?? []; + $s_date = $this->translateDate($this->options['start_date'], $this->client->date_format(), $this->client->locale()) . " - " . $this->translateDate($this->options['end_date'], $this->client->date_format(), $this->client->locale()); return [ From 8256131ea2e4f53c34b3f26925bbf48ce021f1a5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 11 Sep 2023 07:22:22 +1000 Subject: [PATCH 002/109] working on templates --- app/Utils/HtmlEngine.php | 14 ++ app/Utils/PhantomJS/Phantom.php | 119 +++++++++++++++ composer.json | 4 +- composer.lock | 139 +++++++++++++++++- ...3_09_09_135250_client_and_company_type.php | 27 ++++ routes/client.php | 1 + 6 files changed, 302 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2023_09_09_135250_client_and_company_type.php diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 058f9ed36731..efe31880ea9b 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -744,6 +744,20 @@ class HtmlEngine return $data; } + public function makeValuesNoPrefix() :array + { + $data = []; + + $values = $this->buildEntityDataArray(); + + foreach ($values as $key => $value) { + $data[str_replace(["$","."],["_","_"],$key)] = $value['value']; + } + + return $data; + } + + public function generateLabelsAndValues() { $data = []; diff --git a/app/Utils/PhantomJS/Phantom.php b/app/Utils/PhantomJS/Phantom.php index 8080f5c66938..7e8f0d1bb40c 100644 --- a/app/Utils/PhantomJS/Phantom.php +++ b/app/Utils/PhantomJS/Phantom.php @@ -230,4 +230,123 @@ class Phantom return view('pdf.html', $data); } + + public function blade() + { + + $i = \App\Models\Invoice::first(); + + $html_variables = (new HtmlEngine($i->invitations->first()))->makeValuesNoPrefix(); + $variables = (new HtmlEngine($i->invitations->first()))->makeValuesNoPrefix(); + + $html_variables = array_merge($html_variables, $variables); + // $smarty->assign($html_variables); + + $template_string = ' + display {$foo} here + + {if $invoice.amount > 5} +
+ ewwo {$invoice.amount * 5} + {/if} +
+ {if isset($entry) && is_array($entry)} + I am a puppet + {/if} +
+ {if 1 > 0} + 1 is greater than 0 + {/if} +
+ {if 0 > 1} + 0 is greater than 1 + {/if} +
+ {foreach $countries as $country} + + {if $country.name = "Australia"} + {$country.name}
+ {/if} + +
+ + + {/foreach} + + +{foreach $invoice.line_items as $item} + {$item->quantity} - {$item->cost} - {$item->notes} - {$item->line_total}
+{/foreach} + + echo "I am a puppet"; + + + + '; + +$template_string = ' + + + + + {{ _invoice_number }} + + +

{{ _invoice_number }}

+

Athletes list

+ + +{{ _invoiceDate }}
+{{ _shipping }}
+{{ _client_address|raw }}
+{{ xx }} + +$invoice.amount
+ + + +'; + +$loader = new \Twig\Loader\FilesystemLoader(storage_path()); +// $tags = ['if','for','raw','html','sandbox']; +// $filters = ['upper']; +// $methods = [ +// 'Article' => ['getTitle', 'getBody'], +// ]; +// $properties = [ +// 'Article' => ['title', 'body'], +// ]; +// $functions = ['range']; +// $policy = new \Twig\Sandbox\SecurityPolicy($tags, $filters, $methods, $properties, $functions); +// $sandbox = new \Twig\Extension\SandboxExtension($policy); + +$twig = new \Twig\Environment($loader); +// $twig->addExtension($sandbox); + +// $twig = new \Twig\Environment(new \Twig\Loader\ArrayLoader([])); +$template = $twig->createTemplate($template_string); +echo $template->render(array_merge([ + 'invoice' => $i->toArray(), +], $html_variables)); + + + // try{ + // $smarty->display('string:' . $template_string); + // } + // catch(\Throwable $e){ + // echo $e->getMessage(); + // exit; + // } + + // $smarty->display('string:' . $template_string); + + } } diff --git a/composer.json b/composer.json index ae61a4b6334e..f49301bc8b99 100644 --- a/composer.json +++ b/composer.json @@ -76,6 +76,7 @@ "omnipay/paypal": "^3.0", "payfast/payfast-php-sdk": "^1.1", "pragmarx/google2fa": "^8.0", + "predis/predis": "^2", "psr/http-message": "^1.0", "pusher/pusher-php-server": "^7.2", "razorpay/razorpay": "2.*", @@ -83,6 +84,7 @@ "setasign/fpdf": "^1.8", "setasign/fpdi": "^2.3", "shopify/shopify-api": "^4.3", + "smarty/smarty": "^4.3", "socialiteproviders/apple": "^5.2", "socialiteproviders/microsoft": "^4.1", "spatie/laravel-data": "^3.5", @@ -93,7 +95,7 @@ "symfony/mailgun-mailer": "^6.1", "symfony/postmark-mailer": "^6.1", "turbo124/beacon": "^1.5", - "predis/predis": "^2", + "twig/twig": "^3.0", "twilio/sdk": "^6.40", "webpatser/laravel-countries": "dev-master#75992ad", "wepay/php-sdk": "^0.3", diff --git a/composer.lock b/composer.lock index fb13b2f575ac..79d85c1da1da 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fe4e98a48b87b1d62a7c93b6f56c57cc", + "content-hash": "22c7a90fc3389d0e5478e03f626d9ddb", "packages": [ { "name": "adrienrn/php-mimetyper", @@ -9904,6 +9904,72 @@ }, "time": "2023-08-10T06:11:26+00:00" }, + { + "name": "smarty/smarty", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/smarty-php/smarty.git", + "reference": "1d9cda2be34fd6edb74924684260636fd0b89288" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/1d9cda2be34fd6edb74924684260636fd0b89288", + "reference": "1d9cda2be34fd6edb74924684260636fd0b89288", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^7.5", + "smarty/smarty-lexer": "^3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "libs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + }, + { + "name": "Simon Wisselink", + "homepage": "https://www.iwink.nl/" + } + ], + "description": "Smarty - the compiling PHP template engine", + "homepage": "https://smarty-php.github.io/smarty/", + "keywords": [ + "templating" + ], + "support": { + "forum": "https://github.com/smarty-php/smarty/discussions", + "issues": "https://github.com/smarty-php/smarty/issues", + "source": "https://github.com/smarty-php/smarty/tree/v4.3.2" + }, + "time": "2023-07-19T10:27:36+00:00" + }, { "name": "socialiteproviders/apple", "version": "5.5.2", @@ -13895,6 +13961,77 @@ }, "time": "2023-08-20T23:18:11+00:00" }, + { + "name": "twig/twig", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-08-28T11:09:02+00:00" + }, { "name": "twilio/sdk", "version": "6.44.4", diff --git a/database/migrations/2023_09_09_135250_client_and_company_type.php b/database/migrations/2023_09_09_135250_client_and_company_type.php new file mode 100644 index 000000000000..4fb7f69afceb --- /dev/null +++ b/database/migrations/2023_09_09_135250_client_and_company_type.php @@ -0,0 +1,27 @@ +string('classification')->nullable(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/routes/client.php b/routes/client.php index c9fec140ea3a..56e872f232a0 100644 --- a/routes/client.php +++ b/routes/client.php @@ -141,6 +141,7 @@ Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'clie }); Route::get('phantom/{entity}/{invitation_key}', [Phantom::class, 'displayInvitation'])->middleware(['invite_db', 'phantom_secret'])->name('phantom_view'); +Route::get('blade/', [Phantom::class, 'blade'])->name('blade'); Route::get('.env', function () { })->middleware('throttle:honeypot'); From eaad980f1e0031baa2a2bf49b29675cab993b385 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 11 Sep 2023 15:54:20 +1000 Subject: [PATCH 003/109] Working on twig --- app/Services/PdfMaker/PdfMaker.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index 26c375c5671e..505327c126c8 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -74,6 +74,28 @@ class PdfMaker $this->updateElementProperties($this->data['template']); } + if(isset($this->data['template'])) { + $contents= $this->document->getElementsByTagName('twig'); + + foreach ($contents as $content) { + + $template = $content->ownerDocument->saveHTML($content); + + $loader = new \Twig\Loader\FilesystemLoader(storage_path()); + $twig = new \Twig\Environment($loader); + $template = $twig->createTemplate($template); + $template = $template->render([ + 'invoice' => \App\Models\Invoice::first()->toArray(), + ]); + + $f = $this->document->createDocumentFragment(); + $f->appendXML($template); + + $content->parentNode->replaceChild($f, $content); + } + + } + if (isset($this->data['variables'])) { $this->updateVariables($this->data['variables']); } @@ -89,8 +111,9 @@ class PdfMaker */ public function getCompiledHTML($final = false) { - $html = $this->document->saveHTML(); + $html = $this->document->saveHTML(); + nlog($html); return str_replace('%24', '$', $html); } } From 1c73c7ed157f7ddd80274362bcc9ac9d3a4d3789 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 17 Sep 2023 11:46:59 +1000 Subject: [PATCH 004/109] Clean up and remove secondary dependency --- app/Utils/PhantomJS/Phantom.php | 118 --------- composer.json | 5 +- composer.lock | 407 ++++++++++++++------------------ 3 files changed, 178 insertions(+), 352 deletions(-) diff --git a/app/Utils/PhantomJS/Phantom.php b/app/Utils/PhantomJS/Phantom.php index 7e8f0d1bb40c..a9a6d3c31305 100644 --- a/app/Utils/PhantomJS/Phantom.php +++ b/app/Utils/PhantomJS/Phantom.php @@ -231,122 +231,4 @@ class Phantom return view('pdf.html', $data); } - public function blade() - { - - $i = \App\Models\Invoice::first(); - - $html_variables = (new HtmlEngine($i->invitations->first()))->makeValuesNoPrefix(); - $variables = (new HtmlEngine($i->invitations->first()))->makeValuesNoPrefix(); - - $html_variables = array_merge($html_variables, $variables); - // $smarty->assign($html_variables); - - $template_string = ' - display {$foo} here - - {if $invoice.amount > 5} -
- ewwo {$invoice.amount * 5} - {/if} -
- {if isset($entry) && is_array($entry)} - I am a puppet - {/if} -
- {if 1 > 0} - 1 is greater than 0 - {/if} -
- {if 0 > 1} - 0 is greater than 1 - {/if} -
- {foreach $countries as $country} - - {if $country.name = "Australia"} - {$country.name}
- {/if} - -
- - - {/foreach} - - -{foreach $invoice.line_items as $item} - {$item->quantity} - {$item->cost} - {$item->notes} - {$item->line_total}
-{/foreach} - - echo "I am a puppet"; - - - - '; - -$template_string = ' - - - - - {{ _invoice_number }} - - -

{{ _invoice_number }}

-

Athletes list

-
    - {% for item in invoice.line_items %} -
  • {{ item.product_key|e }} {{ item.quantity|e }} {{ item.type_id|e }} {{ item.notes|e }} {{ item.line_total|e }}
  • - {% endfor %} - -
- -{{ _invoiceDate }}
-{{ _shipping }}
-{{ _client_address|raw }}
-{{ xx }} - -$invoice.amount
- - - -'; - -$loader = new \Twig\Loader\FilesystemLoader(storage_path()); -// $tags = ['if','for','raw','html','sandbox']; -// $filters = ['upper']; -// $methods = [ -// 'Article' => ['getTitle', 'getBody'], -// ]; -// $properties = [ -// 'Article' => ['title', 'body'], -// ]; -// $functions = ['range']; -// $policy = new \Twig\Sandbox\SecurityPolicy($tags, $filters, $methods, $properties, $functions); -// $sandbox = new \Twig\Extension\SandboxExtension($policy); - -$twig = new \Twig\Environment($loader); -// $twig->addExtension($sandbox); - -// $twig = new \Twig\Environment(new \Twig\Loader\ArrayLoader([])); -$template = $twig->createTemplate($template_string); -echo $template->render(array_merge([ - 'invoice' => $i->toArray(), -], $html_variables)); - - - // try{ - // $smarty->display('string:' . $template_string); - // } - // catch(\Throwable $e){ - // echo $e->getMessage(); - // exit; - // } - - // $smarty->display('string:' . $template_string); - - } } diff --git a/composer.json b/composer.json index f49301bc8b99..45d160ff2958 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ ], "type": "project", "require": { - "php": "^8.1", + "php": "^8.1|^8.2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -84,7 +84,6 @@ "setasign/fpdf": "^1.8", "setasign/fpdi": "^2.3", "shopify/shopify-api": "^4.3", - "smarty/smarty": "^4.3", "socialiteproviders/apple": "^5.2", "socialiteproviders/microsoft": "^4.1", "spatie/laravel-data": "^3.5", @@ -102,7 +101,7 @@ "wildbit/postmark-php": "^4.0" }, "require-dev": { - "php": "^8.1", + "php": "^8.1|^8.2", "barryvdh/laravel-debugbar": "^3.6", "barryvdh/laravel-ide-helper": "^2.13", "brianium/paratest": "^7", diff --git a/composer.lock b/composer.lock index 79d85c1da1da..774034308467 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "22c7a90fc3389d0e5478e03f626d9ddb", + "content-hash": "a3cef8412df6b0cc9371807991ab699a", "packages": [ { "name": "adrienrn/php-mimetyper", @@ -525,16 +525,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.280.2", + "version": "3.281.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "d68b83b3bc39b70bf33e9b8b5166facbe3e4fe9b" + "reference": "926cea9a41a545ca9801ac304f2a9ffd23ac68c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d68b83b3bc39b70bf33e9b8b5166facbe3e4fe9b", - "reference": "d68b83b3bc39b70bf33e9b8b5166facbe3e4fe9b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/926cea9a41a545ca9801ac304f2a9ffd23ac68c9", + "reference": "926cea9a41a545ca9801ac304f2a9ffd23ac68c9", "shasum": "" }, "require": { @@ -614,9 +614,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.280.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.7" }, - "time": "2023-09-01T18:06:10+00:00" + "time": "2023-09-14T18:05:11+00:00" }, { "name": "bacon/bacon-qr-code", @@ -830,16 +830,16 @@ }, { "name": "checkout/checkout-sdk-php", - "version": "3.0.13", + "version": "3.0.14", "source": { "type": "git", "url": "https://github.com/checkout/checkout-sdk-php.git", - "reference": "09f50d3df10f99681b535b53c395d2ee1ddab22b" + "reference": "e8a34d34abac3fb6e7b2227731eb2e75f6ff036f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/09f50d3df10f99681b535b53c395d2ee1ddab22b", - "reference": "09f50d3df10f99681b535b53c395d2ee1ddab22b", + "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/e8a34d34abac3fb6e7b2227731eb2e75f6ff036f", + "reference": "e8a34d34abac3fb6e7b2227731eb2e75f6ff036f", "shasum": "" }, "require": { @@ -892,9 +892,9 @@ ], "support": { "issues": "https://github.com/checkout/checkout-sdk-php/issues", - "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.13" + "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.14" }, - "time": "2023-06-09T09:09:30+00:00" + "time": "2023-09-07T11:00:14+00:00" }, { "name": "cleverit/ubl_invoice", @@ -2517,16 +2517,16 @@ }, { "name": "google/apiclient", - "version": "v2.15.0", + "version": "v2.15.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "49787fa30b8d8313146a61efbf77ed1fede723c2" + "reference": "7a95ed29e4b6c6859d2d22300c5455a92e2622ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/49787fa30b8d8313146a61efbf77ed1fede723c2", - "reference": "49787fa30b8d8313146a61efbf77ed1fede723c2", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/7a95ed29e4b6c6859d2d22300c5455a92e2622ad", + "reference": "7a95ed29e4b6c6859d2d22300c5455a92e2622ad", "shasum": "" }, "require": { @@ -2537,7 +2537,7 @@ "guzzlehttp/psr7": "^1.8.4||^2.2.1", "monolog/monolog": "^2.9||^3.0", "php": "^7.4|^8.0", - "phpseclib/phpseclib": "^3.0.2" + "phpseclib/phpseclib": "^3.0.19" }, "require-dev": { "cache/filesystem-adapter": "^1.1", @@ -2580,22 +2580,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.15.0" + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.15.1" }, - "time": "2023-05-18T13:51:33+00:00" + "time": "2023-09-13T21:46:39+00:00" }, { "name": "google/apiclient-services", - "version": "v0.314.0", + "version": "v0.315.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "fe2f7513dc5a4a6cf82715fd0edf7589423d6535" + "reference": "9fe675be642888cded64be861891901f092ab72d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/fe2f7513dc5a4a6cf82715fd0edf7589423d6535", - "reference": "fe2f7513dc5a4a6cf82715fd0edf7589423d6535", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/9fe675be642888cded64be861891901f092ab72d", + "reference": "9fe675be642888cded64be861891901f092ab72d", "shasum": "" }, "require": { @@ -2624,22 +2624,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.314.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.315.0" }, - "time": "2023-09-03T01:04:12+00:00" + "time": "2023-09-10T01:10:37+00:00" }, { "name": "google/auth", - "version": "v1.29.1", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "f199ed635b945e5adfd3c1a203543d8d86aff239" + "reference": "6028b072aa444d7edecbed603431322026704627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/f199ed635b945e5adfd3c1a203543d8d86aff239", - "reference": "f199ed635b945e5adfd3c1a203543d8d86aff239", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/6028b072aa444d7edecbed603431322026704627", + "reference": "6028b072aa444d7edecbed603431322026704627", "shasum": "" }, "require": { @@ -2682,9 +2682,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.29.1" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.30.0" }, - "time": "2023-08-23T08:49:35+00:00" + "time": "2023-09-07T19:13:44+00:00" }, { "name": "graham-campbell/result-type", @@ -3441,16 +3441,16 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.26", + "version": "v1.0.28", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "2a7541a35f00499c206391273f30159dc2c7072a" + "reference": "be78b1b53a46e94a69b92dcff1e909180170583c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/2a7541a35f00499c206391273f30159dc2c7072a", - "reference": "2a7541a35f00499c206391273f30159dc2c7072a", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/be78b1b53a46e94a69b92dcff1e909180170583c", + "reference": "be78b1b53a46e94a69b92dcff1e909180170583c", "shasum": "" }, "require": { @@ -3508,9 +3508,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.26" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.28" }, - "time": "2023-08-18T03:05:43+00:00" + "time": "2023-09-12T14:54:01+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -4331,16 +4331,16 @@ }, { "name": "laravel/framework", - "version": "v10.21.0", + "version": "v10.23.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "96b15c7ac382a9adb4a56d40c640e782d669a112" + "reference": "dbfd495557678759153e8d71cc2f6027686ca51e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/96b15c7ac382a9adb4a56d40c640e782d669a112", - "reference": "96b15c7ac382a9adb4a56d40c640e782d669a112", + "url": "https://api.github.com/repos/laravel/framework/zipball/dbfd495557678759153e8d71cc2f6027686ca51e", + "reference": "dbfd495557678759153e8d71cc2f6027686ca51e", "shasum": "" }, "require": { @@ -4440,7 +4440,7 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^8.4", + "orchestra/testbench-core": "^8.10", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", @@ -4527,20 +4527,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-08-29T13:55:56+00:00" + "time": "2023-09-13T14:51:46+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.6", + "version": "v0.1.7", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "b514c5620e1b3b61221b0024dc88def26d9654f4" + "reference": "554e7d855a22e87942753d68e23b327ad79b2070" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/b514c5620e1b3b61221b0024dc88def26d9654f4", - "reference": "b514c5620e1b3b61221b0024dc88def26d9654f4", + "url": "https://api.github.com/repos/laravel/prompts/zipball/554e7d855a22e87942753d68e23b327ad79b2070", + "reference": "554e7d855a22e87942753d68e23b327ad79b2070", "shasum": "" }, "require": { @@ -4573,9 +4573,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.6" + "source": "https://github.com/laravel/prompts/tree/v0.1.7" }, - "time": "2023-08-18T13:32:23+00:00" + "time": "2023-09-12T11:09:22+00:00" }, { "name": "laravel/serializable-closure", @@ -4700,16 +4700,16 @@ }, { "name": "laravel/socialite", - "version": "v5.8.1", + "version": "v5.9.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "9989b4530331597fae811bca240bf4e8f15e804b" + "reference": "49ecc4c907ed88c1254bae991c6b2948945645c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/9989b4530331597fae811bca240bf4e8f15e804b", - "reference": "9989b4530331597fae811bca240bf4e8f15e804b", + "url": "https://api.github.com/repos/laravel/socialite/zipball/49ecc4c907ed88c1254bae991c6b2948945645c2", + "reference": "49ecc4c907ed88c1254bae991c6b2948945645c2", "shasum": "" }, "require": { @@ -4766,7 +4766,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2023-08-21T13:06:52+00:00" + "time": "2023-09-07T16:13:53+00:00" }, { "name": "laravel/tinker", @@ -5315,16 +5315,16 @@ }, { "name": "league/flysystem", - "version": "3.15.1", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed" + "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", - "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4fdf372ca6b63c6e281b1c01a624349ccb757729", + "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729", "shasum": "" }, "require": { @@ -5333,6 +5333,8 @@ "php": "^8.0.2" }, "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", @@ -5352,7 +5354,7 @@ "microsoft/azure-storage-blob": "^1.1", "phpseclib/phpseclib": "^3.0.14", "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^9.5.11", + "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.3.1" }, "type": "library", @@ -5387,7 +5389,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.16.0" }, "funding": [ { @@ -5399,20 +5401,20 @@ "type": "github" } ], - "time": "2023-05-04T09:04:26+00:00" + "time": "2023-09-07T19:22:17+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.15.0", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a" + "reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d8de61ee10b6a607e7996cff388c5a3a663e8c8a", - "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c", + "reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c", "shasum": "" }, "require": { @@ -5453,7 +5455,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.16.0" }, "funding": [ { @@ -5465,20 +5467,20 @@ "type": "github" } ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2023-08-30T10:14:57+00:00" }, { "name": "league/flysystem-local", - "version": "3.15.0", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", - "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ec7383f25642e6fd4bb0c9554fc2311245391781", + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781", "shasum": "" }, "require": { @@ -5513,7 +5515,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.16.0" }, "funding": [ { @@ -5525,7 +5527,7 @@ "type": "github" } ], - "time": "2023-05-02T20:02:14+00:00" + "time": "2023-08-30T10:23:59+00:00" }, { "name": "league/fractal", @@ -5867,16 +5869,16 @@ }, { "name": "microsoft/microsoft-graph", - "version": "1.105.0", + "version": "1.106.0", "source": { "type": "git", "url": "https://github.com/microsoftgraph/msgraph-sdk-php.git", - "reference": "d137bb44a1f4ec949c814471ee94265db002fc2c" + "reference": "a9f43d74131bb13cb1b5a999101d486b26601b8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/d137bb44a1f4ec949c814471ee94265db002fc2c", - "reference": "d137bb44a1f4ec949c814471ee94265db002fc2c", + "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/a9f43d74131bb13cb1b5a999101d486b26601b8f", + "reference": "a9f43d74131bb13cb1b5a999101d486b26601b8f", "shasum": "" }, "require": { @@ -5913,9 +5915,9 @@ "homepage": "https://developer.microsoft.com/en-us/graph", "support": { "issues": "https://github.com/microsoftgraph/msgraph-sdk-php/issues", - "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.105.0" + "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.106.0" }, - "time": "2023-08-22T13:28:28+00:00" + "time": "2023-09-08T06:02:27+00:00" }, { "name": "mollie/mollie-api-php", @@ -6403,16 +6405,16 @@ }, { "name": "nesbot/carbon", - "version": "2.69.0", + "version": "2.70.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c" + "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4308217830e4ca445583a37d1bf4aff4153fa81c", - "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d3298b38ea8612e5f77d38d1a99438e42f70341d", + "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d", "shasum": "" }, "require": { @@ -6505,7 +6507,7 @@ "type": "tidelift" } ], - "time": "2023-08-03T09:00:52+00:00" + "time": "2023-09-07T16:43:50+00:00" }, { "name": "nette/schema", @@ -7366,6 +7368,7 @@ "issues": "https://github.com/PayFast/payfast-php-sdk/issues", "source": "https://github.com/PayFast/payfast-php-sdk/tree/v1.1.4" }, + "abandoned": true, "time": "2022-12-20T10:39:51+00:00" }, { @@ -8169,16 +8172,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.23.1", + "version": "1.24.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" + "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/3510b0a6274cc42f7219367cb3abfc123ffa09d6", + "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6", "shasum": "" }, "require": { @@ -8210,9 +8213,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.0" }, - "time": "2023-08-03T16:32:59+00:00" + "time": "2023-09-07T20:46:32+00:00" }, { "name": "pragmarx/google2fa", @@ -8268,16 +8271,16 @@ }, { "name": "predis/predis", - "version": "v2.2.1", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "5f2b410a74afaff296a87a494e4c5488cf9fab57" + "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/5f2b410a74afaff296a87a494e4c5488cf9fab57", - "reference": "5f2b410a74afaff296a87a494e4c5488cf9fab57", + "url": "https://api.github.com/repos/predis/predis/zipball/b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", + "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", "shasum": "" }, "require": { @@ -8317,7 +8320,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.2.1" + "source": "https://github.com/predis/predis/tree/v2.2.2" }, "funding": [ { @@ -8325,7 +8328,7 @@ "type": "github" } ], - "time": "2023-08-15T23:01:46+00:00" + "time": "2023-09-13T16:42:03+00:00" }, { "name": "psr/cache", @@ -9152,16 +9155,16 @@ }, { "name": "razorpay/razorpay", - "version": "2.8.6", + "version": "2.8.7", "source": { "type": "git", "url": "https://github.com/razorpay/razorpay-php.git", - "reference": "c151dadbb3d0a64d92574e9789b970196e629cac" + "reference": "2180c8c3c39678623f5cb8f639c39a706de14c44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/razorpay/razorpay-php/zipball/c151dadbb3d0a64d92574e9789b970196e629cac", - "reference": "c151dadbb3d0a64d92574e9789b970196e629cac", + "url": "https://api.github.com/repos/razorpay/razorpay-php/zipball/2180c8c3c39678623f5cb8f639c39a706de14c44", + "reference": "2180c8c3c39678623f5cb8f639c39a706de14c44", "shasum": "" }, "require": { @@ -9213,20 +9216,20 @@ "issues": "https://github.com/Razorpay/razorpay-php/issues", "source": "https://github.com/Razorpay/razorpay-php" }, - "time": "2023-06-16T10:31:14+00:00" + "time": "2023-09-11T08:31:26+00:00" }, { "name": "rmccue/requests", - "version": "v2.0.7", + "version": "v2.0.8", "source": { "type": "git", "url": "https://github.com/WordPress/Requests.git", - "reference": "e14a6f4e7438d3f8da3f2657759e6367b906ee23" + "reference": "fae75bcb83d9d00d0e31ee86a472a036f9f91519" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/Requests/zipball/e14a6f4e7438d3f8da3f2657759e6367b906ee23", - "reference": "e14a6f4e7438d3f8da3f2657759e6367b906ee23", + "url": "https://api.github.com/repos/WordPress/Requests/zipball/fae75bcb83d9d00d0e31ee86a472a036f9f91519", + "reference": "fae75bcb83d9d00d0e31ee86a472a036f9f91519", "shasum": "" }, "require": { @@ -9244,6 +9247,12 @@ "wp-coding-standards/wpcs": "^2.0", "yoast/phpunit-polyfills": "^1.0.0" }, + "suggest": { + "art4/requests-psr18-adapter": "For using Requests as a PSR-18 HTTP Client", + "ext-curl": "For improved performance", + "ext-openssl": "For secure transport support", + "ext-zlib": "For improved performance when decompressing encoded streams" + }, "type": "library", "autoload": { "files": [ @@ -9294,7 +9303,7 @@ "issues": "https://github.com/WordPress/Requests/issues", "source": "https://github.com/WordPress/Requests" }, - "time": "2023-06-02T07:35:42+00:00" + "time": "2023-09-11T08:27:57+00:00" }, { "name": "sabre/uri", @@ -9583,16 +9592,16 @@ }, { "name": "sentry/sentry-laravel", - "version": "3.7.3", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf" + "reference": "c7e7611553f9f90af10ed98dde1a680220f02e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", - "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/c7e7611553f9f90af10ed98dde1a680220f02e4d", + "reference": "c7e7611553f9f90af10ed98dde1a680220f02e4d", "shasum": "" }, "require": { @@ -9605,6 +9614,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.11", + "laravel/folio": "^1.0", "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "mockery/mockery": "^1.3", "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", @@ -9658,7 +9668,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/3.7.3" + "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.0" }, "funding": [ { @@ -9670,7 +9680,7 @@ "type": "custom" } ], - "time": "2023-08-03T10:10:23+00:00" + "time": "2023-09-05T11:02:34+00:00" }, { "name": "setasign/fpdf", @@ -9904,94 +9914,28 @@ }, "time": "2023-08-10T06:11:26+00:00" }, - { - "name": "smarty/smarty", - "version": "v4.3.2", - "source": { - "type": "git", - "url": "https://github.com/smarty-php/smarty.git", - "reference": "1d9cda2be34fd6edb74924684260636fd0b89288" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/1d9cda2be34fd6edb74924684260636fd0b89288", - "reference": "1d9cda2be34fd6edb74924684260636fd0b89288", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^7.5", - "smarty/smarty-lexer": "^3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "libs/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Monte Ohrt", - "email": "monte@ohrt.com" - }, - { - "name": "Uwe Tews", - "email": "uwe.tews@googlemail.com" - }, - { - "name": "Rodney Rehm", - "email": "rodney.rehm@medialize.de" - }, - { - "name": "Simon Wisselink", - "homepage": "https://www.iwink.nl/" - } - ], - "description": "Smarty - the compiling PHP template engine", - "homepage": "https://smarty-php.github.io/smarty/", - "keywords": [ - "templating" - ], - "support": { - "forum": "https://github.com/smarty-php/smarty/discussions", - "issues": "https://github.com/smarty-php/smarty/issues", - "source": "https://github.com/smarty-php/smarty/tree/v4.3.2" - }, - "time": "2023-07-19T10:27:36+00:00" - }, { "name": "socialiteproviders/apple", - "version": "5.5.2", + "version": "5.6.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Apple.git", - "reference": "82febc9805143d1ebea6c3e66db402d43bf511e1" + "reference": "4f0f06e463824f0df6151c768db2fec6610ea055" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Apple/zipball/82febc9805143d1ebea6c3e66db402d43bf511e1", - "reference": "82febc9805143d1ebea6c3e66db402d43bf511e1", + "url": "https://api.github.com/repos/SocialiteProviders/Apple/zipball/4f0f06e463824f0df6151c768db2fec6610ea055", + "reference": "4f0f06e463824f0df6151c768db2fec6610ea055", "shasum": "" }, "require": { "ext-json": "*", "ext-openssl": "*", - "firebase/php-jwt": "^6.2", + "firebase/php-jwt": "^6.8", "lcobucci/clock": "^2.0 || ^3.0", "lcobucci/jwt": "^4.1.5 || ^5.0.0", - "php": "^7.4 || ^8.0", - "socialiteproviders/manager": "~4.0" + "php": "^8.0", + "socialiteproviders/manager": "^4.4" }, "suggest": { "ahilmurugesan/socialite-apple-helper": "Automatic Apple client key generation and management." @@ -10040,7 +9984,7 @@ "issues": "https://github.com/socialiteproviders/providers/issues", "source": "https://github.com/socialiteproviders/providers" }, - "time": "2023-05-24T23:29:11+00:00" + "time": "2023-09-11T21:59:09+00:00" }, { "name": "socialiteproviders/manager", @@ -10168,16 +10112,16 @@ }, { "name": "spatie/laravel-data", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "7ead3d8f761846185a94d06e584bfe17e43b9239" + "reference": "21bad55113a1e1e5180a0f89b695f02ce1732aef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/7ead3d8f761846185a94d06e584bfe17e43b9239", - "reference": "7ead3d8f761846185a94d06e584bfe17e43b9239", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/21bad55113a1e1e5180a0f89b695f02ce1732aef", + "reference": "21bad55113a1e1e5180a0f89b695f02ce1732aef", "shasum": "" }, "require": { @@ -10239,7 +10183,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/3.8.1" + "source": "https://github.com/spatie/laravel-data/tree/3.9.0" }, "funding": [ { @@ -10247,7 +10191,7 @@ "type": "github" } ], - "time": "2023-08-11T11:59:07+00:00" + "time": "2023-09-15T12:04:39+00:00" }, { "name": "spatie/laravel-package-tools", @@ -14687,16 +14631,16 @@ }, { "name": "brianium/paratest", - "version": "v7.2.6", + "version": "v7.2.7", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "7f372b5bb59b4271adedc67d3129df29b84c4173" + "reference": "1526eb4fd195f65075456dee394d14742ae0a66c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/7f372b5bb59b4271adedc67d3129df29b84c4173", - "reference": "7f372b5bb59b4271adedc67d3129df29b84c4173", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/1526eb4fd195f65075456dee394d14742ae0a66c", + "reference": "1526eb4fd195f65075456dee394d14742ae0a66c", "shasum": "" }, "require": { @@ -14766,7 +14710,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.2.6" + "source": "https://github.com/paratestphp/paratest/tree/v7.2.7" }, "funding": [ { @@ -14778,7 +14722,7 @@ "type": "paypal" } ], - "time": "2023-08-29T07:47:39+00:00" + "time": "2023-09-14T14:10:09+00:00" }, { "name": "composer/class-map-generator", @@ -15205,16 +15149,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.25.1", + "version": "v3.26.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "8e21d69801de6b5ecb0dbe0bcdf967b335b1260b" + "reference": "d023ba6684055f6ea1da1352d8a02baca0426983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8e21d69801de6b5ecb0dbe0bcdf967b335b1260b", - "reference": "8e21d69801de6b5ecb0dbe0bcdf967b335b1260b", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983", + "reference": "d023ba6684055f6ea1da1352d8a02baca0426983", "shasum": "" }, "require": { @@ -15288,7 +15232,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.25.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.26.1" }, "funding": [ { @@ -15296,7 +15240,7 @@ "type": "github" } ], - "time": "2023-09-04T01:22:52+00:00" + "time": "2023-09-08T19:09:07+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -16007,16 +15951,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.32", + "version": "1.10.34", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44" + "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c47e47d3ab03137c0e121e77c4d2cb58672f6d44", - "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7f806b6f1403e6914c778140e2ba07c293cb4901", + "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901", "shasum": "" }, "require": { @@ -16065,20 +16009,20 @@ "type": "tidelift" } ], - "time": "2023-08-24T21:54:50+00:00" + "time": "2023-09-13T09:49:47+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.4", + "version": "10.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" + "reference": "1df504e42a88044c27a90136910f0b3fe9e91939" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1df504e42a88044c27a90136910f0b3fe9e91939", + "reference": "1df504e42a88044c27a90136910f0b3fe9e91939", "shasum": "" }, "require": { @@ -16135,7 +16079,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.5" }, "funding": [ { @@ -16143,7 +16087,7 @@ "type": "github" } ], - "time": "2023-08-31T14:04:38+00:00" + "time": "2023-09-12T14:37:22+00:00" }, { "name": "phpunit/php-file-iterator", @@ -16390,16 +16334,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.2", + "version": "10.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" + "reference": "b8d59476f19115c9774b3b447f78131781c6c32b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b8d59476f19115c9774b3b447f78131781c6c32b", + "reference": "b8d59476f19115c9774b3b447f78131781c6c32b", "shasum": "" }, "require": { @@ -16413,7 +16357,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -16471,7 +16415,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.4" }, "funding": [ { @@ -16487,7 +16431,7 @@ "type": "tidelift" } ], - "time": "2023-08-15T05:34:23+00:00" + "time": "2023-09-12T14:42:28+00:00" }, { "name": "sebastian/cli-parser", @@ -16924,16 +16868,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/32ff03d078fed1279c4ec9a407d08c5e9febb480", + "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480", "shasum": "" }, "require": { @@ -16989,7 +16933,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.1" }, "funding": [ { @@ -16997,7 +16942,7 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-08T04:46:58+00:00" }, { "name": "sebastian/global-state", @@ -17972,13 +17917,13 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": "^8.1|^8.2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*" }, "platform-dev": { - "php": "^8.1" + "php": "^8.1|^8.2" }, "plugin-api-version": "2.3.0" } From b92e95efb37de4df8c48fd6634f4ead4adcf6748 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 19 Sep 2023 10:05:13 +1000 Subject: [PATCH 005/109] Working on logic for custom designs --- app/Http/Controllers/PreviewController.php | 15 +++ .../PreviewPurchaseOrderController.php | 6 + app/Jobs/Entity/CreateEntityPdf.php | 3 + app/Jobs/Entity/CreateRawPdf.php | 3 + app/Jobs/Vendor/CreatePurchaseOrderPdf.php | 4 + app/Repositories/ActivityRepository.php | 4 + app/Services/Client/Statement.php | 10 +- app/Services/Invoice/GenerateDeliveryNote.php | 5 + .../Designs/Utilities/DesignHelpers.php | 3 +- app/Services/PdfMaker/PdfMaker.php | 16 +-- app/Services/Preview/StubBuilder.php | 4 + app/Utils/PhantomJS/Phantom.php | 2 + composer.lock | 112 +++++++++--------- 13 files changed, 124 insertions(+), 63 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index c99a4a400fe8..dad299106c93 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -110,6 +110,10 @@ class PreviewController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $entity_obj->client->company->markdown_enabled, + 'options' => [ + 'client' => $entity_obj->client, + 'entity' => $entity_obj, + ] ]; $design = new Design(request()->design['name']); @@ -274,6 +278,9 @@ class PreviewController extends BaseController 'options' => [ 'all_pages_header' => $entity_obj->client->getSetting('all_pages_header'), 'all_pages_footer' => $entity_obj->client->getSetting('all_pages_footer'), + 'client' => $entity_obj->client, + 'entity' => $entity_obj, + 'variables' => $variables, ], 'process_markdown' => $entity_obj->client->company->markdown_enabled, ]; @@ -375,6 +382,10 @@ class PreviewController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $invitation->invoice->client->company->markdown_enabled, + 'options' => [ + 'client' => $invitation->invoice->client, + 'entity' => $invitation->invoice, + ] ]; $maker = new PdfMaker($state); @@ -485,6 +496,10 @@ class PreviewController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $invoice->client->company->markdown_enabled, + 'options' => [ + 'client' => $invitation->invoice->client, + 'entity' => $invitation->invoice, + ] ]; $maker = new PdfMaker($state); diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 81d823cf254a..660ea5f6e9e6 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -232,6 +232,12 @@ class PreviewPurchaseOrderController extends BaseController '$product' => $design->design->product, ]), 'variables' => $html->generateLabelsAndValues(), + 'options' => [ + 'client' => null, + 'vendor' => $entity_obj->vendor, + 'entity' => $entity_obj, + 'variables' => $html->generateLabelsAndValues(), + ], 'process_markdown' => $entity_obj->company->markdown_enabled, ]; diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php index 7ef89d2c3e81..5210cf236192 100644 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -170,6 +170,9 @@ class CreateEntityPdf implements ShouldQueue 'options' => [ 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), + 'client' => $this->client, + 'entity' => $this->entity, + 'variables' => $variables, ], 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 593566577b9b..1be6cd24e114 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -157,6 +157,9 @@ class CreateRawPdf implements ShouldQueue 'options' => [ 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), + 'client' => $this->entity->client, + 'entity' => $this->entity, + 'variables' => $variables, ], 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; diff --git a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php index 5c8432603a08..8238602e2002 100644 --- a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php +++ b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php @@ -154,6 +154,10 @@ class CreatePurchaseOrderPdf implements ShouldQueue 'options' => [ 'all_pages_header' => $this->entity->company->getSetting('all_pages_header'), 'all_pages_footer' => $this->entity->company->getSetting('all_pages_footer'), + 'client' => null, + 'vendor' => $this->vendor, + 'entity' => $this->entity, + 'variables' => $variables, ], 'process_markdown' => $this->entity->company->markdown_enabled, ]; diff --git a/app/Repositories/ActivityRepository.php b/app/Repositories/ActivityRepository.php index 3ea31c3c7b3d..72a9091b8edf 100644 --- a/app/Repositories/ActivityRepository.php +++ b/app/Repositories/ActivityRepository.php @@ -163,6 +163,8 @@ class ActivityRepository extends BaseRepository 'options' => [ 'all_pages_header' => $entity->vendor->getSetting('all_pages_header'), 'all_pages_footer' => $entity->vendor->getSetting('all_pages_footer'), + 'vendor' => $entity->vendor, + 'entity' => $entity, ], 'process_markdown' => $entity->vendor->company->markdown_enabled, ]; @@ -233,6 +235,8 @@ class ActivityRepository extends BaseRepository 'options' => [ 'all_pages_header' => $entity->client->getSetting('all_pages_header'), 'all_pages_footer' => $entity->client->getSetting('all_pages_footer'), + 'client' => $entity->client, + 'entity' => $entity, ], 'process_markdown' => $entity->client->company->markdown_enabled, ]; diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 4fe0ccc36fbe..dae872c774bb 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -76,7 +76,15 @@ class Statement 'aging' => $this->getAging(), ], \App\Services\PdfMaker\Design::STATEMENT), 'variables' => $variables, - 'options' => [], + 'options' => [ + 'client' => $this->client, + 'entity' => $this->entity, + 'variables' => $variables, + 'invoices' => $this->getInvoices(), + 'payments' => $this->getPayments(), + 'credits' => $this->getCredits(), + 'aging' => $this->getAging(), + ], 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index 86ba365545c5..681891138811 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -70,6 +70,11 @@ class GenerateDeliveryNote 'contact' => $this->contact, ], 'delivery_note'), 'variables' => $html->generateLabelsAndValues(), + 'options' => [ + 'client' => $this->invoice->client, + 'entity' => $this->invoice, + 'contact' => $this->contact, + ], 'process_markdown' => $this->invoice->client->company->markdown_enabled, ]; diff --git a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php index 89aa0ea21420..74d9afb3ef8c 100644 --- a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php +++ b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php @@ -246,7 +246,8 @@ trait DesignHelpers }); "; - $javascript = 'document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{if(""!==t.innerText){let e=t.getAttribute("data-ref").slice(0,-3);document.querySelector(`th[data-ref="${e}-th"]`).removeAttribute("hidden")}}),document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{let e=t.getAttribute("data-ref").slice(0,-3);(e=document.querySelector(`th[data-ref="${e}-th"]`)).hasAttribute("hidden")&&""==t.innerText&&t.setAttribute("hidden","true")})},!1);'; + // $javascript = 'document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{if(""!==t.innerText){let e=t.getAttribute("data-ref").slice(0,-3);document.querySelector(`th[data-ref="${e}-th"]`).removeAttribute("hidden")}}),document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{let e=t.getAttribute("data-ref").slice(0,-3);(e=document.querySelector(`th[data-ref="${e}-th"]`)).hasAttribute("hidden")&&""==t.innerText&&t.setAttribute("hidden","true")})},!1);'; + $javascript = 'document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("#custom-table > tbody > tr >td, #product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{if(""!==t.innerText){let e=t.getAttribute("data-ref").slice(0,-3);document.querySelector(`th[data-ref="${e}-th"]`).removeAttribute("hidden")}}),document.querySelectorAll("#custom-table > tbody > tr > td, #product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{let e=t.getAttribute("data-ref").slice(0,-3);(e=document.querySelector(`th[data-ref="${e}-th"]`)).hasAttribute("hidden")&&""==t.innerText&&t.setAttribute("hidden","true")})},!1);'; // Previously we've been decoding the HTML on the backend and XML parsing isn't good options because it requires, // strict & valid HTML to even output/decode. Decoding is now done on the frontend with this piece of Javascript. diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index 505327c126c8..ecb00c462291 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -74,19 +74,21 @@ class PdfMaker $this->updateElementProperties($this->data['template']); } - if(isset($this->data['template'])) { - $contents= $this->document->getElementsByTagName('twig'); + if(isset($this->options)) { + $contents= $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { - - $template = $content->ownerDocument->saveHTML($content); + + $content->removeChild($content->firstChild); + //$template = $content->ownerDocument->saveHTML($content); + $template = $content->ownerDocument->saveHTML($content->removeChild($content->firstChild)); $loader = new \Twig\Loader\FilesystemLoader(storage_path()); $twig = new \Twig\Environment($loader); $template = $twig->createTemplate($template); - $template = $template->render([ - 'invoice' => \App\Models\Invoice::first()->toArray(), - ]); + $template = $template->render($this->options); + + nlog($template); $f = $this->document->createDocumentFragment(); $f->appendXML($template); diff --git a/app/Services/Preview/StubBuilder.php b/app/Services/Preview/StubBuilder.php index 8d3cce3076f9..33568a6f57b1 100644 --- a/app/Services/Preview/StubBuilder.php +++ b/app/Services/Preview/StubBuilder.php @@ -192,6 +192,10 @@ class StubBuilder ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $this->company->markdown_enabled, + 'options' => [ + 'client' => $this->recipient, + 'entity' => $this->entity, + ], ]; $maker = new PdfMaker($state); diff --git a/app/Utils/PhantomJS/Phantom.php b/app/Utils/PhantomJS/Phantom.php index a9a6d3c31305..d0acd053b570 100644 --- a/app/Utils/PhantomJS/Phantom.php +++ b/app/Utils/PhantomJS/Phantom.php @@ -214,6 +214,8 @@ class Phantom 'options' => [ 'all_pages_header' => $entity_obj->client->getSetting('all_pages_header'), 'all_pages_footer' => $entity_obj->client->getSetting('all_pages_footer'), + 'client' => $entity_obj->client, + 'entity' => $entity_obj, ], 'process_markdown' => $entity_obj->client->company->markdown_enabled, ]; diff --git a/composer.lock b/composer.lock index 774034308467..533b512f7473 100644 --- a/composer.lock +++ b/composer.lock @@ -525,16 +525,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.7", + "version": "3.281.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "926cea9a41a545ca9801ac304f2a9ffd23ac68c9" + "reference": "9e744fd8925f7908fbc4dcea91bd785aba308587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/926cea9a41a545ca9801ac304f2a9ffd23ac68c9", - "reference": "926cea9a41a545ca9801ac304f2a9ffd23ac68c9", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e744fd8925f7908fbc4dcea91bd785aba308587", + "reference": "9e744fd8925f7908fbc4dcea91bd785aba308587", "shasum": "" }, "require": { @@ -614,9 +614,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.9" }, - "time": "2023-09-14T18:05:11+00:00" + "time": "2023-09-18T18:11:01+00:00" }, { "name": "bacon/bacon-qr-code", @@ -2586,16 +2586,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.315.0", + "version": "v0.316.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "9fe675be642888cded64be861891901f092ab72d" + "reference": "08e3579d94363716cef2bc79643f3d30fdd914b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/9fe675be642888cded64be861891901f092ab72d", - "reference": "9fe675be642888cded64be861891901f092ab72d", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/08e3579d94363716cef2bc79643f3d30fdd914b5", + "reference": "08e3579d94363716cef2bc79643f3d30fdd914b5", "shasum": "" }, "require": { @@ -2624,9 +2624,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.315.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.316.0" }, - "time": "2023-09-10T01:10:37+00:00" + "time": "2023-09-17T01:06:13+00:00" }, { "name": "google/auth", @@ -3625,16 +3625,16 @@ }, { "name": "imdhemy/google-play-billing", - "version": "1.4.2", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/imdhemy/google-play-billing.git", - "reference": "d318db28efafb56ac8954c9f651fbe6ac367d637" + "reference": "a227174a71bc5d7b3e5f9aa4fcad2c4a9a11a8a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/imdhemy/google-play-billing/zipball/d318db28efafb56ac8954c9f651fbe6ac367d637", - "reference": "d318db28efafb56ac8954c9f651fbe6ac367d637", + "url": "https://api.github.com/repos/imdhemy/google-play-billing/zipball/a227174a71bc5d7b3e5f9aa4fcad2c4a9a11a8a4", + "reference": "a227174a71bc5d7b3e5f9aa4fcad2c4a9a11a8a4", "shasum": "" }, "require": { @@ -3670,9 +3670,9 @@ "description": "Google Play Billing", "support": { "issues": "https://github.com/imdhemy/google-play-billing/issues", - "source": "https://github.com/imdhemy/google-play-billing/tree/1.4.2" + "source": "https://github.com/imdhemy/google-play-billing/tree/1.5.0" }, - "time": "2023-07-04T16:00:39+00:00" + "time": "2023-09-17T12:33:33+00:00" }, { "name": "imdhemy/laravel-purchases", @@ -8062,16 +8062,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.21", + "version": "3.0.23", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1" + "reference": "866cc78fbd82462ffd880e3f65692afe928bed50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1", - "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/866cc78fbd82462ffd880e3f65692afe928bed50", + "reference": "866cc78fbd82462ffd880e3f65692afe928bed50", "shasum": "" }, "require": { @@ -8152,7 +8152,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.21" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.23" }, "funding": [ { @@ -8168,20 +8168,20 @@ "type": "tidelift" } ], - "time": "2023-07-09T15:24:48+00:00" + "time": "2023-09-18T17:22:01+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.0", + "version": "1.24.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6" + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/3510b0a6274cc42f7219367cb3abfc123ffa09d6", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", "shasum": "" }, "require": { @@ -8213,9 +8213,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1" }, - "time": "2023-09-07T20:46:32+00:00" + "time": "2023-09-18T12:18:02+00:00" }, { "name": "pragmarx/google2fa", @@ -8793,16 +8793,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.20", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -8832,6 +8832,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -8863,9 +8867,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, - "time": "2023-07-31T14:32:22+00:00" + "time": "2023-09-17T21:15:54+00:00" }, { "name": "pusher/pusher-php-server", @@ -15149,16 +15153,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.26.1", + "version": "v3.27.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983" + "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6", + "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6", "shasum": "" }, "require": { @@ -15232,7 +15236,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.26.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0" }, "funding": [ { @@ -15240,7 +15244,7 @@ "type": "github" } ], - "time": "2023-09-08T19:09:07+00:00" + "time": "2023-09-17T14:37:54+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -15864,16 +15868,16 @@ }, { "name": "phpmyadmin/sql-parser", - "version": "5.8.0", + "version": "5.8.1", "source": { "type": "git", "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "db1b3069b5dbc220d393d67ff911e0ae76732755" + "reference": "b877ee6262a00f0f498da5e01335e8a5dc01d203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/db1b3069b5dbc220d393d67ff911e0ae76732755", - "reference": "db1b3069b5dbc220d393d67ff911e0ae76732755", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/b877ee6262a00f0f498da5e01335e8a5dc01d203", + "reference": "b877ee6262a00f0f498da5e01335e8a5dc01d203", "shasum": "" }, "require": { @@ -15895,7 +15899,7 @@ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psalm/plugin-phpunit": "^0.16.1", "vimeo/psalm": "^4.11", - "zumba/json-serializer": "^3.0" + "zumba/json-serializer": "~3.0.2" }, "suggest": { "ext-mbstring": "For best performance", @@ -15947,7 +15951,7 @@ "type": "other" } ], - "time": "2023-06-05T18:19:38+00:00" + "time": "2023-09-15T18:21:22+00:00" }, { "name": "phpstan/phpstan", @@ -16868,16 +16872,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.1", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480" + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/32ff03d078fed1279c4ec9a407d08c5e9febb480", - "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", "shasum": "" }, "require": { @@ -16934,7 +16938,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" }, "funding": [ { @@ -16942,7 +16946,7 @@ "type": "github" } ], - "time": "2023-09-08T04:46:58+00:00" + "time": "2023-09-18T07:15:37+00:00" }, { "name": "sebastian/global-state", From 74ea46b0b2819026f0436501851ac0df6fdf472b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 19 Sep 2023 11:19:19 +1000 Subject: [PATCH 006/109] Working on logic for custom designs --- app/Services/PdfMaker/PdfMaker.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index ecb00c462291..00da860c3877 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -75,25 +75,27 @@ class PdfMaker } if(isset($this->options)) { - $contents= $this->document->getElementsByTagName('ninja'); + + $replacements = []; + $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { - $content->removeChild($content->firstChild); - //$template = $content->ownerDocument->saveHTML($content); - $template = $content->ownerDocument->saveHTML($content->removeChild($content->firstChild)); + $template = $content->ownerDocument->saveHTML($content); $loader = new \Twig\Loader\FilesystemLoader(storage_path()); $twig = new \Twig\Environment($loader); $template = $twig->createTemplate($template); $template = $template->render($this->options); - nlog($template); - $f = $this->document->createDocumentFragment(); $f->appendXML($template); + $replacements[] = $f; - $content->parentNode->replaceChild($f, $content); + } + + foreach($contents as $key => $content){ + $content->parentNode->replaceChild($replacements[$key], $content); } } From 34e170f7a38480a6f342c743e8667022103f27c2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 19 Sep 2023 11:43:26 +1000 Subject: [PATCH 007/109] Fixes for statement designs --- app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php | 2 +- resources/views/pdf-designs/plain.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php index 74d9afb3ef8c..47c726667486 100644 --- a/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php +++ b/app/Services/PdfMaker/Designs/Utilities/DesignHelpers.php @@ -241,7 +241,7 @@ trait DesignHelpers { // We want to show headers for statements, no exceptions. $statements = " - document.querySelectorAll('#statement-invoice-table > thead > tr > th, #statement-payment-table > thead > tr > th, #statement-aging-table > thead > tr > th').forEach(t => { + document.querySelectorAll('#statement-credit-table > thead > tr > th, #statement-invoice-table > thead > tr > th, #statement-payment-table > thead > tr > th, #statement-aging-table > thead > tr > th').forEach(t => { t.hidden = false; }); "; diff --git a/resources/views/pdf-designs/plain.html b/resources/views/pdf-designs/plain.html index a7f8fc2f50a3..10f362007795 100644 --- a/resources/views/pdf-designs/plain.html +++ b/resources/views/pdf-designs/plain.html @@ -388,7 +388,7 @@ $entity_images ]; tables.forEach((tableIdentifier) => { - document.getElementById(tableIdentifier).childElementCount === 0 + document.getElementById(tableIdentifier) && document.getElementById(tableIdentifier).childElementCount === 0 ? document.getElementById(tableIdentifier).style.display = 'none' : ''; }); From fe614ff282847c022c50388b5049c3f4f6eb3f2f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 19 Sep 2023 15:54:18 +1000 Subject: [PATCH 008/109] Fixes for react build pipeline --- .github/workflows/release.yml | 10 +++++++++- composer.lock | 12 ++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2ebf2c1707cb..59e4080640f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,7 +46,15 @@ jobs: git checkout main npm i npm run build - cp -r dist/react/* ../public/react + + for file in dist/react/* ; do + filename=$(basename -- "$file") + extension="${filename##*.}" + filename="${filename%.*}" + version=${{ github.event.release.tag_name }} + cp dist/react/$file ../public/react/$filename"."$version"."$extension + done + mkdir -p ../public/tinymce_6.4.2/tinymce/js/ cp -r node_modules/tinymce ../public/tinymce_6.4.2/tinymce/js/ cd .. diff --git a/composer.lock b/composer.lock index 533b512f7473..907d5c1c47b9 100644 --- a/composer.lock +++ b/composer.lock @@ -16017,16 +16017,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.5", + "version": "10.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "1df504e42a88044c27a90136910f0b3fe9e91939" + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1df504e42a88044c27a90136910f0b3fe9e91939", - "reference": "1df504e42a88044c27a90136910f0b3fe9e91939", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", "shasum": "" }, "require": { @@ -16083,7 +16083,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.5" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" }, "funding": [ { @@ -16091,7 +16091,7 @@ "type": "github" } ], - "time": "2023-09-12T14:37:22+00:00" + "time": "2023-09-19T04:59:03+00:00" }, { "name": "phpunit/php-file-iterator", From 4d0d7357bdd85320b19ee8ea1cb6696da702d815 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 19 Sep 2023 15:56:27 +1000 Subject: [PATCH 009/109] Adjustments for build phase --- app/Console/Commands/ReactBuilder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/ReactBuilder.php b/app/Console/Commands/ReactBuilder.php index 430b16d90542..61b8c3dd2ca3 100644 --- a/app/Console/Commands/ReactBuilder.php +++ b/app/Console/Commands/ReactBuilder.php @@ -51,7 +51,7 @@ class ReactBuilder extends Command $directoryIterator = new \RecursiveDirectoryIterator(public_path('react'), \RecursiveDirectoryIterator::SKIP_DOTS); foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) { - if ($file->getExtension() == 'js') { + if ($file->getExtension() == 'js' && stripos($file->getFileName(), config('ninja.app_version')) !== false) { if (str_contains($file->getFileName(), 'index-')) { $includes .= ''."\n"; } else { @@ -59,7 +59,7 @@ class ReactBuilder extends Command } } - if (str_contains($file->getFileName(), '.css')) { + if (str_contains($file->getFileName(), '.css' && stripos($file->getFileName(), config('ninja.app_version')) !== false) { $includes .= ''."\n"; } } From cfb20182fb7e7c766e212262c1160d353f92821c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 21 Sep 2023 17:15:51 +1000 Subject: [PATCH 010/109] Working on designs --- app/Console/Commands/ReactBuilder.php | 10 +- app/Models/Design.php | 1 + app/Transformers/DesignTransformer.php | 1 + composer.lock | 163 +++++---- resources/views/react/head.blade.php | 470 ++++++++++++------------- 5 files changed, 323 insertions(+), 322 deletions(-) diff --git a/app/Console/Commands/ReactBuilder.php b/app/Console/Commands/ReactBuilder.php index 61b8c3dd2ca3..c6f6a854e7cd 100644 --- a/app/Console/Commands/ReactBuilder.php +++ b/app/Console/Commands/ReactBuilder.php @@ -51,16 +51,16 @@ class ReactBuilder extends Command $directoryIterator = new \RecursiveDirectoryIterator(public_path('react'), \RecursiveDirectoryIterator::SKIP_DOTS); foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) { - if ($file->getExtension() == 'js' && stripos($file->getFileName(), config('ninja.app_version')) !== false) { + if ($file->getExtension() == 'js') { if (str_contains($file->getFileName(), 'index-')) { - $includes .= ''."\n"; + $includes .= ''."\n"; } else { - $includes .= ''."\n"; + $includes .= ''."\n"; } } - if (str_contains($file->getFileName(), '.css' && stripos($file->getFileName(), config('ninja.app_version')) !== false) { - $includes .= ''."\n"; + if (str_contains($file->getFileName(), '.css')) { + $includes .= ''."\n"; } } diff --git a/app/Models/Design.php b/app/Models/Design.php index fbb6915135c4..1b0bf79a8347 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -68,6 +68,7 @@ class Design extends BaseModel 'name', 'design', 'is_active', + 'is_template', ]; public function company() diff --git a/app/Transformers/DesignTransformer.php b/app/Transformers/DesignTransformer.php index 953f5f164881..3e8bd2c2f98a 100644 --- a/app/Transformers/DesignTransformer.php +++ b/app/Transformers/DesignTransformer.php @@ -47,6 +47,7 @@ class DesignTransformer extends EntityTransformer 'name' => (string) $design->name, 'is_custom' => (bool) $design->is_custom, 'is_active' => (bool) $design->is_active, + 'is_template' => (bool) $design->is_template, 'design' => $design->design, 'updated_at' => (int) $design->updated_at, 'archived_at' => (int) $design->deleted_at, diff --git a/composer.lock b/composer.lock index 907d5c1c47b9..e0e6996e1fc7 100644 --- a/composer.lock +++ b/composer.lock @@ -525,16 +525,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.9", + "version": "3.281.11", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "9e744fd8925f7908fbc4dcea91bd785aba308587" + "reference": "9d466efae67d5016ed132fd4ffa1566a7d4cab98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e744fd8925f7908fbc4dcea91bd785aba308587", - "reference": "9e744fd8925f7908fbc4dcea91bd785aba308587", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9d466efae67d5016ed132fd4ffa1566a7d4cab98", + "reference": "9d466efae67d5016ed132fd4ffa1566a7d4cab98", "shasum": "" }, "require": { @@ -614,9 +614,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.9" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.11" }, - "time": "2023-09-18T18:11:01+00:00" + "time": "2023-09-20T19:16:24+00:00" }, { "name": "bacon/bacon-qr-code", @@ -830,16 +830,16 @@ }, { "name": "checkout/checkout-sdk-php", - "version": "3.0.14", + "version": "3.0.15", "source": { "type": "git", "url": "https://github.com/checkout/checkout-sdk-php.git", - "reference": "e8a34d34abac3fb6e7b2227731eb2e75f6ff036f" + "reference": "18a2278eb28cb1141b1cb189d4a2ee86b1837350" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/e8a34d34abac3fb6e7b2227731eb2e75f6ff036f", - "reference": "e8a34d34abac3fb6e7b2227731eb2e75f6ff036f", + "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/18a2278eb28cb1141b1cb189d4a2ee86b1837350", + "reference": "18a2278eb28cb1141b1cb189d4a2ee86b1837350", "shasum": "" }, "require": { @@ -892,9 +892,9 @@ ], "support": { "issues": "https://github.com/checkout/checkout-sdk-php/issues", - "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.14" + "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.15" }, - "time": "2023-09-07T11:00:14+00:00" + "time": "2023-09-19T14:42:51+00:00" }, { "name": "cleverit/ubl_invoice", @@ -3676,23 +3676,23 @@ }, { "name": "imdhemy/laravel-purchases", - "version": "1.8.2", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/imdhemy/laravel-in-app-purchases.git", - "reference": "22c6c85f94b34fefe6a92e5d1df2e1d61bd62d38" + "reference": "4471f5dc211931b847ac0bf88f78bd4fa9e3760d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/imdhemy/laravel-in-app-purchases/zipball/22c6c85f94b34fefe6a92e5d1df2e1d61bd62d38", - "reference": "22c6c85f94b34fefe6a92e5d1df2e1d61bd62d38", + "url": "https://api.github.com/repos/imdhemy/laravel-in-app-purchases/zipball/4471f5dc211931b847ac0bf88f78bd4fa9e3760d", + "reference": "4471f5dc211931b847ac0bf88f78bd4fa9e3760d", "shasum": "" }, "require": { "ext-json": "*", "ext-openssl": "*", "imdhemy/appstore-iap": "^1.6", - "imdhemy/google-play-billing": "^1.4", + "imdhemy/google-play-billing": "^1.5", "laravel/framework": ">=8.0", "php": ">=8.0" }, @@ -3741,7 +3741,7 @@ ], "support": { "issues": "https://github.com/imdhemy/laravel-in-app-purchases/issues", - "source": "https://github.com/imdhemy/laravel-in-app-purchases/tree/1.8.2" + "source": "https://github.com/imdhemy/laravel-in-app-purchases/tree/1.9.0" }, "funding": [ { @@ -3749,7 +3749,7 @@ "type": "github" } ], - "time": "2023-07-04T16:11:06+00:00" + "time": "2023-09-19T06:01:35+00:00" }, { "name": "intervention/image", @@ -4331,16 +4331,16 @@ }, { "name": "laravel/framework", - "version": "v10.23.1", + "version": "v10.24.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "dbfd495557678759153e8d71cc2f6027686ca51e" + "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/dbfd495557678759153e8d71cc2f6027686ca51e", - "reference": "dbfd495557678759153e8d71cc2f6027686ca51e", + "url": "https://api.github.com/repos/laravel/framework/zipball/bcebd0a4c015d5c38aeec299d355a42451dd3726", + "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726", "shasum": "" }, "require": { @@ -4527,20 +4527,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-09-13T14:51:46+00:00" + "time": "2023-09-19T15:25:04+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.7", + "version": "v0.1.8", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "554e7d855a22e87942753d68e23b327ad79b2070" + "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/554e7d855a22e87942753d68e23b327ad79b2070", - "reference": "554e7d855a22e87942753d68e23b327ad79b2070", + "url": "https://api.github.com/repos/laravel/prompts/zipball/68dcc65babf92e1fb43cba0b3f78fc3d8002709c", + "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c", "shasum": "" }, "require": { @@ -4573,9 +4573,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.7" + "source": "https://github.com/laravel/prompts/tree/v0.1.8" }, - "time": "2023-09-12T11:09:22+00:00" + "time": "2023-09-19T15:33:56+00:00" }, { "name": "laravel/serializable-closure", @@ -6573,16 +6573,16 @@ }, { "name": "nette/utils", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e" + "reference": "cead6637226456b35e1175cc53797dd585d85545" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/9124157137da01b1f5a5a22d6486cb975f26db7e", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", "shasum": "" }, "require": { @@ -6604,8 +6604,7 @@ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { @@ -6654,9 +6653,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.1" + "source": "https://github.com/nette/utils/tree/v4.0.2" }, - "time": "2023-07-30T15:42:21+00:00" + "time": "2023-09-19T11:58:07+00:00" }, { "name": "nikic/php-parser", @@ -15358,16 +15357,16 @@ }, { "name": "maximebf/debugbar", - "version": "v1.18.2", + "version": "v1.19.0", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "17dcf3f6ed112bb85a37cf13538fd8de49f5c274" + "reference": "30f65f18f7ac086255a77a079f8e0dcdd35e828e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/17dcf3f6ed112bb85a37cf13538fd8de49f5c274", - "reference": "17dcf3f6ed112bb85a37cf13538fd8de49f5c274", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30f65f18f7ac086255a77a079f8e0dcdd35e828e", + "reference": "30f65f18f7ac086255a77a079f8e0dcdd35e828e", "shasum": "" }, "require": { @@ -15418,9 +15417,9 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.18.2" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.0" }, - "time": "2023-02-04T15:27:00+00:00" + "time": "2023-09-19T19:53:10+00:00" }, { "name": "mockery/mockery", @@ -15568,37 +15567,37 @@ }, { "name": "nunomaduro/collision", - "version": "v7.8.1", + "version": "v7.9.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "61553ad3260845d7e3e49121b7074619233d361b" + "reference": "296d0cf9fe462837ac0da8a568b56fc026b132da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/61553ad3260845d7e3e49121b7074619233d361b", - "reference": "61553ad3260845d7e3e49121b7074619233d361b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/296d0cf9fe462837ac0da8a568b56fc026b132da", + "reference": "296d0cf9fe462837ac0da8a568b56fc026b132da", "shasum": "" }, "require": { "filp/whoops": "^2.15.3", "nunomaduro/termwind": "^1.15.1", "php": "^8.1.0", - "symfony/console": "^6.3.2" + "symfony/console": "^6.3.4" }, "require-dev": { - "brianium/paratest": "^7.2.4", - "laravel/framework": "^10.17.1", - "laravel/pint": "^1.10.5", - "laravel/sail": "^1.23.1", - "laravel/sanctum": "^3.2.5", - "laravel/tinker": "^2.8.1", + "brianium/paratest": "^7.2.7", + "laravel/framework": "^10.23.1", + "laravel/pint": "^1.13.1", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.5.9", - "pestphp/pest": "^2.12.1", - "phpunit/phpunit": "^10.3.1", + "orchestra/testbench-core": "^8.11.0", + "pestphp/pest": "^2.19.1", + "phpunit/phpunit": "^10.3.5", "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.2.0" + "spatie/laravel-ignition": "^2.3.0" }, "type": "library", "extra": { @@ -15657,7 +15656,7 @@ "type": "patreon" } ], - "time": "2023-08-07T08:03:21+00:00" + "time": "2023-09-19T10:45:09+00:00" }, { "name": "nunomaduro/larastan", @@ -15868,16 +15867,16 @@ }, { "name": "phpmyadmin/sql-parser", - "version": "5.8.1", + "version": "5.8.2", "source": { "type": "git", "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "b877ee6262a00f0f498da5e01335e8a5dc01d203" + "reference": "f1720ae19abe6294cb5599594a8a57bc3c8cc287" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/b877ee6262a00f0f498da5e01335e8a5dc01d203", - "reference": "b877ee6262a00f0f498da5e01335e8a5dc01d203", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/f1720ae19abe6294cb5599594a8a57bc3c8cc287", + "reference": "f1720ae19abe6294cb5599594a8a57bc3c8cc287", "shasum": "" }, "require": { @@ -15951,20 +15950,20 @@ "type": "other" } ], - "time": "2023-09-15T18:21:22+00:00" + "time": "2023-09-19T12:34:29+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.34", + "version": "1.10.35", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901" + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7f806b6f1403e6914c778140e2ba07c293cb4901", - "reference": "7f806b6f1403e6914c778140e2ba07c293cb4901", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", "shasum": "" }, "require": { @@ -16013,7 +16012,7 @@ "type": "tidelift" } ], - "time": "2023-09-13T09:49:47+00:00" + "time": "2023-09-19T15:27:56+00:00" }, { "name": "phpunit/php-code-coverage", @@ -16338,16 +16337,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.4", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b8d59476f19115c9774b3b447f78131781c6c32b" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b8d59476f19115c9774b3b447f78131781c6c32b", - "reference": "b8d59476f19115c9774b3b447f78131781c6c32b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -16371,7 +16370,7 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", + "sebastian/exporter": "^5.1", "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", @@ -16419,7 +16418,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -16435,7 +16434,7 @@ "type": "tidelift" } ], - "time": "2023-09-12T14:42:28+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "sebastian/cli-parser", @@ -17486,16 +17485,16 @@ }, { "name": "spatie/ignition", - "version": "1.10.1", + "version": "1.11.2", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "d92b9a081e99261179b63a858c7a4b01541e7dd1" + "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/d92b9a081e99261179b63a858c7a4b01541e7dd1", - "reference": "d92b9a081e99261179b63a858c7a4b01541e7dd1", + "url": "https://api.github.com/repos/spatie/ignition/zipball/48b23411ca4bfbc75c75dfc638b6b36159c375aa", + "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa", "shasum": "" }, "require": { @@ -17565,7 +17564,7 @@ "type": "github" } ], - "time": "2023-08-21T15:06:37+00:00" + "time": "2023-09-19T15:29:52+00:00" }, { "name": "spatie/laravel-ignition", diff --git a/resources/views/react/head.blade.php b/resources/views/react/head.blade.php index fc645e62d397..83e2176e969b 100644 --- a/resources/views/react/head.blade.php +++ b/resources/views/react/head.blade.php @@ -1,235 +1,235 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 76446c940295011e3b3544327ca9e00bd2584ae4 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 21 Sep 2023 20:44:16 +1000 Subject: [PATCH 011/109] Fixes for encoded entities --- app/Models/Design.php | 2 +- app/Services/PdfMaker/PdfMaker.php | 6 +++++- composer.json | 2 +- composer.lock | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Models/Design.php b/app/Models/Design.php index 1b0bf79a8347..32c677357464 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -68,7 +68,7 @@ class Design extends BaseModel 'name', 'design', 'is_active', - 'is_template', + // 'is_template', ]; public function company() diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index 00da860c3877..cf77c6acb532 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -85,7 +85,11 @@ class PdfMaker $loader = new \Twig\Loader\FilesystemLoader(storage_path()); $twig = new \Twig\Environment($loader); - $template = $twig->createTemplate($template); + + $string_extension = new \Twig\Extension\StringLoaderExtension(); + $twig->addExtension($string_extension); + + $template = $twig->createTemplate(html_entity_decode($template)); $template = $template->render($this->options); $f = $this->document->createDocumentFragment(); diff --git a/composer.json b/composer.json index 45d160ff2958..5520a24c5d38 100644 --- a/composer.json +++ b/composer.json @@ -94,7 +94,7 @@ "symfony/mailgun-mailer": "^6.1", "symfony/postmark-mailer": "^6.1", "turbo124/beacon": "^1.5", - "twig/twig": "^3.0", + "twig/twig": "^3", "twilio/sdk": "^6.40", "webpatser/laravel-countries": "dev-master#75992ad", "wepay/php-sdk": "^0.3", diff --git a/composer.lock b/composer.lock index e0e6996e1fc7..2ac417355fe4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a3cef8412df6b0cc9371807991ab699a", + "content-hash": "08bc4729962b495b68162a069269f74f", "packages": [ { "name": "adrienrn/php-mimetyper", From 65be91aa47b7f8fe7ec500786a4b0637bb33dd92 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 21 Sep 2023 23:32:34 +1000 Subject: [PATCH 012/109] Fixes for encoded entities --- app/Services/PdfMaker/PdfMaker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index cf77c6acb532..701222bf359e 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -114,14 +114,14 @@ class PdfMaker /** * Final method to get compiled HTML. * - * @param bool $final @deprecated // is it? i still see it being called elsewhere + * @param bool $final * @return mixed */ public function getCompiledHTML($final = false) { $html = $this->document->saveHTML(); - nlog($html); + // nlog($html); return str_replace('%24', '$', $html); } } From 78fe4c0b80c91e9347ac96413dc953bf6968d470 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 10:21:41 +1000 Subject: [PATCH 013/109] Add files --- ...010_add_template_flag_to_designs_table.php | 25 ++++ tests/Feature/Template/TemplateTest.php | 112 ++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php create mode 100644 tests/Feature/Template/TemplateTest.php diff --git a/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php new file mode 100644 index 000000000000..cc0d75c2d00a --- /dev/null +++ b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php @@ -0,0 +1,25 @@ +boolean('is_template')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + } +}; diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php new file mode 100644 index 000000000000..043d774790b6 --- /dev/null +++ b/tests/Feature/Template/TemplateTest.php @@ -0,0 +1,112 @@ +makeTestData(); + + $this->withoutMiddleware( + ThrottleRequests::class + ); + + } + + public function testTemplateGeneration() + { + $entity_obj = $this->invoice; + + $design = new Design(); + $design->design = json_decode(json_encode($this->invoice->company->settings->pdf_variables), true); + $design->name = 'test'; + $design->is_active = true; + $design->is_template = true; + $design->is_custom = true; + $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 = ''; + $design_object->product = ''; + $design_object->task = ''; + $design_object->footer = ''; + + $design->design = $design_object; + + $design->save(); + + App::forgetInstance('translator'); + $t = app('translator'); + App::setLocale($entity_obj->client->locale()); + $t->replace(Ninja::transformTranslations($entity_obj->client->getMergedSettings())); + + $html = new HtmlEngine($entity_obj->invitations()->first()); + + /** @var \App\Models\Design $design */ + $design = \App\Models\Design::withTrashed()->find($entity_obj->design_id); + + $options = [ + 'custom_partials' => json_decode(json_encode($design->design), true), + ]; + $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); + + $variables = $html->generateLabelsAndValues(); + + $state = [ + 'template' => $template->elements([ + 'client' => $entity_obj->client, + 'entity' => $entity_obj, + 'pdf_variables' => (array) $entity_obj->company->settings->pdf_variables, + '$product' => $design->design->product, + 'variables' => $variables, + ]), + 'variables' => $variables, + 'options' => [ + 'all_pages_header' => $entity_obj->client->getSetting('all_pages_header'), + 'all_pages_footer' => $entity_obj->client->getSetting('all_pages_footer'), + 'client' => $entity_obj->client, + 'entity' => $entity_obj, + 'variables' => $variables, + ], + 'process_markdown' => $entity_obj->client->company->markdown_enabled, + ]; + + $maker = new PdfMaker($state); + + + } +} \ No newline at end of file From 2e08fe1ff6763f35bda7203a87a2e3e987026d76 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 14:46:14 +1000 Subject: [PATCH 014/109] Persist template changes --- app/Factory/DesignFactory.php | 2 + app/Filters/DesignFilters.php | 11 ++++ app/Http/Controllers/DesignController.php | 11 +++- .../Requests/Design/StoreDesignRequest.php | 13 ++++- .../Requests/Design/UpdateDesignRequest.php | 5 +- app/Models/Design.php | 2 +- app/Transformers/DesignTransformer.php | 2 + ...010_add_template_flag_to_designs_table.php | 1 + tests/Feature/DesignApiTest.php | 55 +++++++++++++++++++ 9 files changed, 96 insertions(+), 6 deletions(-) diff --git a/app/Factory/DesignFactory.php b/app/Factory/DesignFactory.php index 0013e37d7ba3..b8b8fe2092ef 100644 --- a/app/Factory/DesignFactory.php +++ b/app/Factory/DesignFactory.php @@ -25,6 +25,8 @@ class DesignFactory $design->is_active = true; $design->is_custom = true; $design->name = ''; + $design->is_template = false; + $design->entities = ''; $design->design = new DesignBlocks(); return $design; diff --git a/app/Filters/DesignFilters.php b/app/Filters/DesignFilters.php index 88593f219845..0007a29d08f2 100644 --- a/app/Filters/DesignFilters.php +++ b/app/Filters/DesignFilters.php @@ -69,6 +69,17 @@ class DesignFilters extends QueryFilters }); } + public function template(string $template = 'false'): Builder + { + + if (strlen($template) == 0) { + return $this->builder; + } + + $bool_val = $template == 'true' ? true : false; + + return $this->builder->where('is_template', $bool_val); + } /** * Filter the designs by `is_custom` column. * diff --git a/app/Http/Controllers/DesignController.php b/app/Http/Controllers/DesignController.php index 3e97a8c609b1..9f537f6e447d 100644 --- a/app/Http/Controllers/DesignController.php +++ b/app/Http/Controllers/DesignController.php @@ -301,7 +301,10 @@ class DesignController extends BaseController */ public function create(CreateDesignRequest $request) { - $design = DesignFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $design = DesignFactory::create($user->company()->id, $user->id); return $this->itemResponse($design); } @@ -346,7 +349,11 @@ class DesignController extends BaseController */ public function store(StoreDesignRequest $request) { - $design = DesignFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $design = DesignFactory::create($user->company()->id, $user->id); + $design->fill($request->all()); $design->save(); diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index 2af551664c66..c1ab381badd1 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -23,20 +23,29 @@ class StoreDesignRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin() && auth()->user()->account->hasFeature(Account::FEATURE_API); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API); ; } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + return [ //'name' => 'required', - 'name' => 'required|unique:designs,name,null,null,company_id,'.auth()->user()->companyId(), + 'name' => 'required|unique:designs,name,null,null,company_id,'.$user->companyId(), 'design' => 'required|array', 'design.header' => 'required|min:1', 'design.body' => 'required|min:1', 'design.footer' => 'required|min:1', 'design.includes' => 'required|min:1', + 'is_template' => 'sometimes|boolean', + 'entities' => 'sometimes|string' ]; } diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index bae0d93d92cc..5e643562bf19 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -30,7 +30,10 @@ class UpdateDesignRequest extends Request public function rules() { - return []; + return [ + 'is_template' => 'sometimes|boolean', + 'entities' => 'sometimes|string' + ]; } public function prepareForValidation() diff --git a/app/Models/Design.php b/app/Models/Design.php index 32c677357464..1b0bf79a8347 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -68,7 +68,7 @@ class Design extends BaseModel 'name', 'design', 'is_active', - // 'is_template', + 'is_template', ]; public function company() diff --git a/app/Transformers/DesignTransformer.php b/app/Transformers/DesignTransformer.php index 3e8bd2c2f98a..371733ce85d4 100644 --- a/app/Transformers/DesignTransformer.php +++ b/app/Transformers/DesignTransformer.php @@ -54,6 +54,8 @@ class DesignTransformer extends EntityTransformer 'created_at' => (int) $design->created_at, 'is_deleted' => (bool) $design->is_deleted, 'is_free' => ($design->id <= 4) ? true : false, + 'is_template' => (bool) $design->is_template, + 'entities' => (string) $design->entities ?: '', ]; } } diff --git a/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php index cc0d75c2d00a..f8639253a0d3 100644 --- a/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php +++ b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php @@ -13,6 +13,7 @@ return new class extends Migration { Schema::table('designs', function (Blueprint $table) { $table->boolean('is_template')->default(false); + $table->text('entities')->nullable(); }); } diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index 1fa8bb9c2c1e..372bd1302291 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -14,6 +14,7 @@ namespace Tests\Feature; use Tests\TestCase; use App\Models\Design; use Tests\MockAccountData; +use App\Factory\DesignFactory; use App\Utils\Traits\MakesHash; use App\Events\Design\DesignWasCreated; use App\Events\Design\DesignWasDeleted; @@ -36,6 +37,8 @@ class DesignApiTest extends TestCase public $id; + public $faker; + protected function setUp() :void { parent::setUp(); @@ -49,6 +52,58 @@ class DesignApiTest extends TestCase Model::reguard(); } + public function testDesignTemplates() + { + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->save(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?template=true'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(1, $arr['data']); + } + + public function testDesignTemplatesExcluded() + { + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->save(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?template=false'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(11, $arr['data']); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(12, $arr['data']); + + + } + + public function testDesignPost() { From ad41e6dc9376d63644d22f30a3ad1bce60b56bb9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 16:14:25 +1000 Subject: [PATCH 015/109] template service --- .../Requests/Design/UpdateDesignRequest.php | 5 +- app/Services/Template/TemplateService.php | 235 ++++++++++++++++++ tests/Feature/Template/TemplateTest.php | 110 +++++++- 3 files changed, 342 insertions(+), 8 deletions(-) create mode 100644 app/Services/Template/TemplateService.php diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index 5e643562bf19..9c6c48fa510b 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -25,7 +25,10 @@ class UpdateDesignRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin(); } public function rules() diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php new file mode 100644 index 000000000000..8b4bfc07fd8d --- /dev/null +++ b/app/Services/Template/TemplateService.php @@ -0,0 +1,235 @@ +template = $template; + $this->init(); + } + + /** + * Boot Dom Document + * + * @return self + */ + private function init(): self + { + $this->document = new \DOMDocument(); + $this->document->validateOnParse = true; + + return $this; + } + + /** + * Iterate through all of the + * ninja nodes + * + * @param array $data - the payload to be passed into the template + * @return self + */ + private function build(array $data): self + { + $this->compose() + ->parseNinjaBlocks($data) + ->parseVariables(); + + return $this; + } + + public function getHtml(): string + { + return $this->compiled_html; + } + /** + * Parses all Ninja tags in the document + * + * @param array $data + * + * @return self + */ + private function parseNinjaBlocks(array $data): self + { + $data = $this->preProcessDataBlocks($data); + $replacements = []; + + $contents = $this->document->getElementsByTagName('ninja'); + + foreach ($contents as $content) { + + $template = $content->ownerDocument->saveHTML($content); + + $loader = new \Twig\Loader\FilesystemLoader(storage_path()); + $twig = new \Twig\Environment($loader); + + $string_extension = new \Twig\Extension\StringLoaderExtension(); + $twig->addExtension($string_extension); + + $template = $twig->createTemplate(html_entity_decode($template)); + $template = $template->render($data); + + $f = $this->document->createDocumentFragment(); + $f->appendXML($template); + $replacements[] = $f; + + } + + foreach($contents as $key => $content) { + $content->parentNode->replaceChild($replacements[$key], $content); + } + + $this->save(); + + return $this; + + } + + /** + * Parses all variables in the document + * + * @return self + */ + private function parseVariables(): self + { + $variables = $this->resolveHtmlEngine(); + + $html = strtr($this->getHtml(), $variables['labels']); + $html = strtr($html, $variables['values']); + + @$this->document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); + $this->save(); + + return $this; + } + + /** + * Saves the document and updates the compiled string. + * + * @return self + */ + private function save(): self + { + $this->compiled_html = str_replace('%24', '$', $this->document->saveHTML()); + + return $this; + } + + /** + * compose + * + * @return self + */ + private function compose(): self + { + $html = ''; + $html .= $this->template->design->includes; + $html .= $this->template->design->header; + $html .= $this->template->design->body; + $html .= $this->template->design->footer; + + @$this->document->loadHTML($html); + + return $this; + + } + + /** + * Resolves the labels and values needed to replace the string + * holders in the template. + * + * @return array + */ + private function resolveHtmlEngine(): array + { + + } + + private function preProcessDataBlocks($data): array + { + return collect($data)->map(function ($key, $value){ + + $processed[$key] = []; + + match ($key) { + 'invoices' => $processed[$key] = $this->processInvoices($value), + 'quotes' => $processed[$key] = $this->processQuotes($value), + 'credits' => $processed[$key] = $this->processCredits($value), + 'payments' => $processed[$key] = $this->processPayments($value), + 'tasks' => $processed[$key] = $this->processTasks($value), + 'projects' => $processed[$key] = $this->processProjects($value), + 'purchase_orders' => $processed[$key] = $this->processPurchaseOrders($value), + }; + + return $processed; + + })->toArray(); + } + + private function processInvoices($invoices): array + { + return $invoices->map(function ($invoice){ + + })->toArray(); + } + + private function processQuotes($quotes): array + { + return $quotes->map(function ($quote){ + + })->toArray(); + } + + private function processCredits($credits): array + { + return $credits->map(function ($credit){ + + })->toArray(); + } + + private function processPayments($payments): array + { + return $payments->map(function ($payment){ + + })->toArray(); + } + + private function processTasks($tasks): array + { + return $tasks->map(function ($task){ + + })->toArray(); + } + + private function processProjects($projects): array + { + return $projects->map(function ($project){ + + })->toArray(); + } + + private function processPurchaseOrders($purchase_orders): array + { + return $purchase_orders->map(function ($purchase_order){ + + })->toArray(); + } +} \ No newline at end of file diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 043d774790b6..688d20c9afb2 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -11,17 +11,20 @@ namespace Tests\Feature\Template; -use App\Models\Design; use Tests\TestCase; use App\Utils\Ninja; +use App\Models\Design; +use App\Models\Invoice; use App\Utils\HtmlEngine; use Tests\MockAccountData; use App\Services\PdfMaker\PdfMaker; use Illuminate\Support\Facades\App; -use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use App\Jobs\Entity\CreateEntityPdf; +use App\Services\PdfMaker\Design as DesignMaker; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -32,6 +35,36 @@ class TemplateTest extends TestCase use DatabaseTransactions; use MockAccountData; + private string $body = ' + + + $company.name + + + + + + + + + + + + {% for item in entity.line_items|filter(item => item.type_id == "1") %} + + + + + + + + {% endfor %} + +
Item #DescriptionOrderedDeliveredOutstanding
{{ item.product_key }}{{ item.notes }}{{ item.quantity }}{{ item.quantity }}0
+
+ + '; + protected function setUp() :void { parent::setUp(); @@ -44,6 +77,59 @@ class TemplateTest extends TestCase } + public function testTimingOnCleanDesign() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); + + $entity_obj = \App\Models\Invoice::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'status_id' => Invoice::STATUS_SENT, + 'design_id' => $replicated_design->id, + ]); + + $i = \App\Models\InvoiceInvitation::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'invoice_id' => $entity_obj->id, + 'client_contact_id' => $this->client->contacts->first()->id, + ]); + + $start = microtime(true); + + $pdf = (new CreateEntityPdf($i))->handle(); + + $end = microtime(true); + + $this->assertNotNull($pdf); + + nlog("Twig + PDF Gen Time: " . $end-$start); + + + } + + + public function testStaticPdfGeneration() + { + $start = microtime(true); + + $pdf = (new CreateEntityPdf($this->invoice->invitations->first()))->handle(); + + $end = microtime(true); + + $this->assertNotNull($pdf); + + nlog("Plain PDF Gen Time: " . $end-$start); + } + public function testTemplateGeneration() { $entity_obj = $this->invoice; @@ -60,7 +146,7 @@ class TemplateTest extends TestCase $design_object = new \stdClass; $design_object->includes = ''; $design_object->header = ''; - $design_object->body = ''; + $design_object->body = $this->body; $design_object->product = ''; $design_object->task = ''; $design_object->footer = ''; @@ -69,6 +155,8 @@ class TemplateTest extends TestCase $design->save(); + $start = microtime(true); + App::forgetInstance('translator'); $t = app('translator'); App::setLocale($entity_obj->client->locale()); @@ -76,9 +164,6 @@ class TemplateTest extends TestCase $html = new HtmlEngine($entity_obj->invitations()->first()); - /** @var \App\Models\Design $design */ - $design = \App\Models\Design::withTrashed()->find($entity_obj->design_id); - $options = [ 'custom_partials' => json_decode(json_encode($design->design), true), ]; @@ -106,7 +191,18 @@ class TemplateTest extends TestCase ]; $maker = new PdfMaker($state); + $maker + ->design($template) + ->build(); + $html = $maker->getCompiledHTML(true); + $end = microtime(true); + + $this->assertNotNull($html); + $this->assertStringContainsStringIgnoringCase($this->company->settings->name, $html); + + nlog("Twig Solo Gen Time: ". $end - $start); } + } \ No newline at end of file From c83e94d3afb94d4469d5b6f7b6a182b0338630f4 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 22:08:57 +1000 Subject: [PATCH 016/109] Working on template service --- app/Models/Design.php | 6 + app/Services/Template/TemplateService.php | 131 +++++++++++++++++----- tests/Feature/Template/TemplateTest.php | 17 +++ 3 files changed, 124 insertions(+), 30 deletions(-) diff --git a/app/Models/Design.php b/app/Models/Design.php index 1b0bf79a8347..e9aa7b3ab53a 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -11,6 +11,7 @@ namespace App\Models; +use App\Services\Template\TemplateService; use Illuminate\Database\Eloquent\SoftDeletes; /** @@ -75,4 +76,9 @@ class Design extends BaseModel { return $this->belongsTo(Company::class); } + + public function service(): TemplateService + { + return new TemplateService($this); + } } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 8b4bfc07fd8d..cb69f462fdf8 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -12,7 +12,9 @@ namespace App\Services\Template; use App\Models\Design; - +use App\Utils\VendorHtmlEngine; +use App\Utils\PaymentHtmlEngine; +use Illuminate\Database\Eloquent\Collection; class TemplateService { @@ -21,6 +23,30 @@ class TemplateService private string $compiled_html = ''; + private array $standard_excludes = [ + 'id', + 'client_id', + 'assigned_user_id', + 'project_id', + 'vendor_id', + 'design_id', + 'company_id', + 'recurring_id', + 'subscription_id' + ]; + + private array $purchase_excludes = [ + 'id', + 'vendor_id', + 'assigned_user_id', + 'project_id', + 'vendor_id', + 'design_id', + 'company_id', + 'recurring_id', + 'subscription_id' + ]; + public function __construct(public Design $template) { $this->template = $template; @@ -51,7 +77,7 @@ class TemplateService { $this->compose() ->parseNinjaBlocks($data) - ->parseVariables(); + ->parseVariables($data); return $this; } @@ -112,8 +138,10 @@ class TemplateService { $variables = $this->resolveHtmlEngine(); - $html = strtr($this->getHtml(), $variables['labels']); - $html = strtr($html, $variables['values']); + foreach($variables as $key => $variable) { + $html = strtr($this->getHtml(), $variable['labels']); + $html = strtr($html, $variable['values']); + } @$this->document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $this->save(); @@ -158,8 +186,25 @@ class TemplateService * * @return array */ - private function resolveHtmlEngine(): array + private function resolveHtmlEngine(array $data): array { + return collect($data)->map(function ($key, $value) { + + $processed[$key] = []; + + match ($key) { + 'invoices' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'quotes' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'credits' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'payments' => $processed[$key] = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), + 'tasks' => $processed[$key] = [], + 'projects' => $processed[$key] = [], + 'purchase_orders' => $processed[$key] = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + }; + + return $processed; + + })->toArray(); } @@ -184,52 +229,78 @@ class TemplateService })->toArray(); } - private function processInvoices($invoices): array + private function processInvoices($invoices): Collection { - return $invoices->map(function ($invoice){ - - })->toArray(); + return $invoices->makeHidden($this->standard_excludes); } - private function processQuotes($quotes): array + private function processQuotes($quotes): Collection { - return $quotes->map(function ($quote){ - - })->toArray(); + return $quotes->makeHidden($this->standard_excludes); + // return $quotes->map(function ($quote){ + // })->toArray(); } - private function processCredits($credits): array + private function processCredits($credits): Collection { - return $credits->map(function ($credit){ - - })->toArray(); + return $credits->makeHidden($this->standard_excludes); + // return $credits->map(function ($credit){ + // })->toArray(); } - private function processPayments($payments): array + private function processPayments($payments): Collection { - return $payments->map(function ($payment){ - - })->toArray(); + return $payments->makeHidden([ + 'id', + 'user_id', + 'assigned_user_id', + 'client_id', + 'company_id', + 'project_id', + 'vendor_id', + 'client_contact_id', + 'invitation_id', + 'company_gateway_id', + 'transaction_id', + ]); + // return $payments->map(function ($payment){ + // })->toArray(); } - private function processTasks($tasks): array + private function processTasks($tasks): Collection { - return $tasks->map(function ($task){ - - })->toArray(); + return $task->makeHidden([ + 'id', + 'user_id', + 'assigned_user_id', + 'client_id', + 'company_id', + 'project_id', + 'invoice_id' + ]); + // return $tasks->map(function ($task){ + // })->toArray(); } - private function processProjects($projects): array + private function processProjects($projects): Collection { - return $projects->map(function ($project){ + return $projects->makeHidden([ + 'id', + 'client_id', + 'company_id', + 'user_id', + 'assigned_user_id', + ]); - })->toArray(); + // return $projects->map(function ($project){ + // })->toArray(); } private function processPurchaseOrders($purchase_orders): array { - return $purchase_orders->map(function ($purchase_order){ + return $projects->makeHidden($this->purchase_excludes); - })->toArray(); + // return $purchase_orders->map(function ($purchase_order){ + // })->toArray(); } } \ No newline at end of file diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 688d20c9afb2..490fd0440090 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -23,6 +23,7 @@ use App\Jobs\Entity\CreateEntityPdf; use App\Services\PdfMaker\Design as DesignMaker; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; +use App\Services\Template\TemplateService; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -77,6 +78,22 @@ class TemplateTest extends TestCase } + public function testTemplateService() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); + + + $this->assertNotNull($replicated_design->service()); + $this->assertInstanceOf(TemplateService::class, $replicated_design->service()); + } + public function testTimingOnCleanDesign() { $design_model = Design::find(2); From dc871af5eb0bfa32d6a86a14727ef41710ffcd14 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 22:35:43 +1000 Subject: [PATCH 017/109] Template Service --- app/Services/Template/TemplateService.php | 65 ++++++++++++----------- tests/Feature/Template/TemplateTest.php | 24 ++++++++- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index cb69f462fdf8..1fac26132e13 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -12,9 +12,10 @@ namespace App\Services\Template; use App\Models\Design; +use App\Utils\HtmlEngine; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; -use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Collection; class TemplateService { @@ -46,7 +47,7 @@ class TemplateService 'recurring_id', 'subscription_id' ]; - + public function __construct(public Design $template) { $this->template = $template; @@ -73,7 +74,7 @@ class TemplateService * @param array $data - the payload to be passed into the template * @return self */ - private function build(array $data): self + public function build(array $data): self { $this->compose() ->parseNinjaBlocks($data) @@ -97,7 +98,7 @@ class TemplateService { $data = $this->preProcessDataBlocks($data); $replacements = []; - +nlog($data); $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { @@ -131,15 +132,17 @@ class TemplateService /** * Parses all variables in the document - * + * @param array $data * @return self */ - private function parseVariables(): self + private function parseVariables(array $data): self { - $variables = $this->resolveHtmlEngine(); + $variables = $this->resolveHtmlEngine($data); + + $html = $this->getHtml(); foreach($variables as $key => $variable) { - $html = strtr($this->getHtml(), $variable['labels']); + $html = strtr($html, $variable['labels']); $html = strtr($html, $variable['values']); } @@ -188,18 +191,18 @@ class TemplateService */ private function resolveHtmlEngine(array $data): array { - return collect($data)->map(function ($key, $value) { - - $processed[$key] = []; + return collect($data)->map(function ($value, $key) { + + $processed = []; match ($key) { - 'invoices' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'quotes' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'credits' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'payments' => $processed[$key] = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), - 'tasks' => $processed[$key] = [], - 'projects' => $processed[$key] = [], - 'purchase_orders' => $processed[$key] = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'payments' => $processed = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), + 'tasks' => $processed = [], + 'projects' => $processed = [], + 'purchase_orders' => $processed = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), }; return $processed; @@ -210,18 +213,18 @@ class TemplateService private function preProcessDataBlocks($data): array { - return collect($data)->map(function ($key, $value){ + return collect($data)->map(function ($value, $key){ - $processed[$key] = []; + $processed = []; match ($key) { - 'invoices' => $processed[$key] = $this->processInvoices($value), - 'quotes' => $processed[$key] = $this->processQuotes($value), - 'credits' => $processed[$key] = $this->processCredits($value), - 'payments' => $processed[$key] = $this->processPayments($value), - 'tasks' => $processed[$key] = $this->processTasks($value), - 'projects' => $processed[$key] = $this->processProjects($value), - 'purchase_orders' => $processed[$key] = $this->processPurchaseOrders($value), + 'invoices' => $processed = $this->processInvoices($value), + 'quotes' => $processed = $this->processQuotes($value), + 'credits' => $processed = $this->processCredits($value), + 'payments' => $processed = $this->processPayments($value), + 'tasks' => $processed = $this->processTasks($value), + 'projects' => $processed = $this->processProjects($value), + 'purchase_orders' => $processed = $this->processPurchaseOrders($value), }; return $processed; @@ -231,7 +234,9 @@ class TemplateService private function processInvoices($invoices): Collection { - return $invoices->makeHidden($this->standard_excludes); + return $invoices->map(function($invoice){ + return $invoice->makeHidden($this->standard_excludes); + }); } private function processQuotes($quotes): Collection @@ -269,7 +274,7 @@ class TemplateService private function processTasks($tasks): Collection { - return $task->makeHidden([ + return $tasks->makeHidden([ 'id', 'user_id', 'assigned_user_id', @@ -298,7 +303,7 @@ class TemplateService private function processPurchaseOrders($purchase_orders): array { - return $projects->makeHidden($this->purchase_excludes); + return $purchase_orders->makeHidden($this->purchase_excludes); // return $purchase_orders->map(function ($purchase_order){ // })->toArray(); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 490fd0440090..b2dc89d61540 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -20,7 +20,6 @@ use Tests\MockAccountData; use App\Services\PdfMaker\PdfMaker; use Illuminate\Support\Facades\App; use App\Jobs\Entity\CreateEntityPdf; -use App\Services\PdfMaker\Design as DesignMaker; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\Template\TemplateService; @@ -51,6 +50,7 @@ class TemplateTest extends TestCase + {% for entity in invoices %} {% for item in entity.line_items|filter(item => item.type_id == "1") %} {{ item.product_key }} @@ -60,6 +60,7 @@ class TemplateTest extends TestCase 0 {% endfor %} + {% endfor %} @@ -78,7 +79,7 @@ class TemplateTest extends TestCase } - public function testTemplateService() + public function testTemplateServiceBuild() { $design_model = Design::find(2); @@ -89,6 +90,25 @@ class TemplateTest extends TestCase $replicated_design->is_custom = true; $replicated_design->save(); + $data = []; + $data['invoices'] = collect([$this->invoice]); + + $ts = $replicated_design->service()->build($data); + + nlog($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); + } + + public function testTemplateService() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); $this->assertNotNull($replicated_design->service()); $this->assertInstanceOf(TemplateService::class, $replicated_design->service()); From 91bd2e18f5873d201163248510f4553407cc9e63 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 23:31:12 +1000 Subject: [PATCH 018/109] Template Service --- app/Services/Template/TemplateService.php | 113 +++++++++++++--------- tests/Feature/Template/TemplateTest.php | 36 ++++++- 2 files changed, 98 insertions(+), 51 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 1fac26132e13..7640713dde94 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,11 +11,27 @@ namespace App\Services\Template; +use App\Models\Task; +use App\Models\Quote; +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 League\Fractal\Manager; +use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; use Illuminate\Support\Collection; +use App\Transformers\TaskTransformer; +use App\Transformers\QuoteTransformer; +use App\Transformers\CreditTransformer; +use App\Transformers\InvoiceTransformer; +use App\Transformers\PaymentTransformer; +use App\Transformers\ProjectTransformer; +use App\Transformers\PurchaseOrderTransformer; +use League\Fractal\Serializer\ArraySerializer; class TemplateService { @@ -232,80 +248,81 @@ nlog($data); })->toArray(); } - private function processInvoices($invoices): Collection + private function processInvoices($invoices): array { - return $invoices->map(function($invoice){ - return $invoice->makeHidden($this->standard_excludes); - }); + $it = new InvoiceTransformer(); + $it->setDefaultIncludes(['client']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($invoices, $it, Invoice::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; } private function processQuotes($quotes): Collection { - return $quotes->makeHidden($this->standard_excludes); - // return $quotes->map(function ($quote){ - // })->toArray(); + $it = new QuoteTransformer(); + $it->setDefaultIncludes(['client']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($quotes, $it, Quote::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; + } private function processCredits($credits): Collection { - return $credits->makeHidden($this->standard_excludes); - // return $credits->map(function ($credit){ - // })->toArray(); + $it = new CreditTransformer(); + $it->setDefaultIncludes(['client']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($credits, $it, Credit::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; + } private function processPayments($payments): Collection { - return $payments->makeHidden([ - 'id', - 'user_id', - 'assigned_user_id', - 'client_id', - 'company_id', - 'project_id', - 'vendor_id', - 'client_contact_id', - 'invitation_id', - 'company_gateway_id', - 'transaction_id', - ]); - // return $payments->map(function ($payment){ - // })->toArray(); + $it = new PaymentTransformer(); + $it->setDefaultIncludes(['client','invoices','paymentables']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($payments, $it, Payment::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; + } private function processTasks($tasks): Collection { - return $tasks->makeHidden([ - 'id', - 'user_id', - 'assigned_user_id', - 'client_id', - 'company_id', - 'project_id', - 'invoice_id' - ]); - // return $tasks->map(function ($task){ - // })->toArray(); + $it = new TaskTransformer(); + $it->setDefaultIncludes(['client','tasks','project','invoice']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($tasks, $it, Task::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; + } private function processProjects($projects): Collection { - return $projects->makeHidden([ - 'id', - 'client_id', - 'company_id', - 'user_id', - 'assigned_user_id', - ]); - // return $projects->map(function ($project){ - // })->toArray(); + $it = new ProjectTransformer(); + $it->setDefaultIncludes(['client','tasks']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($projects, $it, Project::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; + } private function processPurchaseOrders($purchase_orders): array { - return $purchase_orders->makeHidden($this->purchase_excludes); + + $it = new PurchaseOrderTransformer(); + $it->setDefaultIncludes(['vendor','expense']); + $manager = new Manager(); + $resource = new \League\Fractal\Resource\Collection($purchase_orders, $it, PurchaseOrder::class); + $i = $manager->createData($resource)->toArray(); + return $i['data']; - // return $purchase_orders->map(function ($purchase_order){ - // })->toArray(); } } \ No newline at end of file diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index b2dc89d61540..dbd4e6bd02fa 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -79,6 +79,37 @@ class TemplateTest extends TestCase } + public function testDoubleEntityTemplateServiceBuild() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); + + $i2 = Invoice::factory() + ->for($this->client) + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'status_id' => Invoice::STATUS_SENT, + 'design_id' => $replicated_design->id, + 'balance' => 100, + ]); + + $data = []; + $data['invoices'] = collect([$this->invoice, $i2]); + + $ts = $replicated_design->service()->build($data); + + // nlog("results = "); + // nlog($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); + } + public function testTemplateServiceBuild() { $design_model = Design::find(2); @@ -95,7 +126,8 @@ class TemplateTest extends TestCase $ts = $replicated_design->service()->build($data); - nlog($ts->getHtml()); + // nlog("results = "); + // nlog($ts->getHtml()); $this->assertNotNull($ts->getHtml()); } @@ -150,10 +182,8 @@ class TemplateTest extends TestCase nlog("Twig + PDF Gen Time: " . $end-$start); - } - public function testStaticPdfGeneration() { $start = microtime(true); From 1ad4c10538227bbb459ca5428cd506445f17ccbc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 23:59:03 +1000 Subject: [PATCH 019/109] Template Service --- app/Services/Template/TemplateService.php | 28 ++-------- tests/Feature/Template/TemplateTest.php | 65 +++++++++++++++++++++++ 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 7640713dde94..d2dbd94e688d 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -32,6 +32,7 @@ use App\Transformers\PaymentTransformer; use App\Transformers\ProjectTransformer; use App\Transformers\PurchaseOrderTransformer; use League\Fractal\Serializer\ArraySerializer; +use League\Fractal\Serializer\JsonApiSerializer; class TemplateService { @@ -40,30 +41,6 @@ class TemplateService private string $compiled_html = ''; - private array $standard_excludes = [ - 'id', - 'client_id', - 'assigned_user_id', - 'project_id', - 'vendor_id', - 'design_id', - 'company_id', - 'recurring_id', - 'subscription_id' - ]; - - private array $purchase_excludes = [ - 'id', - 'vendor_id', - 'assigned_user_id', - 'project_id', - 'vendor_id', - 'design_id', - 'company_id', - 'recurring_id', - 'subscription_id' - ]; - public function __construct(public Design $template) { $this->template = $template; @@ -114,7 +91,7 @@ class TemplateService { $data = $this->preProcessDataBlocks($data); $replacements = []; -nlog($data); + $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { @@ -253,6 +230,7 @@ nlog($data); $it = new InvoiceTransformer(); $it->setDefaultIncludes(['client']); $manager = new Manager(); + // $manager->setSerializer(new JsonApiSerializer()); $resource = new \League\Fractal\Resource\Collection($invoices, $it, Invoice::class); $i = $manager->createData($resource)->toArray(); return $i['data']; diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index dbd4e6bd02fa..aa391d69d747 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -67,6 +67,40 @@ class TemplateTest extends TestCase '; + private string $nested_body = ' + + + $company.name + + + + + + + + + + + + {% for entity in invoices %} + Client Name: {{ entity.client.name }} + Client Name with variables = $client.name + {% for item in entity.line_items|filter(item => item.type_id == "1") %} + + + + + + + + {% endfor %} + {% endfor %} + +
Item #DescriptionOrderedDeliveredOutstanding
{{ item.product_key }}{{ item.notes }}{{ item.quantity }}{{ item.quantity }}0
+
+ + '; + protected function setUp() :void { parent::setUp(); @@ -79,6 +113,37 @@ class TemplateTest extends TestCase } + public function testDoubleEntityNestedDataTemplateServiceBuild() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->nested_body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); + + $i2 = Invoice::factory() + ->for($this->client) + ->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'status_id' => Invoice::STATUS_SENT, + 'design_id' => $replicated_design->id, + 'balance' => 100, + ]); + + $data = []; + $data['invoices'] = collect([$this->invoice, $i2]); + + $ts = $replicated_design->service()->build($data); + + nlog("results = "); + nlog($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); + } + public function testDoubleEntityTemplateServiceBuild() { $design_model = Design::find(2); From 18d0a3938603df8b5671f7bf818775e059229511 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 24 Sep 2023 14:54:24 +1000 Subject: [PATCH 020/109] Fixes for reminders with partial due dates --- app/Http/Controllers/PreviewController.php | 4 +- .../Requests/Invoice/StoreInvoiceRequest.php | 2 + .../Requests/Invoice/UpdateInvoiceRequest.php | 2 + app/Repositories/PaymentRepository.php | 3 - app/Services/Invoice/ApplyPayment.php | 15 +- app/Services/Invoice/ApplyPaymentAmount.php | 23 +- app/Services/Invoice/InvoiceService.php | 25 ++ app/Services/Invoice/UpdateReminder.php | 61 +++-- app/Services/Payment/UpdateInvoicePayment.php | 20 +- composer.lock | 230 +++++++----------- tests/Feature/ReminderTest.php | 94 +++++-- 11 files changed, 285 insertions(+), 194 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index dad299106c93..fb100b9dd12c 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -497,8 +497,8 @@ class PreviewController extends BaseController 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $invoice->client->company->markdown_enabled, 'options' => [ - 'client' => $invitation->invoice->client, - 'entity' => $invitation->invoice, + 'client' => $invoice->client, + 'entity' => $invoice, ] ]; diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 10ab3a1765db..bdcd35017781 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -73,6 +73,8 @@ class StoreInvoiceRequest extends Request $rules['tax_name2'] = 'bail|sometimes|string|nullable'; $rules['tax_name3'] = 'bail|sometimes|string|nullable'; $rules['exchange_rate'] = 'bail|sometimes|numeric'; + $rules['partial'] = 'bail|sometimes|nullable|numeric'; + $rules['partial_due_date'] = 'bail|sometimes|required_if:partial,>0|date'; return $rules; } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 859924029a44..eef95d02cfc2 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -76,6 +76,8 @@ class UpdateInvoiceRequest extends Request $rules['tax_name3'] = 'bail|sometimes|string|nullable'; $rules['status_id'] = 'bail|sometimes|not_in:5'; //do not allow cancelled invoices to be modfified. $rules['exchange_rate'] = 'bail|sometimes|numeric'; + $rules['partial'] = 'bail|sometimes|nullable|numeric'; + $rules['partial_due_date'] = 'bail|sometimes|required_if:partial,>0|date'; return $rules; } diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index f11a6f3cebd6..49e5d0349865 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -139,11 +139,8 @@ class PaymentRepository extends BaseRepository $invoices = Invoice::withTrashed()->whereIn('id', array_column($data['invoices'], 'invoice_id'))->get(); - // $payment->invoices()->saveMany($invoices); //25-06-2023 - //todo optimize this into a single query foreach ($data['invoices'] as $paid_invoice) { - // $invoice = Invoice::withTrashed()->whereId($paid_invoice['invoice_id'])->first(); $invoice = $invoices->firstWhere('id', $paid_invoice['invoice_id']); if ($invoice) { diff --git a/app/Services/Invoice/ApplyPayment.php b/app/Services/Invoice/ApplyPayment.php index de4e5791b594..1b87d7214ec3 100644 --- a/app/Services/Invoice/ApplyPayment.php +++ b/app/Services/Invoice/ApplyPayment.php @@ -47,8 +47,17 @@ class ApplyPayment extends AbstractService $amount_paid = $this->payment_amount * -1; - $this->invoice->service()->clearPartial()->setDueDate()->setStatus(Invoice::STATUS_PARTIAL)->updateBalance($amount_paid)->save(); + $this->invoice + ->service() + ->clearPartial() + ->setDueDate() + ->setStatus(Invoice::STATUS_PARTIAL) + ->updateBalance($amount_paid) + ->save(); } + + $this->invoice->service()->checkReminderStatus()->save(); + } else { if ($this->payment_amount == $this->invoice->balance) { $amount_paid = $this->payment_amount * -1; @@ -84,9 +93,6 @@ class ApplyPayment extends AbstractService /* Update Pivot Record amount */ $this->payment->invoices->each(function ($inv) use ($amount_paid) { if ($inv->id == $this->invoice->id) { - // $inv->pivot->amount = ($amount_paid * -1); - // $inv->pivot->save(); - //25-06-2023 $inv->paid_to_date += floatval($amount_paid * -1); $inv->save(); } @@ -96,7 +102,6 @@ class ApplyPayment extends AbstractService ->service() ->applyNumber() ->workFlow() - // ->deletePdf() ->save(); return $this->invoice; diff --git a/app/Services/Invoice/ApplyPaymentAmount.php b/app/Services/Invoice/ApplyPaymentAmount.php index f075a3992b28..b200148538ab 100644 --- a/app/Services/Invoice/ApplyPaymentAmount.php +++ b/app/Services/Invoice/ApplyPaymentAmount.php @@ -31,7 +31,7 @@ class ApplyPaymentAmount extends AbstractService } public function run() - { + {nlog("apply payment amount"); if ($this->invoice->status_id == Invoice::STATUS_DRAFT) { $this->invoice = $this->invoice->service()->markSent()->save(); } @@ -65,15 +65,28 @@ class ApplyPaymentAmount extends AbstractService 'amount' => $payment->amount, ]); - $this->invoice->next_send_date = null; - $this->invoice->service() + $has_partial = $this->invoice->hasPartial(); + + $invoice_service = $this->invoice->service() ->setExchangeRate() ->updateBalance($payment->amount * -1) ->updatePaidToDate($payment->amount) ->setCalculatedStatus() - ->applyNumber() - ->save(); + ->applyNumber(); + + nlog("check for partials"); + + if ($has_partial) { + nlog("has partial"); + $invoice_service->checkReminderStatus(); + } + + if($this->invoice->balance == 0){ + $this->invoice->next_send_date = null; + } + + $this->invoice = $invoice_service->save(); $this->invoice ->client diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 1122683a7735..a42009c1246e 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -290,6 +290,31 @@ class InvoiceService return $this; } + + /** + * Reset the reminders if only the + * partial has been paid. + * + * We can _ONLY_ call this _IF_ a partial + * amount has been paid, otherwise we end up wiping + * all reminders regardless + * + * @return self + */ + public function checkReminderStatus(): self + { + + if($this->invoice->partial == 0 && $this->invoice->balance > 0) + { + $this->invoice->reminder1_sent = null; + $this->invoice->reminder2_sent = null; + $this->invoice->reminder3_sent = null; + + $this->setReminder(); + } + + return $this; + } public function setReminder($settings = null) { diff --git a/app/Services/Invoice/UpdateReminder.php b/app/Services/Invoice/UpdateReminder.php index f552fb141e85..43768b7cb1f9 100644 --- a/app/Services/Invoice/UpdateReminder.php +++ b/app/Services/Invoice/UpdateReminder.php @@ -49,27 +49,32 @@ class UpdateReminder extends AbstractService $this->settings->schedule_reminder1 == 'after_invoice_date') { $reminder_date = Carbon::parse($this->invoice->date)->startOfDay()->addDays($this->settings->num_days_reminder1); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder1_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder1 == 'before_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->subDays($this->settings->num_days_reminder1); + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder1); +// nlog("1. {$reminder_date->format('Y-m-d')}"); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder1_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder1 == 'after_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->addDays($this->settings->num_days_reminder1); + + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder1); +// nlog("2. {$reminder_date->format('Y-m-d')}"); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } @@ -78,27 +83,33 @@ class UpdateReminder extends AbstractService $this->settings->schedule_reminder2 == 'after_invoice_date') { $reminder_date = Carbon::parse($this->invoice->date)->startOfDay()->addDays($this->settings->num_days_reminder2); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder2_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder2 == 'before_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->subDays($this->settings->num_days_reminder2); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder2); +// nlog("3. {$reminder_date->format('Y-m-d')}"); + + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder2_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder2 == 'after_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->addDays($this->settings->num_days_reminder2); + + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder2); +// nlog("4. {$reminder_date->format('Y-m-d')}"); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } @@ -107,27 +118,33 @@ class UpdateReminder extends AbstractService $this->settings->schedule_reminder3 == 'after_invoice_date') { $reminder_date = Carbon::parse($this->invoice->date)->startOfDay()->addDays($this->settings->num_days_reminder3); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder3_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder3 == 'before_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->subDays($this->settings->num_days_reminder3); + + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder3); +// nlog("5. {$reminder_date->format('Y-m-d')}"); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } if (is_null($this->invoice->reminder3_sent) && - $this->invoice->due_date && + ($this->invoice->partial_due_date || $this->invoice->due_date) && $this->settings->schedule_reminder3 == 'after_due_date') { - $reminder_date = Carbon::parse($this->invoice->due_date)->startOfDay()->addDays($this->settings->num_days_reminder3); + + $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; + $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder3); +// nlog("6. {$reminder_date->format('Y-m-d')}"); - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } @@ -140,7 +157,7 @@ class UpdateReminder extends AbstractService $reminder_date = $this->addTimeInterval($this->invoice->last_sent_date, (int) $this->settings->endless_reminder_frequency_id); if ($reminder_date) { - if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))) { + if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); } } diff --git a/app/Services/Payment/UpdateInvoicePayment.php b/app/Services/Payment/UpdateInvoicePayment.php index 10243007fc70..4f123701ac43 100644 --- a/app/Services/Payment/UpdateInvoicePayment.php +++ b/app/Services/Payment/UpdateInvoicePayment.php @@ -55,6 +55,8 @@ class UpdateInvoicePayment $invoice->restore(); } + // $has_partial = $invoice->hasPartial(); + if ($invoice->id == $this->payment_hash->fee_invoice_id) { $paid_amount = $paid_invoice->amount + $this->payment_hash->fee_total; } else { @@ -63,6 +65,8 @@ class UpdateInvoicePayment $client->service()->updatePaidToDate($paid_amount); //always use the payment->amount + $has_partial = $invoice->hasPartial(); + /* Need to determine here is we have an OVER payment - if YES only apply the max invoice amount */ if ($paid_amount > $invoice->partial && $paid_amount > $invoice->balance) { $paid_amount = $invoice->balance; @@ -76,12 +80,16 @@ class UpdateInvoicePayment $invoice->paid_to_date += $paid_amount; $invoice->save(); - $invoice = $invoice->service() - ->clearPartial() - ->updateStatus() - // ->deletePdf() - ->workFlow() - ->save(); + $invoice_service = $invoice->service() + ->clearPartial() + ->updateStatus() + ->workFlow(); + + if ($has_partial) { + $invoice_service->checkReminderStatus(); + } + + $invoice = $invoice_service->save(); if ($invoice->is_proforma) { //keep proforma's hidden diff --git a/composer.lock b/composer.lock index 2ac417355fe4..f798b135c2d2 100644 --- a/composer.lock +++ b/composer.lock @@ -6,46 +6,6 @@ ], "content-hash": "08bc4729962b495b68162a069269f74f", "packages": [ - { - "name": "adrienrn/php-mimetyper", - "version": "0.2.2", - "source": { - "type": "git", - "url": "https://github.com/adrienrn/php-mimetyper.git", - "reference": "702e00a604b4baed34d69730ce055e05c0f43932" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/adrienrn/php-mimetyper/zipball/702e00a604b4baed34d69730ce055e05c0f43932", - "reference": "702e00a604b4baed34d69730ce055e05c0f43932", - "shasum": "" - }, - "require": { - "dflydev/apache-mime-types": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "MimeTyper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Hussard", - "email": "adrien.ricartnoblet@gmail.com" - } - ], - "description": "PHP mime type and extension mapping library: compatible with Symfony, powered by jshttp/mime-db", - "support": { - "issues": "https://github.com/adrienrn/php-mimetyper/issues", - "source": "https://github.com/adrienrn/php-mimetyper/tree/0.2.2" - }, - "time": "2018-09-27T09:45:05+00:00" - }, { "name": "afosto/yaac", "version": "v1.5.2", @@ -525,16 +485,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.11", + "version": "3.281.12", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "9d466efae67d5016ed132fd4ffa1566a7d4cab98" + "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9d466efae67d5016ed132fd4ffa1566a7d4cab98", - "reference": "9d466efae67d5016ed132fd4ffa1566a7d4cab98", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/22a92f08758db2b152843ea0875eeee5a467d8ff", + "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff", "shasum": "" }, "require": { @@ -614,9 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.11" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.12" }, - "time": "2023-09-20T19:16:24+00:00" + "time": "2023-09-22T18:12:27+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1147,65 +1107,6 @@ }, "time": "2023-08-25T16:18:39+00:00" }, - { - "name": "dflydev/apache-mime-types", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-apache-mime-types.git", - "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-apache-mime-types/zipball/f30a57e59b7476e4c5270b6a0727d79c9c0eb861", - "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "twig/twig": "1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Dflydev\\ApacheMimeTypes": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - } - ], - "description": "Apache MIME Types", - "keywords": [ - "apache", - "mime", - "mimetypes" - ], - "support": { - "issues": "https://github.com/dflydev/dflydev-apache-mime-types/issues", - "source": "https://github.com/dflydev/dflydev-apache-mime-types/tree/v1.0.1" - }, - "time": "2013-05-14T02:02:01+00:00" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.2", @@ -1452,16 +1353,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.6", + "version": "3.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "63646ffd71d1676d2f747f871be31b7e921c7864" + "reference": "8e0e268052b4a8974cb00215bb2892787021614f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864", - "reference": "63646ffd71d1676d2f747f871be31b7e921c7864", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/8e0e268052b4a8974cb00215bb2892787021614f", + "reference": "8e0e268052b4a8974cb00215bb2892787021614f", "shasum": "" }, "require": { @@ -1477,9 +1378,9 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.29", + "phpstan/phpstan": "1.10.34", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.9", + "phpunit/phpunit": "9.6.12", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", @@ -1545,7 +1446,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.6" + "source": "https://github.com/doctrine/dbal/tree/3.6.7" }, "funding": [ { @@ -1561,7 +1462,7 @@ "type": "tidelift" } ], - "time": "2023-08-17T05:38:17+00:00" + "time": "2023-09-19T20:15:41+00:00" }, { "name": "doctrine/deprecations", @@ -3385,6 +3286,61 @@ }, "time": "2023-08-14T19:20:53+00:00" }, + { + "name": "horstoeko/mimedb", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/horstoeko/mimedb.git", + "reference": "2790b61cbff7f94ae8f40565761b15beb7792fcb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/horstoeko/mimedb/zipball/2790b61cbff7f94ae8f40565761b15beb7792fcb", + "reference": "2790b61cbff7f94ae8f40565761b15beb7792fcb", + "shasum": "" + }, + "require": { + "php": "^7.3|^7.4|^8.0|^8.1|^8.2|^8.3" + }, + "require-dev": { + "pdepend/pdepend": "^2", + "phploc/phploc": "^7", + "phpmd/phpmd": "^2", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9", + "sebastian/phpcpd": "^6", + "squizlabs/php_codesniffer": "^3" + }, + "type": "package", + "autoload": { + "psr-4": { + "horstoeko\\mimedb\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Erling", + "email": "daniel@erling.com.de", + "role": "lead" + } + ], + "description": "Get mimetypes by fileextensions and visa versa", + "homepage": "https://github.com/horstoeko/mimedb", + "keywords": [ + "file extension", + "mimetype" + ], + "support": { + "issues": "https://github.com/horstoeko/mimedb/issues", + "source": "https://github.com/horstoeko/mimedb/tree/v1.0.5" + }, + "time": "2023-09-22T20:17:48+00:00" + }, { "name": "horstoeko/stringmanagement", "version": "v1.0.11", @@ -3441,22 +3397,22 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.28", + "version": "v1.0.29", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "be78b1b53a46e94a69b92dcff1e909180170583c" + "reference": "9fb81e2e9a16d10bec8bf655484aae11bdca1997" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/be78b1b53a46e94a69b92dcff1e909180170583c", - "reference": "be78b1b53a46e94a69b92dcff1e909180170583c", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/9fb81e2e9a16d10bec8bf655484aae11bdca1997", + "reference": "9fb81e2e9a16d10bec8bf655484aae11bdca1997", "shasum": "" }, "require": { - "adrienrn/php-mimetyper": "^0.2", "ext-simplexml": "*", "goetas-webservices/xsd2php-runtime": "^0.2.13", + "horstoeko/mimedb": "^1", "horstoeko/stringmanagement": "^1", "jms/serializer": "^3", "php": "^7.3|^7.4|^8.0|^8.1", @@ -3508,9 +3464,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.28" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.29" }, - "time": "2023-09-12T14:54:01+00:00" + "time": "2023-09-23T06:15:04+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -5227,16 +5183,16 @@ }, { "name": "league/csv", - "version": "9.10.0", + "version": "9.11.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c" + "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/d24b0d484812313b07ab74b0fe4db9661606df6c", - "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/33149c4bea4949aa4fa3d03fb11ed28682168b39", + "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39", "shasum": "" }, "require": { @@ -5311,7 +5267,7 @@ "type": "github" } ], - "time": "2023-08-04T15:12:48+00:00" + "time": "2023-09-23T10:09:54+00:00" }, { "name": "league/flysystem", @@ -8531,16 +8487,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -8577,9 +8533,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -15152,16 +15108,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.27.0", + "version": "v3.28.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6" + "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6", - "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/113e09fea3d2306319ffaa2423fe3de768b28cff", + "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff", "shasum": "" }, "require": { @@ -15235,7 +15191,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.28.0" }, "funding": [ { @@ -15243,7 +15199,7 @@ "type": "github" } ], - "time": "2023-09-17T14:37:54+00:00" + "time": "2023-09-22T20:43:40+00:00" }, { "name": "hamcrest/hamcrest-php", diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index ca4265d2ebc1..f963a048628e 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -158,6 +158,82 @@ class ReminderTest extends TestCase } + public function testPartialDueDateReminder() + { + + $settings = $this->company->settings; + $settings->enable_reminder1 = true; + $settings->schedule_reminder1 = 'before_due_date'; + $settings->num_days_reminder1 = 1; + $settings->enable_reminder2 = true; + $settings->schedule_reminder2 = 'after_due_date'; + $settings->num_days_reminder2 = 14; + $settings->enable_reminder3 = true; + $settings->schedule_reminder3 = 'after_due_date'; + $settings->num_days_reminder3 = 30; + $settings->timezone_id = '29'; + $settings->entity_send_time = 0; + $settings->endless_reminder_frequency_id = ''; + $settings->enable_reminder_endless = false; + + $this->buildData(($settings)); + + $this->invoice->reminder1_sent = null; + $this->invoice->reminder2_sent = null; + $this->invoice->reminder3_sent = null; + $this->invoice->date = now()->startOfDay(); + $this->invoice->partial = 10; + $this->invoice->amount = 100; + $this->invoice->balance = 100; + $this->invoice->partial_due_date = now()->startOfDay()->addDays(7); + $this->invoice->due_date = now()->startOfDay()->addMonth(); + $this->invoice->service()->setReminder($settings)->save(); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals(now()->startOfDay()->addDays(6)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + $this->assertTrue($this->invoice->hasPartial()); + $data = [ + 'amount' => 10, + 'client_id' => $this->client->hashed_id, + 'invoices' => [ + [ + 'invoice_id' => $this->invoice->hashed_id, + 'amount' => 10, + ] + ] + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/', $data); + + $response->assertStatus(200); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals(0, $this->invoice->partial); + $this->assertNull($this->invoice->partial_due_date); + $this->assertNull($this->invoice->reminder1_sent); + $this->assertNull($this->invoice->reminder2_sent); + $this->assertNull($this->invoice->reminder3_sent); + + $this->assertEquals(90, $this->invoice->balance); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->startOfDay()->subDay()->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->startOfDay()->format('Y-m-d')); + + $this->travelTo(Carbon::parse($this->invoice->due_date)->startOfDay()->subDay()->addHour()); + + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + + $this->assertNotNull($this->invoice->reminder1_sent); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->startOfDay()->addDays(14)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->travelBack(); + + } + public function testsForTranslationsInReminders() { @@ -233,16 +309,6 @@ class ReminderTest extends TestCase $this->assertEquals(103, $fee->cost); $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); - - - - - - - // $this->travelTo(now()->addHours(1)); -// } - - $this->travelBack(); } @@ -391,8 +457,8 @@ class ReminderTest extends TestCase $next_send_date = Carbon::parse($this->invoice->next_send_date); $calculatedReminderDate = Carbon::parse($this->invoice->due_date)->subDays(4)->addSeconds($this->invoice->client->timezone_offset()); - nlog($next_send_date->format('Y-m-d h:i:s')); - nlog($calculatedReminderDate->format('Y-m-d h:i:s')); + // nlog($next_send_date->format('Y-m-d h:i:s')); + // nlog($calculatedReminderDate->format('Y-m-d h:i:s')); $this->travelTo($calculatedReminderDate); @@ -413,7 +479,7 @@ class ReminderTest extends TestCase $next_send_date = Carbon::parse($this->invoice->next_send_date); - nlog($next_send_date->format('Y-m-d h:i:s')); + // nlog($next_send_date->format('Y-m-d h:i:s')); $calculatedReminderDate = Carbon::parse($this->invoice->due_date)->subDays(2)->addSeconds($this->invoice->client->timezone_offset()); $this->assertTrue($next_send_date->eq($calculatedReminderDate)); @@ -432,7 +498,7 @@ class ReminderTest extends TestCase $calculatedReminderDate = Carbon::parse($this->invoice->due_date)->addDays(3)->addSeconds($this->invoice->client->timezone_offset()); $this->assertTrue($next_send_date->eq($calculatedReminderDate)); - nlog($next_send_date->format('Y-m-d h:i:s')); + // nlog($next_send_date->format('Y-m-d h:i:s')); } public function testReminderQueryCatchesDate() From 96785e27bf881e80a16440e9de910dec2037e54c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 24 Sep 2023 16:51:35 +1000 Subject: [PATCH 021/109] Tests for reminders with partial due dates --- app/Services/Invoice/ApplyPaymentAmount.php | 5 +- app/Services/Invoice/InvoiceService.php | 3 + app/Utils/Traits/MakesReminders.php | 6 +- tests/Feature/ReminderTest.php | 183 ++++++++++++++++++++ 4 files changed, 192 insertions(+), 5 deletions(-) diff --git a/app/Services/Invoice/ApplyPaymentAmount.php b/app/Services/Invoice/ApplyPaymentAmount.php index b200148538ab..468e4524c216 100644 --- a/app/Services/Invoice/ApplyPaymentAmount.php +++ b/app/Services/Invoice/ApplyPaymentAmount.php @@ -31,7 +31,7 @@ class ApplyPaymentAmount extends AbstractService } public function run() - {nlog("apply payment amount"); + { if ($this->invoice->status_id == Invoice::STATUS_DRAFT) { $this->invoice = $this->invoice->service()->markSent()->save(); } @@ -75,10 +75,9 @@ class ApplyPaymentAmount extends AbstractService ->setCalculatedStatus() ->applyNumber(); - nlog("check for partials"); if ($has_partial) { - nlog("has partial"); + $this->invoice->partial = max(0, $this->invoice->partial - $payment->amount); $invoice_service->checkReminderStatus(); } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index a42009c1246e..7e82106ec82a 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -304,6 +304,9 @@ class InvoiceService public function checkReminderStatus(): self { + if($this->invoice->partial == 0) + $this->invoice->partial_due_date = null; + if($this->invoice->partial == 0 && $this->invoice->balance > 0) { $this->invoice->reminder1_sent = null; diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 753fb1d98608..2f3de1aebb2d 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -34,9 +34,11 @@ trait MakesReminders case 'after_invoice_date': return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)->isSameDay(Carbon::now()); case 'before_due_date': - return Carbon::parse($this->due_date)->subDays($num_days_reminder)->startOfDay()->addSeconds($offset)->isSameDay(Carbon::now()); + $partial_or_due_date = ($this->partial > 0 && isset($this->partial_due_date)) ? $this->partial_due_date : $this->due_date; + return Carbon::parse($partial_or_due_date)->subDays($num_days_reminder)->startOfDay()->addSeconds($offset)->isSameDay(Carbon::now()); case 'after_due_date': - return Carbon::parse($this->due_date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)->isSameDay(Carbon::now()); + $partial_or_due_date = ($this->partial > 0 && isset($this->partial_due_date)) ? $this->partial_due_date : $this->due_date; + return Carbon::parse($partial_or_due_date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)->isSameDay(Carbon::now()); default: return null; } diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index f963a048628e..ba2c5a110258 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -158,6 +158,189 @@ class ReminderTest extends TestCase } + + public function testMultiplePartialDueDateReminderWithEndlessReminder() + { + + $settings = $this->company->settings; + $settings->enable_reminder1 = true; + $settings->schedule_reminder1 = 'before_due_date'; + $settings->num_days_reminder1 = 1; + $settings->enable_reminder2 = true; + $settings->schedule_reminder2 = 'after_due_date'; + $settings->num_days_reminder2 = 0; + $settings->enable_reminder3 = true; + $settings->schedule_reminder3 = 'after_due_date'; + $settings->num_days_reminder3 = 7; + $settings->timezone_id = '29'; + $settings->entity_send_time = 0; + $settings->endless_reminder_frequency_id = '1'; + $settings->enable_reminder_endless = true; + + $this->buildData(($settings)); + + $this->invoice->reminder1_sent = null; + $this->invoice->reminder2_sent = null; + $this->invoice->reminder3_sent = null; + $this->invoice->date = now()->startOfDay(); + $this->invoice->partial = 10; + $this->invoice->amount = 100; + $this->invoice->balance = 100; + $this->invoice->partial_due_date = now()->startOfDay()->addDays(7); + $this->invoice->due_date = now()->startOfDay()->addMonth(); + $this->invoice->service()->setReminder($settings)->save(); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals(now()->startOfDay()->addDays(6)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + $this->assertTrue($this->invoice->hasPartial()); + + // nlog("partial due date = {$this->invoice->partial_due_date}"); + // nlog("due date = {$this->invoice->due_date}"); + // nlog("travelling to: ". Carbon::parse($this->invoice->partial_due_date)->subDay()->addHour()->startOfDay()->format("Y-m-d")); + // nlog("Reminder 1 test"); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->subDay()->addHours(2)->startOfDay()); + (new ReminderJob())->handle(); + + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder1_sent); + $this->assertEquals(Carbon::parse($this->invoice->partial_due_date)->startOfDay()->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->startOfDay()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder2_sent); + $this->assertEquals(Carbon::parse($this->invoice->partial_due_date)->startOfDay()->addDays(7)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->addDays(7)->startOfDay()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder3_sent); + $this->assertEquals(Carbon::parse($this->invoice->partial_due_date)->startOfDay()->addDays(8)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->invoice->service()->applyPaymentAmount(100)->save(); + $this->invoice = $this->invoice->fresh(); + $this->assertNull($this->invoice->next_send_date); + $this->assertEquals(0, $this->invoice->partial); + $this->assertNull($this->invoice->partial_due_date); + + $this->invoice->payments()->each(function ($payment) { + $payment->service()->deletePayment(); + }); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals(0, $this->invoice->partial); + $this->assertNull($this->invoice->partial_due_date); + + $this->travelBack(); + + } + + + public function testMultiplePartialDueDateReminder() + { + + $settings = $this->company->settings; + $settings->enable_reminder1 = true; + $settings->schedule_reminder1 = 'before_due_date'; + $settings->num_days_reminder1 = 1; + $settings->enable_reminder2 = true; + $settings->schedule_reminder2 = 'after_due_date'; + $settings->num_days_reminder2 = 0; + $settings->enable_reminder3 = true; + $settings->schedule_reminder3 = 'after_due_date'; + $settings->num_days_reminder3 = 7; + $settings->timezone_id = '29'; + $settings->entity_send_time = 0; + $settings->endless_reminder_frequency_id = ''; + $settings->enable_reminder_endless = false; + + $this->buildData(($settings)); + + $this->invoice->reminder1_sent = null; + $this->invoice->reminder2_sent = null; + $this->invoice->reminder3_sent = null; + $this->invoice->date = now()->startOfDay(); + $this->invoice->partial = 10; + $this->invoice->amount = 100; + $this->invoice->balance = 100; + $this->invoice->partial_due_date = now()->startOfDay()->addDays(7); + $this->invoice->due_date = now()->startOfDay()->addMonth(); + $this->invoice->service()->setReminder($settings)->save(); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals(now()->startOfDay()->addDays(6)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + $this->assertTrue($this->invoice->hasPartial()); + + // nlog("partial due date = {$this->invoice->partial_due_date}"); + // nlog("due date = {$this->invoice->due_date}"); + // nlog("travelling to: ". Carbon::parse($this->invoice->partial_due_date)->subDay()->addHour()->startOfDay()->format("Y-m-d")); + // nlog("Reminder 1 test"); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->subDay()->addHours(2)->startOfDay()); + (new ReminderJob())->handle(); + + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder1_sent); + $this->assertEquals(Carbon::parse($this->invoice->partial_due_date)->startOfDay()->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->startOfDay()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder2_sent); + $this->assertEquals(Carbon::parse($this->invoice->partial_due_date)->startOfDay()->addDays(7)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + // nlog("travelling to: ".Carbon::parse($this->invoice->partial_due_date)->addDays(7)->startOfDay()->format('Y-m-d')); + + $this->travelTo(Carbon::parse($this->invoice->partial_due_date)->addDays(7)->startOfDay()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($this->invoice->reminder_last_sent)->format('Y-m-d')); + $this->assertNotNull($this->invoice->reminder3_sent); + $this->assertNull($this->invoice->next_send_date); + + $this->invoice->service()->applyPaymentAmount(10)->save(); + $this->invoice = $this->invoice->fresh(); + + /** Iterate through Due Date Reminders now */ + $this->assertEquals(0, $this->invoice->partial); + $this->assertNull($this->invoice->partial_due_date); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->subDay()->startOfDay(), Carbon::parse($this->invoice->next_send_date)); + + $this->travelTo(Carbon::parse($this->invoice->due_date)->subDay()->startOfDay()->addHour()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + + $this->assertNotNull($this->invoice->reminder1_sent); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->subDay()->startOfDay(), Carbon::parse($this->invoice->reminder_last_sent)->startOfDay()); + + $this->travelTo(Carbon::parse($this->invoice->due_date)->startOfDay()->addHour()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNotNull($this->invoice->reminder2_sent); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->startOfDay(), Carbon::parse($this->invoice->reminder_last_sent)->startOfDay()); + $this->assertEquals(Carbon::parse($this->invoice->due_date)->addDays(7)->startOfDay(), Carbon::parse($this->invoice->next_send_date)); + + $this->travelTo(Carbon::parse($this->invoice->due_date)->addDays(7)->startOfDay()->addHour()); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNotNull($this->invoice->reminder3_sent); + $this->assertEquals(now()->startOfDay(), Carbon::parse($this->invoice->reminder_last_sent)->startOfDay()); + $this->assertNull($this->invoice->next_send_date); + + $this->travelBack(); + + } + + public function testPartialDueDateReminder() { From 2a40658222e44e6e3298a97ed09132ee2dee8953 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 25 Sep 2023 07:34:10 +1000 Subject: [PATCH 022/109] Fixes for partial validation --- .../Requests/Invoice/StoreInvoiceRequest.php | 4 +-- .../Requests/Invoice/UpdateInvoiceRequest.php | 4 ++- composer.lock | 26 +++++++++---------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index bdcd35017781..0cf37f68e6e1 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -54,7 +54,7 @@ class StoreInvoiceRequest extends Request } elseif ($this->file('file')) { $rules['file'] = $this->file_validation; } - + $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0'; $rules['invitations.*.client_contact_id'] = 'distinct'; @@ -74,7 +74,7 @@ class StoreInvoiceRequest extends Request $rules['tax_name3'] = 'bail|sometimes|string|nullable'; $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric'; - $rules['partial_due_date'] = 'bail|sometimes|required_if:partial,>0|date'; + $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date']; return $rules; } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index eef95d02cfc2..1237c0030831 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -65,6 +65,8 @@ class UpdateInvoiceRequest extends Request $rules['is_amount_discount'] = ['boolean']; + nlog($this->partial); + $rules['line_items'] = 'array'; $rules['discount'] = 'sometimes|numeric'; $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; @@ -77,7 +79,7 @@ class UpdateInvoiceRequest extends Request $rules['status_id'] = 'bail|sometimes|not_in:5'; //do not allow cancelled invoices to be modfified. $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric'; - $rules['partial_due_date'] = 'bail|sometimes|required_if:partial,>0|date'; + $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date']; return $rules; } diff --git a/composer.lock b/composer.lock index f798b135c2d2..6de1b9d36ffd 100644 --- a/composer.lock +++ b/composer.lock @@ -13804,16 +13804,16 @@ }, { "name": "turbo124/beacon", - "version": "v1.5.0", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/turbo124/beacon.git", - "reference": "ffc0a7b229129f6503fa699adaabc1d9f300e41c" + "reference": "a737499198a3aff2d194d4f2a4c834257187d9b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/turbo124/beacon/zipball/ffc0a7b229129f6503fa699adaabc1d9f300e41c", - "reference": "ffc0a7b229129f6503fa699adaabc1d9f300e41c", + "url": "https://api.github.com/repos/turbo124/beacon/zipball/a737499198a3aff2d194d4f2a4c834257187d9b8", + "reference": "a737499198a3aff2d194d4f2a4c834257187d9b8", "shasum": "" }, "require": { @@ -13860,9 +13860,9 @@ "turbo124" ], "support": { - "source": "https://github.com/turbo124/beacon/tree/v1.5.0" + "source": "https://github.com/turbo124/beacon/tree/v1.5.1" }, - "time": "2023-08-20T23:18:11+00:00" + "time": "2023-09-24T07:20:04+00:00" }, { "name": "twig/twig", @@ -16827,16 +16827,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", - "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { @@ -16850,7 +16850,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -16893,7 +16893,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -16901,7 +16901,7 @@ "type": "github" } ], - "time": "2023-09-18T07:15:37+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", From 487ca1574991eb28d60c37c8e886ff98325dfd83 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 25 Sep 2023 13:19:08 +1000 Subject: [PATCH 023/109] Updates for twig templates --- .../Controllers/ClientStatementController.php | 2 +- .../BulkCompanyGatewayRequest.php | 11 +- .../Requests/Design/StoreDesignRequest.php | 2 +- .../Requests/Design/UpdateDesignRequest.php | 2 +- .../Requests/Invoice/UpdateInvoiceRequest.php | 2 - .../Statements/CreateStatementRequest.php | 11 +- app/PaymentDrivers/PayFastPaymentDriver.php | 2 +- app/Services/Client/PaymentMethod.php | 13 ++ app/Services/Client/Statement.php | 42 +++++-- app/Services/Template/TemplateService.php | 67 +++++++--- app/Transformers/PaymentTransformer.php | 8 ++ composer.json | 1 + composer.lock | 66 +++++++++- tests/Feature/Template/TemplateTest.php | 114 ++++++++++++++++++ 14 files changed, 304 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/ClientStatementController.php b/app/Http/Controllers/ClientStatementController.php index 13d4a81ff06d..375234c6d016 100644 --- a/app/Http/Controllers/ClientStatementController.php +++ b/app/Http/Controllers/ClientStatementController.php @@ -43,7 +43,7 @@ class ClientStatementController extends BaseController } $pdf = $request->client()->service()->statement( - $request->only(['start_date', 'end_date', 'show_payments_table', 'show_aging_table', 'status', 'show_credits_table']), + $request->only(['start_date', 'end_date', 'show_payments_table', 'show_aging_table', 'status', 'show_credits_table', 'template']), $send_email ); diff --git a/app/Http/Requests/CompanyGateway/BulkCompanyGatewayRequest.php b/app/Http/Requests/CompanyGateway/BulkCompanyGatewayRequest.php index 444bf89291fe..397734aed5ac 100644 --- a/app/Http/Requests/CompanyGateway/BulkCompanyGatewayRequest.php +++ b/app/Http/Requests/CompanyGateway/BulkCompanyGatewayRequest.php @@ -26,13 +26,20 @@ class BulkCompanyGatewayRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin(); } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + return [ - 'ids' => ['required','bail','array',Rule::exists('company_gateways', 'id')->where('company_id', auth()->user()->company()->id)], + 'ids' => ['required','bail','array',Rule::exists('company_gateways', 'id')->where('company_id', $user->company()->id)], 'action' => 'required|bail|in:archive,restore,delete' ]; } diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index c1ab381badd1..af0fbb8a84bf 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -45,7 +45,7 @@ class StoreDesignRequest extends Request 'design.footer' => 'required|min:1', 'design.includes' => 'required|min:1', 'is_template' => 'sometimes|boolean', - 'entities' => 'sometimes|string' + 'entities' => 'sometimes|string|nullable' ]; } diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index 9c6c48fa510b..62b1b4a97562 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -35,7 +35,7 @@ class UpdateDesignRequest extends Request { return [ 'is_template' => 'sometimes|boolean', - 'entities' => 'sometimes|string' + 'entities' => 'sometimes|string|nullable' ]; } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 1237c0030831..a21c98a988ea 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -65,8 +65,6 @@ class UpdateInvoiceRequest extends Request $rules['is_amount_discount'] = ['boolean']; - nlog($this->partial); - $rules['line_items'] = 'array'; $rules['discount'] = 'sometimes|numeric'; $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; diff --git a/app/Http/Requests/Statements/CreateStatementRequest.php b/app/Http/Requests/Statements/CreateStatementRequest.php index 3406be9468e5..2cf38a3a58d2 100644 --- a/app/Http/Requests/Statements/CreateStatementRequest.php +++ b/app/Http/Requests/Statements/CreateStatementRequest.php @@ -17,9 +17,10 @@ class CreateStatementRequest extends Request */ public function authorize(): bool { - // return auth()->user()->isAdmin(); + /** @var \App\Models\User $user */ + $user = auth()->user(); - return auth()->user()->can('view', $this->client()); + return $user->can('view', $this->client()); } /** @@ -29,14 +30,18 @@ class CreateStatementRequest extends Request */ public function rules() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + return [ 'start_date' => 'required|date_format:Y-m-d', 'end_date' => 'required|date_format:Y-m-d', - 'client_id' => 'bail|required|exists:clients,id,company_id,'.auth()->user()->company()->id, + 'client_id' => 'bail|required|exists:clients,id,company_id,'.$user->company()->id, 'show_payments_table' => 'boolean', 'show_aging_table' => 'boolean', 'show_credits_table' => 'boolean', 'status' => 'string', + 'template' => 'sometimes|string|nullable', ]; } diff --git a/app/PaymentDrivers/PayFastPaymentDriver.php b/app/PaymentDrivers/PayFastPaymentDriver.php index 8e1ce921ac40..707aabd999db 100644 --- a/app/PaymentDrivers/PayFastPaymentDriver.php +++ b/app/PaymentDrivers/PayFastPaymentDriver.php @@ -53,7 +53,7 @@ class PayFastPaymentDriver extends BaseDriver if ($this->client->currency()->code == 'ZAR') { $types[] = GatewayType::CREDIT_CARD; } - + return $types; } diff --git a/app/Services/Client/PaymentMethod.php b/app/Services/Client/PaymentMethod.php index aa535e916a4e..e9cd452dc9b8 100644 --- a/app/Services/Client/PaymentMethod.php +++ b/app/Services/Client/PaymentMethod.php @@ -78,6 +78,19 @@ class PaymentMethod ->sortby(function ($model) use ($transformed_ids) { //company gateways are sorted in order of priority return array_search($model->id, $transformed_ids); // this closure sorts for us }); + + 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. */ + $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() ->with('gateway') diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index dae872c774bb..68d1f29aa531 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -29,11 +29,12 @@ use App\Utils\Traits\Pdf\PdfMaker as PdfMakerTrait; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use App\Models\Credit; +use App\Utils\Traits\MakesHash; class Statement { use PdfMakerTrait; - + use MakesHash; /** * @var Invoice|Payment|null */ @@ -88,21 +89,44 @@ class Statement 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; - $maker = new PdfMaker($state); + if($this->options['template'] ?? false){ - $maker - ->design($template) - ->build(); + $template = Design::where('id', $this->decodePrimaryKey($this->options['template'])) + ->where('company_id', $this->client->company_id) + ->first(); - $pdf = null; + $ts = $template->service()->build([ + 'client' => $this->client, + 'entity' => $this->entity, + 'variables' => $variables, + 'invoices' => $this->getInvoices(), + 'payments' => $this->getPayments(), + 'credits' => $this->getCredits(), + 'aging' => $this->getAging(), + ]); + + $html = $ts->getHtml(); + + } + else { + + $maker = new PdfMaker($state); + + $maker + ->design($template) + ->build(); + + $pdf = null; + $html = $maker->getCompiledHTML(true); + } try { if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - $pdf = (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); + $pdf = (new Phantom)->convertHtmlToPdf($html); } elseif (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); + $pdf = (new NinjaPdf())->build($html); } else { - $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + $pdf = $this->makePdf(null, null, $html); } } catch (\Exception $e) { nlog(print_r($e->getMessage(), 1)); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index d2dbd94e688d..84f758882101 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -20,10 +20,12 @@ use App\Models\Payment; use App\Models\Project; use App\Utils\HtmlEngine; use League\Fractal\Manager; +use App\Models\ClientContact; use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; use Illuminate\Support\Collection; +use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; use App\Transformers\CreditTransformer; @@ -91,7 +93,7 @@ class TemplateService { $data = $this->preProcessDataBlocks($data); $replacements = []; - +nlog($data); $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { @@ -103,10 +105,13 @@ class TemplateService $string_extension = new \Twig\Extension\StringLoaderExtension(); $twig->addExtension($string_extension); - + $twig->addExtension(new IntlExtension()); + $template = $twig->createTemplate(html_entity_decode($template)); $template = $template->render($data); + nlog($template); + $f = $this->document->createDocumentFragment(); $f->appendXML($template); $replacements[] = $f; @@ -228,67 +233,92 @@ class TemplateService private function processInvoices($invoices): array { $it = new InvoiceTransformer(); - $it->setDefaultIncludes(['client']); + $it->setDefaultIncludes(['client','payments']); $manager = new Manager(); - // $manager->setSerializer(new JsonApiSerializer()); - $resource = new \League\Fractal\Resource\Collection($invoices, $it, Invoice::class); - $i = $manager->createData($resource)->toArray(); - return $i['data']; + $manager->parseIncludes(['client','payments','payments.type']); + $resource = new \League\Fractal\Resource\Collection($invoices, $it, null); + $invoices = $manager->createData($resource)->toArray(); + + // nlog($invoices); + + foreach($invoices['data'] as $key => $invoice) + { + + $invoices['data'][$key]['client'] = $invoice['client']['data'] ?? []; + $invoices['data'][$key]['client']['contacts'] = $invoice['client']['data']['contacts']['data'] ?? []; + $invoices['data'][$key]['payments'] = $invoice['payments']['data'] ?? []; + + if($invoice['payments']['data'] ?? false) { + foreach($invoice['payments']['data'] as $keyx => $payment) { + $invoices['data'][$key]['payments'][$keyx]['paymentables']= $payment['paymentables']['data'] ?? []; + } + } + + } + + return $invoices['data']; } - private function processQuotes($quotes): Collection + private function processQuotes($quotes): array { $it = new QuoteTransformer(); $it->setDefaultIncludes(['client']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($quotes, $it, Quote::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + + $i['client']['contacts'] = $i['client']['contacts'][ClientContact::class]; + return $i[Quote::class]; } - private function processCredits($credits): Collection + private function processCredits($credits): array { $it = new CreditTransformer(); $it->setDefaultIncludes(['client']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($credits, $it, Credit::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + return $i[Credit::class]; } - private function processPayments($payments): Collection + private function processPayments($payments): array { $it = new PaymentTransformer(); $it->setDefaultIncludes(['client','invoices','paymentables']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($payments, $it, Payment::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + return $i[Payment::class]; } - private function processTasks($tasks): Collection + private function processTasks($tasks): array { $it = new TaskTransformer(); $it->setDefaultIncludes(['client','tasks','project','invoice']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($tasks, $it, Task::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + return $i[Task::class]; } - private function processProjects($projects): Collection + private function processProjects($projects): array { $it = new ProjectTransformer(); $it->setDefaultIncludes(['client','tasks']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($projects, $it, Project::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + return $i[Project::class]; } @@ -298,9 +328,10 @@ class TemplateService $it = new PurchaseOrderTransformer(); $it->setDefaultIncludes(['vendor','expense']); $manager = new Manager(); + $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($purchase_orders, $it, PurchaseOrder::class); $i = $manager->createData($resource)->toArray(); - return $i['data']; + return $i[PurchaseOrder::class]; } } \ No newline at end of file diff --git a/app/Transformers/PaymentTransformer.php b/app/Transformers/PaymentTransformer.php index 2c9df5a4073c..cb7d038e6941 100644 --- a/app/Transformers/PaymentTransformer.php +++ b/app/Transformers/PaymentTransformer.php @@ -32,6 +32,7 @@ class PaymentTransformer extends EntityTransformer protected array $availableIncludes = [ 'client', 'invoices', + 'type', ]; public function __construct($serializer = null) @@ -69,6 +70,13 @@ class PaymentTransformer extends EntityTransformer return $this->includeCollection($payment->documents, $transformer, Document::class); } + public function includeType(Payment $payment) + { + return [ + 'type' => $payment->type->translatedType() ?? '', + ]; + } + public function transform(Payment $payment) { return [ diff --git a/composer.json b/composer.json index 5520a24c5d38..86c90466fead 100644 --- a/composer.json +++ b/composer.json @@ -94,6 +94,7 @@ "symfony/mailgun-mailer": "^6.1", "symfony/postmark-mailer": "^6.1", "turbo124/beacon": "^1.5", + "twig/intl-extra": "^3.7", "twig/twig": "^3", "twilio/sdk": "^6.40", "webpatser/laravel-countries": "dev-master#75992ad", diff --git a/composer.lock b/composer.lock index 6de1b9d36ffd..200e1a53a515 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "08bc4729962b495b68162a069269f74f", + "content-hash": "0e0f7606a875b132577ee735309b1247", "packages": [ { "name": "afosto/yaac", @@ -13864,6 +13864,70 @@ }, "time": "2023-09-24T07:20:04+00:00" }, + { + "name": "twig/intl-extra", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/intl-extra.git", + "reference": "4f4fe572f635534649cc069e1dafe4a8ad63774d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/4f4fe572f635534649cc069e1dafe4a8ad63774d", + "reference": "4f4fe572f635534649cc069e1dafe4a8ad63774d", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/intl": "^5.4|^6.0", + "twig/twig": "^2.7|^3.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4|^6.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\Extra\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Intl", + "homepage": "https://twig.symfony.com", + "keywords": [ + "intl", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/intl-extra/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-07-29T15:34:56+00:00" + }, { "name": "twig/twig", "version": "v3.7.1", diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index aa391d69d747..1f6dc241f5e7 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -101,6 +101,59 @@ class TemplateTest extends TestCase '; + private string $payments_body = ' + + + + + + + + + + + + + + + {% for invoice in invoices %} + + + + + + + + + + {% for payment in invoice.payments|filter(payment => payment.is_deleted == false) %} + + {% for pivot in payment.paymentables %} + + + + + + + + + + + {% endfor %} + {% endfor %} + {% endfor%} + +
Invoice #DateDue DateTotalTransactionOutstanding
{{ invoice.number }}{{ invoice.date }}{{ invoice.due_date }}{{ invoice.amount|format_currency("EUR") }}{{ invoice.balance|format_currency("EUR") }}
{{ payment.number }}{{ payment.date }} + {% if pivot.amount > 0 %} + {{ pivot.amount|format_currency("EUR") }} - {{ payment.type.name }} + {% else %} + ({{ pivot.refunded|format_currency("EUR") }}) + {% endif %} +
+ +
+ '; + protected function setUp() :void { parent::setUp(); @@ -113,6 +166,67 @@ class TemplateTest extends TestCase } + public function testVariableResolutionViaTransformersForPaymentsInStatements() + { + Invoice::factory()->count(20)->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'status_id' => Invoice::STATUS_SENT, + 'amount' => 100, + 'balance' => 100, + ]); + + $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)); + }); + + $invoices = Invoice::withTrashed() + ->with('payments.type') + ->where('is_deleted', false) + ->where('company_id', $this->client->company_id) + ->where('client_id', $this->client->id) + ->whereIn('status_id', [2,3,4]) + ->orderBy('due_date', 'ASC') + ->orderBy('date', 'ASC') + ->cursor(); + + $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]; + + $i->payments()->each(function ($p) use ($rand){ + shuffle($rand); + $p->type_id = $rand[0]; + $p->save(); + + }); + }); + + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $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); + + nlog("results = "); + nlog($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); + + } + public function testDoubleEntityNestedDataTemplateServiceBuild() { $design_model = Design::find(2); From 909d9ed9df21effd27dd375338127b4527898dee Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 25 Sep 2023 14:40:02 +1000 Subject: [PATCH 024/109] Refactor for PDF Slot --- app/Http/Livewire/PdfSlot.php | 6 +++++- resources/views/portal/ninja2020/credits/show.blade.php | 2 +- resources/views/portal/ninja2020/invoices/show.blade.php | 2 +- .../views/portal/ninja2020/purchase_orders/show.blade.php | 2 +- resources/views/portal/ninja2020/quotes/show.blade.php | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index a97444ba89ee..bb310a22e4ba 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -63,7 +63,11 @@ class PdfSlot extends Component public function getPdf() { - // $this->pdf = $this->entity->fullscreenPdfViewer($this->invitation); + + if(!$this->invitation){ + $this->entity->service()->createInvitations(); + $this->invitation = $this->entity->invitations()->first(); + } $blob = [ 'entity_type' => $this->resolveEntityType(), diff --git a/resources/views/portal/ninja2020/credits/show.blade.php b/resources/views/portal/ninja2020/credits/show.blade.php index 47b093a299f7..2020a6e7d008 100644 --- a/resources/views/portal/ninja2020/credits/show.blade.php +++ b/resources/views/portal/ninja2020/credits/show.blade.php @@ -25,7 +25,7 @@ @include('portal.ninja2020.components.entity-documents', ['entity' => $credit]) -@livewire('pdf-slot', ['entity' => $credit, 'invitation' => $invitation, 'db' => $invitation->company->db]) +@livewire('pdf-slot', ['entity' => $credit, 'invitation' => $invitation, 'db' => $credit->company->db]) @endsection diff --git a/resources/views/portal/ninja2020/invoices/show.blade.php b/resources/views/portal/ninja2020/invoices/show.blade.php index 7f090a4f7ecc..f35b18da5e46 100644 --- a/resources/views/portal/ninja2020/invoices/show.blade.php +++ b/resources/views/portal/ninja2020/invoices/show.blade.php @@ -95,7 +95,7 @@ @endif @include('portal.ninja2020.components.entity-documents', ['entity' => $invoice]) - @livewire('pdf-slot', ['entity' => $invoice, 'invitation' => $invitation, 'db' => $invitation->company->db]) + @livewire('pdf-slot', ['entity' => $invoice, 'invitation' => $invitation, 'db' => $invoice->company->db]) @endsection diff --git a/resources/views/portal/ninja2020/purchase_orders/show.blade.php b/resources/views/portal/ninja2020/purchase_orders/show.blade.php index 172beb0291fc..3bfe60e78c5a 100644 --- a/resources/views/portal/ninja2020/purchase_orders/show.blade.php +++ b/resources/views/portal/ninja2020/purchase_orders/show.blade.php @@ -46,7 +46,7 @@ @endif @include('portal.ninja2020.components.entity-documents', ['entity' => $purchase_order]) - @livewire('pdf-slot', ['entity' => $purchase_order, 'invitation' => $invitation, 'db' => $invitation->company->db]) + @livewire('pdf-slot', ['entity' => $purchase_order, 'invitation' => $invitation, 'db' => $purchase_order->company->db]) @endsection diff --git a/resources/views/portal/ninja2020/quotes/show.blade.php b/resources/views/portal/ninja2020/quotes/show.blade.php index 4b981fb5d4c2..dfab5433fedc 100644 --- a/resources/views/portal/ninja2020/quotes/show.blade.php +++ b/resources/views/portal/ninja2020/quotes/show.blade.php @@ -100,7 +100,7 @@ @endif @include('portal.ninja2020.components.entity-documents', ['entity' => $quote]) - @livewire('pdf-slot', ['entity' => $quote, 'invitation' => $invitation, 'db' => $invitation->company->db]) + @livewire('pdf-slot', ['entity' => $quote, 'invitation' => $invitation, 'db' => $quote->company->db]) @endsection From ae7915353ff9ee5cf02badc3ecfa38234993fd1f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 25 Sep 2023 15:56:32 +1000 Subject: [PATCH 025/109] Template scaffold --- app/Http/Controllers/PreviewController.php | 127 ++++++++++++++----- app/Services/PdfMaker/PdfMaker.php | 9 +- app/Services/Template/TemplateService.php | 132 +++++++++++++++----- app/Transformers/PaymentTransformer.php | 7 +- app/Transformers/PaymentTypeTransformer.php | 25 ++++ app/Transformers/TaskTransformer.php | 2 +- tests/Feature/Template/TemplateTest.php | 18 ++- 7 files changed, 240 insertions(+), 80 deletions(-) create mode 100644 app/Transformers/PaymentTypeTransformer.php diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index fb100b9dd12c..845521c5f2f8 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -11,42 +11,47 @@ namespace App\Http\Controllers; -use App\DataMapper\Analytics\LivePreview; -use App\Factory\CreditFactory; -use App\Factory\InvoiceFactory; -use App\Factory\QuoteFactory; -use App\Factory\RecurringInvoiceFactory; -use App\Http\Requests\Preview\DesignPreviewRequest; -use App\Http\Requests\Preview\PreviewInvoiceRequest; -use App\Jobs\Util\PreviewPdf; -use App\Libraries\MultiDB; +use App\Models\Task; +use App\Utils\Ninja; +use App\Models\Quote; use App\Models\Client; -use App\Models\ClientContact; use App\Models\Credit; use App\Models\Invoice; -use App\Models\InvoiceInvitation; -use App\Models\Quote; -use App\Models\RecurringInvoice; -use App\Repositories\CreditRepository; -use App\Repositories\InvoiceRepository; -use App\Repositories\QuoteRepository; -use App\Repositories\RecurringInvoiceRepository; +use App\Models\Payment; +use App\Models\Project; +use App\Utils\HtmlEngine; +use App\Libraries\MultiDB; +use App\Factory\QuoteFactory; +use App\Jobs\Util\PreviewPdf; +use App\Models\ClientContact; use App\Services\Pdf\PdfMock; +use App\Factory\CreditFactory; +use App\Factory\InvoiceFactory; +use App\Utils\Traits\MakesHash; +use App\Models\RecurringInvoice; +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\Repositories\QuoteRepository; +use App\Repositories\CreditRepository; +use App\Utils\Traits\MakesInvoiceHtml; +use Turbo124\Beacon\Facades\LightLogs; +use App\Repositories\InvoiceRepository; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Factory\RecurringInvoiceFactory; +use Illuminate\Support\Facades\Response; +use App\DataMapper\Analytics\LivePreview; +use App\Services\Template\TemplateService; +use App\Repositories\RecurringInvoiceRepository; +use App\Http\Requests\Preview\DesignPreviewRequest; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -use App\Services\PdfMaker\PdfMaker; -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 App\Http\Requests\Preview\PreviewInvoiceRequest; +use App\Models\PurchaseOrder; class PreviewController extends BaseController { @@ -67,6 +72,11 @@ class PreviewController extends BaseController public function show() { + // if(request()->has('template')){ + return $this->template(); + // } +nlog("wooops"); + if (request()->has('entity') && request()->has('entity_id') && ! empty(request()->input('entity')) && @@ -132,7 +142,6 @@ class PreviewController extends BaseController return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); } - /** @var \App\Models\User $user */ $user = auth()->user(); @@ -342,6 +351,64 @@ class PreviewController extends BaseController return $response; } + private function template() + { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + + /** @var \App\Models\Company $company */ + $company = $user->company(); + + // $template = request()->input('design'); + $design_object = json_decode(json_encode(request()->input('design')),1); + + $data = [ + 'invoices' => Invoice::whereHas('payments')->with('client','payments')->company()->orderBy('id','desc')->take(5)->get(), + 'quotes' => Quote::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), + 'credits' => Credit::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), + 'payments' => Payment::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), + 'purchase_orders' => PurchaseOrder::query()->with('vendor')->company()->orderBy('id','desc')->take(5)->get(), + 'tasks' => Task::query()->with('client','invoice')->company()->orderBy('id','desc')->take(5)->get(), + 'projects' => Project::query()->with('tasks','client')->company()->orderBy('id','desc')->take(5)->get(), + ]; + + nlog($design_object); + $ts = (new TemplateService()); + $ts->setTemplate($design_object) + ->build($data); + + $html = $ts->getHtml(); + + if (request()->query('html') == 'true') { + return $html; + } + + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { + return (new Phantom)->convertHtmlToPdf($html); + } + + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + $pdf = (new NinjaPdf())->build($html); + + $numbered_pdf = $this->pageNumbering($pdf, $company); + + if ($numbered_pdf) { + $pdf = $numbered_pdf; + } + + return $pdf; + } + + $file_path = (new PreviewPdf($html, $company))->handle(); + + $response = Response::make($file_path, 200); + $response->header('Content-Type', 'application/pdf'); + + return $response; + + } + private function blankEntity() { diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index 701222bf359e..2d028563f0a3 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -12,6 +12,7 @@ namespace App\Services\PdfMaker; +use App\Services\Template\TemplateService; use League\CommonMark\CommonMarkConverter; class PdfMaker @@ -78,17 +79,13 @@ class PdfMaker $replacements = []; $contents = $this->document->getElementsByTagName('ninja'); + + $twig = (new TemplateService())->twig; foreach ($contents as $content) { $template = $content->ownerDocument->saveHTML($content); - $loader = new \Twig\Loader\FilesystemLoader(storage_path()); - $twig = new \Twig\Environment($loader); - - $string_extension = new \Twig\Extension\StringLoaderExtension(); - $twig->addExtension($string_extension); - $template = $twig->createTemplate(html_entity_decode($template)); $template = $template->render($this->options); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 84f758882101..0eafa0c05f1c 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -15,7 +15,6 @@ use App\Models\Task; use App\Models\Quote; use App\Models\Credit; use App\Models\Design; -use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; use App\Utils\HtmlEngine; @@ -24,7 +23,6 @@ use App\Models\ClientContact; use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; -use Illuminate\Support\Collection; use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; @@ -41,9 +39,11 @@ class TemplateService private \DomDocument $document; + public \Twig\Environment $twig; + private string $compiled_html = ''; - public function __construct(public Design $template) + public function __construct(public ?Design $template = null) { $this->template = $template; $this->init(); @@ -59,6 +59,12 @@ class TemplateService $this->document = new \DOMDocument(); $this->document->validateOnParse = true; + $loader = new \Twig\Loader\FilesystemLoader(storage_path()); + $this->twig = new \Twig\Environment($loader); + $string_extension = new \Twig\Extension\StringLoaderExtension(); + $this->twig->addExtension($string_extension); + $this->twig->addExtension(new IntlExtension()); + return $this; } @@ -93,24 +99,19 @@ class TemplateService { $data = $this->preProcessDataBlocks($data); $replacements = []; -nlog($data); + + // nlog($data); + $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { $template = $content->ownerDocument->saveHTML($content); - $loader = new \Twig\Loader\FilesystemLoader(storage_path()); - $twig = new \Twig\Environment($loader); - - $string_extension = new \Twig\Extension\StringLoaderExtension(); - $twig->addExtension($string_extension); - $twig->addExtension(new IntlExtension()); - - $template = $twig->createTemplate(html_entity_decode($template)); + $template = $this->twig->createTemplate(html_entity_decode($template)); $template = $template->render($data); - nlog($template); + // nlog($template); $f = $this->document->createDocumentFragment(); $f->appendXML($template); @@ -140,8 +141,12 @@ nlog($data); $html = $this->getHtml(); foreach($variables as $key => $variable) { - $html = strtr($html, $variable['labels']); - $html = strtr($html, $variable['values']); + + if(isset($variable['labels']) && isset($variable['values'])) + { + $html = strtr($html, $variable['labels']); + $html = strtr($html, $variable['values']); + } } @$this->document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); @@ -169,6 +174,9 @@ nlog($data); */ private function compose(): self { + if(!$this->template) + return $this; + $html = ''; $html .= $this->template->design->includes; $html .= $this->template->design->header; @@ -181,6 +189,27 @@ nlog($data); } + /** + * Inject the template components + * manually + * + * @return self + */ + public function setTemplate(array $partials): self + {nlog($partials); + + $html = ''; + $html .= $partials['design']['includes']; + $html .= $partials['design']['header']; + $html .= $partials['design']['body']; + $html .= $partials['design']['footer']; + + @$this->document->loadHTML($html); + + return $this; + + } + /** * Resolves the labels and values needed to replace the string * holders in the template. @@ -200,7 +229,7 @@ nlog($data); 'payments' => $processed = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), 'tasks' => $processed = [], 'projects' => $processed = [], - 'purchase_orders' => $processed = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'purchase_orders' => $processed = $value->first() && $value->first()->invitations()->first() ? (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() : [], }; return $processed; @@ -251,6 +280,7 @@ nlog($data); if($invoice['payments']['data'] ?? false) { foreach($invoice['payments']['data'] as $keyx => $payment) { $invoices['data'][$key]['payments'][$keyx]['paymentables']= $payment['paymentables']['data'] ?? []; + $invoices['data'][$key]['payments'][$keyx]['type']= $payment['type']['data'] ?? []; } } @@ -264,12 +294,22 @@ nlog($data); $it = new QuoteTransformer(); $it->setDefaultIncludes(['client']); $manager = new Manager(); - $manager->setSerializer(new ArraySerializer()); - $resource = new \League\Fractal\Resource\Collection($quotes, $it, Quote::class); - $i = $manager->createData($resource)->toArray(); + $manager->parseIncludes(['client']); + $resource = new \League\Fractal\Resource\Collection($quotes, $it, null); + $resources = $manager->createData($resource)->toArray(); + + foreach($resources['data'] as $key => $resource) { + + $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; + $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; + + } + + return $resources['data']; + + + - $i['client']['contacts'] = $i['client']['contacts'][ClientContact::class]; - return $i[Quote::class]; } @@ -278,10 +318,18 @@ nlog($data); $it = new CreditTransformer(); $it->setDefaultIncludes(['client']); $manager = new Manager(); - $manager->setSerializer(new ArraySerializer()); $resource = new \League\Fractal\Resource\Collection($credits, $it, Credit::class); - $i = $manager->createData($resource)->toArray(); - return $i[Credit::class]; + $resources = $manager->createData($resource)->toArray(); + + foreach($resources['data'] as $key => $resource) { + + $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; + $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; + + } + + return $resources['data']; + } @@ -290,22 +338,40 @@ nlog($data); $it = new PaymentTransformer(); $it->setDefaultIncludes(['client','invoices','paymentables']); $manager = new Manager(); - $manager->setSerializer(new ArraySerializer()); - $resource = new \League\Fractal\Resource\Collection($payments, $it, Payment::class); - $i = $manager->createData($resource)->toArray(); - return $i[Payment::class]; + $resource = new \League\Fractal\Resource\Collection($payments, $it, null); + $resources = $manager->createData($resource)->toArray(); + + foreach($resources['data'] as $key => $resource) { + + $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; + $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; + $resources['data'][$key]['invoices'] = $invoice['invoices']['data'] ?? []; + + } + + return $resources['data']; } private function processTasks($tasks): array { $it = new TaskTransformer(); - $it->setDefaultIncludes(['client','tasks','project','invoice']); + $it->setDefaultIncludes(['client','project','invoice']); $manager = new Manager(); - $manager->setSerializer(new ArraySerializer()); - $resource = new \League\Fractal\Resource\Collection($tasks, $it, Task::class); - $i = $manager->createData($resource)->toArray(); - return $i[Task::class]; + $resource = new \League\Fractal\Resource\Collection($tasks, $it, null); + $resources = $manager->createData($resource)->toArray(); + + foreach($resources['data'] as $key => $resource) { + + $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; + $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; + $resources['data'][$key]['project'] = $resource['project']['data'] ?? []; + $resources['data'][$key]['invoice'] = $resource['invoice'] ?? []; + + } + + return $resources['data']; + } diff --git a/app/Transformers/PaymentTransformer.php b/app/Transformers/PaymentTransformer.php index cb7d038e6941..61d32bf64be8 100644 --- a/app/Transformers/PaymentTransformer.php +++ b/app/Transformers/PaymentTransformer.php @@ -12,10 +12,11 @@ namespace App\Transformers; use App\Models\Client; -use App\Models\Document; use App\Models\Invoice; use App\Models\Payment; +use App\Models\Document; use App\Models\Paymentable; +use App\Models\PaymentType; use App\Utils\Traits\MakesHash; class PaymentTransformer extends EntityTransformer @@ -72,9 +73,7 @@ class PaymentTransformer extends EntityTransformer public function includeType(Payment $payment) { - return [ - 'type' => $payment->type->translatedType() ?? '', - ]; + return $this->includeItem($payment, new PaymentTypeTransformer, PaymentType::class); } public function transform(Payment $payment) diff --git a/app/Transformers/PaymentTypeTransformer.php b/app/Transformers/PaymentTypeTransformer.php new file mode 100644 index 000000000000..3d9aae3da634 --- /dev/null +++ b/app/Transformers/PaymentTypeTransformer.php @@ -0,0 +1,25 @@ + $payment->translatedType() + ]; + } +} diff --git a/app/Transformers/TaskTransformer.php b/app/Transformers/TaskTransformer.php index b4d50535f5fb..5791fa3e5807 100644 --- a/app/Transformers/TaskTransformer.php +++ b/app/Transformers/TaskTransformer.php @@ -55,7 +55,7 @@ class TaskTransformer extends EntityTransformer { $transformer = new InvoiceTransformer($this->serializer); - if (!$task->user) { + if (!$task->invoice) { return null; } diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 1f6dc241f5e7..0d86917b54e1 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -102,7 +102,13 @@ class TemplateTest extends TestCase '; private string $payments_body = ' - + CoName: $company.name + ClName: $client.name + InNumber: $invoice.number + + CoName: $company.name + ClName: $client.name + InNumber: $invoice.number @@ -129,7 +135,7 @@ class TemplateTest extends TestCase {% for payment in invoice.payments|filter(payment => payment.is_deleted == false) %} {% for pivot in payment.paymentables %} - + @@ -221,8 +227,8 @@ class TemplateTest extends TestCase $data['invoices'] = $invoices; $ts = $replicated_design->service()->build($data); - nlog("results = "); - nlog($ts->getHtml()); + // nlog("results = "); + // nlog($ts->getHtml()); $this->assertNotNull($ts->getHtml()); } @@ -253,8 +259,8 @@ class TemplateTest extends TestCase $ts = $replicated_design->service()->build($data); - nlog("results = "); - nlog($ts->getHtml()); + // nlog("results = "); + // nlog($ts->getHtml()); $this->assertNotNull($ts->getHtml()); } From 04f9d1faf52145507c843a51267a74484a4e6317 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 25 Sep 2023 16:16:18 +1000 Subject: [PATCH 026/109] Working on statement display --- app/Services/Template/TemplateService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 0eafa0c05f1c..0fecffc81b9d 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -100,7 +100,7 @@ class TemplateService $data = $this->preProcessDataBlocks($data); $replacements = []; - // nlog($data); + nlog($data); $contents = $this->document->getElementsByTagName('ninja'); From 21cc1873264c54cc61bfac39f5e1ceb6b5ceca5e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 26 Sep 2023 21:21:10 +1000 Subject: [PATCH 027/109] Updates for design validation --- app/Http/Controllers/PreviewController.php | 4 +-- .../Requests/Design/StoreDesignRequest.php | 8 ++--- app/Services/Template/TemplateService.php | 13 ++++--- composer.lock | 34 +++++++++---------- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 845521c5f2f8..087dc5189104 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -72,10 +72,8 @@ class PreviewController extends BaseController public function show() { - // if(request()->has('template')){ + if(request()->has('template')) return $this->template(); - // } -nlog("wooops"); if (request()->has('entity') && request()->has('entity_id') && diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index af0fbb8a84bf..386114c12b41 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -40,10 +40,10 @@ class StoreDesignRequest extends Request //'name' => 'required', 'name' => 'required|unique:designs,name,null,null,company_id,'.$user->companyId(), 'design' => 'required|array', - 'design.header' => 'required|min:1', - 'design.body' => 'required|min:1', - 'design.footer' => 'required|min:1', - 'design.includes' => 'required|min:1', + 'design.header' => 'sometimes|string', + 'design.body' => 'sometimes|string', + 'design.footer' => 'sometimes|string', + 'design.includes' => 'sometimes|string', 'is_template' => 'sometimes|boolean', 'entities' => 'sometimes|string|nullable' ]; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 0fecffc81b9d..9423f9d8c0bf 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -222,14 +222,17 @@ class TemplateService $processed = []; + if(in_array($key, ['tasks','projects']) || !$value->first() || !$value->first()->invitations()->first()) + return $processed; + match ($key) { - 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'payments' => $processed = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), + 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], + 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], + 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], + 'payments' => $processed = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues() ?? [], 'tasks' => $processed = [], 'projects' => $processed = [], - 'purchase_orders' => $processed = $value->first() && $value->first()->invitations()->first() ? (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() : [], + 'purchase_orders' => (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], }; return $processed; diff --git a/composer.lock b/composer.lock index 200e1a53a515..a9bc8a093dfc 100644 --- a/composer.lock +++ b/composer.lock @@ -485,16 +485,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.12", + "version": "3.281.13", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff" + "reference": "5547757d891495713aa7d5770bf04124d48a6ab5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/22a92f08758db2b152843ea0875eeee5a467d8ff", - "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5547757d891495713aa7d5770bf04124d48a6ab5", + "reference": "5547757d891495713aa7d5770bf04124d48a6ab5", "shasum": "" }, "require": { @@ -574,9 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.12" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.13" }, - "time": "2023-09-22T18:12:27+00:00" + "time": "2023-09-25T18:07:38+00:00" }, { "name": "bacon/bacon-qr-code", @@ -2487,16 +2487,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.316.0", + "version": "v0.317.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "08e3579d94363716cef2bc79643f3d30fdd914b5" + "reference": "a11658da6e5ba713e3d636544895bb0af3c27689" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/08e3579d94363716cef2bc79643f3d30fdd914b5", - "reference": "08e3579d94363716cef2bc79643f3d30fdd914b5", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/a11658da6e5ba713e3d636544895bb0af3c27689", + "reference": "a11658da6e5ba713e3d636544895bb0af3c27689", "shasum": "" }, "require": { @@ -2525,9 +2525,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.316.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.317.0" }, - "time": "2023-09-17T01:06:13+00:00" + "time": "2023-09-24T01:06:13+00:00" }, { "name": "google/auth", @@ -6361,16 +6361,16 @@ }, { "name": "nesbot/carbon", - "version": "2.70.0", + "version": "2.71.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d" + "reference": "98276233188583f2ff845a0f992a235472d9466a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d3298b38ea8612e5f77d38d1a99438e42f70341d", - "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", "shasum": "" }, "require": { @@ -6463,7 +6463,7 @@ "type": "tidelift" } ], - "time": "2023-09-07T16:43:50+00:00" + "time": "2023-09-25T11:31:05+00:00" }, { "name": "nette/schema", From 1677482a11cd5afe5358ba12550925c66b1be4f5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 11:18:35 +1000 Subject: [PATCH 028/109] Fixes for templates --- app/Services/Template/TemplateService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 9423f9d8c0bf..36ffde32e9cb 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -222,7 +222,7 @@ class TemplateService $processed = []; - if(in_array($key, ['tasks','projects']) || !$value->first() || !$value->first()->invitations()->first()) + if(in_array($key, ['tasks','projects']) || !$value->first() ) return $processed; match ($key) { From 99e9723fea9d49fec07c58b83d57193cb3b22a1c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 18:10:22 +1000 Subject: [PATCH 029/109] Padding out data --- app/Console/Commands/CreateSingleAccount.php | 135 +++++++++++++------ app/Http/Controllers/PreviewController.php | 18 ++- app/Repositories/TaskRepository.php | 2 +- app/Services/Template/TemplateService.php | 23 +++- app/Transformers/InvoiceTransformer.php | 8 ++ app/Transformers/PaymentTransformer.php | 9 ++ composer.lock | 87 ++++++------ 7 files changed, 188 insertions(+), 94 deletions(-) diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index a28eb64e23ec..2bc1b4c8dedc 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -11,51 +11,52 @@ namespace App\Console\Commands; -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\Product; -use App\Models\Project; -use App\Models\Quote; -use App\Models\RecurringInvoice; -use App\Models\Task; -use App\Models\TaxRate; -use App\Models\User; -use App\Models\Vendor; -use App\Models\VendorContact; -use App\Repositories\InvoiceRepository; -use App\Utils\Ninja; -use App\Utils\Traits\GeneratesCounter; -use App\Utils\Traits\MakesHash; +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\Models\Account; +use App\Models\Company; +use App\Models\Country; +use App\Models\Expense; +use App\Models\Invoice; +use App\Models\Product; +use App\Models\Project; +use App\Models\TaxRate; +use App\Libraries\MultiDB; +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 Illuminate\Support\Facades\Cache; +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 stdClass; +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; class CreateSingleAccount extends Command { @@ -303,6 +304,60 @@ class CreateSingleAccount extends Command $this->createGateways($company, $user); $this->createSubsData($company, $user); + + + $repo = new \App\Repositories\TaskRepository(); + + Task::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\ExpenseRepository(); + + Expense::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\VendorRepository(new \App\Repositories\VendorContactRepository()); + Vendor::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\ClientRepository(new \App\Repositories\ClientContactRepository()); + Client::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\RecurringInvoiceRepository(); + RecurringInvoice::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\InvoiceRepository(); + Invoice::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\QuoteRepository(); + Quote::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + $repo = new \App\Repositories\CreditRepository(); + Credit::query()->cursor()->each(function ($t) use ($repo) { + $repo->save([], $t); + }); + + + Project::query()->cursor()->each(function ($p) { + + if(!isset($p->number)) { + $p->number = $this->getNextProjectNumber($p); + $p->save(); + } + + }); + } private function createSubsData($company, $user) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 087dc5189104..9dfcd7db9c3c 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -362,16 +362,15 @@ class PreviewController extends BaseController $design_object = json_decode(json_encode(request()->input('design')),1); $data = [ - 'invoices' => Invoice::whereHas('payments')->with('client','payments')->company()->orderBy('id','desc')->take(5)->get(), - 'quotes' => Quote::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), - 'credits' => Credit::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), - 'payments' => Payment::query()->company()->with('client')->orderBy('id','desc')->take(5)->get(), + 'invoices' => Invoice::whereHas('payments')->with('client','payments')->company()->orderBy('id','desc')->take(4)->get(), + 'quotes' => Quote::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), + 'credits' => Credit::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), + 'payments' => Payment::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), 'purchase_orders' => PurchaseOrder::query()->with('vendor')->company()->orderBy('id','desc')->take(5)->get(), - 'tasks' => Task::query()->with('client','invoice')->company()->orderBy('id','desc')->take(5)->get(), - 'projects' => Project::query()->with('tasks','client')->company()->orderBy('id','desc')->take(5)->get(), + 'tasks' => Task::query()->with('client','invoice')->company()->orderBy('id','desc')->take(2)->get(), + 'projects' => Project::query()->with('tasks','client')->company()->orderBy('id','desc')->take(2)->get(), ]; - nlog($design_object); $ts = (new TemplateService()); $ts->setTemplate($design_object) ->build($data); @@ -407,6 +406,11 @@ class PreviewController extends BaseController } + private function stubTemplateData() + { + + } + private function blankEntity() { diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index dbb954d35a60..cb7e5e979f4f 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -17,7 +17,7 @@ use App\Utils\Traits\GeneratesCounter; use Illuminate\Database\QueryException; /** - * TaskRepository. + * App\Repositories\TaskRepository. */ class TaskRepository extends BaseRepository { diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 36ffde32e9cb..e49e1eee07c9 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -100,7 +100,7 @@ class TemplateService $data = $this->preProcessDataBlocks($data); $replacements = []; - nlog($data); + // nlog($data); $contents = $this->document->getElementsByTagName('ninja'); @@ -310,12 +310,15 @@ class TemplateService return $resources['data']; - - - - } - + + /** + * Pushes credits through the appropriate transformer + * and builds any required relationships + * + * @param mixed $credits + * @return array + */ private function processCredits($credits): array { $it = new CreditTransformer(); @@ -335,7 +338,13 @@ class TemplateService } - + + /** + * Pushes payments through the appropriate transformer + * + * @param mixed $payments + * @return array + */ private function processPayments($payments): array { $it = new PaymentTransformer(); diff --git a/app/Transformers/InvoiceTransformer.php b/app/Transformers/InvoiceTransformer.php index cc271bebe43b..85605ed37485 100644 --- a/app/Transformers/InvoiceTransformer.php +++ b/app/Transformers/InvoiceTransformer.php @@ -14,6 +14,7 @@ namespace App\Transformers; use App\Models\Activity; use App\Models\Backup; use App\Models\Client; +use App\Models\Credit; use App\Models\Document; use App\Models\Invoice; use App\Models\InvoiceInvitation; @@ -63,6 +64,13 @@ class InvoiceTransformer extends EntityTransformer return $this->includeCollection($invoice->payments, $transformer, Payment::class); } + public function includeCredits(Invoice $invoice) + { + $transformer = new CreditTransformer($this->serializer); + + return $this->includeCollection($invoice->credits, $transformer, Credit::class); + } + /* public function includeExpenses(Invoice $invoice) { diff --git a/app/Transformers/PaymentTransformer.php b/app/Transformers/PaymentTransformer.php index 61d32bf64be8..99a50547fc15 100644 --- a/app/Transformers/PaymentTransformer.php +++ b/app/Transformers/PaymentTransformer.php @@ -12,6 +12,7 @@ namespace App\Transformers; use App\Models\Client; +use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; use App\Models\Document; @@ -34,6 +35,7 @@ class PaymentTransformer extends EntityTransformer 'client', 'invoices', 'type', + 'credits', ]; public function __construct($serializer = null) @@ -50,6 +52,13 @@ class PaymentTransformer extends EntityTransformer return $this->includeCollection($payment->invoices, $transformer, Invoice::class); } + public function includeCredits(Payment $payment) + { + $transformer = new CreditTransformer($this->serializer); + + return $this->includeCollection($payment->credits, $transformer, Credit::class); + } + public function includeClient(Payment $payment) { $transformer = new ClientTransformer($this->serializer); diff --git a/composer.lock b/composer.lock index a9bc8a093dfc..04725b21e0a1 100644 --- a/composer.lock +++ b/composer.lock @@ -485,16 +485,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.13", + "version": "3.281.14", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "5547757d891495713aa7d5770bf04124d48a6ab5" + "reference": "4b5b8aab08ef0add75f086bc03c7651799d187db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5547757d891495713aa7d5770bf04124d48a6ab5", - "reference": "5547757d891495713aa7d5770bf04124d48a6ab5", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4b5b8aab08ef0add75f086bc03c7651799d187db", + "reference": "4b5b8aab08ef0add75f086bc03c7651799d187db", "shasum": "" }, "require": { @@ -574,9 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.13" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.14" }, - "time": "2023-09-25T18:07:38+00:00" + "time": "2023-09-26T18:15:48+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1353,16 +1353,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.7", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "8e0e268052b4a8974cb00215bb2892787021614f" + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/8e0e268052b4a8974cb00215bb2892787021614f", - "reference": "8e0e268052b4a8974cb00215bb2892787021614f", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/00d03067f07482f025d41ab55e4ba0db5eca2cdf", + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf", "shasum": "" }, "require": { @@ -1378,9 +1378,9 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.34", + "phpstan/phpstan": "1.10.35", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.12", + "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", @@ -1446,7 +1446,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.7" + "source": "https://github.com/doctrine/dbal/tree/3.7.0" }, "funding": [ { @@ -1462,7 +1462,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T20:15:41+00:00" + "time": "2023-09-26T20:56:55+00:00" }, { "name": "doctrine/deprecations", @@ -4287,16 +4287,16 @@ }, { "name": "laravel/framework", - "version": "v10.24.0", + "version": "v10.25.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726" + "reference": "cd0a440f43eaaad247d6f6575d3782c156ec913c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/bcebd0a4c015d5c38aeec299d355a42451dd3726", - "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726", + "url": "https://api.github.com/repos/laravel/framework/zipball/cd0a440f43eaaad247d6f6575d3782c156ec913c", + "reference": "cd0a440f43eaaad247d6f6575d3782c156ec913c", "shasum": "" }, "require": { @@ -4314,7 +4314,7 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1", + "laravel/prompts": "^0.1.9", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", @@ -4396,7 +4396,7 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^8.10", + "orchestra/testbench-core": "^8.12", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", @@ -4483,20 +4483,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-09-19T15:25:04+00:00" + "time": "2023-09-27T01:29:32+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.8", + "version": "v0.1.9", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c" + "reference": "b603410e7af1040aa2d29e0a2cdca570bb63e827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/68dcc65babf92e1fb43cba0b3f78fc3d8002709c", - "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c", + "url": "https://api.github.com/repos/laravel/prompts/zipball/b603410e7af1040aa2d29e0a2cdca570bb63e827", + "reference": "b603410e7af1040aa2d29e0a2cdca570bb63e827", "shasum": "" }, "require": { @@ -4505,6 +4505,10 @@ "php": "^8.1", "symfony/console": "^6.2" }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, "require-dev": { "mockery/mockery": "^1.5", "pestphp/pest": "^2.3", @@ -4515,6 +4519,11 @@ "ext-pcntl": "Required for the spinner to be animated." }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, "autoload": { "files": [ "src/helpers.php" @@ -4529,9 +4538,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.8" + "source": "https://github.com/laravel/prompts/tree/v0.1.9" }, - "time": "2023-09-19T15:33:56+00:00" + "time": "2023-09-26T13:14:20+00:00" }, { "name": "laravel/serializable-closure", @@ -8127,16 +8136,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.1", + "version": "1.24.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", - "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { @@ -8168,9 +8177,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, - "time": "2023-09-18T12:18:02+00:00" + "time": "2023-09-26T12:28:12+00:00" }, { "name": "pragmarx/google2fa", @@ -15172,16 +15181,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.28.0", + "version": "v3.30.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff" + "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/113e09fea3d2306319ffaa2423fe3de768b28cff", - "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/95c64693b2f149966a2bc05a7a4981b0343ea52f", + "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f", "shasum": "" }, "require": { @@ -15255,7 +15264,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.28.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.30.0" }, "funding": [ { @@ -15263,7 +15272,7 @@ "type": "github" } ], - "time": "2023-09-22T20:43:40+00:00" + "time": "2023-09-26T22:10:43+00:00" }, { "name": "hamcrest/hamcrest-php", From 98dd01e1d5aca3ef15ba0315839bbc156f947450 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 20:36:08 +1000 Subject: [PATCH 030/109] Stubbing mock data for templates --- app/Http/Controllers/PreviewController.php | 21 ++++--- app/Services/Template/MockTrait.php | 22 +++++++ app/Services/Template/TemplateMock.php | 69 ++++++++++++++++++++++ app/Services/Template/TemplateService.php | 48 +++++++++------ 4 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 app/Services/Template/MockTrait.php create mode 100644 app/Services/Template/TemplateMock.php diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 9dfcd7db9c3c..9535f31c478a 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -16,6 +16,7 @@ use App\Utils\Ninja; use App\Models\Quote; use App\Models\Client; use App\Models\Credit; +use App\Models\Vendor; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; @@ -24,6 +25,7 @@ use App\Libraries\MultiDB; use App\Factory\QuoteFactory; use App\Jobs\Util\PreviewPdf; use App\Models\ClientContact; +use App\Models\PurchaseOrder; use App\Services\Pdf\PdfMock; use App\Factory\CreditFactory; use App\Factory\InvoiceFactory; @@ -51,7 +53,6 @@ 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\Models\PurchaseOrder; class PreviewController extends BaseController { @@ -358,17 +359,19 @@ class PreviewController extends BaseController /** @var \App\Models\Company $company */ $company = $user->company(); - // $template = request()->input('design'); $design_object = json_decode(json_encode(request()->input('design')),1); + $client_id = Invoice::whereHas('payments')->company()->where('is_deleted', 0)->orderBy('id','desc')->first()->client_id; + $vendor_id = PurchaseOrder::query()->company()->where('is_deleted', 0)->orderBy('id', 'desc')->first()->vendor_id; + $data = [ - 'invoices' => Invoice::whereHas('payments')->with('client','payments')->company()->orderBy('id','desc')->take(4)->get(), - 'quotes' => Quote::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), - 'credits' => Credit::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), - 'payments' => Payment::query()->company()->with('client')->orderBy('id','desc')->take(4)->get(), - 'purchase_orders' => PurchaseOrder::query()->with('vendor')->company()->orderBy('id','desc')->take(5)->get(), - 'tasks' => Task::query()->with('client','invoice')->company()->orderBy('id','desc')->take(2)->get(), - 'projects' => Project::query()->with('tasks','client')->company()->orderBy('id','desc')->take(2)->get(), + 'invoices' => Invoice::whereHas('payments')->company()->with('client','payments')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + 'quotes' => Quote::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + 'credits' => Credit::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + 'payments' => Payment::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + 'purchase_orders' => PurchaseOrder::query()->company()->with('vendor')->where('vendor_id', $vendor_id)->orderBy('id','desc')->take(5)->get(), + 'tasks' => Task::query()->company()->with('client','invoice')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), + 'projects' => Project::query()->company()->with('tasks','client')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), ]; $ts = (new TemplateService()); diff --git a/app/Services/Template/MockTrait.php b/app/Services/Template/MockTrait.php new file mode 100644 index 000000000000..32926a46a67f --- /dev/null +++ b/app/Services/Template/MockTrait.php @@ -0,0 +1,22 @@ +Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; + +} \ No newline at end of file diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php new file mode 100644 index 000000000000..67989e81931b --- /dev/null +++ b/app/Services/Template/TemplateMock.php @@ -0,0 +1,69 @@ +company = $company; + + $variables = collect(['invoices', 'quotes', 'credits', 'payments', 'purchase_orders'])->map(function ($type) { + $this->createVariables($type); + })->toArray(); + + $variables = array_merge($variables, [ + 'invoices' => $this->createTemplate('invoices'), + 'quotes' => $this->createTemplate('quotes'), + 'credits' => $this->createTemplate('credits'), + 'tasks' => $this->createTemplate('tasks'), + 'projects' => $this->createTemplate('projects'), + 'payments' => $this->createTemplate('payments'), + 'purchase_orders' => $this->createTemplate('purchase_orders'), + ]); + + return $variables; + } + + /** + * ['entity_type','design','settings_type','settings'] + * + * @param string $type + * @return array + */ + private function createVariables(string $type): array + { + $data = [ + 'entity_type' => rtrim($type,"s"), + 'design' => '', + 'settings_type' => 'company', + 'settings' => $this->company->settings, + ]; + + $mock = (new PdfMock($data, $this->company))->build(); + + return [$type => $mock->getStubVariables()]; + } + + private function createTemplate(string $type): array + { + + } +} \ No newline at end of file diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index e49e1eee07c9..14aec7d1fa6c 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -43,6 +43,8 @@ class TemplateService private string $compiled_html = ''; + private array $data = []; + public function __construct(public ?Design $template = null) { $this->template = $template; @@ -78,30 +80,43 @@ class TemplateService public function build(array $data): self { $this->compose() - ->parseNinjaBlocks($data) + ->processData($data) + ->parseNinjaBlocks() ->parseVariables($data); return $this; } + public function mock(): self + { + + return $this; + } + public function getHtml(): string { return $this->compiled_html; } + + private function processData($data): self + { + + $this->data = $this->preProcessDataBlocks($data); + + nlog(json_encode($this->data)); + + return $this; + } + /** * Parses all Ninja tags in the document - * - * @param array $data * * @return self */ - private function parseNinjaBlocks(array $data): self + private function parseNinjaBlocks(): self { - $data = $this->preProcessDataBlocks($data); $replacements = []; - // nlog($data); - $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { @@ -109,9 +124,7 @@ class TemplateService $template = $content->ownerDocument->saveHTML($content); $template = $this->twig->createTemplate(html_entity_decode($template)); - $template = $template->render($data); - - // nlog($template); + $template = $template->render($this->data); $f = $this->document->createDocumentFragment(); $f->appendXML($template); @@ -196,7 +209,7 @@ class TemplateService * @return self */ public function setTemplate(array $partials): self - {nlog($partials); + { $html = ''; $html .= $partials['design']['includes']; @@ -262,28 +275,27 @@ class TemplateService })->toArray(); } - private function processInvoices($invoices): array + public function processInvoices($invoices): array { $it = new InvoiceTransformer(); - $it->setDefaultIncludes(['client','payments']); + $it->setDefaultIncludes(['client','payments', 'credits']); $manager = new Manager(); - $manager->parseIncludes(['client','payments','payments.type']); + $manager->parseIncludes(['client','payments','payments.type','credits']); $resource = new \League\Fractal\Resource\Collection($invoices, $it, null); $invoices = $manager->createData($resource)->toArray(); - // nlog($invoices); - foreach($invoices['data'] as $key => $invoice) { $invoices['data'][$key]['client'] = $invoice['client']['data'] ?? []; $invoices['data'][$key]['client']['contacts'] = $invoice['client']['data']['contacts']['data'] ?? []; $invoices['data'][$key]['payments'] = $invoice['payments']['data'] ?? []; + $invoices['data'][$key]['credits'] = $invoice['credits']['data'] ?? []; if($invoice['payments']['data'] ?? false) { foreach($invoice['payments']['data'] as $keyx => $payment) { - $invoices['data'][$key]['payments'][$keyx]['paymentables']= $payment['paymentables']['data'] ?? []; - $invoices['data'][$key]['payments'][$keyx]['type']= $payment['type']['data'] ?? []; + $invoices['data'][$key]['payments'][$keyx]['paymentables'] = $payment['paymentables']['data'] ?? []; + $invoices['data'][$key]['payments'][$keyx]['type'] = $payment['type']['data'] ?? []; } } From 5e987c5ee78b1944fa5b2eb90f69d8e11fe0d04b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 21:11:47 +1000 Subject: [PATCH 031/109] Working on mock data --- app/Services/Template/MockTrait.php | 22 -------- app/Services/Template/TemplateMock.php | 62 +++++++++++++++-------- app/Services/Template/TemplateService.php | 12 ++--- 3 files changed, 48 insertions(+), 48 deletions(-) delete mode 100644 app/Services/Template/MockTrait.php diff --git a/app/Services/Template/MockTrait.php b/app/Services/Template/MockTrait.php deleted file mode 100644 index 32926a46a67f..000000000000 --- a/app/Services/Template/MockTrait.php +++ /dev/null @@ -1,22 +0,0 @@ -Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; - -} \ No newline at end of file diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 67989e81931b..4696e022d0fe 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -16,30 +16,46 @@ use App\Services\Pdf\PdfMock; class TemplateMock { - use MockTrait; - - private Company $company; - public function _invoke(Company $company): array + public array $engines = []; + + public array $variables = []; + + 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 = '[{"id":"oBDbDxbl2E","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":0,"refunded":0,"applied":0,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695798370,"updated_at":1695798370,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"xYRdG7dDzO","invoice_id":"mxkazm8eJ0","amount":0,"refunded":0,"created_at":1695798370,"updated_at":1695798370,"archived_at":0}]}},{"id":"K4oeEva0By","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":444,"refunded":0,"applied":444,"transaction_reference":"","transaction_id":"","date":"2023-09-27","is_manual":true,"created_at":1695799116,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0002","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"1YQdJ2dOGp","invoice_id":"mxkazm8eJ0","amount":444,"refunded":0,"created_at":1695799116,"updated_at":1695799116,"archived_at":0}]}},{"id":"xYRdG7dDzO","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":8697.17,"refunded":0,"applied":8697.17,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695799139,"updated_at":1695799139,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0003","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"4y1aKReQGw","invoice_id":"Wpmbk55ezJ","amount":8697.17,"refunded":0,"created_at":1695799139,"updated_at":1695799139,"archived_at":0}]}},{"id":"1YQdJ2dOGp","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":222,"refunded":0,"applied":222,"transaction_reference":"","transaction_id":"","date":"2023-09-27","is_manual":true,"created_at":1695799160,"updated_at":1695802769,"archived_at":0,"is_deleted":false,"type_id":"2","invitation_id":"","private_notes":"","number":"0004","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"q9wdLwbjPX","invoice_id":"Volej2RejN","amount":555,"refunded":0,"created_at":1695799160,"updated_at":1695799160,"archived_at":0},{"id":"7N1aMAaWmp","credit_id":"mWZdPwbKgR","amount":333,"refunded":0,"created_at":1695799160,"updated_at":1695799160,"archived_at":0}]}},{"id":"l4zbqx2apr","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":9199.58,"refunded":0,"applied":9199.58,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695803284,"updated_at":1695803284,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0007","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"OpnelY5aKB","invoice_id":"7N1aMj3bWm","amount":9199.58,"refunded":0,"created_at":1695803284,"updated_at":1695803284,"archived_at":0}]}}]'; + 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 = '[{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"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":{"App\\Models\\ClientContact":[{"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":{"App\\Models\\Document":[]},"gateway_tokens":{"App\\Models\\ClientGatewayToken":[]}},"tasks":{"App\\Models\\Task":[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}}]}},{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"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":{"App\\Models\\ClientContact":[{"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":{"App\\Models\\Document":[]},"gateway_tokens":{"App\\Models\\ClientGatewayToken":[]}},"tasks":{"App\\Models\\Task":[{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}}]}}]'; + + public string $task_data = '[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]}]'; + + public string $invoice_data = '[{ "id": "VWPe9rxaLy", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 9199.58, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0001", "discount": 0, "po_number": "", "date": "2023-08-01", "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": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "QnXe0Rvbxr", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1801.8, "balance": 1801.8, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0002", "discount": 0, "po_number": "", "date": "2023-06-30", "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": 415.8, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1985-10-27", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Wjneg5YbwZ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 6860.73, "balance": 6860.73, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0003", "discount": 0, "po_number": "", "date": "2023-08-19", "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": 2009.73, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1990-11-17", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Volej2RejN", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1905.75, "balance": 1350.75, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799160, "archived_at": 0, "is_deleted": false, "number": "0004", "discount": 0, "po_number": "", "date": "2023-09-13", "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": 519.75, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1978-12-22", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 555, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "Cash" } }], "credits": [] }, { "id": "Wpmbk55ezJ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 8697.17, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "number": "0005", "discount": 0, "po_number": "", "date": "2023-07-11", "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": 1767.17, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1973-12-03", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 8697.17, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "mxkazm8eJ0", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1190, "balance": 746, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695798363, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "number": "0026", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; + + public string $quote_data = '[{ "id": "KGRb41dBLZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "1", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799454, "archived_at": 0, "created_at": 1695799453, "number": "0006", "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": "", "terms": "Default company quote terms", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "MVyb8mdvAZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "2", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799461, "archived_at": 0, "created_at": 1695799458, "number": "0007", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "958c28fa-c217-42b5-8434-e326ac2ab1ad" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "2f2da954-e237-4794-955d-208de2ac63c5" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5807dea2-b153-4e45-84f0-006683ac0c6d" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9dc2a31c-06d1-4b4a-82ef-cc65bb43d906" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "80981f31-87f6-42ef-a582-3387612a2377" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "8ede63e2-d24d-4561-91b7-85ba2e2c0865" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "0a494280-65cf-473a-8519-d7ad1d73ab38" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "6c908212-9f4b-416b-a661-71aa2ce76ab9" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "77357757-607b-411a-a09f-0caa31745916" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "252c03d4-49a8-4c63-a86d-4c3184765388" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "VolejRRejN", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "3", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799466, "archived_at": 0, "created_at": 1695799461, "number": "0008", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "847d125a-5e32-45cf-aa8e-144095fc3b91" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "b789272e-557e-4186-b6e7-13b027c65e20" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "1539315f-927b-4489-be5b-a4dc944d32dc" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "5c26754d-7252-4d91-9883-319560a47f4f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9949909c-9ca0-4646-b2b3-263c12981481" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0aa3e83-e762-473d-8196-10d62350a5e8" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9f831c14-deaa-4fe7-a9d2-6b4bd40a8cc0" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "dd58c4a5-88da-4c04-8841-908304f42a0f" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "2d927272-f8f0-41db-9bf3-20c9a5f4575f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9e7f1874-8783-4dc8-aab1-b0aa60923380" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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 function __construct(private Company $company) + { + } + + public function init(): self { - $this->company = $company; - - $variables = collect(['invoices', 'quotes', 'credits', 'payments', 'purchase_orders'])->map(function ($type) { - $this->createVariables($type); + $this->variables = collect(['invoices', 'quotes', 'credits', 'purchase_orders'])->map(function ($type) { + return $this->createVariables($type); })->toArray(); - $variables = array_merge($variables, [ - 'invoices' => $this->createTemplate('invoices'), - 'quotes' => $this->createTemplate('quotes'), - 'credits' => $this->createTemplate('credits'), - 'tasks' => $this->createTemplate('tasks'), - 'projects' => $this->createTemplate('projects'), - 'payments' => $this->createTemplate('payments'), - 'purchase_orders' => $this->createTemplate('purchase_orders'), - ]); + $this->engines = [ + 'invoices' => json_decode($this->invoice_data, true), + 'quotes' => json_decode($this->quote_data, true), + 'credits' => json_decode($this->credit_data, true), + 'tasks' => json_decode($this->task_data, true), + 'projects' => json_decode($this->project_data, true), + 'payments' => json_decode($this->payment_data, true), + 'purchase_orders' => json_decode($this->purchase_order_data, true), + ]; + + return $this; - return $variables; } /** @@ -57,13 +73,19 @@ class TemplateMock 'settings' => $this->company->settings, ]; - $mock = (new PdfMock($data, $this->company))->build(); + $mock = (new PdfMock($data, $this->company)); + $mock->settings = $this->company->settings; + $mock->build(); return [$type => $mock->getStubVariables()]; } - private function createTemplate(string $type): array + private function createTemplate(string $type) { + $type = $type . "_data"; + nlog($type); + return ; } + } \ No newline at end of file diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 14aec7d1fa6c..4c6d9799e0b5 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -304,7 +304,7 @@ class TemplateService return $invoices['data']; } - private function processQuotes($quotes): array + public function processQuotes($quotes): array { $it = new QuoteTransformer(); $it->setDefaultIncludes(['client']); @@ -331,7 +331,7 @@ class TemplateService * @param mixed $credits * @return array */ - private function processCredits($credits): array + public function processCredits($credits): array { $it = new CreditTransformer(); $it->setDefaultIncludes(['client']); @@ -357,7 +357,7 @@ class TemplateService * @param mixed $payments * @return array */ - private function processPayments($payments): array + public function processPayments($payments): array { $it = new PaymentTransformer(); $it->setDefaultIncludes(['client','invoices','paymentables']); @@ -377,7 +377,7 @@ class TemplateService } - private function processTasks($tasks): array + public function processTasks($tasks): array { $it = new TaskTransformer(); $it->setDefaultIncludes(['client','project','invoice']); @@ -399,7 +399,7 @@ class TemplateService } - private function processProjects($projects): array + public function processProjects($projects): array { $it = new ProjectTransformer(); @@ -412,7 +412,7 @@ class TemplateService } - private function processPurchaseOrders($purchase_orders): array + public function processPurchaseOrders($purchase_orders): array { $it = new PurchaseOrderTransformer(); From 7281f0f2814ff2935ec622512a9e62455b1535de Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 21:32:17 +1000 Subject: [PATCH 032/109] Minor fixes for static analysis --- app/Http/Controllers/PreviewController.php | 5 +++-- app/Models/Design.php | 2 +- app/Services/Template/TemplateMock.php | 9 +-------- app/Services/Template/TemplateService.php | 22 ++++++++++++++++++++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 9535f31c478a..49ab96663259 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -375,8 +375,9 @@ class PreviewController extends BaseController ]; $ts = (new TemplateService()); - $ts->setTemplate($design_object) - ->build($data); + $ts->setCompany($company) + ->setTemplate($design_object) + ->build($data); $html = $ts->getHtml(); diff --git a/app/Models/Design.php b/app/Models/Design.php index e9aa7b3ab53a..329182e7e8b9 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -79,6 +79,6 @@ class Design extends BaseModel public function service(): TemplateService { - return new TemplateService($this); + return (new TemplateService($this))->setCompany($this->company); } } diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 4696e022d0fe..9ec86e030d3a 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -33,7 +33,7 @@ class TemplateMock public string $quote_data = '[{ "id": "KGRb41dBLZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "1", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799454, "archived_at": 0, "created_at": 1695799453, "number": "0006", "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": "", "terms": "Default company quote terms", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "MVyb8mdvAZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "2", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799461, "archived_at": 0, "created_at": 1695799458, "number": "0007", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "958c28fa-c217-42b5-8434-e326ac2ab1ad" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "2f2da954-e237-4794-955d-208de2ac63c5" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5807dea2-b153-4e45-84f0-006683ac0c6d" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9dc2a31c-06d1-4b4a-82ef-cc65bb43d906" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "80981f31-87f6-42ef-a582-3387612a2377" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "8ede63e2-d24d-4561-91b7-85ba2e2c0865" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "0a494280-65cf-473a-8519-d7ad1d73ab38" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "6c908212-9f4b-416b-a661-71aa2ce76ab9" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "77357757-607b-411a-a09f-0caa31745916" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "252c03d4-49a8-4c63-a86d-4c3184765388" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "VolejRRejN", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "3", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799466, "archived_at": 0, "created_at": 1695799461, "number": "0008", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "847d125a-5e32-45cf-aa8e-144095fc3b91" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "b789272e-557e-4186-b6e7-13b027c65e20" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "1539315f-927b-4489-be5b-a4dc944d32dc" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "5c26754d-7252-4d91-9883-319560a47f4f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9949909c-9ca0-4646-b2b3-263c12981481" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0aa3e83-e762-473d-8196-10d62350a5e8" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9f831c14-deaa-4fe7-a9d2-6b4bd40a8cc0" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "dd58c4a5-88da-4c04-8841-908304f42a0f" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "2d927272-f8f0-41db-9bf3-20c9a5f4575f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9e7f1874-8783-4dc8-aab1-b0aa60923380" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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 function __construct(private Company $company) + public function __construct(public Company $company) { } @@ -80,12 +80,5 @@ class TemplateMock return [$type => $mock->getStubVariables()]; } - private function createTemplate(string $type) - { - $type = $type . "_data"; - - nlog($type); - return ; - } } \ No newline at end of file diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 4c6d9799e0b5..2f76aea671d5 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -15,6 +15,7 @@ use App\Models\Task; use App\Models\Quote; use App\Models\Credit; use App\Models\Design; +use App\Models\Company; use App\Models\Payment; use App\Models\Project; use App\Utils\HtmlEngine; @@ -45,6 +46,8 @@ class TemplateService private array $data = []; + public ?Company $company; + public function __construct(public ?Design $template = null) { $this->template = $template; @@ -89,6 +92,11 @@ class TemplateService public function mock(): self { + $tm = new TemplateMock($this->company); + $this->data = $tm->engines; + + $this->parseNinjaBlocks() + ->parseVariables($tm->variables); return $this; } @@ -103,8 +111,6 @@ class TemplateService $this->data = $this->preProcessDataBlocks($data); - nlog(json_encode($this->data)); - return $this; } @@ -424,4 +430,16 @@ class TemplateService return $i[PurchaseOrder::class]; } + + public function setCompany(Company $company): self + { + $this->company = $company; + + return $this; + } + + public function getCompany(): Company + { + return $this->company; + } } \ No newline at end of file From f655064fa530cf66b32584cdd63562667cad09f0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 27 Sep 2023 21:44:09 +1000 Subject: [PATCH 033/109] Template stubs --- app/Http/Controllers/PreviewController.php | 24 +++++++++++----------- app/Services/Template/TemplateMock.php | 18 ++++++++-------- app/Services/Template/TemplateService.php | 21 ++++++++++++++----- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 49ab96663259..cae588da70af 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -361,23 +361,23 @@ class PreviewController extends BaseController $design_object = json_decode(json_encode(request()->input('design')),1); - $client_id = Invoice::whereHas('payments')->company()->where('is_deleted', 0)->orderBy('id','desc')->first()->client_id; - $vendor_id = PurchaseOrder::query()->company()->where('is_deleted', 0)->orderBy('id', 'desc')->first()->vendor_id; + // $client_id = Invoice::whereHas('payments')->company()->where('is_deleted', 0)->orderBy('id','desc')->first()->client_id; + // $vendor_id = PurchaseOrder::query()->company()->where('is_deleted', 0)->orderBy('id', 'desc')->first()->vendor_id; - $data = [ - 'invoices' => Invoice::whereHas('payments')->company()->with('client','payments')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - 'quotes' => Quote::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - 'credits' => Credit::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - 'payments' => Payment::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - 'purchase_orders' => PurchaseOrder::query()->company()->with('vendor')->where('vendor_id', $vendor_id)->orderBy('id','desc')->take(5)->get(), - 'tasks' => Task::query()->company()->with('client','invoice')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), - 'projects' => Project::query()->company()->with('tasks','client')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), - ]; + // $data = [ + // 'invoices' => Invoice::whereHas('payments')->company()->with('client','payments')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + // 'quotes' => Quote::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + // 'credits' => Credit::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + // 'payments' => Payment::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), + // 'purchase_orders' => PurchaseOrder::query()->company()->with('vendor')->where('vendor_id', $vendor_id)->orderBy('id','desc')->take(5)->get(), + // 'tasks' => Task::query()->company()->with('client','invoice')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), + // 'projects' => Project::query()->company()->with('tasks','client')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), + // ]; $ts = (new TemplateService()); $ts->setCompany($company) ->setTemplate($design_object) - ->build($data); + ->mock(); $html = $ts->getHtml(); diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 9ec86e030d3a..b1bc34a224f0 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -44,16 +44,14 @@ class TemplateMock return $this->createVariables($type); })->toArray(); - $this->engines = [ - 'invoices' => json_decode($this->invoice_data, true), - 'quotes' => json_decode($this->quote_data, true), - 'credits' => json_decode($this->credit_data, true), - 'tasks' => json_decode($this->task_data, true), - 'projects' => json_decode($this->project_data, true), - 'payments' => json_decode($this->payment_data, true), - 'purchase_orders' => json_decode($this->purchase_order_data, true), - ]; - + $this->engines['invoices'] = json_decode($this->invoice_data, true); + $this->engines['quotes'] = json_decode($this->quote_data, true); + $this->engines['credits'] = json_decode($this->credit_data, true); + $this->engines['tasks'] = json_decode($this->task_data, true); + $this->engines['projects'] = json_decode($this->project_data, true); + $this->engines['payments'] = json_decode($this->payment_data, true); + $this->engines['purchase_orders'] = json_decode($this->purchase_order_data, true); + return $this; } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 2f76aea671d5..79263cc74bb1 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -46,6 +46,8 @@ class TemplateService private array $data = []; + private array $variables = []; + public ?Company $company; public function __construct(public ?Design $template = null) @@ -85,18 +87,28 @@ class TemplateService $this->compose() ->processData($data) ->parseNinjaBlocks() - ->parseVariables($data); + ->processVariables($data) + ->parseVariables(); return $this; } + private function processVariables($data): self + { + $this->variables = $this->resolveHtmlEngine($data); + + return $this; + } public function mock(): self { $tm = new TemplateMock($this->company); + $tm->init(); + $this->data = $tm->engines; + $this->variables = $tm->variables[0]; $this->parseNinjaBlocks() - ->parseVariables($tm->variables); + ->parseVariables(); return $this; } @@ -153,13 +165,12 @@ class TemplateService * @param array $data * @return self */ - private function parseVariables(array $data): self + private function parseVariables(): self { - $variables = $this->resolveHtmlEngine($data); $html = $this->getHtml(); - foreach($variables as $key => $variable) { + foreach($this->variables as $key => $variable) { if(isset($variable['labels']) && isset($variable['values'])) { From 0cc75973d2b21617371fd31f07222da5cb784657 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 28 Sep 2023 19:53:10 +1000 Subject: [PATCH 034/109] Fixes for template mocks --- app/Services/Pdf/PdfMock.php | 2 +- app/Services/Template/TemplateMock.php | 7 +++-- app/Services/Template/TemplateService.php | 1 + composer.lock | 36 +++++++++++------------ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 3ee76fbaed5a..ebf1bfd1f56d 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -310,7 +310,7 @@ class PdfMock '$created_by_user' => 'Derrick Monahan DDS Erna Wunsch', '$client.currency' => 'USD', '$company.country' => 'United States', - '$company.address' => 'United States
', + '$company.address' => 'Christiansen Garden
70218 Lori Station Suite 529
New Loy, Delaware 29359
United States
Phone: 1-240-886-2233
Email: immanuel53@example.net
', '$tech_hero_image' => 'http://ninja.test:8000/images/pdf-designs/tech-hero-image.jpg', '$task.tax_name1' => '', '$task.tax_name2' => '', diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index b1bc34a224f0..c4f70cd64a05 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -22,14 +22,17 @@ class TemplateMock public array $variables = []; 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 = '[{"id":"oBDbDxbl2E","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":0,"refunded":0,"applied":0,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695798370,"updated_at":1695798370,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"xYRdG7dDzO","invoice_id":"mxkazm8eJ0","amount":0,"refunded":0,"created_at":1695798370,"updated_at":1695798370,"archived_at":0}]}},{"id":"K4oeEva0By","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":444,"refunded":0,"applied":444,"transaction_reference":"","transaction_id":"","date":"2023-09-27","is_manual":true,"created_at":1695799116,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0002","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"1YQdJ2dOGp","invoice_id":"mxkazm8eJ0","amount":444,"refunded":0,"created_at":1695799116,"updated_at":1695799116,"archived_at":0}]}},{"id":"xYRdG7dDzO","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":8697.17,"refunded":0,"applied":8697.17,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695799139,"updated_at":1695799139,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0003","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"4y1aKReQGw","invoice_id":"Wpmbk55ezJ","amount":8697.17,"refunded":0,"created_at":1695799139,"updated_at":1695799139,"archived_at":0}]}},{"id":"1YQdJ2dOGp","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":222,"refunded":0,"applied":222,"transaction_reference":"","transaction_id":"","date":"2023-09-27","is_manual":true,"created_at":1695799160,"updated_at":1695802769,"archived_at":0,"is_deleted":false,"type_id":"2","invitation_id":"","private_notes":"","number":"0004","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"q9wdLwbjPX","invoice_id":"Volej2RejN","amount":555,"refunded":0,"created_at":1695799160,"updated_at":1695799160,"archived_at":0},{"id":"7N1aMAaWmp","credit_id":"mWZdPwbKgR","amount":333,"refunded":0,"created_at":1695799160,"updated_at":1695799160,"archived_at":0}]}},{"id":"l4zbqx2apr","user_id":"wMvbmOeYAl","assigned_user_id":"","amount":9199.58,"refunded":0,"applied":9199.58,"transaction_reference":"Manual entry","transaction_id":"","date":"2023-09-26","is_manual":true,"created_at":1695803284,"updated_at":1695803284,"archived_at":0,"is_deleted":false,"type_id":"","invitation_id":"","private_notes":"","number":"0007","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client_id":"QJ0dN6dLOv","client_contact_id":"","company_gateway_id":"","gateway_type_id":"","status_id":"4","project_id":"","vendor_id":"","currency_id":"1","exchange_rate":1,"exchange_currency_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":[]}},"invoices":[],"paymentables":{"data":[{"id":"OpnelY5aKB","invoice_id":"7N1aMj3bWm","amount":9199.58,"refunded":0,"created_at":1695803284,"updated_at":1695803284,"archived_at":0}]}}]'; + + public string $payment_data = '[{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }] }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }] }, { "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }] }, { "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }] }, { "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 5, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }] }]'; + + 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 = '[{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"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":{"App\\Models\\ClientContact":[{"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":{"App\\Models\\Document":[]},"gateway_tokens":{"App\\Models\\ClientGatewayToken":[]}},"tasks":{"App\\Models\\Task":[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","documents":{"App\\Models\\Document":[]},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}}]}},{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"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":{"App\\Models\\ClientContact":[{"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":{"App\\Models\\Document":[]},"gateway_tokens":{"App\\Models\\ClientGatewayToken":[]}},"tasks":{"App\\Models\\Task":[{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","documents":{"App\\Models\\Document":[]},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"App\\Models\\Document":[]}}}]}}]'; public string $task_data = '[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]}]'; - public string $invoice_data = '[{ "id": "VWPe9rxaLy", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 9199.58, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0001", "discount": 0, "po_number": "", "date": "2023-08-01", "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": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "QnXe0Rvbxr", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1801.8, "balance": 1801.8, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0002", "discount": 0, "po_number": "", "date": "2023-06-30", "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": 415.8, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1985-10-27", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Wjneg5YbwZ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 6860.73, "balance": 6860.73, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0003", "discount": 0, "po_number": "", "date": "2023-08-19", "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": 2009.73, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1990-11-17", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Volej2RejN", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1905.75, "balance": 1350.75, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799160, "archived_at": 0, "is_deleted": false, "number": "0004", "discount": 0, "po_number": "", "date": "2023-09-13", "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": 519.75, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1978-12-22", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 555, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "Cash" } }], "credits": [] }, { "id": "Wpmbk55ezJ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 8697.17, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "number": "0005", "discount": 0, "po_number": "", "date": "2023-07-11", "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": 1767.17, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1973-12-03", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 8697.17, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "mxkazm8eJ0", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1190, "balance": 746, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695798363, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "number": "0026", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; + public string $invoice_data = '[{ "id": "VWPe9rxaLy", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 9199.58, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0001", "discount": 0, "po_number": "", "date": "2023-08-01", "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": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "QnXe0Rvbxr", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1801.8, "balance": 1801.8, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0002", "discount": 0, "po_number": "", "date": "2023-06-30", "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": 415.8, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1985-10-27", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Wjneg5YbwZ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 6860.73, "balance": 6860.73, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0003", "discount": 0, "po_number": "", "date": "2023-08-19", "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": 2009.73, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1990-11-17", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Volej2RejN", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1905.75, "balance": 1350.75, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799160, "archived_at": 0, "is_deleted": false, "number": "0004", "discount": 0, "po_number": "", "date": "2023-09-13", "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": 519.75, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1978-12-22", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 555, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "Cash" } }], "credits": [] }, { "id": "Wpmbk55ezJ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 8697.17, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "number": "0005", "discount": 0, "po_number": "", "date": "2023-07-11", "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": 1767.17, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1973-12-03", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 8697.17, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 50, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 50, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "mxkazm8eJ0", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1190, "balance": 746, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695798363, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "number": "0026", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; public string $quote_data = '[{ "id": "KGRb41dBLZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "1", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799454, "archived_at": 0, "created_at": 1695799453, "number": "0006", "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": "", "terms": "Default company quote terms", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "MVyb8mdvAZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "2", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799461, "archived_at": 0, "created_at": 1695799458, "number": "0007", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "958c28fa-c217-42b5-8434-e326ac2ab1ad" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "2f2da954-e237-4794-955d-208de2ac63c5" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5807dea2-b153-4e45-84f0-006683ac0c6d" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9dc2a31c-06d1-4b4a-82ef-cc65bb43d906" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "80981f31-87f6-42ef-a582-3387612a2377" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "8ede63e2-d24d-4561-91b7-85ba2e2c0865" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "0a494280-65cf-473a-8519-d7ad1d73ab38" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "6c908212-9f4b-416b-a661-71aa2ce76ab9" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "77357757-607b-411a-a09f-0caa31745916" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "252c03d4-49a8-4c63-a86d-4c3184765388" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "VolejRRejN", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "3", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799466, "archived_at": 0, "created_at": 1695799461, "number": "0008", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "847d125a-5e32-45cf-aa8e-144095fc3b91" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "b789272e-557e-4186-b6e7-13b027c65e20" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "1539315f-927b-4489-be5b-a4dc944d32dc" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "5c26754d-7252-4d91-9883-319560a47f4f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9949909c-9ca0-4646-b2b3-263c12981481" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0aa3e83-e762-473d-8196-10d62350a5e8" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9f831c14-deaa-4fe7-a9d2-6b4bd40a8cc0" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "dd58c4a5-88da-4c04-8841-908304f42a0f" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "2d927272-f8f0-41db-9bf3-20c9a5f4575f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9e7f1874-8783-4dc8-aab1-b0aa60923380" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": [] } } }]'; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 79263cc74bb1..a3103b2a4c2d 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -379,6 +379,7 @@ class TemplateService $it = new PaymentTransformer(); $it->setDefaultIncludes(['client','invoices','paymentables']); $manager = new Manager(); + $manager->parseIncludes(['client','invoices','paymentables']); $resource = new \League\Fractal\Resource\Collection($payments, $it, null); $resources = $manager->createData($resource)->toArray(); diff --git a/composer.lock b/composer.lock index 04725b21e0a1..2493991eceb3 100644 --- a/composer.lock +++ b/composer.lock @@ -485,16 +485,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.14", + "version": "3.281.15", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4b5b8aab08ef0add75f086bc03c7651799d187db" + "reference": "8256b827274966396eccf8ad391ce88d7c53ffa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4b5b8aab08ef0add75f086bc03c7651799d187db", - "reference": "4b5b8aab08ef0add75f086bc03c7651799d187db", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8256b827274966396eccf8ad391ce88d7c53ffa0", + "reference": "8256b827274966396eccf8ad391ce88d7c53ffa0", "shasum": "" }, "require": { @@ -574,9 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.14" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.15" }, - "time": "2023-09-26T18:15:48+00:00" + "time": "2023-09-27T18:06:59+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1466,16 +1466,16 @@ }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { @@ -1507,9 +1507,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/event-manager", @@ -5834,16 +5834,16 @@ }, { "name": "microsoft/microsoft-graph", - "version": "1.106.0", + "version": "1.107.0", "source": { "type": "git", "url": "https://github.com/microsoftgraph/msgraph-sdk-php.git", - "reference": "a9f43d74131bb13cb1b5a999101d486b26601b8f" + "reference": "63fed05d4d9c348db094f8d8a1d44ff9ce6887c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/a9f43d74131bb13cb1b5a999101d486b26601b8f", - "reference": "a9f43d74131bb13cb1b5a999101d486b26601b8f", + "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/63fed05d4d9c348db094f8d8a1d44ff9ce6887c7", + "reference": "63fed05d4d9c348db094f8d8a1d44ff9ce6887c7", "shasum": "" }, "require": { @@ -5880,9 +5880,9 @@ "homepage": "https://developer.microsoft.com/en-us/graph", "support": { "issues": "https://github.com/microsoftgraph/msgraph-sdk-php/issues", - "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.106.0" + "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.107.0" }, - "time": "2023-09-08T06:02:27+00:00" + "time": "2023-09-27T06:43:40+00:00" }, { "name": "mollie/mollie-api-php", From 6dd9a6724feb55a49a07f5c05ca3be329f848ead Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 29 Sep 2023 17:14:59 +1000 Subject: [PATCH 035/109] Working on data feeds for templates --- composer.lock | 48 ++--- tests/Feature/Template/TemplateTest.php | 233 +++++++++++++++++++++++- 2 files changed, 255 insertions(+), 26 deletions(-) diff --git a/composer.lock b/composer.lock index 2493991eceb3..39e5e4356514 100644 --- a/composer.lock +++ b/composer.lock @@ -485,16 +485,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.15", + "version": "3.282.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8256b827274966396eccf8ad391ce88d7c53ffa0" + "reference": "79a3ed5bb573f592823f8b1cffe0dbac3132e6b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8256b827274966396eccf8ad391ce88d7c53ffa0", - "reference": "8256b827274966396eccf8ad391ce88d7c53ffa0", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/79a3ed5bb573f592823f8b1cffe0dbac3132e6b4", + "reference": "79a3ed5bb573f592823f8b1cffe0dbac3132e6b4", "shasum": "" }, "require": { @@ -574,9 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.15" + "source": "https://github.com/aws/aws-sdk-php/tree/3.282.0" }, - "time": "2023-09-27T18:06:59+00:00" + "time": "2023-09-28T18:09:20+00:00" }, { "name": "bacon/bacon-qr-code", @@ -4287,16 +4287,16 @@ }, { "name": "laravel/framework", - "version": "v10.25.1", + "version": "v10.25.2", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "cd0a440f43eaaad247d6f6575d3782c156ec913c" + "reference": "6014dd456b414b305fb0b408404efdcec18e64bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/cd0a440f43eaaad247d6f6575d3782c156ec913c", - "reference": "cd0a440f43eaaad247d6f6575d3782c156ec913c", + "url": "https://api.github.com/repos/laravel/framework/zipball/6014dd456b414b305fb0b408404efdcec18e64bc", + "reference": "6014dd456b414b305fb0b408404efdcec18e64bc", "shasum": "" }, "require": { @@ -4483,7 +4483,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-09-27T01:29:32+00:00" + "time": "2023-09-28T14:08:59+00:00" }, { "name": "laravel/prompts", @@ -9698,16 +9698,16 @@ }, { "name": "setasign/fpdi", - "version": "v2.4.1", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b" + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b", - "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4", + "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4", "shasum": "" }, "require": { @@ -9758,7 +9758,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.4.1" + "source": "https://github.com/Setasign/FPDI/tree/v2.5.0" }, "funding": [ { @@ -9766,7 +9766,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T08:12:09+00:00" + "time": "2023-09-28T10:46:27+00:00" }, { "name": "shopify/shopify-api", @@ -16711,16 +16711,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", "shasum": "" }, "require": { @@ -16733,7 +16733,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.1-dev" } }, "autoload": { @@ -16757,7 +16757,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" }, "funding": [ { @@ -16765,7 +16765,7 @@ "type": "github" } ], - "time": "2023-08-31T09:55:53+00:00" + "time": "2023-09-28T11:50:59+00:00" }, { "name": "sebastian/diff", diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 0d86917b54e1..502a5f8e338c 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -13,16 +13,20 @@ namespace Tests\Feature\Template; use Tests\TestCase; use App\Utils\Ninja; +use App\Utils\Number; +use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; +use App\Models\Payment; use App\Utils\HtmlEngine; use Tests\MockAccountData; +use App\Utils\Traits\MakesDates; use App\Services\PdfMaker\PdfMaker; use Illuminate\Support\Facades\App; use App\Jobs\Entity\CreateEntityPdf; +use App\Services\Template\TemplateService; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -use App\Services\Template\TemplateService; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -34,6 +38,7 @@ class TemplateTest extends TestCase { use DatabaseTransactions; use MockAccountData; + use MakesDates; private string $body = ' @@ -170,6 +175,219 @@ class TemplateTest extends TestCase ThrottleRequests::class ); + } + + public function testDataMaps() + { + + Invoice::factory()->count(10)->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'status_id' => Invoice::STATUS_SENT, + 'amount' => 100, + 'balance' => 100, + ]); + + $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){ + return ['invoice_id' => $i->hashed_id, 'amount' => rand(0, $i->balance)]; + })->toArray(); + + Credit::factory()->count(2)->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'status_id' => Invoice::STATUS_SENT, + 'amount' => 50, + 'balance' => 50, + ]); + + $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)]; + })->toArray(); + + $data = [ + 'invoices' => $invoices, + 'credits' => $credits, + 'date' => now()->format('Y-m-d'), + 'client_id' => $this->client->hashed_id, + 'transaction_reference' => 'My Batch Payment', + 'type_id' => "5", + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/', $data); + + $response->assertStatus(200); + + $arr = $response->json(); + + // $p = Payment::with('client','invoices','paymentables','credits') + // ->where('id', $this->decodePrimaryKey($arr['data']['id']))->first(); + + // nlog($p->toArray()); + + $p = Payment::with('client','invoices','paymentables','credits') + ->where('id', $this->decodePrimaryKey($arr['data']['id'])) + ->cursor() + ->map(function ($payment){ + + $this->transformPayment($payment); + + })->toArray(); + + $this->assertIsArray($data); + + $invoices = Invoice::with('client','payments','credits') + ->orderBy('id','desc') + ->where('client_id', $this->client->id) + ->take(10) + ->get() + ->map(function($invoice){ + + $payments = $invoice->payments->map(function ($payment){ + return $this->transformPayment($payment); + })->toArray(); + + return [ + 'amount' => Number::formatMoney($invoice->amount, $invoice->client), + 'balance' => Number::formatMoney($invoice->balance, $invoice->client), + 'balance_raw' => $invoice->balance, + 'number' => $invoice->number ?: '', + 'discount' => $invoice->discount, + 'po_number' => $invoice->po_number ?: '', + 'date' => $this->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()), + 'last_sent_date' => $this->translateDate($invoice->last_sent_date, $invoice->client->date_format(), $invoice->client->locale()), + 'next_send_date' => $this->translateDate($invoice->next_send_date, $invoice->client->date_format(), $invoice->client->locale()), + 'due_date' => $this->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'terms' => $invoice->terms ?: '', + 'public_notes' => $invoice->public_notes ?: '', + 'private_notes' => $invoice->private_notes ?: '', + 'uses_inclusive_taxes' => (bool) $invoice->uses_inclusive_taxes, + 'tax_name1' => $invoice->tax_name1 ?? '', + 'tax_rate1' => (float) $invoice->tax_rate1, + 'tax_name2' => $invoice->tax_name2 ?? '', + 'tax_rate2' => (float) $invoice->tax_rate2, + 'tax_name3' => $invoice->tax_name3 ?? '', + 'tax_rate3' => (float) $invoice->tax_rate3, + 'total_taxes' => Number::formatMoney($invoice->total_taxes, $invoice->client), + 'total_taxes_raw' => $invoice->total_taxes, + 'is_amount_discount' => (bool) $invoice->is_amount_discount ?? false, + 'footer' => $invoice->footer ?? '', + 'partial' => $invoice->partial ?? 0, + 'partial_due_date' => $this->translateDate($invoice->partial_due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'custom_value1' => (string) $invoice->custom_value1 ?: '', + 'custom_value2' => (string) $invoice->custom_value2 ?: '', + 'custom_value3' => (string) $invoice->custom_value3 ?: '', + 'custom_value4' => (string) $invoice->custom_value4 ?: '', + 'custom_surcharge1' => (float) $invoice->custom_surcharge1, + 'custom_surcharge2' => (float) $invoice->custom_surcharge2, + 'custom_surcharge3' => (float) $invoice->custom_surcharge3, + 'custom_surcharge4' => (float) $invoice->custom_surcharge4, + 'exchange_rate' => (float) $invoice->exchange_rate, + 'custom_surcharge_tax1' => (bool) $invoice->custom_surcharge_tax1, + 'custom_surcharge_tax2' => (bool) $invoice->custom_surcharge_tax2, + 'custom_surcharge_tax3' => (bool) $invoice->custom_surcharge_tax3, + 'custom_surcharge_tax4' => (bool) $invoice->custom_surcharge_tax4, + 'line_items' => $invoice->line_items ?: (array) [], + 'reminder1_sent' => $this->translateDate($invoice->reminder1_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder2_sent' => $this->translateDate($invoice->reminder2_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder3_sent' => $this->translateDate($invoice->reminder3_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder_last_sent' => $this->translateDate($invoice->reminder_last_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'paid_to_date' => Number::formatMoney($invoice->paid_to_date, $invoice->client), + 'auto_bill_enabled' => (bool) $invoice->auto_bill_enabled, + 'client' => [ + 'name' => $invoice->client->present()->name(), + 'balance' => $invoice->client->balance, + 'payment_balance' => $invoice->client->payment_balance, + 'credit_balance' => $invoice->client->credit_balance, + ], + 'payments' => $payments + ]; + })->toArray(); + + $this->assertIsArray($invoices); + + } + + private function transformPayment(Payment $payment): array + { + + $data = []; + + $credits = $payment->credits->map(function ($credit) use ($payment) { + return [ + 'credit' => $credit->number, + 'amount_raw' => $credit->pivot->amount, + 'refunded_raw' => $credit->pivot->refunded, + 'net_raw' => $credit->pivot->amount - $credit->pivot->refunded, + 'amount' => Number::formatMoney($credit->pivot->amount, $payment->client), + 'refunded' => Number::formatMoney($credit->pivot->refunded, $payment->client), + 'net' => Number::formatMoney($credit->pivot->amount - $credit->pivot->refunded, $payment->client), + 'is_credit' => true, + 'created_at' => $this->translateDate($credit->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), + 'updated_at' => $this->translateDate($credit->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), + 'timestamp' => $credit->pivot->created_at->timestamp, + ]; + }); + + $pivot = $payment->invoices->map(function ($invoice) use ($payment) { + return [ + 'invoice' => $invoice->number, + 'amount_raw' => $invoice->pivot->amount, + 'refunded_raw' => $invoice->pivot->refunded, + 'net_raw' => $invoice->pivot->amount - $invoice->pivot->refunded, + 'amount' => Number::formatMoney($invoice->pivot->amount, $payment->client), + 'refunded' => Number::formatMoney($invoice->pivot->refunded, $payment->client), + 'net' => Number::formatMoney($invoice->pivot->amount - $invoice->pivot->refunded, $payment->client), + 'is_credit' => false, + 'created_at' => $this->translateDate($invoice->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), + 'updated_at' => $this->translateDate($invoice->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), + 'timestamp' => $invoice->pivot->created_at->timestamp, + ]; + })->merge($credits)->sortBy('timestamp')->toArray(); + + return [ + 'status' => $payment->stringStatus($payment->status_id), + 'badge' => $payment->badgeForStatus($payment->status_id), + 'amount' => Number::formatMoney($payment->amount, $payment->client), + 'applied' => Number::formatMoney($payment->applied, $payment->client), + 'balance' => Number::formatMoney(($payment->amount - $payment->refunded - $payment->applied), $payment->client), + 'refunded' => Number::formatMoney($payment->refunded, $payment->client), + 'amount_raw' => $payment->amount, + 'applied_raw' => $payment->applied, + 'refunded_raw' => $payment->refunded, + 'balance_raw' => ($payment->amount - $payment->refunded - $payment->applied), + 'date' => $this->translateDate($payment->date, $payment->client->date_format(), $payment->client->locale()), + 'method' => $payment->translatedType(), + 'currency' => $payment->currency->code, + 'exchange_rate' => $payment->exchange_rate, + 'transaction_reference' => $payment->transaction_reference, + 'is_manual' => $payment->is_manual, + 'number' => $payment->number, + 'custom_value1' => $payment->custom_value1 ?? '', + 'custom_value2' => $payment->custom_value2 ?? '', + 'custom_value3' => $payment->custom_value3 ?? '', + 'custom_value4' => $payment->custom_value4 ?? '', + 'client' => [ + 'name' => $payment->client->present()->name(), + 'balance' => $payment->client->balance, + 'payment_balance' => $payment->client->payment_balance, + 'credit_balance' => $payment->client->credit_balance, + ], + 'paymentables' => $pivot, + ]; + + return $data; + + + } public function testVariableResolutionViaTransformersForPaymentsInStatements() @@ -216,6 +434,8 @@ class TemplateTest extends TestCase $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; @@ -238,6 +458,8 @@ class TemplateTest extends TestCase $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->nested_body; $replicated_design->design = $design; @@ -269,6 +491,8 @@ class TemplateTest extends TestCase $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->body; $replicated_design->design = $design; @@ -298,8 +522,9 @@ class TemplateTest extends TestCase public function testTemplateServiceBuild() { $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->body; $replicated_design->design = $design; @@ -321,6 +546,8 @@ class TemplateTest extends TestCase $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->body; $replicated_design->design = $design; @@ -336,6 +563,8 @@ class TemplateTest extends TestCase $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->body; $replicated_design->design = $design; From 2dd98ccbc52cbc1fe083610619c627ec71880eda Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 30 Sep 2023 09:40:41 +1000 Subject: [PATCH 036/109] Tests for data collecting --- tests/Feature/Template/TemplateTest.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 502a5f8e338c..d2fedf16eed0 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -179,6 +179,7 @@ class TemplateTest extends TestCase public function testDataMaps() { + $start = microtime(true); Invoice::factory()->count(10)->create([ 'company_id' => $this->company->id, @@ -233,6 +234,8 @@ class TemplateTest extends TestCase // nlog($p->toArray()); + $start = microtime(true); + $p = Payment::with('client','invoices','paymentables','credits') ->where('id', $this->decodePrimaryKey($arr['data']['id'])) ->cursor() @@ -242,9 +245,15 @@ class TemplateTest extends TestCase })->toArray(); + + nlog("end payments = " . microtime(true) - $start); + $this->assertIsArray($data); - $invoices = Invoice::with('client','payments','credits') + $start = microtime(true); +\DB::enableQueryLog(); + + $invoices = Invoice::with('client','payments.client','payments.paymentables','payments.credits','credits.client') ->orderBy('id','desc') ->where('client_id', $this->client->id) ->take(10) @@ -252,6 +261,7 @@ class TemplateTest extends TestCase ->map(function($invoice){ $payments = $invoice->payments->map(function ($payment){ + nlog(microtime(true)); return $this->transformPayment($payment); })->toArray(); @@ -312,8 +322,15 @@ class TemplateTest extends TestCase ]; })->toArray(); + $queries = \DB::getQueryLog(); + $count = count($queries); + + nlog("query count = {$count}"); + nlog($invoices); $this->assertIsArray($invoices); + nlog("end invoices = " . microtime(true) - $start); + } private function transformPayment(Payment $payment): array From 9231dab99971f8b3074337c169c4aed2bbe90ea7 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 1 Oct 2023 15:40:50 +1100 Subject: [PATCH 037/109] Refactor for data providers for templates --- app/Services/Template/TemplateMock.php | 5 +- composer.lock | 193 ++++++++++++------------ tests/Feature/Template/TemplateTest.php | 22 +-- 3 files changed, 113 insertions(+), 107 deletions(-) diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index c4f70cd64a05..2298fcae5076 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -23,7 +23,10 @@ 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 = '[{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }] }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }] }, { "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }] }, { "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }] }, { "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 5, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }] }]'; + public string $payment_data = "[{"amount":"$100.00","balance":"$79.00","balance_raw":"79.000000","number":"8203155839804","discount":7,"po_number":"Animi eum.","date":"07\\\/Dec\\\/1996","last_sent_date":"","next_send_date":"","due_date":"16\\\/Jun\\\/2017","terms":"Unde beatae et laborum. Assumenda et molestiae dolorum consequatur repudiandae voluptas. Eos rerum consectetur voluptate ducimus. Consequatur deserunt veniam perspiciatis. Illo totam assumenda in quae. Magni quis eligendi commodi non voluptatem delectus. Iste pariatur voluptatum repudiandae molestiae corrupti iusto voluptatem animi. Et ipsum soluta deleniti dolorem quo. Odio quaerat sint et soluta. Ut doloremque similique in sed. Ut corporis est incidunt rerum voluptas in.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2007-06-12","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":9,"cost":136.9,"product_key":"velit","notes":"I was going to turn round on its axis--'.","discount":4,"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":1232.1000000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":681.34,"product_key":"quidem","notes":"Alice to find my way into that beautiful.","discount":1,"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":1362.68,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":552.24,"product_key":"quasi","notes":"I like\\"!' 'You might just as if he had come to.","discount":6,"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":1656.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":893.31,"product_key":"quis","notes":"I give you fair warning,' shouted the Queen.","discount":4,"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":7146.48,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":284.14,"product_key":"in","notes":"Hatter: 'but you could manage it?) 'And what an.","discount":10,"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":2557.2599999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$21.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$100.00","balance_raw":"100.000000","number":"5380674505151","discount":9,"po_number":"Quis quas.","date":"24\\\/Nov\\\/2013","last_sent_date":"","next_send_date":"","due_date":"17\\\/May\\\/2006","terms":"Adipisci ut in deserunt eum. Explicabo dolores blanditiis nesciunt veritatis saepe suscipit. Eum modi et excepturi quisquam maxime. Qui aut cum est voluptatem molestiae fuga. Quia temporibus illo esse voluptatem qui. Dolore numquam exercitationem quaerat vero nesciunt. Delectus vel enim debitis sit qui officia. Quo consectetur adipisci qui quia impedit enim et repellat.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2008-02-05","custom_value2":"yes","custom_value3":"3","custom_value4":"1","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":271.42,"product_key":"iste","notes":"MINE.' The Queen smiled and passed on. 'Who ARE.","discount":8,"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":271.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":941.72,"product_key":"natus","notes":"Why, she'll eat a little way off, and that if.","discount":10,"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":4708.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":702.01,"product_key":"natus","notes":"At last the Caterpillar seemed to be no chance.","discount":4,"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":4212.0599999999995,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":748.88,"product_key":"voluptate","notes":"The Cat seemed to have no answers.' 'If you.","discount":6,"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":2246.64,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":38.09,"product_key":"enim","notes":"I had not attended to this last remark that had.","discount":4,"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":152.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$27.00","balance_raw":"27.000000","number":"9701706715755","discount":5,"po_number":"Aliquid.","date":"10\\\/Apr\\\/1995","last_sent_date":"","next_send_date":"","due_date":"30\\\/Apr\\\/1998","terms":"Ab consectetur voluptates tempore. Magnam et veniam impedit minima eligendi itaque tempore. Non rerum a reprehenderit. Aut omnis molestiae possimus odio nisi perspiciatis. Consequatur culpa molestiae quis. Ratione voluptas est cumque sunt. Quia labore deleniti dicta placeat rem voluptas et.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1995-07-22","custom_value2":"yes","custom_value3":"3","custom_value4":"1","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":3,"cost":127.69,"product_key":"et","notes":"Next came the royal children; there were TWO.","discount":8,"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":383.07,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":868.16,"product_key":"corrupti","notes":"Queen: so she waited. The Gryphon sat up and.","discount":3,"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":7813.44,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":570.9,"product_key":"neque","notes":"NOT marked 'poison,' it is almost certain to.","discount":6,"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":1141.8,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":894.95,"product_key":"ullam","notes":"DON'T know,' said the Hatter, and here the Mock.","discount":1,"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":4474.75,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":949.38,"product_key":"aut","notes":"I shall be punished for it now, I suppose, by.","discount":5,"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":5696.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$31.00","balance_raw":"31.000000","number":"6713201251853","discount":5,"po_number":"Veniam id.","date":"19\\\/Mar\\\/1990","last_sent_date":"","next_send_date":"","due_date":"22\\\/Nov\\\/2021","terms":"Quos nobis facilis explicabo aut consequatur. Sunt ut voluptatem sapiente corrupti rerum. Quo possimus consequatur corrupti sed blanditiis similique ut quibusdam. Reiciendis quis delectus magnam corrupti corporis. Nihil non nihil similique ab nisi. Quia voluptatem dolorum earum iusto enim ipsa. Expedita consequatur et deserunt minus. Fugit non ea laboriosam et delectus aut. Culpa cumque voluptate quibusdam expedita recusandae minima et et.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-12-01","custom_value2":"no","custom_value3":"4","custom_value4":"2","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":4,"cost":953.9,"product_key":"velit","notes":"But the insolence of his shrill little voice.","discount":1,"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":3815.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":186.47,"product_key":"dolorem","notes":"Hatter. 'You might just as well wait, as she.","discount":9,"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":1305.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":310.3,"product_key":"nostrum","notes":"I? Ah, THAT'S the great concert given by the.","discount":5,"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":620.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":376.99,"product_key":"aut","notes":"The hedgehog was engaged in a helpless sort of.","discount":4,"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":1507.96,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":847.47,"product_key":"nemo","notes":"VERY unpleasant state of mind, she turned the.","discount":1,"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":5932.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$53.00","balance_raw":"53.000000","number":"4722647616586","discount":8,"po_number":"Et.","date":"19\\\/Feb\\\/2008","last_sent_date":"","next_send_date":"","due_date":"26\\\/Jul\\\/2002","terms":"Rerum ea ratione quasi perferendis praesentium accusantium. Doloribus est nesciunt aspernatur. Explicabo ut facere odio. Dolorum dolorem excepturi alias aut nemo nesciunt architecto omnis. Nobis rem autem fugit. Repudiandae et inventore quis sequi. Est accusantium facilis ipsa consequuntur pariatur ut aut. Quam qui architecto quia molestiae. Hic omnis nobis nulla sint officiis nihil non.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2015-08-23","custom_value2":"no","custom_value3":"1","custom_value4":"2","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":3,"cost":264.3,"product_key":"maxime","notes":"I don't want to go on in the same age as.","discount":6,"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":792.9000000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":326.41,"product_key":"est","notes":"King in a dreamy sort of knot, and then sat upon.","discount":8,"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":2937.69,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":733.44,"product_key":"quae","notes":"However, she did not see anything that looked.","discount":9,"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":7334.400000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":368.19,"product_key":"id","notes":"Mabel after all, and I had not attended to this.","discount":5,"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":3313.71,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":132.57,"product_key":"eum","notes":"The first question of course you know what to.","discount":9,"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":265.14,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$39.00","balance_raw":"39.000000","number":"2869896494625","discount":2,"po_number":"Et.","date":"30\\\/Apr\\\/2022","last_sent_date":"","next_send_date":"","due_date":"27\\\/Dec\\\/1972","terms":"Ut asperiores ab aliquid et sint fuga. Cupiditate porro laborum voluptatum veniam. Est architecto voluptatibus nobis quia aut quisquam. Accusantium non nemo dolorem sed pariatur dolor. Distinctio accusantium esse itaque expedita totam voluptas accusamus. Sit eum autem provident sunt aut. Voluptatem sed in dolores earum similique. Repellat voluptatem vero aut eum debitis.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-07-16","custom_value2":"no","custom_value3":"3","custom_value4":"3","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":4,"cost":240.46,"product_key":"dolore","notes":"When the procession came opposite to Alice, and.","discount":3,"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":961.84,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":629.01,"product_key":"tempore","notes":"Hatter, 'or you'll be telling me next that you.","discount":1,"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":6290.1,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":586.37,"product_key":"ducimus","notes":"Alice replied in an offended tone, 'Hm! No.","discount":6,"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":1759.1100000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":716,"product_key":"rerum","notes":"First, she tried to get hold of its voice. 'Back.","discount":3,"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":716,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":529.24,"product_key":"et","notes":"Dormouse,' the Queen had ordered. They very soon.","discount":4,"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":1587.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$23.00","balance_raw":"23.000000","number":"7455293413298","discount":10,"po_number":"Eum ut.","date":"11\\\/May\\\/1985","last_sent_date":"","next_send_date":"","due_date":"19\\\/Dec\\\/1970","terms":"Doloribus nihil nisi excepturi nihil. Maiores dolor necessitatibus et laboriosam deleniti aut corporis. Aperiam quia excepturi voluptatum incidunt. Consequatur magni et est et quaerat. Impedit odit molestias dolore aliquid vero sit. Ut ipsa et deserunt et. Numquam molestias ea ea autem. Voluptas repellat sunt rerum earum magnam doloremque provident. Odio saepe sint omnis incidunt qui ut consequatur. Blanditiis qui magni sit. Dolor quo provident laborum quod qui recusandae unde.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1979-02-20","custom_value2":"no","custom_value3":"2","custom_value4":"3","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":3,"cost":369.19,"product_key":"distinctio","notes":"Duchess sneezed occasionally; and as the jury.","discount":10,"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":1107.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":997.15,"product_key":"harum","notes":"Mouse only shook its head impatiently, and.","discount":10,"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":8974.35,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":157.52,"product_key":"omnis","notes":"So they began running when they saw the White.","discount":5,"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":1260.16,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":802.16,"product_key":"illo","notes":"Alice timidly. 'Would you like the right height.","discount":3,"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":8021.599999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":878.69,"product_key":"et","notes":"Mock Turtle, 'but if they do, why then they're a.","discount":8,"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":1757.38,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$50.00","balance_raw":"50.000000","number":"9500243978117","discount":3,"po_number":"Soluta.","date":"17\\\/Jul\\\/1991","last_sent_date":"","next_send_date":"","due_date":"02\\\/Jun\\\/1997","terms":"Velit possimus qui numquam vel ut. Sit natus et nobis cum id dolore. Iusto voluptatum consequatur error. Exercitationem natus voluptate cum labore. Ut cupiditate ipsa et eaque aut est perspiciatis. Et natus porro cumque est voluptatem repudiandae ullam reiciendis. Aliquid facere excepturi repellat voluptas expedita cum consequatur. Aperiam aut sed magni nihil. Animi ducimus ea aut ut rem ipsa perferendis.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1991-07-20","custom_value2":"no","custom_value3":"1","custom_value4":"1","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":290.98,"product_key":"voluptatem","notes":"It quite makes my forehead ache!' Alice watched.","discount":1,"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":290.98,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":488.12,"product_key":"culpa","notes":"How I wonder what they said. The executioner's.","discount":8,"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":1952.48,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":758.58,"product_key":"voluptatum","notes":"Duchess: 'what a clear way you go,' said the.","discount":6,"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":5310.06,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":113.07,"product_key":"expedita","notes":"Alice, a little bottle on it, for she was.","discount":1,"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":452.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":83.42,"product_key":"tempore","notes":"I believe.' 'Boots and shoes under the window.","discount":4,"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":500.52,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$68.00","balance_raw":"68.000000","number":"1594748358466","discount":2,"po_number":"Corporis.","date":"30\\\/Dec\\\/1986","last_sent_date":"","next_send_date":"","due_date":"15\\\/Sep\\\/2002","terms":"Quos et facilis minus sunt. Non qui quos repellat. Delectus debitis aut ipsam possimus. Atque et nesciunt quae placeat at. Voluptatem rem quia quae. Quia fugit soluta in suscipit culpa ab. Est earum assumenda molestiae quae voluptatem accusamus. Placeat iure similique sunt molestiae eum laudantium. Quia iste nisi quaerat aperiam quam animi ut. Quis dolores temporibus voluptatibus. Iusto numquam assumenda molestias doloribus et eaque quidem.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1988-06-17","custom_value2":"yes","custom_value3":"4","custom_value4":"1","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":2,"cost":821.14,"product_key":"et","notes":"Alice heard it before,' said the Lory positively.","discount":4,"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":1642.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":328.19,"product_key":"recusandae","notes":"Hatter. 'You might just as well as she swam.","discount":9,"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":2953.71,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":264.33,"product_key":"voluptatem","notes":"Hatter, 'you wouldn't talk about trouble!' said.","discount":10,"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":792.99,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":939.11,"product_key":"dolorum","notes":"Dinah, if I fell off the fire, licking her paws.","discount":8,"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":5634.66,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":257.01,"product_key":"consequatur","notes":"Dinah, tell me your history, she do.' 'I'll tell.","discount":10,"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":1285.05,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$78.00","balance_raw":"78.000000","number":"7717690731864","discount":4,"po_number":"Quis quia.","date":"30\\\/Jan\\\/2003","last_sent_date":"","next_send_date":"","due_date":"01\\\/Jun\\\/2021","terms":"Non sit hic eos nisi et aliquam nulla. Fugit dignissimos magnam officia aliquid. Aut voluptatem vero quasi reiciendis. Qui aut nemo vero architecto harum. Beatae cumque excepturi ad tempore perspiciatis eaque. Sed ut assumenda ut aperiam dicta. Eligendi voluptatibus ipsum laborum est dolores tempore. Unde cupiditate est qui veritatis fugiat. Iure natus nulla saepe corrupti eveniet harum ratione mollitia.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1981-12-19","custom_value2":"no","custom_value3":"2","custom_value4":"2","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":28.42,"product_key":"tempora","notes":"Let me see: that would be of very little way.","discount":8,"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":28.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":180.36,"product_key":"laudantium","notes":"Once more she found herself safe in a confused.","discount":3,"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":1262.52,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":791.62,"product_key":"consequatur","notes":"He looked anxiously at the bottom of a well?'.","discount":10,"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":7916.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":644.8,"product_key":"vel","notes":"For instance, if you like!' the Duchess said.","discount":2,"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":6448,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":267.08,"product_key":"in","notes":"EVER happen in a great many more than three.'.","discount":6,"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":534.16,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]}]" +; + + public string $payment_data2 = '[{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }] }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }] }, { "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }] }, { "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }] }, { "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 5, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }] }]'; 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":[]}}}]'; diff --git a/composer.lock b/composer.lock index 39e5e4356514..f1745e73b6bd 100644 --- a/composer.lock +++ b/composer.lock @@ -3397,16 +3397,16 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.29", + "version": "v1.0.30", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "9fb81e2e9a16d10bec8bf655484aae11bdca1997" + "reference": "b5e85651fe2e53eef82aa086c9245b7f5229433f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/9fb81e2e9a16d10bec8bf655484aae11bdca1997", - "reference": "9fb81e2e9a16d10bec8bf655484aae11bdca1997", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/b5e85651fe2e53eef82aa086c9245b7f5229433f", + "reference": "b5e85651fe2e53eef82aa086c9245b7f5229433f", "shasum": "" }, "require": { @@ -3464,9 +3464,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.29" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.30" }, - "time": "2023-09-23T06:15:04+00:00" + "time": "2023-09-30T13:42:02+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -4487,16 +4487,16 @@ }, { "name": "laravel/prompts", - "version": "v0.1.9", + "version": "v0.1.10", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "b603410e7af1040aa2d29e0a2cdca570bb63e827" + "reference": "37ed55f6950d921a87d5beeab16d03f8de26b060" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/b603410e7af1040aa2d29e0a2cdca570bb63e827", - "reference": "b603410e7af1040aa2d29e0a2cdca570bb63e827", + "url": "https://api.github.com/repos/laravel/prompts/zipball/37ed55f6950d921a87d5beeab16d03f8de26b060", + "reference": "37ed55f6950d921a87d5beeab16d03f8de26b060", "shasum": "" }, "require": { @@ -4538,9 +4538,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.9" + "source": "https://github.com/laravel/prompts/tree/v0.1.10" }, - "time": "2023-09-26T13:14:20+00:00" + "time": "2023-09-29T07:26:07+00:00" }, { "name": "laravel/serializable-closure", @@ -10621,16 +10621,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" + "reference": "1f69476b64fb47105c06beef757766c376b548c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", - "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", + "reference": "1f69476b64fb47105c06beef757766c376b548c4", "shasum": "" }, "require": { @@ -10675,7 +10675,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.3.2" + "source": "https://github.com/symfony/error-handler/tree/v6.3.5" }, "funding": [ { @@ -10691,7 +10691,7 @@ "type": "tidelift" } ], - "time": "2023-07-16T17:05:46+00:00" + "time": "2023-09-12T06:57:20+00:00" }, { "name": "symfony/event-dispatcher", @@ -10914,16 +10914,16 @@ }, { "name": "symfony/finder", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "shasum": "" }, "require": { @@ -10958,7 +10958,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.3" + "source": "https://github.com/symfony/finder/tree/v6.3.5" }, "funding": [ { @@ -10974,20 +10974,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:31:44+00:00" + "time": "2023-09-26T12:56:25+00:00" }, { "name": "symfony/http-client", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00" + "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", - "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", + "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d", + "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d", "shasum": "" }, "require": { @@ -11050,7 +11050,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.2" + "source": "https://github.com/symfony/http-client/tree/v6.3.5" }, "funding": [ { @@ -11066,7 +11066,7 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-09-29T15:57:12+00:00" }, { "name": "symfony/http-client-contracts", @@ -11148,16 +11148,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.4", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", - "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957", + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957", "shasum": "" }, "require": { @@ -11205,7 +11205,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.5" }, "funding": [ { @@ -11221,20 +11221,20 @@ "type": "tidelift" } ], - "time": "2023-08-22T08:20:46+00:00" + "time": "2023-09-04T21:33:54+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.4", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb" + "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", - "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc", + "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc", "shasum": "" }, "require": { @@ -11318,7 +11318,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.4" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.5" }, "funding": [ { @@ -11334,7 +11334,7 @@ "type": "tidelift" } ], - "time": "2023-08-26T13:54:49+00:00" + "time": "2023-09-30T06:37:04+00:00" }, { "name": "symfony/intl", @@ -11420,16 +11420,16 @@ }, { "name": "symfony/mailer", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435" + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", - "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", "shasum": "" }, "require": { @@ -11480,7 +11480,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.3.0" + "source": "https://github.com/symfony/mailer/tree/v6.3.5" }, "funding": [ { @@ -11496,20 +11496,20 @@ "type": "tidelift" } ], - "time": "2023-05-29T12:49:39+00:00" + "time": "2023-09-06T09:47:15+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "df371e42a4c2a78a28c8de910f96949040e308fd" + "reference": "b467aba49c8240a71f7027c213d9d140ba1abce7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/df371e42a4c2a78a28c8de910f96949040e308fd", - "reference": "df371e42a4c2a78a28c8de910f96949040e308fd", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/b467aba49c8240a71f7027c213d9d140ba1abce7", + "reference": "b467aba49c8240a71f7027c213d9d140ba1abce7", "shasum": "" }, "require": { @@ -11549,7 +11549,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.2" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.5" }, "funding": [ { @@ -11565,20 +11565,20 @@ "type": "tidelift" } ], - "time": "2023-07-20T10:26:17+00:00" + "time": "2023-09-29T17:30:10+00:00" }, { "name": "symfony/mime", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", "shasum": "" }, "require": { @@ -11633,7 +11633,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.3" + "source": "https://github.com/symfony/mime/tree/v6.3.5" }, "funding": [ { @@ -11649,7 +11649,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-09-29T06:59:36+00:00" }, { "name": "symfony/options-resolver", @@ -13010,16 +13010,16 @@ }, { "name": "symfony/routing", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", - "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", + "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", "shasum": "" }, "require": { @@ -13073,7 +13073,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.3" + "source": "https://github.com/symfony/routing/tree/v6.3.5" }, "funding": [ { @@ -13089,7 +13089,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-09-20T16:05:51+00:00" }, { "name": "symfony/service-contracts", @@ -13175,16 +13175,16 @@ }, { "name": "symfony/string", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "53d1a83225002635bca3482fcbf963001313fb68" + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", - "reference": "53d1a83225002635bca3482fcbf963001313fb68", + "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", "shasum": "" }, "require": { @@ -13241,7 +13241,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.2" + "source": "https://github.com/symfony/string/tree/v6.3.5" }, "funding": [ { @@ -13257,7 +13257,7 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-09-18T10:38:32+00:00" }, { "name": "symfony/translation", @@ -13508,16 +13508,16 @@ }, { "name": "symfony/validator", - "version": "v6.3.4", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "0c8435154920b9bbe93bece675234c244cadf73b" + "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/0c8435154920b9bbe93bece675234c244cadf73b", - "reference": "0c8435154920b9bbe93bece675234c244cadf73b", + "url": "https://api.github.com/repos/symfony/validator/zipball/48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", + "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", "shasum": "" }, "require": { @@ -13584,7 +13584,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.3.4" + "source": "https://github.com/symfony/validator/tree/v6.3.5" }, "funding": [ { @@ -13600,20 +13600,20 @@ "type": "tidelift" } ], - "time": "2023-08-17T15:49:05+00:00" + "time": "2023-09-29T07:41:15+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.4", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", - "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", "shasum": "" }, "require": { @@ -13668,7 +13668,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" }, "funding": [ { @@ -13684,7 +13684,7 @@ "type": "tidelift" } ], - "time": "2023-08-24T14:51:05+00:00" + "time": "2023-09-12T10:11:35+00:00" }, { "name": "symfony/yaml", @@ -15181,16 +15181,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.30.0", + "version": "v3.34.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f" + "reference": "7c7a4ad2ed8fe50df3e25528218b13d383608f23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/95c64693b2f149966a2bc05a7a4981b0343ea52f", - "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7c7a4ad2ed8fe50df3e25528218b13d383608f23", + "reference": "7c7a4ad2ed8fe50df3e25528218b13d383608f23", "shasum": "" }, "require": { @@ -15211,6 +15211,9 @@ "symfony/process": "^5.4 || ^6.0", "symfony/stopwatch": "^5.4 || ^6.0" }, + "conflict": { + "stevebauman/unfinalize": "*" + }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", @@ -15264,7 +15267,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.30.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.34.0" }, "funding": [ { @@ -15272,7 +15275,7 @@ "type": "github" } ], - "time": "2023-09-26T22:10:43+00:00" + "time": "2023-09-29T15:34:26+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -15983,16 +15986,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.35", + "version": "1.10.36", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" + "reference": "ffa3089511121a672e62969404e4fddc753f9b15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", - "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa3089511121a672e62969404e4fddc753f9b15", + "reference": "ffa3089511121a672e62969404e4fddc753f9b15", "shasum": "" }, "require": { @@ -16041,7 +16044,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T15:27:56+00:00" + "time": "2023-09-29T14:07:45+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index d2fedf16eed0..fafa8ac22c43 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -229,11 +229,6 @@ class TemplateTest extends TestCase $arr = $response->json(); - // $p = Payment::with('client','invoices','paymentables','credits') - // ->where('id', $this->decodePrimaryKey($arr['data']['id']))->first(); - - // nlog($p->toArray()); - $start = microtime(true); $p = Payment::with('client','invoices','paymentables','credits') @@ -251,7 +246,8 @@ class TemplateTest extends TestCase $this->assertIsArray($data); $start = microtime(true); -\DB::enableQueryLog(); + + \DB::enableQueryLog(); $invoices = Invoice::with('client','payments.client','payments.paymentables','payments.credits','credits.client') ->orderBy('id','desc') @@ -260,8 +256,9 @@ class TemplateTest extends TestCase ->get() ->map(function($invoice){ + $payments = []; $payments = $invoice->payments->map(function ($payment){ - nlog(microtime(true)); + // nlog(microtime(true)); return $this->transformPayment($payment); })->toArray(); @@ -318,16 +315,19 @@ class TemplateTest extends TestCase 'payment_balance' => $invoice->client->payment_balance, 'credit_balance' => $invoice->client->credit_balance, ], - 'payments' => $payments + 'payments' => $payments, ]; - })->toArray(); + }); $queries = \DB::getQueryLog(); $count = count($queries); nlog("query count = {$count}"); - nlog($invoices); - $this->assertIsArray($invoices); + + $x = $invoices->toArray(); + nlog(json_encode(htmlspecialchars(json_encode($x), ENT_QUOTES, 'UTF-8'))); + // nlog($invoices->toJson()); + $this->assertIsArray($invoices->toArray()); nlog("end invoices = " . microtime(true) - $start); From 72e699a045f731b4c3b8e47dc9f9e756d2cd25bd Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 1 Oct 2023 17:57:37 +1100 Subject: [PATCH 038/109] Refactor for data providers for templates --- app/Factory/InvoiceItemFactory.php | 2 +- app/Services/Template/TemplateMock.php | 8 +- app/Services/Template/TemplateService.php | 158 +++++++++++++++++++++- tests/Feature/Template/TemplateTest.php | 5 +- 4 files changed, 165 insertions(+), 8 deletions(-) diff --git a/app/Factory/InvoiceItemFactory.php b/app/Factory/InvoiceItemFactory.php index 08c13f47847f..153c5baf2527 100644 --- a/app/Factory/InvoiceItemFactory.php +++ b/app/Factory/InvoiceItemFactory.php @@ -63,7 +63,7 @@ class InvoiceItemFactory $item->line_total = $item->quantity * $item->cost; $item->is_amount_discount = true; $item->discount = $faker->numberBetween(1, 10); - $item->notes = $faker->realText(50); + $item->notes = str_replace(['"',"'"],['',""], $faker->realText(20)); $item->product_key = $faker->word(); // $item->custom_value1 = $faker->realText(10); // $item->custom_value2 = $faker->realText(10); diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 2298fcae5076..1dd5da502d13 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -23,8 +23,7 @@ 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 = "[{"amount":"$100.00","balance":"$79.00","balance_raw":"79.000000","number":"8203155839804","discount":7,"po_number":"Animi eum.","date":"07\\\/Dec\\\/1996","last_sent_date":"","next_send_date":"","due_date":"16\\\/Jun\\\/2017","terms":"Unde beatae et laborum. Assumenda et molestiae dolorum consequatur repudiandae voluptas. Eos rerum consectetur voluptate ducimus. Consequatur deserunt veniam perspiciatis. Illo totam assumenda in quae. Magni quis eligendi commodi non voluptatem delectus. Iste pariatur voluptatum repudiandae molestiae corrupti iusto voluptatem animi. Et ipsum soluta deleniti dolorem quo. Odio quaerat sint et soluta. Ut doloremque similique in sed. Ut corporis est incidunt rerum voluptas in.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2007-06-12","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":9,"cost":136.9,"product_key":"velit","notes":"I was going to turn round on its axis--'.","discount":4,"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":1232.1000000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":681.34,"product_key":"quidem","notes":"Alice to find my way into that beautiful.","discount":1,"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":1362.68,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":552.24,"product_key":"quasi","notes":"I like\\"!' 'You might just as if he had come to.","discount":6,"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":1656.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":893.31,"product_key":"quis","notes":"I give you fair warning,' shouted the Queen.","discount":4,"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":7146.48,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":284.14,"product_key":"in","notes":"Hatter: 'but you could manage it?) 'And what an.","discount":10,"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":2557.2599999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$21.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$100.00","balance_raw":"100.000000","number":"5380674505151","discount":9,"po_number":"Quis quas.","date":"24\\\/Nov\\\/2013","last_sent_date":"","next_send_date":"","due_date":"17\\\/May\\\/2006","terms":"Adipisci ut in deserunt eum. Explicabo dolores blanditiis nesciunt veritatis saepe suscipit. Eum modi et excepturi quisquam maxime. Qui aut cum est voluptatem molestiae fuga. Quia temporibus illo esse voluptatem qui. Dolore numquam exercitationem quaerat vero nesciunt. Delectus vel enim debitis sit qui officia. Quo consectetur adipisci qui quia impedit enim et repellat.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2008-02-05","custom_value2":"yes","custom_value3":"3","custom_value4":"1","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":271.42,"product_key":"iste","notes":"MINE.' The Queen smiled and passed on. 'Who ARE.","discount":8,"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":271.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":941.72,"product_key":"natus","notes":"Why, she'll eat a little way off, and that if.","discount":10,"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":4708.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":702.01,"product_key":"natus","notes":"At last the Caterpillar seemed to be no chance.","discount":4,"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":4212.0599999999995,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":748.88,"product_key":"voluptate","notes":"The Cat seemed to have no answers.' 'If you.","discount":6,"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":2246.64,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":38.09,"product_key":"enim","notes":"I had not attended to this last remark that had.","discount":4,"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":152.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$27.00","balance_raw":"27.000000","number":"9701706715755","discount":5,"po_number":"Aliquid.","date":"10\\\/Apr\\\/1995","last_sent_date":"","next_send_date":"","due_date":"30\\\/Apr\\\/1998","terms":"Ab consectetur voluptates tempore. Magnam et veniam impedit minima eligendi itaque tempore. Non rerum a reprehenderit. Aut omnis molestiae possimus odio nisi perspiciatis. Consequatur culpa molestiae quis. Ratione voluptas est cumque sunt. Quia labore deleniti dicta placeat rem voluptas et.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1995-07-22","custom_value2":"yes","custom_value3":"3","custom_value4":"1","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":3,"cost":127.69,"product_key":"et","notes":"Next came the royal children; there were TWO.","discount":8,"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":383.07,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":868.16,"product_key":"corrupti","notes":"Queen: so she waited. The Gryphon sat up and.","discount":3,"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":7813.44,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":570.9,"product_key":"neque","notes":"NOT marked 'poison,' it is almost certain to.","discount":6,"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":1141.8,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":894.95,"product_key":"ullam","notes":"DON'T know,' said the Hatter, and here the Mock.","discount":1,"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":4474.75,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":949.38,"product_key":"aut","notes":"I shall be punished for it now, I suppose, by.","discount":5,"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":5696.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$31.00","balance_raw":"31.000000","number":"6713201251853","discount":5,"po_number":"Veniam id.","date":"19\\\/Mar\\\/1990","last_sent_date":"","next_send_date":"","due_date":"22\\\/Nov\\\/2021","terms":"Quos nobis facilis explicabo aut consequatur. Sunt ut voluptatem sapiente corrupti rerum. Quo possimus consequatur corrupti sed blanditiis similique ut quibusdam. Reiciendis quis delectus magnam corrupti corporis. Nihil non nihil similique ab nisi. Quia voluptatem dolorum earum iusto enim ipsa. Expedita consequatur et deserunt minus. Fugit non ea laboriosam et delectus aut. Culpa cumque voluptate quibusdam expedita recusandae minima et et.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-12-01","custom_value2":"no","custom_value3":"4","custom_value4":"2","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":4,"cost":953.9,"product_key":"velit","notes":"But the insolence of his shrill little voice.","discount":1,"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":3815.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":186.47,"product_key":"dolorem","notes":"Hatter. 'You might just as well wait, as she.","discount":9,"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":1305.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":310.3,"product_key":"nostrum","notes":"I? Ah, THAT'S the great concert given by the.","discount":5,"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":620.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":376.99,"product_key":"aut","notes":"The hedgehog was engaged in a helpless sort of.","discount":4,"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":1507.96,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":847.47,"product_key":"nemo","notes":"VERY unpleasant state of mind, she turned the.","discount":1,"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":5932.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$53.00","balance_raw":"53.000000","number":"4722647616586","discount":8,"po_number":"Et.","date":"19\\\/Feb\\\/2008","last_sent_date":"","next_send_date":"","due_date":"26\\\/Jul\\\/2002","terms":"Rerum ea ratione quasi perferendis praesentium accusantium. Doloribus est nesciunt aspernatur. Explicabo ut facere odio. Dolorum dolorem excepturi alias aut nemo nesciunt architecto omnis. Nobis rem autem fugit. Repudiandae et inventore quis sequi. Est accusantium facilis ipsa consequuntur pariatur ut aut. Quam qui architecto quia molestiae. Hic omnis nobis nulla sint officiis nihil non.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2015-08-23","custom_value2":"no","custom_value3":"1","custom_value4":"2","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":3,"cost":264.3,"product_key":"maxime","notes":"I don't want to go on in the same age as.","discount":6,"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":792.9000000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":326.41,"product_key":"est","notes":"King in a dreamy sort of knot, and then sat upon.","discount":8,"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":2937.69,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":733.44,"product_key":"quae","notes":"However, she did not see anything that looked.","discount":9,"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":7334.400000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":368.19,"product_key":"id","notes":"Mabel after all, and I had not attended to this.","discount":5,"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":3313.71,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":132.57,"product_key":"eum","notes":"The first question of course you know what to.","discount":9,"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":265.14,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$39.00","balance_raw":"39.000000","number":"2869896494625","discount":2,"po_number":"Et.","date":"30\\\/Apr\\\/2022","last_sent_date":"","next_send_date":"","due_date":"27\\\/Dec\\\/1972","terms":"Ut asperiores ab aliquid et sint fuga. Cupiditate porro laborum voluptatum veniam. Est architecto voluptatibus nobis quia aut quisquam. Accusantium non nemo dolorem sed pariatur dolor. Distinctio accusantium esse itaque expedita totam voluptas accusamus. Sit eum autem provident sunt aut. Voluptatem sed in dolores earum similique. Repellat voluptatem vero aut eum debitis.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-07-16","custom_value2":"no","custom_value3":"3","custom_value4":"3","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":4,"cost":240.46,"product_key":"dolore","notes":"When the procession came opposite to Alice, and.","discount":3,"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":961.84,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":629.01,"product_key":"tempore","notes":"Hatter, 'or you'll be telling me next that you.","discount":1,"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":6290.1,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":586.37,"product_key":"ducimus","notes":"Alice replied in an offended tone, 'Hm! No.","discount":6,"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":1759.1100000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":716,"product_key":"rerum","notes":"First, she tried to get hold of its voice. 'Back.","discount":3,"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":716,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":529.24,"product_key":"et","notes":"Dormouse,' the Queen had ordered. They very soon.","discount":4,"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":1587.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$23.00","balance_raw":"23.000000","number":"7455293413298","discount":10,"po_number":"Eum ut.","date":"11\\\/May\\\/1985","last_sent_date":"","next_send_date":"","due_date":"19\\\/Dec\\\/1970","terms":"Doloribus nihil nisi excepturi nihil. Maiores dolor necessitatibus et laboriosam deleniti aut corporis. Aperiam quia excepturi voluptatum incidunt. Consequatur magni et est et quaerat. Impedit odit molestias dolore aliquid vero sit. Ut ipsa et deserunt et. Numquam molestias ea ea autem. Voluptas repellat sunt rerum earum magnam doloremque provident. Odio saepe sint omnis incidunt qui ut consequatur. Blanditiis qui magni sit. Dolor quo provident laborum quod qui recusandae unde.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1979-02-20","custom_value2":"no","custom_value3":"2","custom_value4":"3","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":3,"cost":369.19,"product_key":"distinctio","notes":"Duchess sneezed occasionally; and as the jury.","discount":10,"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":1107.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":997.15,"product_key":"harum","notes":"Mouse only shook its head impatiently, and.","discount":10,"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":8974.35,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":157.52,"product_key":"omnis","notes":"So they began running when they saw the White.","discount":5,"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":1260.16,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":802.16,"product_key":"illo","notes":"Alice timidly. 'Would you like the right height.","discount":3,"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":8021.599999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":878.69,"product_key":"et","notes":"Mock Turtle, 'but if they do, why then they're a.","discount":8,"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":1757.38,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$50.00","balance_raw":"50.000000","number":"9500243978117","discount":3,"po_number":"Soluta.","date":"17\\\/Jul\\\/1991","last_sent_date":"","next_send_date":"","due_date":"02\\\/Jun\\\/1997","terms":"Velit possimus qui numquam vel ut. Sit natus et nobis cum id dolore. Iusto voluptatum consequatur error. Exercitationem natus voluptate cum labore. Ut cupiditate ipsa et eaque aut est perspiciatis. Et natus porro cumque est voluptatem repudiandae ullam reiciendis. Aliquid facere excepturi repellat voluptas expedita cum consequatur. Aperiam aut sed magni nihil. Animi ducimus ea aut ut rem ipsa perferendis.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1991-07-20","custom_value2":"no","custom_value3":"1","custom_value4":"1","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":290.98,"product_key":"voluptatem","notes":"It quite makes my forehead ache!' Alice watched.","discount":1,"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":290.98,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":488.12,"product_key":"culpa","notes":"How I wonder what they said. The executioner's.","discount":8,"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":1952.48,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":758.58,"product_key":"voluptatum","notes":"Duchess: 'what a clear way you go,' said the.","discount":6,"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":5310.06,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":113.07,"product_key":"expedita","notes":"Alice, a little bottle on it, for she was.","discount":1,"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":452.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":83.42,"product_key":"tempore","notes":"I believe.' 'Boots and shoes under the window.","discount":4,"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":500.52,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$68.00","balance_raw":"68.000000","number":"1594748358466","discount":2,"po_number":"Corporis.","date":"30\\\/Dec\\\/1986","last_sent_date":"","next_send_date":"","due_date":"15\\\/Sep\\\/2002","terms":"Quos et facilis minus sunt. Non qui quos repellat. Delectus debitis aut ipsam possimus. Atque et nesciunt quae placeat at. Voluptatem rem quia quae. Quia fugit soluta in suscipit culpa ab. Est earum assumenda molestiae quae voluptatem accusamus. Placeat iure similique sunt molestiae eum laudantium. Quia iste nisi quaerat aperiam quam animi ut. Quis dolores temporibus voluptatibus. Iusto numquam assumenda molestias doloribus et eaque quidem.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1988-06-17","custom_value2":"yes","custom_value3":"4","custom_value4":"1","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":2,"cost":821.14,"product_key":"et","notes":"Alice heard it before,' said the Lory positively.","discount":4,"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":1642.28,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":328.19,"product_key":"recusandae","notes":"Hatter. 'You might just as well as she swam.","discount":9,"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":2953.71,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":264.33,"product_key":"voluptatem","notes":"Hatter, 'you wouldn't talk about trouble!' said.","discount":10,"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":792.99,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":939.11,"product_key":"dolorum","notes":"Dinah, if I fell off the fire, licking her paws.","discount":8,"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":5634.66,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":257.01,"product_key":"consequatur","notes":"Dinah, tell me your history, she do.' 'I'll tell.","discount":10,"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":1285.05,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]},{"amount":"$100.00","balance":"$78.00","balance_raw":"78.000000","number":"7717690731864","discount":4,"po_number":"Quis quia.","date":"30\\\/Jan\\\/2003","last_sent_date":"","next_send_date":"","due_date":"01\\\/Jun\\\/2021","terms":"Non sit hic eos nisi et aliquam nulla. Fugit dignissimos magnam officia aliquid. Aut voluptatem vero quasi reiciendis. Qui aut nemo vero architecto harum. Beatae cumque excepturi ad tempore perspiciatis eaque. Sed ut assumenda ut aperiam dicta. Eligendi voluptatibus ipsum laborum est dolores tempore. Unde cupiditate est qui veritatis fugiat. Iure natus nulla saepe corrupti eveniet harum ratione mollitia.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1981-12-19","custom_value2":"no","custom_value3":"2","custom_value4":"2","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":28.42,"product_key":"tempora","notes":"Let me see: that would be of very little way.","discount":8,"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":28.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":180.36,"product_key":"laudantium","notes":"Once more she found herself safe in a confused.","discount":3,"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":1262.52,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":791.62,"product_key":"consequatur","notes":"He looked anxiously at the bottom of a well?'.","discount":10,"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":7916.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":644.8,"product_key":"vel","notes":"For instance, if you like!' the Duchess said.","discount":2,"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":6448,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":267.08,"product_key":"in","notes":"EVER happen in a great many more than three.'.","discount":6,"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":534.16,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"payments":[{"status":"Completed","badge":"<h6><span class=\\"badge badge-info\\">Completed<\\\/span><\\\/h6>","amount":"$390.00","applied":"$390.00","balance":"$0.00","refunded":"$0.00","amount_raw":"390.000000","applied_raw":"390.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\\\/Oct\\\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Weimann, Haag and Corwin","balance":"-442.000000","payment_balance":"0.000000","credit_balance":"-52.000000"},"paymentables":[{"invoice":"8203155839804","amount_raw":"21.0000","refunded_raw":"0.0000","net_raw":21,"amount":"$21.00","refunded":"$0.00","net":"$21.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"5380674505151","amount_raw":"0.0000","refunded_raw":"0.0000","net_raw":0,"amount":"$0.00","refunded":"$0.00","net":"$0.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9701706715755","amount_raw":"73.0000","refunded_raw":"0.0000","net_raw":73,"amount":"$73.00","refunded":"$0.00","net":"$73.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"6713201251853","amount_raw":"69.0000","refunded_raw":"0.0000","net_raw":69,"amount":"$69.00","refunded":"$0.00","net":"$69.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"4722647616586","amount_raw":"47.0000","refunded_raw":"0.0000","net_raw":47,"amount":"$47.00","refunded":"$0.00","net":"$47.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"2869896494625","amount_raw":"61.0000","refunded_raw":"0.0000","net_raw":61,"amount":"$61.00","refunded":"$0.00","net":"$61.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7455293413298","amount_raw":"77.0000","refunded_raw":"0.0000","net_raw":77,"amount":"$77.00","refunded":"$0.00","net":"$77.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"9500243978117","amount_raw":"50.0000","refunded_raw":"0.0000","net_raw":50,"amount":"$50.00","refunded":"$0.00","net":"$50.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"1594748358466","amount_raw":"32.0000","refunded_raw":"0.0000","net_raw":32,"amount":"$32.00","refunded":"$0.00","net":"$32.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"invoice":"7717690731864","amount_raw":"22.0000","refunded_raw":"0.0000","net_raw":22,"amount":"$22.00","refunded":"$0.00","net":"$22.00","is_credit":false,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0003","amount_raw":"16.0000","refunded_raw":"0.0000","net_raw":16,"amount":"$16.00","refunded":"$0.00","net":"$16.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154},{"credit":"0004","amount_raw":"46.0000","refunded_raw":"0.0000","net_raw":46,"amount":"$46.00","refunded":"$0.00","net":"$46.00","is_credit":true,"created_at":"01\\\/Oct\\\/2023","updated_at":"01\\\/Oct\\\/2023","timestamp":1696135154}]}]}]" -; + public string $payment_data = '[{"amount":"$100.00","balance":"$75.00","balance_raw":"75.000000","number":"8651845192683","discount":6,"po_number":"Nihil.","date":"08\/Feb\/2008","last_sent_date":"","next_send_date":"","due_date":"13\/Apr\/2008","terms":"Repellat unde laboriosam optio minima pariatur odit voluptatum. Eum eum corrupti laboriosam beatae odit dicta. Quia possimus beatae commodi minima. Aut debitis ut rerum et voluptatem. Voluptates cumque quibusdam aut officiis est. Ea ullam enim fugit ut. Modi soluta porro et accusamus quae officia consequatur. Quia maxime adipisci atque ipsa consequatur sit. Eligendi sequi quod iste non fuga corporis ab. Quae autem eveniet provident voluptas tempora molestiae. Autem nulla unde recusandae qui.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2022-05-14","custom_value2":"yes","custom_value3":"2","custom_value4":"2","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":2,"cost":967.46,"product_key":"autem","notes":"Elsie, Lacie, and.","discount":1,"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":1934.92,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":740.14,"product_key":"ipsum","notes":"Hatter opened his.","discount":10,"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":7401.4,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":496.59,"product_key":"ducimus","notes":"How neatly spread.","discount":2,"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":1489.77,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":332.12,"product_key":"aspernatur","notes":"I hadnt begun my.","discount":8,"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":996.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":803.47,"product_key":"debitis","notes":"Rabbit coming to.","discount":4,"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":8034.700000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$25.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"

Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$87.00","balance_raw":"87.000000","number":"1570392317752","discount":3,"po_number":"Pariatur.","date":"09\/Sep\/2008","last_sent_date":"","next_send_date":"","due_date":"09\/Jul\/2001","terms":"Corporis nihil assumenda ea. Rerum enim tempore laboriosam consectetur praesentium. Quaerat at autem et sequi. Nemo atque reprehenderit et officia aliquam vero reiciendis. Perferendis consectetur non laboriosam non et occaecati aut. Ex est nihil repudiandae modi unde. Similique et nihil vitae mollitia harum. Est id qui necessitatibus sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1990-06-13","custom_value2":"yes","custom_value3":"1","custom_value4":"3","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":3,"cost":96.28,"product_key":"soluta","notes":"Then she went on.","discount":5,"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":288.84000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":926.69,"product_key":"repudiandae","notes":"Heads below! (a.","discount":7,"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":8340.210000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":653.21,"product_key":"quibusdam","notes":"Alice. Nothing,.","discount":1,"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":2612.84,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":369.57,"product_key":"beatae","notes":"Alice more boldly.","discount":6,"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":739.14,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":224.11,"product_key":"quae","notes":"PRECIOUS nose; as.","discount":10,"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":448.22,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$73.00","balance_raw":"73.000000","number":"6754511981115","discount":7,"po_number":"Veritatis.","date":"11\/Jul\/1977","last_sent_date":"","next_send_date":"","due_date":"09\/May\/1978","terms":"Occaecati ea eligendi occaecati qui quia minima dolores cum. Quia veniam tempore sunt dolores voluptatem sit. Aut eos ea quis nesciunt delectus vitae vero. Vel rerum itaque aliquam cum ut sit. Aliquam sequi praesentium quasi voluptate provident quis aut velit. Laboriosam est molestiae facilis iusto unde harum quo. Quia ratione porro est recusandae beatae et. At amet facilis et labore. Quibusdam fuga consequatur et dolorem hic sint.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2013-06-24","custom_value2":"yes","custom_value3":"3","custom_value4":"3","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":689.95,"product_key":"ipsum","notes":"Im not the same.","discount":1,"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":689.95,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":37.13,"product_key":"consequatur","notes":"WHAT things? said.","discount":3,"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":222.78000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":198.59,"product_key":"natus","notes":"That your eye was.","discount":10,"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":1985.9,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":3.62,"product_key":"exercitationem","notes":"Bill, she gave a.","discount":5,"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":21.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":104.81,"product_key":"eum","notes":"But if Im not the.","discount":5,"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":943.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$49.00","balance_raw":"49.000000","number":"3857859890781","discount":4,"po_number":"Vel qui.","date":"25\/Dec\/2018","last_sent_date":"","next_send_date":"","due_date":"29\/May\/1974","terms":"Eum eos voluptatibus quasi labore ducimus veniam. Mollitia nulla modi est dolorem. Nobis autem repellat nesciunt veniam numquam. Officiis aut debitis a quis occaecati rem. Voluptatem dolorem quia voluptates beatae dolorem. Ratione illo expedita ea cum qui amet aut. Harum ducimus repellendus et atque perferendis. Autem quae qui dolor iste. Illo ut nesciunt officia et nihil quaerat. Temporibus voluptas rerum at voluptas.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1992-08-13","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":6,"cost":549.52,"product_key":"et","notes":"Poor Alice! It was.","discount":4,"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":3297.12,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":610.65,"product_key":"consequatur","notes":"March Hare said--.","discount":7,"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":3663.8999999999996,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":910.51,"product_key":"quos","notes":"The soldiers were.","discount":2,"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":6373.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":996.08,"product_key":"officia","notes":"I know! exclaimed.","discount":7,"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":6972.56,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":371.65,"product_key":"ipsum","notes":"Grief, they used.","discount":5,"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":1114.9499999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$8.00","balance_raw":"8.000000","number":"7929692902054","discount":6,"po_number":"Quos.","date":"02\/Apr\/1985","last_sent_date":"","next_send_date":"","due_date":"08\/Sep\/1983","terms":"Accusantium occaecati beatae veritatis. Praesentium et ratione minus consequatur et eos. Tenetur quia illum ex explicabo modi reprehenderit. Pariatur nihil nihil libero ipsum dolores quas. Dolorum est voluptatem dolore fugit. Rerum dolor numquam labore mollitia velit itaque. Unde quisquam dolorem soluta dignissimos. Nam a eius ad ut repellat accusantium. Ut voluptatum nemo quaerat. Alias incidunt eum et est corrupti. Rerum vel corporis quasi qui quis. Sed atque praesentium sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-09-20","custom_value2":"no","custom_value3":"4","custom_value4":"4","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":7,"cost":138.19,"product_key":"necessitatibus","notes":"I THINK; or is it.","discount":7,"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":967.3299999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":625.42,"product_key":"vel","notes":"Alice said to the.","discount":1,"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":4377.94,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":671.1,"product_key":"sint","notes":"Alice, thinking it.","discount":5,"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":1342.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":914.43,"product_key":"pariatur","notes":"I think. And she.","discount":7,"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":9144.3,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":43.83,"product_key":"et","notes":"There was nothing.","discount":3,"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":438.29999999999995,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$97.00","balance_raw":"97.000000","number":"9532098692559","discount":7,"po_number":"Ut ea.","date":"31\/Jul\/1997","last_sent_date":"","next_send_date":"","due_date":"08\/Dec\/2015","terms":"Distinctio sed praesentium recusandae numquam omnis quasi non. Eveniet omnis non harum vel atque laboriosam beatae. Maxime sed minima et ut quis. Praesentium est dolorum sed. Et id ipsum tempore magni tempora. Consectetur molestias quasi commodi molestias minima et. Labore quibusdam culpa assumenda aperiam amet labore voluptatum sit. Molestiae non odio nam sint impedit repellat ut.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2005-03-21","custom_value2":"yes","custom_value3":"2","custom_value4":"2","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":10,"cost":128.07,"product_key":"et","notes":"Hatter, and here.","discount":5,"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":1280.6999999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":134.43,"product_key":"expedita","notes":"Mouse, who seemed.","discount":10,"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":134.43,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":424.33,"product_key":"reiciendis","notes":"I wish you were or.","discount":10,"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":3818.97,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":50.51,"product_key":"sit","notes":"CAN all that green.","discount":6,"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":353.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":992.48,"product_key":"alias","notes":"I get SOMEWHERE,.","discount":3,"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":8932.32,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$88.00","balance_raw":"88.000000","number":"5228040185814","discount":8,"po_number":"Soluta.","date":"20\/Jan\/1978","last_sent_date":"","next_send_date":"","due_date":"12\/Dec\/1991","terms":"Doloribus temporibus tempore ex et architecto ut deserunt. Nihil omnis dignissimos sed. Cupiditate voluptatibus illo omnis qui est voluptatem doloremque. Omnis vel nesciunt quis blanditiis sunt tempora. Fuga repellat unde mollitia iusto mollitia. Delectus non sunt quis voluptas quia quasi ratione et. Dolorum quae in eos deleniti dolor voluptates iste optio. Quam nesciunt aspernatur amet voluptatem non. Saepe nulla alias et enim. Sint consectetur non quibusdam porro qui quisquam quod laudantium.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2014-01-28","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":5,"cost":280.24,"product_key":"sed","notes":"She said this she.","discount":5,"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":1401.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":651.68,"product_key":"quibusdam","notes":"Queens hedgehog.","discount":6,"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":1303.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":533.15,"product_key":"nulla","notes":"Adventures of hers.","discount":7,"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":2665.75,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":294.76,"product_key":"esse","notes":"WOULD not remember.","discount":6,"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":2947.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":914.34,"product_key":"totam","notes":"Canary called out.","discount":2,"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":5486.04,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$32.00","balance_raw":"32.000000","number":"8727857125862","discount":7,"po_number":"Qui sit.","date":"06\/Apr\/1991","last_sent_date":"","next_send_date":"","due_date":"25\/Apr\/1992","terms":"Maiores reprehenderit autem sit vel pariatur et. Minus nihil aut tempora iusto quaerat. Aut enim eum ut cum ut sequi. Quidem quod et repudiandae omnis. Vitae aliquid explicabo rem quae odit impedit inventore. Quasi voluptas praesentium libero dolores. Ut quibusdam impedit sit adipisci quibusdam qui. Omnis sint numquam dolores quo. Saepe ducimus velit qui. Nihil enim sit omnis id quam et sit. Ex qui dicta officia. Nihil corporis adipisci ex. Aut et voluptatem eius repellendus sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1988-05-08","custom_value2":"no","custom_value3":"4","custom_value4":"1","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":8,"cost":802.63,"product_key":"vel","notes":"Alice desperately.","discount":10,"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":6421.04,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":362.72,"product_key":"repellendus","notes":"White Rabbit with.","discount":9,"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":3627.2000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":217.83,"product_key":"et","notes":"Alice, or perhaps.","discount":3,"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":1306.98,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":36.55,"product_key":"iste","notes":"King had said that.","discount":7,"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":36.55,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":680,"product_key":"vero","notes":"Alice replied, so.","discount":5,"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":6800,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$35.00","balance_raw":"35.000000","number":"9569539191784","discount":8,"po_number":"Nesciunt.","date":"30\/Mar\/2006","last_sent_date":"","next_send_date":"","due_date":"18\/Apr\/2020","terms":"Nostrum sed repellendus ipsum earum illo. Deserunt et voluptas consequuntur necessitatibus aut suscipit assumenda. Necessitatibus necessitatibus animi consectetur quaerat libero provident recusandae. Culpa sed dolore ipsa ut voluptates animi ipsam eius. Velit consequatur dolores beatae minus laudantium illum. Nemo molestiae sunt ab quos rerum. Dolore sunt omnis id laboriosam.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2013-05-31","custom_value2":"no","custom_value3":"1","custom_value4":"3","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":7,"cost":504.67,"product_key":"sint","notes":"Alice, we learned.","discount":8,"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":3532.69,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":900.06,"product_key":"architecto","notes":"And with that she.","discount":3,"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":6300.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":821.97,"product_key":"dolores","notes":"King sharply. Do.","discount":7,"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":7397.7300000000005,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":219.23,"product_key":"rem","notes":"Then followed the.","discount":10,"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":1315.3799999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":21.02,"product_key":"debitis","notes":"Quick, now! And.","discount":3,"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":189.18,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$26.00","balance_raw":"26.000000","number":"5083153655186","discount":8,"po_number":"Et soluta.","date":"25\/Jan\/2018","last_sent_date":"","next_send_date":"","due_date":"21\/Nov\/2004","terms":"Dignissimos quas quod aut minus. Delectus magnam quas dolorem fugit. Dolorem eligendi et ratione quae quia blanditiis. Sunt labore optio architecto vel dolorem sit. Qui et nulla alias id tenetur. Ipsa architecto quas asperiores expedita excepturi repudiandae qui. Unde dolor culpa quidem facilis veritatis nemo voluptatum. Sit aspernatur eum necessitatibus cumque ut culpa. Nemo dolore blanditiis et nesciunt accusantium. Dolorum enim eos minima tenetur quasi qui accusamus.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1972-11-29","custom_value2":"no","custom_value3":"1","custom_value4":"4","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":10,"cost":713.89,"product_key":"quidem","notes":"Then the Queen in.","discount":9,"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":7138.9,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":336.09,"product_key":"rerum","notes":"I dont keep the.","discount":4,"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":3360.8999999999996,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":914.3,"product_key":"odio","notes":"The Mouse looked.","discount":8,"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":9143,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":17.67,"product_key":"provident","notes":"Shark, But, when.","discount":2,"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":141.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":734.28,"product_key":"quia","notes":"The Fish-Footman.","discount":9,"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":5139.96,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]}]'; public string $payment_data2 = '[{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }] }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }] }, { "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }] }, { "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }] }, { "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 5, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }] }]'; @@ -37,7 +36,7 @@ class TemplateMock public string $invoice_data = '[{ "id": "VWPe9rxaLy", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 9199.58, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0001", "discount": 0, "po_number": "", "date": "2023-08-01", "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": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "QnXe0Rvbxr", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1801.8, "balance": 1801.8, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0002", "discount": 0, "po_number": "", "date": "2023-06-30", "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": 415.8, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1985-10-27", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Wjneg5YbwZ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 6860.73, "balance": 6860.73, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0003", "discount": 0, "po_number": "", "date": "2023-08-19", "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": 2009.73, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1990-11-17", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Volej2RejN", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1905.75, "balance": 1350.75, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799160, "archived_at": 0, "is_deleted": false, "number": "0004", "discount": 0, "po_number": "", "date": "2023-09-13", "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": 519.75, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1978-12-22", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 555, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "Cash" } }], "credits": [] }, { "id": "Wpmbk55ezJ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 8697.17, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "number": "0005", "discount": 0, "po_number": "", "date": "2023-07-11", "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": 1767.17, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1973-12-03", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 8697.17, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 50, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 50, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "mxkazm8eJ0", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1190, "balance": 746, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695798363, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "number": "0026", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; - public string $quote_data = '[{ "id": "KGRb41dBLZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "1", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799454, "archived_at": 0, "created_at": 1695799453, "number": "0006", "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": "", "terms": "Default company quote terms", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }, { "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": "1", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "MVyb8mdvAZ", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "2", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799461, "archived_at": 0, "created_at": 1695799458, "number": "0007", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "958c28fa-c217-42b5-8434-e326ac2ab1ad" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "2f2da954-e237-4794-955d-208de2ac63c5" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5807dea2-b153-4e45-84f0-006683ac0c6d" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9dc2a31c-06d1-4b4a-82ef-cc65bb43d906" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "80981f31-87f6-42ef-a582-3387612a2377" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "8ede63e2-d24d-4561-91b7-85ba2e2c0865" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "0a494280-65cf-473a-8519-d7ad1d73ab38" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "6c908212-9f4b-416b-a661-71aa2ce76ab9" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "77357757-607b-411a-a09f-0caa31745916" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "252c03d4-49a8-4c63-a86d-4c3184765388" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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": "VolejRRejN", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "status_id": "3", "design_id": "Wpmbk5ezJn", "invoice_id": "", "vendor_id": "", "updated_at": 1695799466, "archived_at": 0, "created_at": 1695799461, "number": "0008", "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": "", "terms": "

Default company quote terms<\/p>", "public_notes": "", "private_notes": "", "is_deleted": false, "uses_inclusive_taxes": false, "tax_name1": "GST", "tax_rate1": 10, "tax_name2": "VAT", "tax_rate2": 17.5, "tax_name3": "", "tax_rate3": 0, "total_taxes": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "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": "Sales Tax", "tax_rate1": 5, "tax_name2": "", "tax_rate2": 0, "tax_name3": "", "tax_rate3": 0, "sort_id": "0", "line_total": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "847d125a-5e32-45cf-aa8e-144095fc3b91" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "b789272e-557e-4186-b6e7-13b027c65e20" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "1539315f-927b-4489-be5b-a4dc944d32dc" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "5c26754d-7252-4d91-9883-319560a47f4f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9949909c-9ca0-4646-b2b3-263c12981481" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0aa3e83-e762-473d-8196-10d62350a5e8" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9f831c14-deaa-4fe7-a9d2-6b4bd40a8cc0" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "dd58c4a5-88da-4c04-8841-908304f42a0f" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "2d927272-f8f0-41db-9bf3-20c9a5f4575f" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9e7f1874-8783-4dc8-aab1-b0aa60923380" }], "entity_type": "quote", "exchange_rate": 1, "paid_to_date": 0, "project_id": "", "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": 548.03, "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": 1695803284, "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 $quote_data = '[{"id":1,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0001","discount":1,"is_amount_discount":false,"po_number":"Molestias.","date":"1986-08-02","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":747.36,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":110.36,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":637,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1797.280000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"6211.690000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1695943658,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"VolejRejNm"},{"id":2,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0002","discount":9,"is_amount_discount":true,"po_number":"Omnis.","date":"1988-11-22","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":694.97,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":57.97,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1381.560000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"4557.560000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1696118643,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"Wpmbk5ezJn"}]'; public function __construct(public Company $company) { @@ -58,6 +57,9 @@ class TemplateMock $this->engines['payments'] = json_decode($this->payment_data, true); $this->engines['purchase_orders'] = json_decode($this->purchase_order_data, true); + // nlog("engines"); + // nlog($this->engines); + return $this; } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index a3103b2a4c2d..8492aecfbe24 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -13,6 +13,7 @@ namespace App\Services\Template; use App\Models\Task; use App\Models\Quote; +use App\Utils\Number; use App\Models\Credit; use App\Models\Design; use App\Models\Company; @@ -24,6 +25,7 @@ use App\Models\ClientContact; use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; +use App\Utils\Traits\MakesDates; use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; @@ -37,7 +39,8 @@ use League\Fractal\Serializer\JsonApiSerializer; class TemplateService { - + use MakesDates; + private \DomDocument $document; public \Twig\Environment $twig; @@ -99,6 +102,7 @@ class TemplateService return $this; } + public function mock(): self { $tm = new TemplateMock($this->company); @@ -107,6 +111,8 @@ class TemplateService $this->data = $tm->engines; $this->variables = $tm->variables[0]; + nlog($this->data); + $this->parseNinjaBlocks() ->parseVariables(); @@ -162,7 +168,7 @@ class TemplateService /** * Parses all variables in the document - * @param array $data + * * @return self */ private function parseVariables(): self @@ -293,6 +299,79 @@ class TemplateService } public function processInvoices($invoices): array + { + $invoices = collect($invoices) + ->map(function ($invoice){ + + $payments = $invoice->payments->map(function ($payment) { + // nlog(microtime(true)); + return $this->transformPayment($payment); + })->toArray(); + + return [ + 'amount' => Number::formatMoney($invoice->amount, $invoice->client), + 'balance' => Number::formatMoney($invoice->balance, $invoice->client), + 'balance_raw' => $invoice->balance, + 'number' => $invoice->number ?: '', + 'discount' => $invoice->discount, + 'po_number' => $invoice->po_number ?: '', + 'date' => $this->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()), + 'last_sent_date' => $this->translateDate($invoice->last_sent_date, $invoice->client->date_format(), $invoice->client->locale()), + 'next_send_date' => $this->translateDate($invoice->next_send_date, $invoice->client->date_format(), $invoice->client->locale()), + 'due_date' => $this->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'terms' => $invoice->terms ?: '', + 'public_notes' => $invoice->public_notes ?: '', + 'private_notes' => $invoice->private_notes ?: '', + 'uses_inclusive_taxes' => (bool) $invoice->uses_inclusive_taxes, + 'tax_name1' => $invoice->tax_name1 ?? '', + 'tax_rate1' => (float) $invoice->tax_rate1, + 'tax_name2' => $invoice->tax_name2 ?? '', + 'tax_rate2' => (float) $invoice->tax_rate2, + 'tax_name3' => $invoice->tax_name3 ?? '', + 'tax_rate3' => (float) $invoice->tax_rate3, + 'total_taxes' => Number::formatMoney($invoice->total_taxes, $invoice->client), + 'total_taxes_raw' => $invoice->total_taxes, + 'is_amount_discount' => (bool) $invoice->is_amount_discount ?? false, + 'footer' => $invoice->footer ?? '', + 'partial' => $invoice->partial ?? 0, + 'partial_due_date' => $this->translateDate($invoice->partial_due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'custom_value1' => (string) $invoice->custom_value1 ?: '', + 'custom_value2' => (string) $invoice->custom_value2 ?: '', + 'custom_value3' => (string) $invoice->custom_value3 ?: '', + 'custom_value4' => (string) $invoice->custom_value4 ?: '', + 'custom_surcharge1' => (float) $invoice->custom_surcharge1, + 'custom_surcharge2' => (float) $invoice->custom_surcharge2, + 'custom_surcharge3' => (float) $invoice->custom_surcharge3, + 'custom_surcharge4' => (float) $invoice->custom_surcharge4, + 'exchange_rate' => (float) $invoice->exchange_rate, + 'custom_surcharge_tax1' => (bool) $invoice->custom_surcharge_tax1, + 'custom_surcharge_tax2' => (bool) $invoice->custom_surcharge_tax2, + 'custom_surcharge_tax3' => (bool) $invoice->custom_surcharge_tax3, + 'custom_surcharge_tax4' => (bool) $invoice->custom_surcharge_tax4, + 'line_items' => $invoice->line_items ?: (array) [], + 'reminder1_sent' => $this->translateDate($invoice->reminder1_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder2_sent' => $this->translateDate($invoice->reminder2_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder3_sent' => $this->translateDate($invoice->reminder3_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder_last_sent' => $this->translateDate($invoice->reminder_last_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'paid_to_date' => Number::formatMoney($invoice->paid_to_date, $invoice->client), + 'auto_bill_enabled' => (bool) $invoice->auto_bill_enabled, + 'client' => [ + 'name' => $invoice->client->present()->name(), + 'balance' => $invoice->client->balance, + 'payment_balance' => $invoice->client->payment_balance, + 'credit_balance' => $invoice->client->credit_balance, + ], + 'payments' => $payments, + ]; + + }); + + nlog($invoices->count()); + return $invoices->toArray(); + + } + + public function processInvoicesBak($invoices): array { $it = new InvoiceTransformer(); $it->setDefaultIncludes(['client','payments', 'credits']); @@ -321,6 +400,81 @@ class TemplateService return $invoices['data']; } +private function transformPayment(Payment $payment): array + { + + $data = []; + + $credits = $payment->credits->map(function ($credit) use ($payment) { + return [ + 'credit' => $credit->number, + 'amount_raw' => $credit->pivot->amount, + 'refunded_raw' => $credit->pivot->refunded, + 'net_raw' => $credit->pivot->amount - $credit->pivot->refunded, + 'amount' => Number::formatMoney($credit->pivot->amount, $payment->client), + 'refunded' => Number::formatMoney($credit->pivot->refunded, $payment->client), + 'net' => Number::formatMoney($credit->pivot->amount - $credit->pivot->refunded, $payment->client), + 'is_credit' => true, + 'created_at' => $this->translateDate($credit->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), + 'updated_at' => $this->translateDate($credit->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), + 'timestamp' => $credit->pivot->created_at->timestamp, + ]; + }); + + $pivot = $payment->invoices->map(function ($invoice) use ($payment) { + return [ + 'invoice' => $invoice->number, + 'amount_raw' => $invoice->pivot->amount, + 'refunded_raw' => $invoice->pivot->refunded, + 'net_raw' => $invoice->pivot->amount - $invoice->pivot->refunded, + 'amount' => Number::formatMoney($invoice->pivot->amount, $payment->client), + 'refunded' => Number::formatMoney($invoice->pivot->refunded, $payment->client), + 'net' => Number::formatMoney($invoice->pivot->amount - $invoice->pivot->refunded, $payment->client), + 'is_credit' => false, + 'created_at' => $this->translateDate($invoice->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), + 'updated_at' => $this->translateDate($invoice->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), + 'timestamp' => $invoice->pivot->created_at->timestamp, + ]; + })->merge($credits)->sortBy('timestamp')->toArray(); + + return [ + 'status' => $payment->stringStatus($payment->status_id), + 'badge' => $payment->badgeForStatus($payment->status_id), + 'amount' => Number::formatMoney($payment->amount, $payment->client), + 'applied' => Number::formatMoney($payment->applied, $payment->client), + 'balance' => Number::formatMoney(($payment->amount - $payment->refunded - $payment->applied), $payment->client), + 'refunded' => Number::formatMoney($payment->refunded, $payment->client), + 'amount_raw' => $payment->amount, + 'applied_raw' => $payment->applied, + 'refunded_raw' => $payment->refunded, + 'balance_raw' => ($payment->amount - $payment->refunded - $payment->applied), + 'date' => $this->translateDate($payment->date, $payment->client->date_format(), $payment->client->locale()), + 'method' => $payment->translatedType(), + 'currency' => $payment->currency->code, + 'exchange_rate' => $payment->exchange_rate, + 'transaction_reference' => $payment->transaction_reference, + 'is_manual' => $payment->is_manual, + 'number' => $payment->number, + 'custom_value1' => $payment->custom_value1 ?? '', + 'custom_value2' => $payment->custom_value2 ?? '', + 'custom_value3' => $payment->custom_value3 ?? '', + 'custom_value4' => $payment->custom_value4 ?? '', + 'client' => [ + 'name' => $payment->client->present()->name(), + 'balance' => $payment->client->balance, + 'payment_balance' => $payment->client->payment_balance, + 'credit_balance' => $payment->client->credit_balance, + ], + 'paymentables' => $pivot, + ]; + + return $data; + + + + } + + public function processQuotes($quotes): array { $it = new QuoteTransformer(); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index fafa8ac22c43..23b119c8a2ab 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -323,10 +323,11 @@ class TemplateTest extends TestCase $count = count($queries); nlog("query count = {$count}"); - $x = $invoices->toArray(); - nlog(json_encode(htmlspecialchars(json_encode($x), ENT_QUOTES, 'UTF-8'))); + nlog(json_encode($x)); + // nlog(json_encode(htmlspecialchars(json_encode($x), ENT_QUOTES, 'UTF-8'))); // nlog($invoices->toJson()); + $this->assertIsArray($invoices->toArray()); nlog("end invoices = " . microtime(true) - $start); From c5d94a7c2ecc89ca06cc0b783a6cceb433494986 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 1 Oct 2023 21:21:57 +1100 Subject: [PATCH 039/109] Remodelling data for templates --- app/Services/Template/TemplateMock.php | 16 ++++----- app/Services/Template/TemplateService.php | 41 +++++++++++++---------- tests/Feature/Template/TemplateTest.php | 10 +++--- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 1dd5da502d13..53e55ec2aab7 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -23,9 +23,7 @@ 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 = '[{"amount":"$100.00","balance":"$75.00","balance_raw":"75.000000","number":"8651845192683","discount":6,"po_number":"Nihil.","date":"08\/Feb\/2008","last_sent_date":"","next_send_date":"","due_date":"13\/Apr\/2008","terms":"Repellat unde laboriosam optio minima pariatur odit voluptatum. Eum eum corrupti laboriosam beatae odit dicta. Quia possimus beatae commodi minima. Aut debitis ut rerum et voluptatem. Voluptates cumque quibusdam aut officiis est. Ea ullam enim fugit ut. Modi soluta porro et accusamus quae officia consequatur. Quia maxime adipisci atque ipsa consequatur sit. Eligendi sequi quod iste non fuga corporis ab. Quae autem eveniet provident voluptas tempora molestiae. Autem nulla unde recusandae qui.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2022-05-14","custom_value2":"yes","custom_value3":"2","custom_value4":"2","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":2,"cost":967.46,"product_key":"autem","notes":"Elsie, Lacie, and.","discount":1,"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":1934.92,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":740.14,"product_key":"ipsum","notes":"Hatter opened his.","discount":10,"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":7401.4,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":496.59,"product_key":"ducimus","notes":"How neatly spread.","discount":2,"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":1489.77,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":332.12,"product_key":"aspernatur","notes":"I hadnt begun my.","discount":8,"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":996.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":803.47,"product_key":"debitis","notes":"Rabbit coming to.","discount":4,"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":8034.700000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$25.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"

Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$87.00","balance_raw":"87.000000","number":"1570392317752","discount":3,"po_number":"Pariatur.","date":"09\/Sep\/2008","last_sent_date":"","next_send_date":"","due_date":"09\/Jul\/2001","terms":"Corporis nihil assumenda ea. Rerum enim tempore laboriosam consectetur praesentium. Quaerat at autem et sequi. Nemo atque reprehenderit et officia aliquam vero reiciendis. Perferendis consectetur non laboriosam non et occaecati aut. Ex est nihil repudiandae modi unde. Similique et nihil vitae mollitia harum. Est id qui necessitatibus sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1990-06-13","custom_value2":"yes","custom_value3":"1","custom_value4":"3","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":3,"cost":96.28,"product_key":"soluta","notes":"Then she went on.","discount":5,"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":288.84000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":926.69,"product_key":"repudiandae","notes":"Heads below! (a.","discount":7,"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":8340.210000000001,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":4,"cost":653.21,"product_key":"quibusdam","notes":"Alice. Nothing,.","discount":1,"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":2612.84,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":369.57,"product_key":"beatae","notes":"Alice more boldly.","discount":6,"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":739.14,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":224.11,"product_key":"quae","notes":"PRECIOUS nose; as.","discount":10,"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":448.22,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$73.00","balance_raw":"73.000000","number":"6754511981115","discount":7,"po_number":"Veritatis.","date":"11\/Jul\/1977","last_sent_date":"","next_send_date":"","due_date":"09\/May\/1978","terms":"Occaecati ea eligendi occaecati qui quia minima dolores cum. Quia veniam tempore sunt dolores voluptatem sit. Aut eos ea quis nesciunt delectus vitae vero. Vel rerum itaque aliquam cum ut sit. Aliquam sequi praesentium quasi voluptate provident quis aut velit. Laboriosam est molestiae facilis iusto unde harum quo. Quia ratione porro est recusandae beatae et. At amet facilis et labore. Quibusdam fuga consequatur et dolorem hic sint.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2013-06-24","custom_value2":"yes","custom_value3":"3","custom_value4":"3","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":689.95,"product_key":"ipsum","notes":"Im not the same.","discount":1,"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":689.95,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":37.13,"product_key":"consequatur","notes":"WHAT things? said.","discount":3,"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":222.78000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":198.59,"product_key":"natus","notes":"That your eye was.","discount":10,"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":1985.9,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":3.62,"product_key":"exercitationem","notes":"Bill, she gave a.","discount":5,"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":21.72,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":104.81,"product_key":"eum","notes":"But if Im not the.","discount":5,"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":943.29,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$49.00","balance_raw":"49.000000","number":"3857859890781","discount":4,"po_number":"Vel qui.","date":"25\/Dec\/2018","last_sent_date":"","next_send_date":"","due_date":"29\/May\/1974","terms":"Eum eos voluptatibus quasi labore ducimus veniam. Mollitia nulla modi est dolorem. Nobis autem repellat nesciunt veniam numquam. Officiis aut debitis a quis occaecati rem. Voluptatem dolorem quia voluptates beatae dolorem. Ratione illo expedita ea cum qui amet aut. Harum ducimus repellendus et atque perferendis. Autem quae qui dolor iste. Illo ut nesciunt officia et nihil quaerat. Temporibus voluptas rerum at voluptas.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1992-08-13","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":6,"cost":549.52,"product_key":"et","notes":"Poor Alice! It was.","discount":4,"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":3297.12,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":610.65,"product_key":"consequatur","notes":"March Hare said--.","discount":7,"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":3663.8999999999996,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":910.51,"product_key":"quos","notes":"The soldiers were.","discount":2,"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":6373.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":996.08,"product_key":"officia","notes":"I know! exclaimed.","discount":7,"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":6972.56,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":3,"cost":371.65,"product_key":"ipsum","notes":"Grief, they used.","discount":5,"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":1114.9499999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$8.00","balance_raw":"8.000000","number":"7929692902054","discount":6,"po_number":"Quos.","date":"02\/Apr\/1985","last_sent_date":"","next_send_date":"","due_date":"08\/Sep\/1983","terms":"Accusantium occaecati beatae veritatis. Praesentium et ratione minus consequatur et eos. Tenetur quia illum ex explicabo modi reprehenderit. Pariatur nihil nihil libero ipsum dolores quas. Dolorum est voluptatem dolore fugit. Rerum dolor numquam labore mollitia velit itaque. Unde quisquam dolorem soluta dignissimos. Nam a eius ad ut repellat accusantium. Ut voluptatum nemo quaerat. Alias incidunt eum et est corrupti. Rerum vel corporis quasi qui quis. Sed atque praesentium sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1980-09-20","custom_value2":"no","custom_value3":"4","custom_value4":"4","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":7,"cost":138.19,"product_key":"necessitatibus","notes":"I THINK; or is it.","discount":7,"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":967.3299999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":625.42,"product_key":"vel","notes":"Alice said to the.","discount":1,"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":4377.94,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":671.1,"product_key":"sint","notes":"Alice, thinking it.","discount":5,"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":1342.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":914.43,"product_key":"pariatur","notes":"I think. And she.","discount":7,"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":9144.3,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":43.83,"product_key":"et","notes":"There was nothing.","discount":3,"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":438.29999999999995,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$97.00","balance_raw":"97.000000","number":"9532098692559","discount":7,"po_number":"Ut ea.","date":"31\/Jul\/1997","last_sent_date":"","next_send_date":"","due_date":"08\/Dec\/2015","terms":"Distinctio sed praesentium recusandae numquam omnis quasi non. Eveniet omnis non harum vel atque laboriosam beatae. Maxime sed minima et ut quis. Praesentium est dolorum sed. Et id ipsum tempore magni tempora. Consectetur molestias quasi commodi molestias minima et. Labore quibusdam culpa assumenda aperiam amet labore voluptatum sit. Molestiae non odio nam sint impedit repellat ut.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2005-03-21","custom_value2":"yes","custom_value3":"2","custom_value4":"2","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":10,"cost":128.07,"product_key":"et","notes":"Hatter, and here.","discount":5,"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":1280.6999999999998,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":134.43,"product_key":"expedita","notes":"Mouse, who seemed.","discount":10,"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":134.43,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":424.33,"product_key":"reiciendis","notes":"I wish you were or.","discount":10,"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":3818.97,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":50.51,"product_key":"sit","notes":"CAN all that green.","discount":6,"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":353.57,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":992.48,"product_key":"alias","notes":"I get SOMEWHERE,.","discount":3,"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":8932.32,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$88.00","balance_raw":"88.000000","number":"5228040185814","discount":8,"po_number":"Soluta.","date":"20\/Jan\/1978","last_sent_date":"","next_send_date":"","due_date":"12\/Dec\/1991","terms":"Doloribus temporibus tempore ex et architecto ut deserunt. Nihil omnis dignissimos sed. Cupiditate voluptatibus illo omnis qui est voluptatem doloremque. Omnis vel nesciunt quis blanditiis sunt tempora. Fuga repellat unde mollitia iusto mollitia. Delectus non sunt quis voluptas quia quasi ratione et. Dolorum quae in eos deleniti dolor voluptates iste optio. Quam nesciunt aspernatur amet voluptatem non. Saepe nulla alias et enim. Sint consectetur non quibusdam porro qui quisquam quod laudantium.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2014-01-28","custom_value2":"no","custom_value3":"2","custom_value4":"1","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":5,"cost":280.24,"product_key":"sed","notes":"She said this she.","discount":5,"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":1401.2,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":2,"cost":651.68,"product_key":"quibusdam","notes":"Queens hedgehog.","discount":6,"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":1303.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":5,"cost":533.15,"product_key":"nulla","notes":"Adventures of hers.","discount":7,"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":2665.75,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":294.76,"product_key":"esse","notes":"WOULD not remember.","discount":6,"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":2947.6,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":914.34,"product_key":"totam","notes":"Canary called out.","discount":2,"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":5486.04,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$32.00","balance_raw":"32.000000","number":"8727857125862","discount":7,"po_number":"Qui sit.","date":"06\/Apr\/1991","last_sent_date":"","next_send_date":"","due_date":"25\/Apr\/1992","terms":"Maiores reprehenderit autem sit vel pariatur et. Minus nihil aut tempora iusto quaerat. Aut enim eum ut cum ut sequi. Quidem quod et repudiandae omnis. Vitae aliquid explicabo rem quae odit impedit inventore. Quasi voluptas praesentium libero dolores. Ut quibusdam impedit sit adipisci quibusdam qui. Omnis sint numquam dolores quo. Saepe ducimus velit qui. Nihil enim sit omnis id quam et sit. Ex qui dicta officia. Nihil corporis adipisci ex. Aut et voluptatem eius repellendus sit.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1988-05-08","custom_value2":"no","custom_value3":"4","custom_value4":"1","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":8,"cost":802.63,"product_key":"vel","notes":"Alice desperately.","discount":10,"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":6421.04,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":362.72,"product_key":"repellendus","notes":"White Rabbit with.","discount":9,"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":3627.2000000000003,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":217.83,"product_key":"et","notes":"Alice, or perhaps.","discount":3,"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":1306.98,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":1,"cost":36.55,"product_key":"iste","notes":"King had said that.","discount":7,"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":36.55,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":680,"product_key":"vero","notes":"Alice replied, so.","discount":5,"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":6800,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$35.00","balance_raw":"35.000000","number":"9569539191784","discount":8,"po_number":"Nesciunt.","date":"30\/Mar\/2006","last_sent_date":"","next_send_date":"","due_date":"18\/Apr\/2020","terms":"Nostrum sed repellendus ipsum earum illo. Deserunt et voluptas consequuntur necessitatibus aut suscipit assumenda. Necessitatibus necessitatibus animi consectetur quaerat libero provident recusandae. Culpa sed dolore ipsa ut voluptates animi ipsam eius. Velit consequatur dolores beatae minus laudantium illum. Nemo molestiae sunt ab quos rerum. Dolore sunt omnis id laboriosam.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":false,"footer":"","partial":0,"partial_due_date":"","custom_value1":"2013-05-31","custom_value2":"no","custom_value3":"1","custom_value4":"3","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":7,"cost":504.67,"product_key":"sint","notes":"Alice, we learned.","discount":8,"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":3532.69,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":900.06,"product_key":"architecto","notes":"And with that she.","discount":3,"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":6300.42,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":821.97,"product_key":"dolores","notes":"King sharply. Do.","discount":7,"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":7397.7300000000005,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":6,"cost":219.23,"product_key":"rem","notes":"Then followed the.","discount":10,"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":1315.3799999999999,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":9,"cost":21.02,"product_key":"debitis","notes":"Quick, now! And.","discount":3,"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":189.18,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]},{"amount":"$100.00","balance":"$26.00","balance_raw":"26.000000","number":"5083153655186","discount":8,"po_number":"Et soluta.","date":"25\/Jan\/2018","last_sent_date":"","next_send_date":"","due_date":"21\/Nov\/2004","terms":"Dignissimos quas quod aut minus. Delectus magnam quas dolorem fugit. Dolorem eligendi et ratione quae quia blanditiis. Sunt labore optio architecto vel dolorem sit. Qui et nulla alias id tenetur. Ipsa architecto quas asperiores expedita excepturi repudiandae qui. Unde dolor culpa quidem facilis veritatis nemo voluptatum. Sit aspernatur eum necessitatibus cumque ut culpa. Nemo dolore blanditiis et nesciunt accusantium. Dolorum enim eos minima tenetur quasi qui accusamus.","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":"$0.00","total_taxes_raw":"0.000000","is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"1972-11-29","custom_value2":"no","custom_value3":"1","custom_value4":"4","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":10,"cost":713.89,"product_key":"quidem","notes":"Then the Queen in.","discount":9,"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":7138.9,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":336.09,"product_key":"rerum","notes":"I dont keep the.","discount":4,"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":3360.8999999999996,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":10,"cost":914.3,"product_key":"odio","notes":"The Mouse looked.","discount":8,"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":9143,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":8,"cost":17.67,"product_key":"provident","notes":"Shark, But, when.","discount":2,"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":141.36,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"},{"quantity":7,"cost":734.28,"product_key":"quia","notes":"The Fish-Footman.","discount":9,"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":5139.96,"gross_line_total":0,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1"}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$0.00","auto_bill_enabled":false,"client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$383.00","applied":"$383.00","balance":"$0.00","refunded":"$0.00","amount_raw":"383.000000","applied_raw":"383.000000","refunded_raw":"0.000000","balance_raw":0,"date":"01\/Oct\/2023","method":"Visa Card","currency":"USD","exchange_rate":1,"transaction_reference":"My Batch Payment","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Champlin, Dooley and Jacobi","balance":"-420.000000","payment_balance":"0.000000","credit_balance":"-37.000000"},"paymentables":[{"invoice":"8651845192683","amount_raw":"25.0000","refunded_raw":"0.0000","net_raw":25,"amount":"$25.00","refunded":"$0.00","net":"$25.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"1570392317752","amount_raw":"13.0000","refunded_raw":"0.0000","net_raw":13,"amount":"$13.00","refunded":"$0.00","net":"$13.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"6754511981115","amount_raw":"27.0000","refunded_raw":"0.0000","net_raw":27,"amount":"$27.00","refunded":"$0.00","net":"$27.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"3857859890781","amount_raw":"51.0000","refunded_raw":"0.0000","net_raw":51,"amount":"$51.00","refunded":"$0.00","net":"$51.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"7929692902054","amount_raw":"92.0000","refunded_raw":"0.0000","net_raw":92,"amount":"$92.00","refunded":"$0.00","net":"$92.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9532098692559","amount_raw":"3.0000","refunded_raw":"0.0000","net_raw":3,"amount":"$3.00","refunded":"$0.00","net":"$3.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5228040185814","amount_raw":"12.0000","refunded_raw":"0.0000","net_raw":12,"amount":"$12.00","refunded":"$0.00","net":"$12.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"8727857125862","amount_raw":"68.0000","refunded_raw":"0.0000","net_raw":68,"amount":"$68.00","refunded":"$0.00","net":"$68.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"9569539191784","amount_raw":"65.0000","refunded_raw":"0.0000","net_raw":65,"amount":"$65.00","refunded":"$0.00","net":"$65.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"invoice":"5083153655186","amount_raw":"74.0000","refunded_raw":"0.0000","net_raw":74,"amount":"$74.00","refunded":"$0.00","net":"$74.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0003","amount_raw":"45.0000","refunded_raw":"0.0000","net_raw":45,"amount":"$45.00","refunded":"$0.00","net":"$45.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011},{"credit":"0004","amount_raw":"2.0000","refunded_raw":"0.0000","net_raw":2,"amount":"$2.00","refunded":"$0.00","net":"$2.00","is_credit":true,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696138011}]}]}]'; - - public string $payment_data2 = '[{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }] }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }] }, { "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 0, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 0, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }] }, { "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 5, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }] }, { "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_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", "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": [] } }, "invoices": [], "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 5, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }] }]'; + 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 $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":[]}}}]'; @@ -34,7 +32,7 @@ class TemplateMock public string $task_data = '[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]}]'; - public string $invoice_data = '[{ "id": "VWPe9rxaLy", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 9199.58, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0001", "discount": 0, "po_number": "", "date": "2023-08-01", "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": 2269.58, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "QnXe0Rvbxr", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1801.8, "balance": 1801.8, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0002", "discount": 0, "po_number": "", "date": "2023-06-30", "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": 415.8, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1985-10-27", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Wjneg5YbwZ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 6860.73, "balance": 6860.73, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "2", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695796654, "archived_at": 0, "is_deleted": false, "number": "0003", "discount": 0, "po_number": "", "date": "2023-08-19", "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": 2009.73, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1990-11-17", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 0, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [], "credits": [] }, { "id": "Volej2RejN", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1905.75, "balance": 1350.75, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799160, "archived_at": 0, "is_deleted": false, "number": "0004", "discount": 0, "po_number": "", "date": "2023-09-13", "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": 519.75, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1978-12-22", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 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": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 555, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "1YQdJ2dOGp", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 222, "refunded": 0, "applied": 222, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799160, "updated_at": 1695802769, "archived_at": 0, "is_deleted": false, "type_id": "2", "invitation_id": "", "private_notes": "", "number": "0004", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "q9wdLwbjPX", "invoice_id": "Volej2RejN", "amount": 555, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }, { "id": "7N1aMAaWmp", "credit_id": "mWZdPwbKgR", "amount": 333, "refunded": 0, "created_at": 1695799160, "updated_at": 1695799160, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "Cash" } }], "credits": [] }, { "id": "Wpmbk55ezJ", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 8697.17, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695796650, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "number": "0005", "discount": 0, "po_number": "", "date": "2023-07-11", "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": 1767.17, "is_amount_discount": true, "footer": "", "partial": 0, "partial_due_date": "", "custom_value1": "1973-12-03", "custom_value2": "no", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 762.3, "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": 69.3, "date": "", "tax_id": "", "task_id": "", "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 8697.17, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "xYRdG7dDzO", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 8697.17, "refunded": 50, "applied": 8697.17, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0003", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "4y1aKReQGw", "invoice_id": "Wpmbk55ezJ", "amount": 8697.17, "refunded": 50, "created_at": 1695799139, "updated_at": 1695799139, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "mxkazm8eJ0", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 1190, "balance": 746, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "3", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695798363, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "number": "0026", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company invoice terms<\/p>", "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": "

Default invoice footer<\/p>", "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, "exchange_rate": 1, "custom_surcharge_tax1": false, "custom_surcharge_tax2": false, "custom_surcharge_tax3": false, "custom_surcharge_tax4": false, "line_items": [{ "_id": "1d9727b4-bc32-4c62-a291-3b595e638a3b", "quantity": 0, "cost": 33, "product_key": "t1", "product_cost": 0, "notes": "task 1 description", "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": "2", "tax_id": "2", "task_id": "Volej0WbjN", "tax_amount": 0, "expense_id": "" }, { "_id": "37e6f099-d7c9-47ad-aaf3-2de38942959c", "quantity": 5, "cost": 123, "product_key": "t2", "product_cost": 0, "notes": "task 2 description", "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": 615, "gross_line_total": 615, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "O5xe7pwa7r", "tax_amount": 0, "expense_id": "" }, { "_id": "d109e819-e839-4eeb-9c24-cd91cbfed7b5", "quantity": 5, "cost": 33, "product_key": "t3", "product_cost": 0, "notes": "task 3 description", "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": 165, "gross_line_total": 165, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "QK9b6B7bEv", "tax_amount": 0, "expense_id": "" }, { "_id": "ac64e02b-219c-4a18-9a7c-191dd5b8f21f", "quantity": 5, "cost": 67, "product_key": "t4", "product_cost": 0, "notes": "task 4 description", "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": 335, "gross_line_total": 335, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "qM7e5Rxa2v", "tax_amount": 0, "expense_id": "" }, { "_id": "7b6dcee1-7b07-49b7-bcfa-2129ef844f07", "quantity": 5, "cost": 4, "product_key": "t5", "product_cost": 0, "notes": "task 5 description", "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": 20, "gross_line_total": 20, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "KGRb4z2eBL", "tax_amount": 0, "expense_id": "" }, { "_id": "a8ef31c5-49ac-43f7-a40e-0e311b940589", "quantity": 5, "cost": 11, "product_key": "t6", "product_cost": 0, "notes": "task 6 description", "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": 55, "gross_line_total": 55, "date": "", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "type_id": "2", "tax_id": "2", "task_id": "GELe3yrb69", "tax_amount": 0, "expense_id": "" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 444, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "oBDbDxbl2E", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 0, "refunded": 0, "applied": 0, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0001", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "xYRdG7dDzO", "invoice_id": "mxkazm8eJ0", "amount": 0, "refunded": 0, "created_at": 1695798370, "updated_at": 1695798370, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }, { "id": "K4oeEva0By", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 444, "refunded": 0, "applied": 444, "transaction_reference": "", "transaction_id": "", "date": "2023-09-27", "is_manual": true, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0002", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "1YQdJ2dOGp", "invoice_id": "mxkazm8eJ0", "amount": 444, "refunded": 0, "created_at": 1695799116, "updated_at": 1695799116, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }, { "id": "7N1aMj3bWm", "user_id": "wMvbmOeYAl", "project_id": "", "assigned_user_id": "", "amount": 9199.58, "balance": 0, "client_id": "QJ0dN6dLOv", "vendor_id": "", "status_id": "4", "design_id": "Wpmbk5ezJn", "recurring_id": "", "created_at": 1695799468, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "number": "0027", "discount": 0, "po_number": "", "date": "2023-09-27", "last_sent_date": "", "next_send_date": "", "due_date": "", "terms": "

Default company quote terms<\/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": 2269.58, "is_amount_discount": true, "footer": "Default invoice footer", "partial": 0, "partial_due_date": "", "custom_value1": "1991-04-30", "custom_value2": "yes", "custom_value3": "", "custom_value4": "", "has_tasks": false, "has_expenses": false, "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": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "f8b4d3e2-4460-4403-a2c2-2f4e0f0aa93b" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "9d1d7614-3286-4405-95e1-583b63a9243d" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "85886668-4ae6-4fe6-95fe-f7bfdd59e409" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "e6b7e129-2821-4e89-b378-dc8f46a00c00" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "a0eaa41c-4dce-4500-aa5d-fbae0906e42a" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 814.28, "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": 121.28, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "ba7b8380-07a4-4898-9968-3f995e51b9a2" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "fe9d54c1-bd41-42df-b53d-8934088a3120" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "65c01100-0261-4f0c-9d19-9152d95c111b" }, { "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": "1", "task_id": "", "expense_id": "", "_id": "5e325b00-904b-47bc-8a53-8bae8bbe10ff" }, { "quantity": 1, "cost": 693, "product_key": "Sed.", "notes": "Est sequi.", "discount": 0, "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": 693, "gross_line_total": 727.65, "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": 34.65, "date": "", "tax_id": "1", "task_id": "", "expense_id": "", "_id": "483cdc42-a0c8-42db-974a-33edc91fdf30" }], "entity_type": "invoice", "reminder1_sent": "", "reminder2_sent": "", "reminder3_sent": "", "reminder_last_sent": "", "paid_to_date": 9199.58, "subscription_id": "", "auto_bill_enabled": false, "tax_info": {}, "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": 548.03, "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", "is_deleted": false, "vat_number": "881403416", "id_number": "MU19IWUA7340242407223765691CMM", "updated_at": 1695803284, "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": [] } }, "payments": [{ "id": "l4zbqx2apr", "user_id": "wMvbmOeYAl", "assigned_user_id": "", "amount": 9199.58, "refunded": 0, "applied": 9199.58, "transaction_reference": "Manual entry", "transaction_id": "", "date": "2023-09-26", "is_manual": true, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0, "is_deleted": false, "type_id": "", "invitation_id": "", "private_notes": "", "number": "0007", "custom_value1": "", "custom_value2": "", "custom_value3": "", "custom_value4": "", "client_id": "QJ0dN6dLOv", "client_contact_id": "", "company_gateway_id": "", "gateway_type_id": "", "status_id": "4", "project_id": "", "vendor_id": "", "currency_id": "1", "exchange_rate": 1, "exchange_currency_id": "", "paymentables": [{ "id": "OpnelY5aKB", "invoice_id": "7N1aMj3bWm", "amount": 9199.58, "refunded": 0, "created_at": 1695803284, "updated_at": 1695803284, "archived_at": 0 }], "documents": { "data": [] }, "type": { "name": "" } }], "credits": [] }]'; + public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","balance_raw":"0.000000","number":"0015","discount":0,"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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$3,132.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$9,396.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$6,077.51","balance":"$0.00","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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$4,090.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$2,197.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$4,955.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$2,290.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,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$6,802.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$10,986.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]}]'; public string $quote_data = '[{"id":1,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0001","discount":1,"is_amount_discount":false,"po_number":"Molestias.","date":"1986-08-02","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":747.36,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":110.36,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":637,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1797.280000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"6211.690000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1695943658,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"VolejRejNm"},{"id":2,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0002","discount":9,"is_amount_discount":true,"po_number":"Omnis.","date":"1988-11-22","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":694.97,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":57.97,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1381.560000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"4557.560000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1696118643,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"Wpmbk5ezJn"}]'; @@ -50,12 +48,12 @@ class TemplateMock })->toArray(); $this->engines['invoices'] = json_decode($this->invoice_data, true); - $this->engines['quotes'] = json_decode($this->quote_data, true); - $this->engines['credits'] = json_decode($this->credit_data, true); - $this->engines['tasks'] = json_decode($this->task_data, true); - $this->engines['projects'] = json_decode($this->project_data, true); + // $this->engines['quotes'] = json_decode($this->quote_data, true); + // $this->engines['credits'] = json_decode($this->credit_data, true); + // $this->engines['tasks'] = json_decode($this->task_data, true); + // $this->engines['projects'] = json_decode($this->project_data, true); $this->engines['payments'] = json_decode($this->payment_data, true); - $this->engines['purchase_orders'] = json_decode($this->purchase_order_data, true); + // $this->engines['purchase_orders'] = json_decode($this->purchase_order_data, true); // nlog("engines"); // nlog($this->engines); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 8492aecfbe24..514f066e8ad7 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -111,7 +111,6 @@ class TemplateService $this->data = $tm->engines; $this->variables = $tm->variables[0]; - nlog($this->data); $this->parseNinjaBlocks() ->parseVariables(); @@ -151,7 +150,8 @@ class TemplateService $template = $template->render($this->data); $f = $this->document->createDocumentFragment(); - $f->appendXML($template); + nlog($template); + $f->appendXML(html_entity_decode($template)); $replacements[] = $f; } @@ -219,7 +219,7 @@ class TemplateService $html .= $this->template->design->body; $html .= $this->template->design->footer; - @$this->document->loadHTML($html); + @$this->document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); return $this; @@ -240,7 +240,7 @@ class TemplateService $html .= $partials['design']['body']; $html .= $partials['design']['footer']; - @$this->document->loadHTML($html); + @$this->document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); return $this; @@ -400,7 +400,7 @@ class TemplateService return $invoices['data']; } -private function transformPayment(Payment $payment): array + private function transformPayment(Payment $payment): array { $data = []; @@ -530,22 +530,29 @@ private function transformPayment(Payment $payment): array */ public function processPayments($payments): array { - $it = new PaymentTransformer(); - $it->setDefaultIncludes(['client','invoices','paymentables']); - $manager = new Manager(); - $manager->parseIncludes(['client','invoices','paymentables']); - $resource = new \League\Fractal\Resource\Collection($payments, $it, null); - $resources = $manager->createData($resource)->toArray(); - foreach($resources['data'] as $key => $resource) { + $payments = $payments->map(function ($payment) { + // nlog(microtime(true)); + return $this->transformPayment($payment); + })->toArray(); - $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; - $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; - $resources['data'][$key]['invoices'] = $invoice['invoices']['data'] ?? []; + return $payments; + // $it = new PaymentTransformer(); + // $it->setDefaultIncludes(['client','invoices','paymentables']); + // $manager = new Manager(); + // $manager->parseIncludes(['client','invoices','paymentables']); + // $resource = new \League\Fractal\Resource\Collection($payments, $it, null); + // $resources = $manager->createData($resource)->toArray(); - } + // foreach($resources['data'] as $key => $resource) { - return $resources['data']; + // $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; + // $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; + // $resources['data'][$key]['invoices'] = $invoice['invoices']['data'] ?? []; + + // } + + // return $resources['data']; } diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 23b119c8a2ab..227301467aa6 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -132,9 +132,9 @@ class TemplateTest extends TestCase
- + - + {% for payment in invoice.payments|filter(payment => payment.is_deleted == false) %} @@ -146,10 +146,10 @@ class TemplateTest extends TestCase From 46a459b5a0adee951b5f425c7e6d8740d2fbd557 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 2 Oct 2023 11:06:24 +1100 Subject: [PATCH 040/109] Minor fixes --- app/Http/Controllers/PreviewController.php | 17 +++++++++++++---- app/Http/Middleware/UserVerified.php | 5 ++--- app/Services/Template/TemplateService.php | 12 ++++++++++-- composer.lock | 12 ++++++------ 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index cae588da70af..d5cf2651f002 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -374,11 +374,20 @@ class PreviewController extends BaseController // 'projects' => Project::query()->company()->with('tasks','client')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), // ]; + $ts = (new TemplateService()); - $ts->setCompany($company) - ->setTemplate($design_object) - ->mock(); - + try { + $ts->setCompany($company) + ->setTemplate($design_object) + ->mock(); + } + catch(\Twig\Error\SyntaxError $e) + { + + // return response()->json(['message' => 'Twig syntax is invalid.', 'errors' => new \stdClass], 422); + + } + $html = $ts->getHtml(); if (request()->query('html') == 'true') { diff --git a/app/Http/Middleware/UserVerified.php b/app/Http/Middleware/UserVerified.php index c951c13f3a6f..e45acb74c757 100644 --- a/app/Http/Middleware/UserVerified.php +++ b/app/Http/Middleware/UserVerified.php @@ -21,10 +21,9 @@ use Illuminate\Http\Request; */ class UserVerified { - public $user; - - public function __construct(?User $user) + public function __construct(public ?User $user) { + $this->user = property_exists($user, 'id') ? $user : auth()->user(); } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 514f066e8ad7..874ccaff55a0 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -29,6 +29,7 @@ use App\Utils\Traits\MakesDates; use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; +use App\Services\Template\TemplateMock; use App\Transformers\CreditTransformer; use App\Transformers\InvoiceTransformer; use App\Transformers\PaymentTransformer; @@ -146,11 +147,18 @@ class TemplateService $template = $content->ownerDocument->saveHTML($content); - $template = $this->twig->createTemplate(html_entity_decode($template)); + try { + $template = $this->twig->createTemplate(html_entity_decode($template)); + } + catch(\Twig\Error\SyntaxError $e) { + nlog($e->getMessage()); + throw ($e); + } + $template = $template->render($this->data); $f = $this->document->createDocumentFragment(); - nlog($template); + $f->appendXML(html_entity_decode($template)); $replacements[] = $f; diff --git a/composer.lock b/composer.lock index f1745e73b6bd..1c3d91f5945e 100644 --- a/composer.lock +++ b/composer.lock @@ -13813,16 +13813,16 @@ }, { "name": "turbo124/beacon", - "version": "v1.5.1", + "version": "v1.5.2", "source": { "type": "git", "url": "https://github.com/turbo124/beacon.git", - "reference": "a737499198a3aff2d194d4f2a4c834257187d9b8" + "reference": "4f08b91d3f9326e42f664e667d84100dc8afe752" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/turbo124/beacon/zipball/a737499198a3aff2d194d4f2a4c834257187d9b8", - "reference": "a737499198a3aff2d194d4f2a4c834257187d9b8", + "url": "https://api.github.com/repos/turbo124/beacon/zipball/4f08b91d3f9326e42f664e667d84100dc8afe752", + "reference": "4f08b91d3f9326e42f664e667d84100dc8afe752", "shasum": "" }, "require": { @@ -13869,9 +13869,9 @@ "turbo124" ], "support": { - "source": "https://github.com/turbo124/beacon/tree/v1.5.1" + "source": "https://github.com/turbo124/beacon/tree/v1.5.2" }, - "time": "2023-09-24T07:20:04+00:00" + "time": "2023-10-01T07:13:02+00:00" }, { "name": "twig/intl-extra", From d51570e5f84083267366b09b3e96fe0d65480c64 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 2 Oct 2023 13:43:07 +1100 Subject: [PATCH 041/109] Adjustments for templates --- app/Services/Template/TemplateService.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 874ccaff55a0..b9c8a344a04c 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -34,6 +34,7 @@ use App\Transformers\CreditTransformer; use App\Transformers\InvoiceTransformer; use App\Transformers\PaymentTransformer; use App\Transformers\ProjectTransformer; +use App\Services\Template\LogoTokenParser; use App\Transformers\PurchaseOrderTransformer; use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Serializer\JsonApiSerializer; @@ -76,6 +77,11 @@ class TemplateService $this->twig->addExtension($string_extension); $this->twig->addExtension(new IntlExtension()); + $function = new \Twig\TwigFunction('img', function ($string, $style = '') { + return ''; + }); + $this->twig->addFunction($function); + return $this; } @@ -156,10 +162,16 @@ class TemplateService } $template = $template->render($this->data); - +nlog($template); $f = $this->document->createDocumentFragment(); - - $f->appendXML(html_entity_decode($template)); + // nlog($template); + // $f->appendChild(html_entity_decode($template)); + // $template = html_entity_decode(htmlentities($template, ENT_QUOTES, 'UTF-8')); + +// $f->appendXML(html_encode$template); +$f->appendXML(html_entity_decode($template)); + // $f->appendChild($this->document->createTextNode($template)); + $replacements[] = $f; } From af27f39ba15ea0e948a33678572c71b0278a0bca Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 2 Oct 2023 20:04:14 +1100 Subject: [PATCH 042/109] lock --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 1c3d91f5945e..2c2cacba4624 100644 --- a/composer.lock +++ b/composer.lock @@ -2487,16 +2487,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.317.0", + "version": "v0.318.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "a11658da6e5ba713e3d636544895bb0af3c27689" + "reference": "908a866797b9731352e650997112c8c3a0347ac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/a11658da6e5ba713e3d636544895bb0af3c27689", - "reference": "a11658da6e5ba713e3d636544895bb0af3c27689", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/908a866797b9731352e650997112c8c3a0347ac5", + "reference": "908a866797b9731352e650997112c8c3a0347ac5", "shasum": "" }, "require": { @@ -2525,9 +2525,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.317.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.318.0" }, - "time": "2023-09-24T01:06:13+00:00" + "time": "2023-10-02T01:10:14+00:00" }, { "name": "google/auth", From 69400c8371bd92ddd5e48af797fe307222f191b2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 3 Oct 2023 16:38:36 +1100 Subject: [PATCH 043/109] Working on data feeds for templates --- app/Services/Pdf/PdfMock.php | 4 +++ app/Services/Template/TemplateMock.php | 2 +- app/Services/Template/TemplateService.php | 42 +++++++++++++++++------ app/Utils/HtmlEngine.php | 3 +- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index ebf1bfd1f56d..09f620936c7a 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -202,6 +202,8 @@ class PdfMock '$company.postal_city_state' => 'CA', '$company.postal_city' => '90210, CA', '$product.gross_line_total' => '100', + '$client.classification' => 'Individual', + '$company.classification' => 'Business', '$client.postal_city_state' => '11243 Aufderharchester, North Carolina', '$client.postal_city' => '11243 Aufderharchester, North Carolina', '$client.shipping_address1' => '453', @@ -509,6 +511,8 @@ class PdfMock '$client.billing_postal_code_label' => ctrans('texts.billing_postal_code'), '$company.postal_city_state_label' => ctrans('texts.postal_city_state'), '$company.city_state_postal_label' => ctrans('texts.city_state_postal'), + '$client.classification_label' => ctrans('texts.classification'), + '$company.classification_label' => ctrans('texts.classification'), '$product.gross_line_total_label' => ctrans('texts.gross_line_total'), '$client.shipping_address1_label' => ctrans('texts.shipping_address1'), '$client.postal_city_state_label' => ctrans('texts.postal_city_state'), diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 53e55ec2aab7..44089164f7cf 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -32,7 +32,7 @@ class TemplateMock public string $task_data = '[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]}]'; - public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","balance_raw":"0.000000","number":"0015","discount":0,"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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$3,132.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$9,396.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$6,077.51","balance":"$0.00","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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$4,090.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$2,197.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$4,955.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$2,290.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,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$6,802.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]},{"amount":"$10,986.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,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","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":935,"gross_line_total":935,"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,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1098.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,"tax_amount":163.63,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"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,"tax_amount":46.75,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":935,"product_key":"Et.","notes":"Illum similique.","discount":0,"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,"gross_line_total":1028.5,"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,"tax_amount":93.5,"date":"","tax_id":"","task_id":"","expense_id":""}],"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}]}]}]'; + public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","balance_raw":"0.000000","number":"0015","discount":0,"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}]}]},{"amount":"$3,132.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}]}]},{"amount":"$9,396.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}]}]},{"amount":"$6,077.51","balance":"$0.00","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}]}]},{"amount":"$4,090.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}]}]},{"amount":"$2,197.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}]}]},{"amount":"$4,955.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}]}]},{"amount":"$2,290.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}]}]},{"amount":"$6,802.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}]}]},{"amount":"$10,986.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}]}]}]'; public string $quote_data = '[{"id":1,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0001","discount":1,"is_amount_discount":false,"po_number":"Molestias.","date":"1986-08-02","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":747.36,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":110.36,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":637,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1797.280000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"6211.690000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1695943658,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"VolejRejNm"},{"id":2,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0002","discount":9,"is_amount_discount":true,"po_number":"Omnis.","date":"1988-11-22","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":694.97,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":57.97,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1381.560000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"4557.560000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1696118643,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"Wpmbk5ezJn"}]'; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index b9c8a344a04c..698eda4ee1ae 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -14,6 +14,7 @@ namespace App\Services\Template; use App\Models\Task; use App\Models\Quote; use App\Utils\Number; +use App\Models\Client; use App\Models\Credit; use App\Models\Design; use App\Models\Company; @@ -162,16 +163,10 @@ class TemplateService } $template = $template->render($this->data); -nlog($template); + $f = $this->document->createDocumentFragment(); - // nlog($template); - // $f->appendChild(html_entity_decode($template)); - // $template = html_entity_decode(htmlentities($template, ENT_QUOTES, 'UTF-8')); - -// $f->appendXML(html_encode$template); -$f->appendXML(html_entity_decode($template)); - // $f->appendChild($this->document->createTextNode($template)); - + $f->appendXML(html_entity_decode($template)); + $replacements[] = $f; } @@ -368,7 +363,7 @@ $f->appendXML(html_entity_decode($template)); 'custom_surcharge_tax2' => (bool) $invoice->custom_surcharge_tax2, 'custom_surcharge_tax3' => (bool) $invoice->custom_surcharge_tax3, 'custom_surcharge_tax4' => (bool) $invoice->custom_surcharge_tax4, - 'line_items' => $invoice->line_items ?: (array) [], + 'line_items' => $invoice->line_items ? $this->padLineItems($invoice->line_items, $invoice->client): (array) [], 'reminder1_sent' => $this->translateDate($invoice->reminder1_sent, $invoice->client->date_format(), $invoice->client->locale()), 'reminder2_sent' => $this->translateDate($invoice->reminder2_sent, $invoice->client->date_format(), $invoice->client->locale()), 'reminder3_sent' => $this->translateDate($invoice->reminder3_sent, $invoice->client->date_format(), $invoice->client->locale()), @@ -386,11 +381,36 @@ $f->appendXML(html_entity_decode($template)); }); - nlog($invoices->count()); return $invoices->toArray(); } + public function padLineItems(array $items, Client $client): array + { + return collect($items)->map(function ($item) use ($client){ + + $item->cost_raw = $item->cost; + $item->discount_raw = $item->discount; + $item->line_total_raw = $item->line_total; + $item->gross_line_total_raw = $item->gross_line_total; + $item->tax_amount_raw = $item->tax_amount; + $item->product_cost_raw = $item->product_cost; + + $item->cost = Number::formatMoney($item->cost_raw, $client); + + if($item->is_amount_discount) + $item->discount = Number::formatMoney($item->discount_raw, $client); + + $item->line_total = Number::formatMoney($item->line_total_raw, $client); + $item->gross_line_total = Number::formatMoney($item->gross_line_total_raw, $client); + $item->tax_amount = Number::formatMoney($item->tax_amount_raw, $client); + $item->product_cost = Number::formatMoney($item->product_cost_raw, $client); + + return $item; + + })->toArray(); + } + public function processInvoicesBak($invoices): array { $it = new InvoiceTransformer(); diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index efe31880ea9b..13197470757e 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -459,7 +459,7 @@ class HtmlEngine $data['$client.postal_city'] = &$data['$postal_city']; $data['$client.country'] = &$data['$country']; $data['$client.email'] = &$data['$email']; - + $data['$client.classification'] = ['value' => isset($this->client->classification) ? ctrans("texts.{$this->client->classification}") : ' ', 'label' => ctrans('texts.classification')]; $data['$client.billing_address'] = &$data['$client_address']; $data['$client.billing_address1'] = &$data['$client.address1']; $data['$client.billing_address2'] = &$data['$client.address2']; @@ -515,6 +515,7 @@ class HtmlEngine $data['$company.postal_city_state'] = ['value' => $this->company->present()->cityStateZip($this->settings->city, $this->settings->state, $this->settings->postal_code, true) ?: ' ', 'label' => ctrans('texts.postal_city_state')]; $data['$company.postal_city'] = ['value' => $this->company->present()->cityStateZip($this->settings->city, null, $this->settings->postal_code, true) ?: ' ', 'label' => ctrans('texts.postal_city')]; $data['$company.name'] = ['value' => $this->settings->name ?: ctrans('texts.untitled_account'), 'label' => ctrans('texts.company_name')]; + $data['$company.classification'] = ['value' => ($this->settings->classification ?? false) ? ctrans("texts.{$this->settings->classification}") : ' ', 'label' => ctrans('texts.classification')]; $data['$account'] = &$data['$company.name']; $data['$company.address1'] = ['value' => $this->settings->address1 ?: ' ', 'label' => ctrans('texts.address1')]; From 09fafb46ddb037c4f2c2d851e2ef75118ec38521 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 3 Oct 2023 18:52:46 +1100 Subject: [PATCH 044/109] Working on data feeds for templates --- app/Services/Pdf/PdfMock.php | 28 +++++++++++------------ app/Services/Template/TemplateMock.php | 2 +- app/Services/Template/TemplateService.php | 4 +++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 09f620936c7a..6b26adcc0078 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -274,8 +274,8 @@ class PdfMock '$product.quantity' => '', '$total_tax_labels' => '', '$total_tax_values' => '', - '$invoice.discount' => '$0.00', - '$invoice.subtotal' => '$0.00', + '$invoice.discount' => '$5.00', + '$invoice.subtotal' => '$100.00', '$company.address2' => $this->settings->address2, '$partial_due_date' => ' ', '$invoice.due_date' => '2023-10-24', @@ -346,9 +346,9 @@ class PdfMock '$task.discount' => '', '$contact.email' => 'bob@gmail.com', '$primary_color' => isset($this->settings->primary_color) ? $this->settings->primary_color : '#4e4e4e', - '$credit_amount' => '$0.00', - '$invoice.total' => '$0.00', - '$invoice.taxes' => '$0.00', + '$credit_amount' => '$40.00', + '$invoice.total' => '$330.00', + '$invoice.taxes' => '$10.00', '$quote.custom1' => 'custom value', '$quote.custom2' => 'custom value', '$quote.custom3' => 'custom value', @@ -395,10 +395,10 @@ class PdfMock '$valid_until' => '', '$your_entity' => '', '$shipping' => ctrans('texts.shipping_address'), - '$balance_due' => '$0.00', - '$outstanding' => '$0.00', - '$partial_due' => '$0.00', - '$quote.total' => '$0.00', + '$balance_due' => '$1110.00', + '$outstanding' => '$440.00', + '$partial_due' => '$50.00', + '$quote.total' => '$10.00', '$payment_due' => ' ', '$credit.date' => '25/Feb/2023', '$invoiceDate' => '25/Feb/2023', @@ -456,8 +456,8 @@ class PdfMock '$view_url' => 'http://ninja.test:8000/client/invoice/UAUY8vIPuno72igmXbbpldwo5BDDKIqs', '$font_url' => 'https://fonts.googleapis.com/css2?family=Roboto&display=swap', '$details' => '', - '$balance' => '$0.00', - '$partial' => '$0.00', + '$balance' => '$40.00', + '$partial' => '$30.00', '$client1' => 'custom value', '$client2' => 'custom value', '$client3' => 'custom value', @@ -471,7 +471,7 @@ class PdfMock '$website' => 'http://www.parisian.org/', '$entity' => '', '$thanks' => 'Thanks!', - '$amount' => '$0.00', + '$amount' => '$30.00', '$method' => ' ', '$number' => '0029', '$footer' => 'Default invoice footer', @@ -481,8 +481,8 @@ class PdfMock '_rate1' => '', '_rate2' => '', '_rate3' => '', - '$taxes' => '$0.00', - '$total' => '$0.00', + '$taxes' => '$40.00', + '$total' => '$10.00', '$phone' => ' ', '$terms' => 'Default company invoice terms', '$from' => 'Bob Jones', diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 44089164f7cf..af129c400c6d 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -32,7 +32,7 @@ class TemplateMock public string $task_data = '[{"id":"k8mepZ1bMy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0009","description":"Tenetur molestiae voluptatem voluptate nostrum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"l4zbqQ3bpr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0010","description":"Vitae eum amet magni.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yMYer2weOB","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0011","description":"Eos facilis maiores enim harum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"gl9avQVeG1","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0012","description":"Vero iure veritatis odio voluptate dolorem.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7LDdw0Je1Y","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0013","description":"Nulla quisquam autem blanditiis sed tempore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JX7ax6Jdyv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0014","description":"Eveniet quos est odit quam repellat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kzPdywVaQr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0015","description":"Molestiae facilis magni vitae ducimus eius et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mxkaz6raJ0","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0016","description":"Quia nam et et excepturi explicabo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4w9aA6BbvM","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0017","description":"Velit et reiciendis accusamus qui quo.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"X46dBrxd79","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0018","description":"Possimus ipsum dolorum accusamus.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"oBDbDqBdl2","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0019","description":"Ipsam ex aut rerum eius id.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"K4oeEqNe0B","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0020","description":"Et et et occaecati non quis ut ea enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"xYRdGRybDz","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0021","description":"Rerum voluptatum nihil impedit doloribus enim.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"1YQdJNDdOG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0022","description":"Corrupti quos voluptas ut veniam perferendis.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"4y1aKLrbQG","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0023","description":"Est nobis aut a corporis ullam consequatur illum.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"q9wdLvgajP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0024","description":"Sed sunt labore ea dolorum eligendi et.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"7N1aMJQbWm","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0025","description":"Fugit tempora iure aut aut exercitationem a.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QJ0dNYLbLO","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0026","description":"Sed enim et rem maxime ipsam vitae labore.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"z3YaOPgbxq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0027","description":"Animi ex dolores illum accusantium eos.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"mWZdPzzaKg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0028","description":"Amet quam eligendi assumenda sapiente fugiat.","duration":0,"rate":0,"created_at":1695797958,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"qM7e5Ba2vp","is_deleted":false,"time_log":"[[1694933958,1695365958,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-16","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":[]}},"project":{"id":"qM7e5Ba2vp","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Jace Windler DVM","number":"0002","created_at":1695797958,"updated_at":1695798905,"archived_at":0,"is_deleted":false,"task_rate":38,"due_date":"","private_notes":"Private Project Notes","public_notes":"Rerum voluptas incidunt velit.","budgeted_hours":826,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"LYqaQ67bnj","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0029","description":"Optio illum sapiente explicabo qui molestias.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"JAPdRPLaGy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0030","description":"Ratione culpa tenetur molestiae beatae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Oy5eV75aEP","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0031","description":"Deleniti mollitia qui sint dicta quod.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"rlNbWQWeyg","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0032","description":"In illo omnis dolores.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"kQBeXrkbyK","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0033","description":"Ut quo impedit et et architecto.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"W4QbYy0bzq","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0034","description":"Quo recusandae quam debitis dolorem facere aut.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"joQeZzvepZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0035","description":"At magni sed inventore molestiae.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"EKQe1G3bJY","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0036","description":"Placeat delectus beatae qui enim consequuntur ea.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"yJrb27JdWL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0037","description":"Iste nulla id quisquam.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"GELe3yrb69","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0038","description":"Quia laborum quis sed qui sunt.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"KGRb4z2eBL","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0039","description":"Omnis amet illum inventore.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"qM7e5Rxa2v","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0040","description":"Tempore dolore aut necessitatibus ex illo.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"QK9b6B7bEv","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0041","description":"Ipsam eos deleniti delectus.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"O5xe7pwa7r","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0042","description":"Aperiam quae voluptas voluptatem vero.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"MVyb8MldvA","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0043","description":"Voluptatem iusto quod cupiditate.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"VWPe9DPdLy","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0044","description":"Ab occaecati ut in qui.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798950,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"X46dBXa79j","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"QnXe007exr","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0045","description":"At ratione dicta dicta ab earum.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Wjnegn9dwZ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0046","description":"Omnis dolores ducimus iusto maxime aut iure.","duration":0,"rate":0,"created_at":1695797987,"updated_at":1695798928,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"4w9aAOdvMR","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]},{"id":"Volej0WbjN","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0047","description":"Possimus ut quia commodi voluptatem.","duration":0,"rate":33,"created_at":1695797987,"updated_at":1695799099,"archived_at":0,"invoice_id":"mxkazm8eJ0","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"mxkazYeJ0P","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":{"data":{"id":"mxkazm8eJ0","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","amount":1190,"balance":746,"client_id":"QJ0dN6dLOv","vendor_id":"","status_id":"3","design_id":"Wpmbk5ezJn","recurring_id":"","created_at":1695798363,"updated_at":1695799116,"archived_at":0,"is_deleted":false,"number":"0026","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","due_date":"","terms":"

Default company invoice terms<\/p>","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":"

Default invoice footer<\/p>","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,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"1d9727b4-bc32-4c62-a291-3b595e638a3b","quantity":0,"cost":33,"product_key":"t1","product_cost":0,"notes":"task 1 description","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":"2","tax_id":"2","task_id":"Volej0WbjN","tax_amount":0,"expense_id":""},{"_id":"37e6f099-d7c9-47ad-aaf3-2de38942959c","quantity":5,"cost":123,"product_key":"t2","product_cost":0,"notes":"task 2 description","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":615,"gross_line_total":615,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"O5xe7pwa7r","tax_amount":0,"expense_id":""},{"_id":"d109e819-e839-4eeb-9c24-cd91cbfed7b5","quantity":5,"cost":33,"product_key":"t3","product_cost":0,"notes":"task 3 description","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":165,"gross_line_total":165,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"QK9b6B7bEv","tax_amount":0,"expense_id":""},{"_id":"ac64e02b-219c-4a18-9a7c-191dd5b8f21f","quantity":5,"cost":67,"product_key":"t4","product_cost":0,"notes":"task 4 description","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":335,"gross_line_total":335,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"qM7e5Rxa2v","tax_amount":0,"expense_id":""},{"_id":"7b6dcee1-7b07-49b7-bcfa-2129ef844f07","quantity":5,"cost":4,"product_key":"t5","product_cost":0,"notes":"task 5 description","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":20,"gross_line_total":20,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"KGRb4z2eBL","tax_amount":0,"expense_id":""},{"_id":"a8ef31c5-49ac-43f7-a40e-0e311b940589","quantity":5,"cost":11,"product_key":"t6","product_cost":0,"notes":"task 6 description","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":55,"gross_line_total":55,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"2","tax_id":"2","task_id":"GELe3yrb69","tax_amount":0,"expense_id":""}],"entity_type":"invoice","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":444,"subscription_id":"","auto_bill_enabled":false,"tax_info":{},"invitations":{"data":[{"id":"WJxboZzagw","client_contact_id":"yMYerkEaOB","key":"i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","link":"http:\/\/ninja.test:8000\/client\/invoice\/i6oaEtKOSJGW8ArM7tzz0zWVASYmSebr","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"k8mepZ1bMy","client_contact_id":"gl9av2maG1","key":"H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","link":"http:\/\/ninja.test:8000\/client\/invoice\/H6tz4cLXorbZPJHwF1b08QAZwF7zMQUZ","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""},{"id":"l4zbqQ3bpr","client_contact_id":"7LDdwpRe1Y","key":"viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","link":"http:\/\/ninja.test:8000\/client\/invoice\/viWjxxto5SAr8pUqqgSIdrJbLuAHl3sL","sent_date":"2023-09-27 07:06:09","viewed_date":"","opened_date":"","updated_at":1695798369,"archived_at":0,"created_at":1695798363,"email_status":"","email_error":""}]},"documents":{"data":[]}}}},{"id":"WpmbkrxazJ","user_id":"wMvbmOeYAl","assigned_user_id":"","number":"0048","description":"Blanditiis ad mollitia ratione veritatis.","duration":0,"rate":55,"created_at":1695797987,"updated_at":1695798883,"archived_at":0,"invoice_id":"","client_id":"QJ0dN6dLOv","project_id":"QK9b6nbEvY","is_deleted":false,"time_log":"[[1695761987,1695779987,\"description\",false]]","is_running":false,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status_id":"kzPdy7aQro","status_sort_order":0,"is_date_based":false,"status_order":null,"date":"2023-09-26","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":[]}},"project":{"id":"QK9b6nbEvY","user_id":"wMvbmOeYAl","assigned_user_id":"","client_id":"QJ0dN6dLOv","name":"Linnie Pfannerstill","number":"0001","created_at":1695797987,"updated_at":1695798405,"archived_at":0,"is_deleted":false,"task_rate":97,"due_date":"2023-09-30","private_notes":"These are the private notes for this user.","public_notes":"Quo sed quis reprehenderit est consequatur et.","budgeted_hours":738,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":0,"documents":{"data":[]}},"invoice":[]}]'; - public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","balance_raw":"0.000000","number":"0015","discount":0,"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}]}]},{"amount":"$3,132.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}]}]},{"amount":"$9,396.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}]}]},{"amount":"$6,077.51","balance":"$0.00","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}]}]},{"amount":"$4,090.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}]}]},{"amount":"$2,197.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}]}]},{"amount":"$4,955.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}]}]},{"amount":"$2,290.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}]}]},{"amount":"$6,802.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}]}]},{"amount":"$10,986.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}]}]}]'; + public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","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","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","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","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","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","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","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","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","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","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}]}]'; public string $quote_data = '[{"id":1,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0001","discount":1,"is_amount_discount":false,"po_number":"Molestias.","date":"1986-08-02","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":747.36,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":110.36,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":637,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":700.06,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":63.06,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"is_amount_discount":false,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"637.00","gross_line_total":668.53,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":31.53,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1797.280000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"6211.690000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1695943658,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"VolejRejNm"},{"id":2,"client_id":1,"user_id":1,"assigned_user_id":null,"company_id":1,"status_id":2,"project_id":null,"vendor_id":null,"recurring_id":null,"design_id":2,"invoice_id":null,"number":"0002","discount":9,"is_amount_discount":true,"po_number":"Omnis.","date":"1988-11-22","last_sent_date":null,"due_date":null,"next_send_date":null,"is_deleted":false,"line_items":[{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":665.98,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":28.98,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":694.97,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":57.97,"date":"","tax_id":"","task_id":"","expense_id":""},{"quantity":1,"cost":637,"product_key":"Nisi.","notes":"Ut ipsa rerum.","discount":0,"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":637,"gross_line_total":738.44,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"42","custom_value3":"Maxime dolores.","custom_value4":"Odio consequatur.","type_id":"1","product_cost":0,"tax_amount":101.44,"date":"","tax_id":"","task_id":"","expense_id":""}],"backup":null,"footer":null,"public_notes":null,"private_notes":null,"terms":null,"tax_name1":"GST","tax_rate1":"10.000000","tax_name2":"VAT","tax_rate2":"17.500000","tax_name3":"THIRDTAX","tax_rate3":"5.000000","total_taxes":"1381.560000","uses_inclusive_taxes":0,"custom_value1":null,"custom_value2":null,"custom_value3":null,"custom_value4":null,"custom_surcharge1":null,"custom_surcharge2":null,"custom_surcharge3":null,"custom_surcharge4":null,"custom_surcharge_tax1":0,"custom_surcharge_tax2":0,"custom_surcharge_tax3":0,"custom_surcharge_tax4":0,"exchange_rate":"1.000000","amount":"4557.560000","balance":"0.000000","partial":null,"partial_due_date":null,"last_viewed":null,"created_at":1695943654,"updated_at":1696118643,"deleted_at":null,"reminder1_sent":null,"reminder2_sent":null,"reminder3_sent":null,"reminder_last_sent":null,"paid_to_date":"0.000000","subscription_id":null,"hashed_id":"Wpmbk5ezJn"}]'; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 698eda4ee1ae..cd787c1ea8e5 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -285,7 +285,7 @@ class TemplateService 'projects' => $processed = [], 'purchase_orders' => (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], }; - + return $processed; })->toArray(); @@ -377,6 +377,8 @@ class TemplateService 'credit_balance' => $invoice->client->credit_balance, ], 'payments' => $payments, + 'total_tax_map' => $invoice->calc()->getTotalTaxMap(), + 'line_tax_map' => $invoice->calc()->getTaxMap(), ]; }); From 7055be44ba6880972d5e91175cbcc425d9d2849a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 4 Oct 2023 15:29:31 +1100 Subject: [PATCH 045/109] Updates for displaying delivery notes --- app/DataMapper/CompanySettings.php | 14 ++++-- app/Http/Controllers/InvoiceController.php | 6 ++- .../Requests/Design/StoreDesignRequest.php | 19 ++++++++ .../Requests/Design/UpdateDesignRequest.php | 19 ++++++++ app/Models/Design.php | 1 + app/Services/Invoice/GenerateDeliveryNote.php | 24 ++++++++-- app/Services/Template/TemplateService.php | 47 ++++++++++++------- tests/Feature/Template/TemplateTest.php | 9 ++-- 8 files changed, 109 insertions(+), 30 deletions(-) diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index ee9afae8ec9a..237cab626a2a 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -481,13 +481,21 @@ class CompanySettings extends BaseSettings public $enable_e_invoice = false; - public $statement_design_id = 'VolejRejNm'; + public $delivery_note_design_id = ''; + + public $statement_design_id = ''; + + public $payment_receipt_design_id = ''; - public $delivery_note_design_id = 'VolejRejNm'; + public $payment_refund_design_id = ''; public $classification = ''; // individual, business, partnership, trust, charity, government, other public static $casts = [ + 'statement_design_id' => 'string', + 'delivery_note_design_id' => 'string', + 'payment_receipt_design_id' => 'string', + 'payment_refund_design_id' => 'string', 'classification' => 'string', 'enable_e_invoice' => 'bool', 'default_expense_payment_type_id' => 'string', @@ -718,8 +726,6 @@ class CompanySettings extends BaseSettings 'portal_custom_js' => 'string', 'client_portal_enable_uploads' => 'bool', 'purchase_order_number_counter' => 'integer', - 'statement_design_id' => 'string', - 'delivery_note_design_id' => 'string', ]; public static $free_plan_casts = [ diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 2eca29cedd34..268c5994458c 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -911,8 +911,12 @@ class InvoiceController extends BaseController $file = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact); return response()->streamDownload(function () use ($file) { - echo Storage::get($file); + echo $file; }, basename($file), ['Content-Type' => 'application/pdf']); + + // return response()->streamDownload(function () use ($file) { + // echo Storage::get($file); + // }, basename($file), ['Content-Type' => 'application/pdf']); } /** diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index 386114c12b41..63d2b17911d1 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -16,6 +16,11 @@ use App\Models\Account; class StoreDesignRequest extends Request { + + private array $valid_entities = [ + 'invoice', + ]; + /** * Determine if the user is authorized to make this request. * @@ -78,6 +83,20 @@ class StoreDesignRequest extends Request $input['design']['body'] = ''; } + if(array_key_exists('entities', $input)) { + $user_entities = explode(",", $input['entities']); + + $e = []; + + foreach ($user_entities as $entity) { + if (in_array($entity, $this->valid_entities)) { + $e[] = $entity; + } + } + + $input['entities'] = implode(",", $e); + } + $this->replace($input); } } diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index 62b1b4a97562..07fb4e68ea7f 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -18,6 +18,10 @@ class UpdateDesignRequest extends Request { use ChecksEntityStatus; + private array $valid_entities = [ + 'invoice', + ]; + /** * Determine if the user is authorized to make this request. * @@ -67,6 +71,21 @@ class UpdateDesignRequest extends Request $input['design']['body'] = ''; } + if(array_key_exists('entities', $input)) { + $user_entities = explode(",", $input['entities']); + + $e = []; + + foreach ($user_entities as $entity) { + if (in_array($entity, $this->valid_entities)) { + $e[] = $entity; + } + } + + $input['entities'] = implode(",", $e); + } + + $this->replace($input); } } diff --git a/app/Models/Design.php b/app/Models/Design.php index 329182e7e8b9..e328d88853fd 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -70,6 +70,7 @@ class Design extends BaseModel 'design', 'is_active', 'is_template', + 'entities', ]; public function company() diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index 681891138811..a7a35a05fcac 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -17,6 +17,7 @@ use App\Models\Design; use App\Models\Invoice; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; +use App\Services\Template\TemplateService; use App\Utils\HostedPDF\NinjaPdf; use App\Utils\HtmlEngine; use App\Utils\PhantomJS\Phantom; @@ -40,6 +41,22 @@ class GenerateDeliveryNote public function run() { + + $delivery_note_design_id = $this->invoice->client->getSetting('delivery_note_design_id'); + + // if($design = Design::find($this->decodePrimaryKey($delivery_note_design_id))) + if($design = Design::find(15)) + { + + $ts = new TemplateService($design); + $pdf = $ts->build([ + 'invoices' => collect([$this->invoice]), + ])->getPdf(); + + return $pdf; + + } + $design_id = $this->invoice->design_id ? $this->invoice->design_id : $this->decodePrimaryKey($this->invoice->client->getSetting('invoice_design_id')); @@ -84,8 +101,6 @@ class GenerateDeliveryNote ->design($template) ->build(); - // Storage::makeDirectory($this->invoice->client->invoice_filepath(), 0775); - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); } else { @@ -96,11 +111,12 @@ class GenerateDeliveryNote info($maker->getCompiledHTML()); } - Storage::disk($this->disk)->put($file_path, $pdf); + return $pdf; + // Storage::disk($this->disk)->put($file_path, $pdf); $maker = null; $state = null; - return $file_path; + // return $file_path; } } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index cd787c1ea8e5..9ed3762cdffe 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,8 +11,6 @@ namespace App\Services\Template; -use App\Models\Task; -use App\Models\Quote; use App\Utils\Number; use App\Models\Client; use App\Models\Credit; @@ -22,27 +20,25 @@ use App\Models\Payment; use App\Models\Project; use App\Utils\HtmlEngine; use League\Fractal\Manager; -use App\Models\ClientContact; use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; use App\Utils\Traits\MakesDates; +use App\Utils\HostedPDF\NinjaPdf; use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; use App\Services\Template\TemplateMock; use App\Transformers\CreditTransformer; use App\Transformers\InvoiceTransformer; -use App\Transformers\PaymentTransformer; use App\Transformers\ProjectTransformer; -use App\Services\Template\LogoTokenParser; use App\Transformers\PurchaseOrderTransformer; use League\Fractal\Serializer\ArraySerializer; -use League\Fractal\Serializer\JsonApiSerializer; +use App\Utils\Traits\Pdf\PdfMaker; class TemplateService { - use MakesDates; + use MakesDates, PdfMaker; private \DomDocument $document; @@ -131,6 +127,19 @@ class TemplateService return $this->compiled_html; } + public function getPdf(): mixed + { + + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + $pdf = (new NinjaPdf())->build($this->compiled_html); + } else { + $pdf = $this->makePdf(null, null, $this->compiled_html); + } + + return $pdf; + + } + private function processData($data): self { @@ -318,10 +327,14 @@ class TemplateService $invoices = collect($invoices) ->map(function ($invoice){ - $payments = $invoice->payments->map(function ($payment) { - // nlog(microtime(true)); - return $this->transformPayment($payment); - })->toArray(); + $payments = []; + nlog($invoice); + if($invoice->payments) { + $payments = $invoice->payments->map(function ($payment) { + // nlog(microtime(true)); + return $this->transformPayment($payment); + })->toArray(); + } return [ 'amount' => Number::formatMoney($invoice->amount, $invoice->client), @@ -391,12 +404,12 @@ class TemplateService { return collect($items)->map(function ($item) use ($client){ - $item->cost_raw = $item->cost; - $item->discount_raw = $item->discount; - $item->line_total_raw = $item->line_total; - $item->gross_line_total_raw = $item->gross_line_total; - $item->tax_amount_raw = $item->tax_amount; - $item->product_cost_raw = $item->product_cost; + $item->cost_raw = $item->cost ?? 0; + $item->discount_raw = $item->discount ?? 0; + $item->line_total_raw = $item->line_total ?? 0; + $item->gross_line_total_raw = $item->gross_line_total ?? 0; + $item->tax_amount_raw = $item->tax_amount ?? 0; + $item->product_cost_raw = $item->product_cost ?? 0; $item->cost = Number::formatMoney($item->cost_raw, $client); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 227301467aa6..39109ce8855b 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -324,7 +324,7 @@ class TemplateTest extends TestCase nlog("query count = {$count}"); $x = $invoices->toArray(); - nlog(json_encode($x)); + // nlog(json_encode($x)); // nlog(json_encode(htmlspecialchars(json_encode($x), ENT_QUOTES, 'UTF-8'))); // nlog($invoices->toJson()); @@ -337,8 +337,8 @@ class TemplateTest extends TestCase private function transformPayment(Payment $payment): array { - $data = []; - + $data = []; + $credits = $payment->credits->map(function ($credit) use ($payment) { return [ 'credit' => $credit->number, @@ -401,11 +401,12 @@ class TemplateTest extends TestCase ], 'paymentables' => $pivot, ]; - + return $data; + } public function testVariableResolutionViaTransformersForPaymentsInStatements() From 5cbf8abae270b8baf14cc22e50cd7816b0ad8119 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 5 Oct 2023 08:08:49 +1100 Subject: [PATCH 046/109] Minor fixes for template --- app/Services/Invoice/GenerateDeliveryNote.php | 4 ++-- app/Services/Pdf/PdfMock.php | 22 +++++++++---------- app/Services/Template/TemplateService.php | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index a7a35a05fcac..b54d89184b2f 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -43,9 +43,9 @@ class GenerateDeliveryNote { $delivery_note_design_id = $this->invoice->client->getSetting('delivery_note_design_id'); + $design = Design::find($this->decodePrimaryKey($delivery_note_design_id)); - // if($design = Design::find($this->decodePrimaryKey($delivery_note_design_id))) - if($design = Design::find(15)) + if($design && $design->is_template) { $ts = new TemplateService($design); diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 6b26adcc0078..c120168f2427 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -209,12 +209,12 @@ class PdfMock '$client.shipping_address1' => '453', '$client.shipping_address2' => '66327 Waters Trail', '$client.city_state_postal' => 'Aufderharchester, North Carolina 11243', - '$client.shipping_address' => '453
66327 Waters Trail
Aufderharchester, North Carolina 11243
Afghanistan
', + '$client.shipping_address' => '453
66327 Waters Trail
Aufderharchester, North Carolina 11243
United States
', '$client.billing_address2' => '63993 Aiyana View', '$client.billing_address1' => '8447', '$client.shipping_country' => 'USA', '$invoiceninja.whitelabel' => 'https://invoicing.co/images/new_logo.png', - '$client.billing_address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
Afghanistan
', + '$client.billing_address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
United States
', '$client.billing_country' => 'USA', '$task.gross_line_total' => '100', '$contact.portal_button' => 'View client portal', @@ -331,14 +331,14 @@ class PdfMock '$invoice.number' => '0029', '$quote.quote_no' => '0029', '$quote.datetime' => '25/Feb/2023 1:10 am', - '$client_address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
Afghanistan
', - '$client.address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
Afghanistan
', + '$client_address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
United States
', + '$client.address' => '8447
63993 Aiyana View
Aufderharchester, North Carolina 11243
United States
', '$payment_button' => 'Pay Now', '$payment_qrcode' => ' ', - '$client.country' => 'Afghanistan', + '$client.country' => 'United States', '$user.last_name' => 'Erna Wunsch', '$client.website' => 'http://www.parisian.org/', '$dir_text_align' => 'left', @@ -832,8 +832,8 @@ class PdfMock '$purchase_order.custom2' => 'Custom 2', '$purchase_order.custom3' => 'Custom 3', '$purchase_order.custom4' => 'Custom 4', - '$vendor.billing_address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
Afghanistan
', - '$vendor.billing_country' => 'Afghanistan', + '$vendor.billing_address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
United States
', + '$vendor.billing_country' => 'United States', '$purchase_order.number' => 'Live Preview #790', '$purchase_order.total' => '$10,256.40', '$vendor.billing_state' => 'West Virginia', @@ -907,9 +907,9 @@ class PdfMock '$company.website' => 'http://www.dare.com/vero-consequatur-eveniet-dolorum-exercitationem-alias-repellat.html', '$gross_subtotal' => '$10,256.40', '$emailSignature' => ' ', - '$vendor_address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
Afghanistan
', - '$vendor.address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
Afghanistan
', - '$vendor.country' => 'Afghanistan', + '$vendor_address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
United States
', + '$vendor.address' => '589
761 Odessa Centers Suite 673
New Loy, Delaware 29359
United States
', + '$vendor.country' => 'United States', '$vendor.custom3' => 'Ea quia tempore.', '$vendor.custom1' => 'Necessitatibus aut.', '$vendor.custom4' => 'Nobis aut harum.', @@ -1089,7 +1089,7 @@ class PdfMock '$custom3' => ' ', '$custom4' => ' ', '$dueDate' => ' ', - '$country' => 'Afghanistan', + '$country' => 'United States', '$vendor3' => 'Ea quia tempore.', '$contact' => 'Geo Maggio', '$account' => 'Mrs. Kristina Powlowski', diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 9ed3762cdffe..c9caffb66c1c 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -328,7 +328,7 @@ class TemplateService ->map(function ($invoice){ $payments = []; - nlog($invoice); + if($invoice->payments) { $payments = $invoice->payments->map(function ($payment) { // nlog(microtime(true)); From 91a36e3d0e415633dc631370c1bff6e300a3459b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 5 Oct 2023 11:26:53 +1100 Subject: [PATCH 047/109] Minor fixes for template --- app/Filters/DesignFilters.php | 13 ++++++ tests/Feature/DesignApiTest.php | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/app/Filters/DesignFilters.php b/app/Filters/DesignFilters.php index 0007a29d08f2..e1abed8c9a1b 100644 --- a/app/Filters/DesignFilters.php +++ b/app/Filters/DesignFilters.php @@ -54,6 +54,19 @@ class DesignFilters extends QueryFilters return $this->builder->orderBy($sort_col[0], $sort_col[1]); } + public function entities(string $entities = ''): Builder + { + + if (strlen($entities) == 0 || str_contains($entities, ',')) { + return $this->builder; + } + + return $this->builder + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [trim($entities)]); + + } + /** * Filters the query by the users company ID. * diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index 372bd1302291..c28b0f600ca2 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -52,6 +52,85 @@ class DesignApiTest extends TestCase Model::reguard(); } + public function testFindInSetQueries() + { + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'searchable'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(1, $q->count()); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=payment'); + + $response->assertStatus(200); + + $arr = $response->json(); + $this->assertCount(1, $arr['data']); + + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=,,,3,3,3,'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=unsearchable'); + + $response->assertStatus(200); + + $arr = $response->json(); + $this->assertCount(0, $arr['data']); + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'unsearchable'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(0, $q->count()); + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'searchable,payment'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(0, $q->count()); + + + + } + public function testDesignTemplates() { $design = DesignFactory::create($this->company->id, $this->user->id); From 4d8fef3e4ed89fb89a13ee83da3faefff61ccee8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 5 Oct 2023 11:59:50 +1100 Subject: [PATCH 048/109] Fixes for tests --- tests/Feature/DesignApiTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index c28b0f600ca2..cfa46bfd2b5f 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -79,7 +79,6 @@ class DesignApiTest extends TestCase $arr = $response->json(); $this->assertCount(1, $arr['data']); - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, From def82e2d5277295b05a45304c69d449678154ea3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 5 Oct 2023 21:47:24 +1100 Subject: [PATCH 049/109] Fixes for settings checker --- app/Models/Design.php | 9 ++++---- app/Utils/Traits/CompanySettingsSaver.php | 26 +++++++++++++++++------ app/Utils/Traits/SettingsSaver.php | 12 ++++++++++- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/app/Models/Design.php b/app/Models/Design.php index e328d88853fd..d78cf61b4278 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -21,15 +21,16 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $user_id * @property int|null $company_id * @property string $name - * @property int $is_custom - * @property int $is_active + * @property bool $is_custom + * @property bool $is_active + * @property bool $is_template * @property object|null $design - * @property int $is_deleted + * @property bool $is_deleted * @property int|null $created_at * @property int|null $updated_at * @property int|null $deleted_at * @property-read \App\Models\Company|null $company - * @property-read mixed $hashed_id + * @property-read string $hashed_id * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Illuminate\Database\Eloquent\Builder|Design filter(\App\Filters\QueryFilters $filters) diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/CompanySettingsSaver.php index 915b2e88bea7..9354c7036435 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/CompanySettingsSaver.php @@ -28,6 +28,15 @@ use App\Jobs\Company\CompanyTaxRate; */ trait CompanySettingsSaver { + + private array $string_ids = [ + 'payment_refund_design_id', + 'payment_receipt_design_id', + 'delivery_note_design_id', + 'statement_design_id', + 'besr_id', + 'gmail_sending_user_id', + ]; /** * Saves a setting object. * @@ -131,7 +140,8 @@ trait CompanySettingsSaver elseif (substr($key, -3) == '_id' || substr($key, -14) == 'number_counter') { $value = 'integer'; - if ($key == 'besr_id') { + if(in_array($key, $this->string_ids)) { + // if ($key == 'besr_id') { $value = 'string'; } @@ -199,13 +209,17 @@ trait CompanySettingsSaver if (substr($key, -3) == '_id' || substr($key, -14) == 'number_counter') { $value = 'integer'; - if ($key == 'gmail_sending_user_id') { - $value = 'string'; + if(in_array($key, $this->string_ids)) { + $value ='string'; } - if ($key == 'besr_id') { - $value = 'string'; - } + // if ($key == 'gmail_sending_user_id') { + // $value = 'string'; + // } + + // if ($key == 'besr_id') { + // $value = 'string'; + // } if (! property_exists($settings, $key)) { continue; diff --git a/app/Utils/Traits/SettingsSaver.php b/app/Utils/Traits/SettingsSaver.php index e53a764318f9..5c06b4481edc 100644 --- a/app/Utils/Traits/SettingsSaver.php +++ b/app/Utils/Traits/SettingsSaver.php @@ -18,6 +18,15 @@ use App\DataMapper\CompanySettings; */ trait SettingsSaver { + private array $string_ids = [ + 'payment_refund_design_id', + 'payment_receipt_design_id', + 'delivery_note_design_id', + 'statement_design_id', + 'besr_id', + 'gmail_sending_user_id', + ]; + /** * Used for custom validation of inbound * settings request. @@ -54,7 +63,8 @@ trait SettingsSaver elseif (substr($key, -3) == '_id' || substr($key, -14) == 'number_counter' || ($key == 'payment_terms' && property_exists($settings, $key) && strlen($settings->{$key}) >= 1) || ($key == 'valid_until' && property_exists($settings, $key) && strlen($settings->{$key}) >= 1)) { $value = 'integer'; - if ($key == 'gmail_sending_user_id' || $key == 'besr_id') { + if(in_array($key, $this->string_ids)) { + // if ($key == 'gmail_sending_user_id' || $key == 'besr_id') { $value = 'string'; } From e7abfc09c4d14a092f8eb4090d39e270ee0a8a8a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 17:47:36 +1100 Subject: [PATCH 050/109] Working on the template action --- app/Services/Invoice/GenerateDeliveryNote.php | 2 +- app/Services/Template/TemplateAction.php | 140 ++++++++++++++++++ 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 app/Services/Template/TemplateAction.php diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index b54d89184b2f..5b40a550ded8 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -43,7 +43,7 @@ class GenerateDeliveryNote { $delivery_note_design_id = $this->invoice->client->getSetting('delivery_note_design_id'); - $design = Design::find($this->decodePrimaryKey($delivery_note_design_id)); + $design = Design::withTrashed()->find($this->decodePrimaryKey($delivery_note_design_id)); if($design && $design->is_template) { diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php new file mode 100644 index 000000000000..12125f83fedc --- /dev/null +++ b/app/Services/Template/TemplateAction.php @@ -0,0 +1,140 @@ +db); + + $key = $this->resolveEntityString(); + + $entity = new $this->entity(); + + $template = Design::withTrashed()->find($this->decodePrimaryKey($this->template)); + + $template_service = new TemplateService($template); + + $resource = $entity->query() + ->withTrashed() + ->whereIn('id', $this->transformKeys($this->ids)) + ->where('company_id', $this->company->id) + ->get(); + + if(count($resource) <= 1) + $data[$key] = [$resource]; + else + $data[$key] = $resource; + + $pdf = $template_service->build($data)->getPdf(); + + if($this->send_email) + return $this->sendEmail($pdf); + + return $pdf; + } + + private function sendEmail(mixed $pdf): void + { + //send the email. + } + + /** + * Context + * + * If I have an array of invoices, what could I possib + * + * + */ + private function resolveEntityString() + { + return match ($this->entity) { + Invoice::class => 'invoices', + Quote::class => 'quotes', + Task::class => 'tasks', + Credit::class => 'credits', + RecurringInvoice::class => 'recurring_invoices', + Project::class => 'projects', + Expense::class => 'expenses', + Payment::class => 'payments', + Product::class => 'products', + PurchaseOrder::class => 'purchase_orders', + Project::class => 'projects', + Client::class => 'clients', + Vendor::class => 'vendors', + }; + } + + public function middleware() + { + return [new WithoutOverlapping("template-{$this->company->company_key}")]; + } + +} + + + From 2e4447fdf2d6265acc7816ad51d08cc7af3c9cab Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 17:52:21 +1100 Subject: [PATCH 051/109] Working on the template action --- app/Services/Template/TemplateAction.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index 12125f83fedc..e64821ec0e0f 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -93,12 +93,12 @@ class TemplateAction implements ShouldQueue $pdf = $template_service->build($data)->getPdf(); if($this->send_email) - return $this->sendEmail($pdf); - - return $pdf; + $this->sendEmail($pdf); + else + return $pdf; } - private function sendEmail(mixed $pdf): void + private function sendEmail(mixed $pdf): mixed { //send the email. } From 52cdf610c77f92529d061b920943cfde476d0904 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:07:31 +1100 Subject: [PATCH 052/109] Working on the template action --- app/Http/Controllers/InvoiceController.php | 14 ++++- .../Controllers/TemplatePreviewController.php | 52 +++++++++++++++++++ .../Requests/Invoice/BulkInvoiceRequest.php | 5 +- app/Jobs/Report/PreviewReport.php | 4 +- app/Services/Template/TemplateAction.php | 11 +++- routes/api.php | 4 +- 6 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 app/Http/Controllers/TemplatePreviewController.php diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 268c5994458c..b5f6bf82ab23 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -34,6 +34,7 @@ use Illuminate\Support\Facades\Storage; use App\Transformers\InvoiceTransformer; use App\Events\Invoice\InvoiceWasCreated; use App\Events\Invoice\InvoiceWasUpdated; +use App\Services\Template\TemplateAction; use App\Factory\CloneInvoiceToQuoteFactory; use App\Http\Requests\Invoice\BulkInvoiceRequest; use App\Http\Requests\Invoice\EditInvoiceRequest; @@ -537,6 +538,16 @@ class InvoiceController extends BaseController }, 'print.pdf', ['Content-Type' => 'application/pdf']); } + if($action == 'template' && $user->can('view', $invoices->first())){ + + + $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); + + TemplateAction::dispatch($request->ids, $request->template, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); + + return response()->json(['message' => $hash_or_response], 200); + } + /* * Send the other actions to the switch */ @@ -718,8 +729,7 @@ class InvoiceController extends BaseController return response()->json(['message' => 'email sent'], 200); } break; - - + default: return response()->json(['message' => ctrans('texts.action_unavailable', ['action' => $action])], 400); } diff --git a/app/Http/Controllers/TemplatePreviewController.php b/app/Http/Controllers/TemplatePreviewController.php new file mode 100644 index 000000000000..76a15ab42cc6 --- /dev/null +++ b/app/Http/Controllers/TemplatePreviewController.php @@ -0,0 +1,52 @@ +exists($this->path_prefix.$hash.$this->path_suffix); + + if(!$report) { + return response()->json(['message' => 'Still working.....'], 409); + } + + Cache::forget($hash); + + return response()->streamDownload(function () use ($hash) { + + echo Storage::get($this->path_prefix.$hash.$this->path_suffix); + Storage::delete($this->path_prefix.$hash.$this->path_suffix); + + }, 'template.pdf', ['Content-Type' => 'application/pdf']); + + } +} diff --git a/app/Http/Requests/Invoice/BulkInvoiceRequest.php b/app/Http/Requests/Invoice/BulkInvoiceRequest.php index 68554d1ee71d..c46fe6db8069 100644 --- a/app/Http/Requests/Invoice/BulkInvoiceRequest.php +++ b/app/Http/Requests/Invoice/BulkInvoiceRequest.php @@ -25,7 +25,10 @@ class BulkInvoiceRequest extends Request return [ 'action' => 'required|string', 'ids' => 'required|array', - 'email_type' => 'sometimes|in:reminder1,reminder2,reminder3,reminder_endless,custom1,custom2,custom3,invoice,quote,credit,payment,payment_partial,statement,purchase_order' + 'email_type' => 'sometimes|in:reminder1,reminder2,reminder3,reminder_endless,custom1,custom2,custom3,invoice,quote,credit,payment,payment_partial,statement,purchase_order', + 'template' => 'sometimes|string', + 'template_id' => 'sometimes|string', + 'send_email' => 'sometimes|bool' ]; } } diff --git a/app/Jobs/Report/PreviewReport.php b/app/Jobs/Report/PreviewReport.php index ce07cbfc1c34..9651b64de603 100644 --- a/app/Jobs/Report/PreviewReport.php +++ b/app/Jobs/Report/PreviewReport.php @@ -39,9 +39,7 @@ class PreviewReport implements ShouldQueue /** @var \App\Export\CSV\CreditExport $export */ $export = new $this->report_class($this->company, $this->request); $report = $export->returnJson(); - nlog($report); - nlog($this->report_class); - // nlog($report); + Cache::put($this->hash, $report, 60 * 60); } diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index e64821ec0e0f..beb59ba2adf5 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -29,6 +29,7 @@ use Illuminate\Bus\Queueable; use App\Utils\Traits\MakesHash; use App\Models\RecurringInvoice; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Storage; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; @@ -59,6 +60,7 @@ class TemplateAction implements ShouldQueue private int $user_id, private Company $company, private string $db, + private string $hash, private bool $send_email = false) { } @@ -94,13 +96,18 @@ class TemplateAction implements ShouldQueue if($this->send_email) $this->sendEmail($pdf); - else - return $pdf; + else { + + $filename = "templates/{$this->hash}.pdf"; + Storage::disk(config('filesystems.default'))->put($filename, $pdf); + + } } private function sendEmail(mixed $pdf): mixed { //send the email. + return $pdf; } /** diff --git a/routes/api.php b/routes/api.php index 3ce1fdc1737e..954c88645024 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,6 +26,7 @@ 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; @@ -73,6 +74,7 @@ use App\Http\Controllers\BankTransactionController; use App\Http\Controllers\ClientStatementController; use App\Http\Controllers\ExpenseCategoryController; use App\Http\Controllers\HostedMigrationController; +use App\Http\Controllers\TemplatePreviewController; use App\Http\Controllers\ConnectedAccountController; use App\Http\Controllers\RecurringExpenseController; use App\Http\Controllers\RecurringInvoiceController; @@ -111,7 +113,6 @@ use App\Http\Controllers\Reports\ClientContactReportController; use App\Http\Controllers\Reports\PurchaseOrderReportController; use App\Http\Controllers\Reports\RecurringInvoiceReportController; use App\Http\Controllers\Reports\PurchaseOrderItemReportController; -use App\Http\Controllers\SearchController; Route::group(['middleware' => ['throttle:api', 'api_secret_check']], function () { Route::post('api/v1/signup', [AccountController::class, 'store'])->name('signup.submit'); @@ -318,6 +319,7 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::post('reports/tax_summary_report', TaxSummaryReportController::class); Route::post('reports/user_sales_report', UserSalesReportController::class); Route::post('reports/preview/{hash}', ReportPreviewController::class); + Route::post('templates/preview/{hash}', TemplatePreviewController::class); Route::post('search', SearchController::class); Route::resource('task_schedulers', TaskSchedulerController::class); From 98e44c1778907b3bb1e5a2d46fae970ebc81ecae Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:19:45 +1100 Subject: [PATCH 053/109] Working on the template action --- app/Http/Controllers/InvoiceController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index b5f6bf82ab23..90914824694e 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -543,7 +543,7 @@ class InvoiceController extends BaseController $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); - TemplateAction::dispatch($request->ids, $request->template, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); + TemplateAction::dispatch($ids, $request->template, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); return response()->json(['message' => $hash_or_response], 200); } From 61d22d8c40b12d6c3c9090614e1380981743dfbd Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:30:29 +1100 Subject: [PATCH 054/109] Fixes for template_id --- app/Http/Controllers/InvoiceController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 90914824694e..8fac5e4ca0b0 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -543,7 +543,7 @@ class InvoiceController extends BaseController $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); - TemplateAction::dispatch($ids, $request->template, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); + TemplateAction::dispatch($ids, $request->template_id, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); return response()->json(['message' => $hash_or_response], 200); } From 019aac5daa7f1ae4de8722cbbfd198d0a927eda8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:33:32 +1100 Subject: [PATCH 055/109] Fixes for template_id --- app/Services/Template/TemplateAction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index beb59ba2adf5..240abcbec852 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -56,7 +56,7 @@ class TemplateAction implements ShouldQueue */ public function __construct(public array $ids, private string $template, - private Builder | Invoice | Quote | Task | Credit | RecurringInvoice | Project | Expense | Client | Payment | Product | PurchaseOrder | Vendor $entity, + private string $entity, private int $user_id, private Company $company, private string $db, From 703c60903e6a4dbc96bbaccc392faac284bc8ea5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:39:22 +1100 Subject: [PATCH 056/109] Fixes for template_id --- app/Services/Template/TemplateService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index c9caffb66c1c..9ee5d9796402 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -329,7 +329,7 @@ class TemplateService $payments = []; - if($invoice->payments) { + if($invoice->payments ?? false) { $payments = $invoice->payments->map(function ($payment) { // nlog(microtime(true)); return $this->transformPayment($payment); From 9424950dbbceff61eec37694dd593b86d9942c13 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 21:54:40 +1100 Subject: [PATCH 057/109] Adjustments for template action --- app/Http/Controllers/InvoiceController.php | 10 +++- public/storage/.htaccess | 0 tests/Feature/InvoiceTest.php | 61 ++++++++++++++++++---- 3 files changed, 59 insertions(+), 12 deletions(-) mode change 100644 => 100755 public/storage/.htaccess diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 8fac5e4ca0b0..e7df44100636 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -540,10 +540,16 @@ class InvoiceController extends BaseController if($action == 'template' && $user->can('view', $invoices->first())){ - $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); - TemplateAction::dispatch($ids, $request->template_id, Invoice::class, $user->id, $user->company(), $user->company()->db, $hash_or_response, $request->boolean('send_email')); + TemplateAction::dispatch($ids, + $request->template_id, + Invoice::class, + $user->id, + $user->company(), + $user->company()->db, + $hash_or_response, + $request->boolean('send_email')); return response()->json(['message' => $hash_or_response], 200); } diff --git a/public/storage/.htaccess b/public/storage/.htaccess old mode 100644 new mode 100755 diff --git a/tests/Feature/InvoiceTest.php b/tests/Feature/InvoiceTest.php index e0530f5b2056..e54c6c2e2580 100644 --- a/tests/Feature/InvoiceTest.php +++ b/tests/Feature/InvoiceTest.php @@ -11,17 +11,19 @@ namespace Tests\Feature; -use App\Helpers\Invoice\InvoiceSum; -use App\Models\Client; -use App\Models\ClientContact; -use App\Models\Invoice; -use App\Repositories\InvoiceRepository; -use App\Utils\Traits\MakesHash; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Illuminate\Support\Facades\Session; -use Tests\MockAccountData; use Tests\TestCase; +use App\Models\Client; +use App\Models\Design; +use App\Models\Invoice; +use Tests\MockAccountData; +use App\Models\ClientContact; +use App\Utils\Traits\MakesHash; +use App\Helpers\Invoice\InvoiceSum; +use App\Repositories\InvoiceRepository; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Session; +use App\Services\Template\TemplateAction; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -48,6 +50,45 @@ class InvoiceTest extends TestCase $this->makeTestData(); } + public function testTemplateBulkAction() + { + + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $replicated_design->company_id = $this->company->id; + $replicated_design->user_id = $this->user->id; + $replicated_design->is_template = true; + $replicated_design->is_custom = true; + $replicated_design->save(); + + //delete invoice + $data = [ + 'ids' => [$this->invoice->hashed_id], + 'action' => 'template', + 'template_id' => $replicated_design->hashed_id, + 'send_email' => false, + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->post('/api/v1/invoices/bulk', $data) + ->assertStatus(200); + + + (new TemplateAction([$this->invoice->hashed_id], + $replicated_design->hashed_id, + Invoice::class, + $this->user->id, + $this->company, + $this->company->db, + 'dd', + false))->handle(); + } + + + public function testInvoiceGetDatesBetween() { $response = $this->withHeaders([ From 715e5022f0573a4bb760643daa9c0ef8e53490e2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 22:08:23 +1100 Subject: [PATCH 058/109] Fixes for missing payments --- app/Services/Template/TemplateAction.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index 240abcbec852..0a3c6a5f0081 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -84,8 +84,12 @@ class TemplateAction implements ShouldQueue $resource = $entity->query() ->withTrashed() ->whereIn('id', $this->transformKeys($this->ids)) - ->where('company_id', $this->company->id) - ->get(); + ->where('company_id', $this->company->id); + + if($this->entity == Invoice::class) + $resource->with('payments'); + + $resource->get(); if(count($resource) <= 1) $data[$key] = [$resource]; From e56b14e8be33467d35ace86014013578baeaa614 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 22:08:38 +1100 Subject: [PATCH 059/109] Fixes for missing payments --- app/Services/Template/TemplateAction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index 0a3c6a5f0081..bc4188d3b1c7 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -87,7 +87,7 @@ class TemplateAction implements ShouldQueue ->where('company_id', $this->company->id); if($this->entity == Invoice::class) - $resource->with('payments'); + $resource->with('payments','client'); $resource->get(); From 02a85cfc5a423c44e457ab22196d04bb19269b7e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 22:21:58 +1100 Subject: [PATCH 060/109] Fixes for missing payments --- app/Services/Template/TemplateAction.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index bc4188d3b1c7..b8cce0f74809 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -75,23 +75,23 @@ class TemplateAction implements ShouldQueue $key = $this->resolveEntityString(); - $entity = new $this->entity(); + $resource = $this->entity::query(); $template = Design::withTrashed()->find($this->decodePrimaryKey($this->template)); $template_service = new TemplateService($template); - $resource = $entity->query() - ->withTrashed() - ->whereIn('id', $this->transformKeys($this->ids)) - ->where('company_id', $this->company->id); + if($this->entity == Invoice::class) { + $resource->with('payments', 'client'); + } - if($this->entity == Invoice::class) - $resource->with('payments','client'); + $resource->withTrashed() + ->whereIn('id', $this->transformKeys($this->ids)) + ->where('company_id', $this->company->id); $resource->get(); - if(count($resource) <= 1) + if($resource->count() <= 1) $data[$key] = [$resource]; else $data[$key] = $resource; From e7f04f0cf880c7f87fb211e26f0ab9ce59df34a9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 6 Oct 2023 22:35:54 +1100 Subject: [PATCH 061/109] pass result, not collect --- app/Services/Template/TemplateAction.php | 14 +++++++------- tests/Feature/InvoiceTest.php | 2 -- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index b8cce0f74809..80f0a3351e12 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -85,16 +85,16 @@ class TemplateAction implements ShouldQueue $resource->with('payments', 'client'); } - $resource->withTrashed() + $result = $resource->withTrashed() ->whereIn('id', $this->transformKeys($this->ids)) - ->where('company_id', $this->company->id); + ->where('company_id', $this->company->id) + ->get(); - $resource->get(); - - if($resource->count() <= 1) - $data[$key] = [$resource]; + + if($result->count() <= 1) + $data[$key] = collect($result); else - $data[$key] = $resource; + $data[$key] = $result; $pdf = $template_service->build($data)->getPdf(); diff --git a/tests/Feature/InvoiceTest.php b/tests/Feature/InvoiceTest.php index e54c6c2e2580..a97515484ce1 100644 --- a/tests/Feature/InvoiceTest.php +++ b/tests/Feature/InvoiceTest.php @@ -87,8 +87,6 @@ class InvoiceTest extends TestCase false))->handle(); } - - public function testInvoiceGetDatesBetween() { $response = $this->withHeaders([ From a9fd7d4a54945d8b4ba8ef15c0c12280f63ebece Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 14:09:36 +1100 Subject: [PATCH 062/109] Template action fixes --- app/Mail/DownloadDocuments.php | 12 +- app/Services/Email/AdminEmail.php | 671 ++++++++++++++++++++++ app/Services/Email/AdminEmailMailable.php | 106 ++++ app/Services/Email/Email.php | 1 - app/Services/Email/EmailObject.php | 4 + app/Services/Template/TemplateAction.php | 34 +- 6 files changed, 810 insertions(+), 18 deletions(-) create mode 100644 app/Services/Email/AdminEmail.php create mode 100644 app/Services/Email/AdminEmailMailable.php diff --git a/app/Mail/DownloadDocuments.php b/app/Mail/DownloadDocuments.php index 70508f3a8847..54e2ca051370 100644 --- a/app/Mail/DownloadDocuments.php +++ b/app/Mail/DownloadDocuments.php @@ -12,24 +12,14 @@ namespace App\Mail; use App\Models\Company; -use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; -use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\App; class DownloadDocuments extends Mailable { - // use Queueable, SerializesModels; - public $file_path; - - public $company; - - public function __construct($file_path, Company $company) + public function __construct(public string $file_path, public Company $company) { - $this->file_path = $file_path; - - $this->company = $company; } /** diff --git a/app/Services/Email/AdminEmail.php b/app/Services/Email/AdminEmail.php new file mode 100644 index 000000000000..abf1771d8cde --- /dev/null +++ b/app/Services/Email/AdminEmail.php @@ -0,0 +1,671 @@ +company->db); + + $this->setOverride() + ->buildMailable(); + + if ($this->preFlightChecksFail()) { + return; + } + + $this->email(); + + } + + /** + * Sets the override flag + * + * @return self + */ + public function setOverride(): self + { + $this->override = $this->email_object->override; + + return $this; + } + + /** + * Populates the mailable + * + * @return self + */ + public function buildMailable(): self + { + $this->mailable = new AdminEmailMailable($this->email_object); + + return $this; + } + + /** + * Attempts to send the email + * + * @return void + */ + public function email() + { + $this->setMailDriver(); + + /* Init the mailer*/ + $mailer = Mail::mailer($this->mailer); + + /* Additional configuration if using a client third party mailer */ + if ($this->client_postmark_secret) { + $mailer->postmark_config($this->client_postmark_secret); + } + + if ($this->client_mailgun_secret) { + $mailer->mailgun_config($this->client_mailgun_secret, $this->client_mailgun_domain, $this->client_mailgun_endpoint); + } + + /* Attempt the send! */ + try { + nlog("Using mailer => ". $this->mailer. " ". now()->toDateTimeString()); + + $mailer->send($this->mailable); + + Cache::increment("email_quota".$this->company->account->key); + + LightLogs::create(new EmailSuccess($this->company->company_key)) + ->send(); + + } catch(\Symfony\Component\Mime\Exception\RfcComplianceException $e) { + nlog("Mailer failed with a Logic Exception {$e->getMessage()}"); + $this->fail(); + $this->cleanUpMailers(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + return; + } catch(\Symfony\Component\Mime\Exception\LogicException $e) { + nlog("Mailer failed with a Logic Exception {$e->getMessage()}"); + $this->fail(); + $this->cleanUpMailers(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + return; + } catch (\Exception | \RuntimeException | \Google\Service\Exception $e) { + nlog("Mailer failed with {$e->getMessage()}"); + $message = $e->getMessage(); + + if (stripos($e->getMessage(), 'code 406') || 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(); + + return; + } + + /** + * Post mark buries the proper message in a a guzzle response + * this merges a text string with a json object + * need to harvest the ->Message property using the following + */ + if ($e instanceof ClientException) { //postmark specific failure + $response = $e->getResponse(); + $message_body = json_decode($response->getBody()->getContents()); + + if ($message_body && property_exists($message_body, 'Message')) { + $message = $message_body->Message; + nlog($message); + } + + $this->fail(); + $this->cleanUpMailers(); + return; + } + + //only report once, not on all tries + if ($this->attempts() == $this->tries) { + /* If the is an entity attached to the message send a failure mailer */ + $this->entityEmailFailed($message); + + /* Don't send postmark failures to Sentry */ + if (Ninja::isHosted() && (!$e instanceof ClientException)) { + app('sentry')->captureException($e); + } + } + + sleep(rand(0, 3)); + + $this->release($this->backoff()[$this->attempts()-1]); + + $message = null; + } + + $this->cleanUpMailers(); + } + + /** + * On the hosted platform we scan all outbound email for + * spam. This sequence processes the filters we use on all + * emails. + * + * @return bool + */ + public function preFlightChecksFail(): bool + { + /* Always send if disabled */ + if($this->override) { + return false; + } + + /* If we are migrating data we don't want to fire any emails */ + if ($this->company->is_disabled) { + return true; + } + + if (Ninja::isSelfHost()) { + return false; + } + + /* To handle spam users we drop all emails from flagged accounts */ + if ($this->company->account && $this->company->account->is_flagged) { + return true; + } + + /* On the hosted platform we set default contacts a @example.com email address - we shouldn't send emails to these types of addresses */ + if ($this->hasInValidEmails()) { + return true; + } + + /* GMail users are uncapped */ + if (in_array($this->email_object->settings->email_sending_method, ['gmail', 'office365', 'client_postmark', 'client_mailgun'])) { + return false; + } + + /* On the hosted platform, if the user is over the email quotas, we do not send the email. */ + if ($this->company->account && $this->company->account->emailQuotaExceeded()) { + return true; + } + + /* If the account is verified, we allow emails to flow */ + if ($this->company->account && $this->company->account->is_verified_account) { + //11-01-2022 + + /* Continue to analyse verified accounts in case they later start sending poor quality emails*/ + // if(class_exists(\Modules\Admin\Jobs\Account\EmailQuality::class)) + // (new \Modules\Admin\Jobs\Account\EmailQuality($this->nmo, $this->company))->run(); + + return false; + } + + /* On the hosted platform if the user has not verified their account we fail here - but still check what they are trying to send! */ + if ($this->company->account && !$this->company->account->account_sms_verified) { + if (class_exists(\Modules\Admin\Jobs\Account\EmailFilter::class)) { + return (new \Modules\Admin\Jobs\Account\EmailFilter($this->email_object, $this->company))->run(); + } + + return true; + } + + /* On the hosted platform we actively scan all outbound emails to ensure outbound email quality remains high */ + if (class_exists(\Modules\Admin\Jobs\Account\EmailFilter::class)) { + return (new \Modules\Admin\Jobs\Account\EmailFilter($this->email_object, $this->company))->run(); + } + + return false; + } + + /** + * hasInValidEmails + * + * @return bool + */ + private function hasInValidEmails(): bool + { + foreach ($this->email_object->to as $address_object) { + if (strpos($address_object->address, '@example.com') !== false) { + return true; + } + + if (!str_contains($address_object->address, "@")) { + return true; + } + + if ($address_object->address == " ") { + return true; + } + } + + + return false; + } + + /** + * Sets the mail driver to use and applies any specific configuration + * the the mailable + */ + private function setMailDriver(): self + { + switch ($this->email_object->settings->email_sending_method) { + case 'default': + $this->mailer = config('mail.default'); + break; + case 'gmail': + $this->mailer = 'gmail'; + $this->setGmailMailer(); + return $this; + case 'office365': + case 'microsoft': + $this->mailer = 'office365'; + $this->setOfficeMailer(); + return $this; + case 'client_postmark': + $this->mailer = 'postmark'; + $this->setPostmarkMailer(); + return $this; + case 'client_mailgun': + $this->mailer = 'mailgun'; + $this->setMailgunMailer(); + return $this; + + default: + $this->mailer = config('mail.default'); + return $this; + } + + if (Ninja::isSelfHost()) { + $this->setSelfHostMultiMailer(); + } + + return $this; + } + + /** + * Allows configuration of multiple mailers + * per company for use by self hosted users + */ + private function setSelfHostMultiMailer(): void + { + if (env($this->company->id . '_MAIL_HOST')) { + config([ + 'mail.mailers.smtp' => [ + 'transport' => 'smtp', + 'host' => env($this->company->id . '_MAIL_HOST'), + 'port' => env($this->company->id . '_MAIL_PORT'), + 'username' => env($this->company->id . '_MAIL_USERNAME'), + 'password' => env($this->company->id . '_MAIL_PASSWORD'), + ], + ]); + + if (env($this->company->id . '_MAIL_FROM_ADDRESS')) { + $this->mailable + ->from(env($this->company->id . '_MAIL_FROM_ADDRESS', env('MAIL_FROM_ADDRESS')), env($this->company->id . '_MAIL_FROM_NAME', env('MAIL_FROM_NAME'))); + } + } + } + + + /** + * Ensure we discard any data that is not required + * + * @return void + */ + private function cleanUpMailers(): void + { + $this->client_postmark_secret = null; + + $this->client_mailgun_secret = null; + + $this->client_mailgun_domain = null; + + $this->client_mailgun_endpoint = null; + + //always dump the drivers to prevent reuse + app('mail.manager')->forgetMailers(); + } + + + /** + * Check to ensure no cross account + * emails can be sent. + * + * @param User $user + */ + private function checkValidSendingUser($user) + { + /* Always ensure the user is set on the correct account */ + if ($user->account_id != $this->company->account_id) { + $this->email_object->settings->email_sending_method = 'default'; + + return $this->setMailDriver(); + } + } + + /** + * Resolves the sending user + * when configuring the Mailer + * on behalf of the client + * + * @return User $user + */ + private function resolveSendingUser(): ?User + { + $sending_user = $this->email_object->settings->gmail_sending_user_id; + + if ($sending_user == "0") { + $user = $this->company->owner(); + } else { + $user = User::find($this->decodePrimaryKey($sending_user)); + } + + return $user; + } + /** + * Configures Mailgun using client supplied secret + * as the Mailer + */ + private function setMailgunMailer() + { + if (strlen($this->email_object->settings->mailgun_secret) > 2 && strlen($this->email_object->settings->mailgun_domain) > 2) { + $this->client_mailgun_secret = $this->email_object->settings->mailgun_secret; + $this->client_mailgun_domain = $this->email_object->settings->mailgun_domain; + $this->client_mailgun_endpoint = $this->email_object->settings->mailgun_endpoint; + + } else { + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + $user = $this->resolveSendingUser(); + + $sending_email = (isset($this->email_object->settings->custom_sending_email) && stripos($this->email_object->settings->custom_sending_email, "@")) ? $this->email_object->settings->custom_sending_email : $user->email; + $sending_user = (isset($this->email_object->settings->email_from_name) && strlen($this->email_object->settings->email_from_name) > 2) ? $this->email_object->settings->email_from_name : $user->name(); + + $this->mailable + ->from($sending_email, $sending_user); + } + + /** + * Configures Postmark using client supplied secret + * as the Mailer + */ + private function setPostmarkMailer() + { + if (strlen($this->email_object->settings->postmark_secret) > 2) { + $this->client_postmark_secret = $this->email_object->settings->postmark_secret; + } else { + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + $user = $this->resolveSendingUser(); + + $sending_email = (isset($this->email_object->settings->custom_sending_email) && stripos($this->email_object->settings->custom_sending_email, "@")) ? $this->email_object->settings->custom_sending_email : $user->email; + $sending_user = (isset($this->email_object->settings->email_from_name) && strlen($this->email_object->settings->email_from_name) > 2) ? $this->email_object->settings->email_from_name : $user->name(); + + $this->mailable + ->from($sending_email, $sending_user); + } + + /** + * Configures Microsoft via Oauth + * as the Mailer + */ + private function setOfficeMailer() + { + $user = $this->resolveSendingUser(); + + $this->checkValidSendingUser($user); + + nlog("Sending via {$user->name()}"); + + $token = $this->refreshOfficeToken($user); + + if ($token) { + $user->oauth_user_token = $token; + $user->save(); + } else { + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + $this->mailable + ->from($user->email, $user->name()) + ->withSymfonyMessage(function ($message) use ($token) { + $message->getHeaders()->addTextHeader('gmailtoken', $token); + }); + } + + /** + * Configures GMail via Oauth + * as the Mailer + */ + private function setGmailMailer() + { + $user = $this->resolveSendingUser(); + + $this->checkValidSendingUser($user); + + nlog("Sending via {$user->name()}"); + + $google = (new Google())->init(); + + try { + if ($google->getClient()->isAccessTokenExpired()) { + $google->refreshToken($user); + $user = $user->fresh(); + } + + $google->getClient()->setAccessToken(json_encode($user->oauth_user_token)); + } catch(\Exception $e) { + $this->logMailError('Gmail Token Invalid', $this->company->clients()->first()); + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + /** + * If the user doesn't have a valid token, notify them + */ + + if (!$user->oauth_user_token) { + $this->company->account->gmailCredentialNotification(); + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + /* + * Now that our token is refreshed and valid we can boot the + * mail driver at runtime and also set the token which will persist + * just for this request. + */ + + $token = $user->oauth_user_token->access_token; + + if (!$token) { + $this->company->account->gmailCredentialNotification(); + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + $this->mailable + ->from($user->email, $user->name()) + ->withSymfonyMessage(function ($message) use ($token) { + $message->getHeaders()->addTextHeader('gmailtoken', $token); + }); + } + + /** + * Logs any errors to the SystemLog + * + * @param string $errors + * @param null | \App\Models\Client $recipient_object + * @return void + */ + private function logMailError($errors, $recipient_object) :void + { + (new SystemLogger( + $errors, + SystemLog::CATEGORY_MAIL, + SystemLog::EVENT_MAIL_SEND, + SystemLog::TYPE_FAILURE, + $recipient_object, + $this->company + ))->handle(); + + $job_failure = new EmailFailure($this->company->company_key); + $job_failure->string_metric5 = 'failed_email'; + $job_failure->string_metric6 = substr($errors, 0, 150); + + LightLogs::create($job_failure) + ->send(); + + $job_failure = null; + } + + /** + * Attempts to refresh the Microsoft refreshToken + * + * @param \App\Models\User $user + * @return mixed + */ + private function refreshOfficeToken(User $user): mixed + { + $expiry = $user->oauth_user_token_expiry ?: now()->subDay(); + + if ($expiry->lt(now())) { + $guzzle = new \GuzzleHttp\Client(); + $url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'; + + $token = json_decode($guzzle->post($url, [ + 'form_params' => [ + 'client_id' => config('ninja.o365.client_id') , + 'client_secret' => config('ninja.o365.client_secret') , + 'scope' => 'email Mail.Send offline_access profile User.Read openid', + 'grant_type' => 'refresh_token', + 'refresh_token' => $user->oauth_user_refresh_token + ], + ])->getBody()->getContents()); + + if ($token) { + $user->oauth_user_refresh_token = property_exists($token, 'refresh_token') ? $token->refresh_token : $user->oauth_user_refresh_token; + $user->oauth_user_token = $token->access_token; + $user->oauth_user_token_expiry = now()->addSeconds($token->expires_in); + $user->save(); + + return $token->access_token; + } + + return false; + } + + return $user->oauth_user_token; + } + + /** + * Entity notification when an email fails to send + * + * @param string $message + * @return void + */ + private function entityEmailFailed($message): void + { + $class = get_class($this->email_object->entity); + + switch ($class) { + case Invoice::class: + event(new InvoiceWasEmailedAndFailed($this->email_object->invitation, $this->company, $message, $this->email_object->html_template, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + break; + case Payment::class: + event(new PaymentWasEmailedAndFailed($this->email_object->entity, $this->company, $message, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + break; + default: + # code... + break; + } + + if ($this->email_object->client) { + $this->logMailError($message, $this->email_object->client); + } + } + + + public function failed($exception = null) + { + if ($exception) { + nlog($exception->getMessage()); + } + + config(['queue.failed.driver' => null]); + } +} diff --git a/app/Services/Email/AdminEmailMailable.php b/app/Services/Email/AdminEmailMailable.php new file mode 100644 index 000000000000..94cfc53a83c6 --- /dev/null +++ b/app/Services/Email/AdminEmailMailable.php @@ -0,0 +1,106 @@ +", "", $this->email_object->subject), + tags: [$this->email_object->company_key], + replyTo: $this->email_object->reply_to, + from: $this->email_object->from, + to: $this->email_object->to, + bcc: $this->email_object->bcc, + cc: $this->email_object->cc, + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content() + { + + return new Content( + view: 'email.admin.generic', + text: 'email.admin.generic_text', + with: [ + 'title' => $this->email_object->subject, + 'message' => $this->email_object->body, + 'url' => $this->email_object->url ?? null, + 'button' => $this->email_object->button ?? null, + 'signature' => $this->email_object->company->owner()->signature, + 'logo' => $this->email_object->company->present()->logo(), + 'settings' => $this->email_object->settings, + 'whitelabel' => $this->email_object->company->account->isPaid() ? true : false, + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments() + { + $attachments = []; + + $attachments = collect($this->email_object->attachments)->map(function ($file) { + return Attachment::fromData(fn () => base64_decode($file['file']), $file['name']); + }); + + return $attachments->toArray(); + } + + /** + * Get the message headers. + * + * @return \Illuminate\Mail\Mailables\Headers + */ + public function headers() + { + return new Headers( + messageId: null, + references: [], + text: $this->email_object->headers, + ); + } +} diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index cebb8b7b6f79..12a0d46e508c 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -75,7 +75,6 @@ class Email implements ShouldQueue */ public function backoff() { - // return [10, 30, 60, 240]; return [rand(10, 20), rand(30, 45), rand(60, 79), rand(160, 400)]; } diff --git a/app/Services/Email/EmailObject.php b/app/Services/Email/EmailObject.php index 4eb7c0b28e13..86b57e934c8f 100644 --- a/app/Services/Email/EmailObject.php +++ b/app/Services/Email/EmailObject.php @@ -121,4 +121,8 @@ class EmailObject public ?string $template = null; //invoice //quote //reminder1 public array $links = []; + + public ?string $button = null; + + public ?string $url = null; } diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index 80f0a3351e12..ff318b640c05 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -12,6 +12,7 @@ namespace App\Services\Template; use App\Models\Task; +use App\Models\User; use App\Models\Quote; use App\Models\Client; use App\Models\Credit; @@ -28,6 +29,9 @@ use App\Models\PurchaseOrder; use Illuminate\Bus\Queueable; use App\Utils\Traits\MakesHash; use App\Models\RecurringInvoice; +use App\Services\Email\AdminEmail; +use App\Services\Email\EmailObject; +use Illuminate\Mail\Mailables\Address; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Storage; use Illuminate\Queue\InteractsWithQueue; @@ -47,7 +51,7 @@ class TemplateAction implements ShouldQueue * * @param array $ids The array of entity IDs * @param string $template The template id - * @param Builder | Invoice | Quote | Task | Credit | RecurringInvoice | Project | Expense | Client | Payment | Product | PurchaseOrder | Vendor $entity The entity class name + * @param string $entity The entity class name * @param int $user_id requesting the template * @param string $db The database name * @param bool $send_email Determines whether to send an email @@ -96,10 +100,13 @@ class TemplateAction implements ShouldQueue else $data[$key] = $result; - $pdf = $template_service->build($data)->getPdf(); + $ts = $template_service->build($data); + + nlog($ts->getHtml()); + $pdf = $ts->getPdf(); if($this->send_email) - $this->sendEmail($pdf); + $this->sendEmail($pdf, $template); else { $filename = "templates/{$this->hash}.pdf"; @@ -108,10 +115,25 @@ class TemplateAction implements ShouldQueue } } - private function sendEmail(mixed $pdf): mixed + private function sendEmail(mixed $pdf, Design $template) { - //send the email. - return $pdf; + $user = $this->user_id ? User::find($this->user_id) : $this->company->owner(); + + $template_name = " [{$template->name}]"; + $email_object = new EmailObject; + $email_object->to = [new Address($user->email, $user->present()->name())]; + $email_object->attachments = [['file' => base64_encode($pdf), 'name' => ctrans('texts.template') . ".pdf"]]; + $email_object->company_key = $this->company->company_key; + $email_object->company = $this->company; + $email_object->settings = $this->company->settings; + $email_object->logo = $this->company->present()->logo(); + $email_object->whitelabel = $this->company->account->isPaid() ? true : false; + $email_object->user_id = $user->id; + $email_object->text_body = ctrans('texts.download_report_description') . $template_name; + $email_object->body = ctrans('texts.download_report_description') . $template_name; + $email_object->subject = ctrans('texts.download_report_description') . $template_name; + + (new AdminEmail($email_object, $this->company))->handle(); } /** From 9fee3c538c13ad89117be86acf43679b2b999503 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 15:06:34 +1100 Subject: [PATCH 063/109] Updates for structure of payment entities --- app/Jobs/Payment/EmailPayment.php | 11 +----- app/Jobs/Payment/EmailRefundPayment.php | 15 +++----- app/Mail/Engine/PaymentEmailEngine.php | 43 +++++++++++++++++++++-- app/Services/Template/TemplateAction.php | 26 +++++++++----- app/Services/Template/TemplateService.php | 20 ++--------- lang/en/texts.php | 2 ++ 6 files changed, 68 insertions(+), 49 deletions(-) diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index edcdf83a4c3f..1ec9ecce8b65 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -31,14 +31,8 @@ class EmailPayment implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - public $payment; - public $email_builder; - private $contact; - - private $company; - public $settings; /** @@ -49,11 +43,8 @@ class EmailPayment implements ShouldQueue * @param $contact * @param $company */ - public function __construct(Payment $payment, Company $company, ?ClientContact $contact) + public function __construct(public Payment $payment, private Company $company, private ?ClientContact $contact) { - $this->payment = $payment; - $this->contact = $contact; - $this->company = $company; $this->settings = $payment->client->getMergedSettings(); } diff --git a/app/Jobs/Payment/EmailRefundPayment.php b/app/Jobs/Payment/EmailRefundPayment.php index a6e5de75b2a2..5563c6ee8af9 100644 --- a/app/Jobs/Payment/EmailRefundPayment.php +++ b/app/Jobs/Payment/EmailRefundPayment.php @@ -32,14 +32,8 @@ class EmailRefundPayment implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - public $payment; - public $email_builder; - private $contact; - - private $company; - public $settings; /** @@ -50,11 +44,8 @@ class EmailRefundPayment implements ShouldQueue * @param $contact * @param $company */ - public function __construct(Payment $payment, Company $company, ClientContact $contact) + public function __construct(public Payment $payment, private Company $company, private ?ClientContact $contact) { - $this->payment = $payment; - $this->contact = $contact; - $this->company = $company; $this->settings = $payment->client->getMergedSettings(); } @@ -84,7 +75,9 @@ class EmailRefundPayment implements ShouldQueue $template_data['body'] = ctrans('texts.refunded_payment').' $payment.refunded

$invoices'; $template_data['subject'] = ctrans('texts.refunded_payment'); - $email_builder = (new PaymentEmailEngine($this->payment, $this->contact, $template_data))->build(); + $email_builder = new PaymentEmailEngine($this->payment, $this->contact, $template_data); + $email_builder->is_refund = true; + $email_builder->build(); $invitation = null; diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index 0e890e2165e7..df4dd211cf17 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -15,12 +15,14 @@ use App\Utils\Ninja; use App\Utils\Number; use App\Utils\Helpers; use App\Models\Account; +use App\Models\Payment; use App\Utils\Traits\MakesDates; use App\Jobs\Entity\CreateRawPdf; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\Storage; use App\DataMapper\EmailTemplateDefaults; +use App\Services\Template\TemplateAction; class PaymentEmailEngine extends BaseEmailEngine { @@ -44,6 +46,8 @@ class PaymentEmailEngine extends BaseEmailEngine private $payment_template_subject; + public bool $is_refund = false; + public function __construct($payment, $contact, $template_data = null) { $this->payment = $payment; @@ -92,9 +96,44 @@ class PaymentEmailEngine extends BaseEmailEngine if ($this->client->getSetting('pdf_email_attachment') !== false && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $this->payment->invoices->each(function ($invoice) { - $pdf = ((new CreateRawPdf($invoice->invitations->first(), $invoice->company->db))->handle()); - $this->setAttachments([['file' => base64_encode($pdf), 'name' => $invoice->numberFormatter().'.pdf']]); + if($this->is_refund && strlen($invoice->client->getSetting('payment_refund_design_id')) > 2) { + $pdf = (new TemplateAction( + [$this->payment->hashed_id], + $invoice->client->getSetting('payment_refund_design_id'), + Payment::class, + $this->payment->user_id, + $this->payment->company, + $this->payment->company->db, + 'nohash', + false + ))->handle(); + + $file_name = ctrans('texts.payment_refund_receipt', ['number' => $this->payment->number ]) . '.pdf'; + $file_name = str_replace(' ', '_', $file_name); + + } + elseif(!$this->is_refund && strlen($invoice->client->getSetting('payment_receipt_design_id')) > 2){ + $pdf = (new TemplateAction( + [$this->payment->hashed_id], + $invoice->client->getSetting('payment_refund_design_id'), + Payment::class, + $this->payment->user_id, + $this->payment->company, + $this->payment->company->db, + 'nohash', + false))->handle(); + + $file_name = ctrans('texts.payment_receipt', ['number' => $this->payment->number ]) . '.pdf'; + $file_name = str_replace(' ', '_', $file_name); + + } + else { + $pdf = ((new CreateRawPdf($invoice->invitations->first(), $invoice->company->db))->handle()); + $file_name = $invoice->numberFormatter().'.pdf'; + } + + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); //attach invoice documents also to payments if ($this->client->getSetting('document_email_attachment') !== false) { diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index ff318b640c05..0449a86263ea 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -74,7 +74,8 @@ class TemplateAction implements ShouldQueue * */ public function handle() - { + { nlog("inside template action"); + MultiDB::setDb($this->db); $key = $this->resolveEntityString(); @@ -85,16 +86,22 @@ class TemplateAction implements ShouldQueue $template_service = new TemplateService($template); - if($this->entity == Invoice::class) { - $resource->with('payments', 'client'); - } + match($this->entity){ + Invoice::class => $resource->with('payments', 'client'), + Quote::class => $resource->with('client'), + Task::class => $resource->with('client'), + Credit::class => $resource->with('client'), + RecurringInvoice::class => $resource->with('client'), + Project::class => $resource->with('client'), + Expense::class => $resource->with('client'), + Payment::class => $resource->with('invoices', 'client'), + }; $result = $resource->withTrashed() ->whereIn('id', $this->transformKeys($this->ids)) ->where('company_id', $this->company->id) ->get(); - if($result->count() <= 1) $data[$key] = collect($result); else @@ -103,15 +110,16 @@ class TemplateAction implements ShouldQueue $ts = $template_service->build($data); nlog($ts->getHtml()); - $pdf = $ts->getPdf(); - if($this->send_email) + if($this->send_email) { + $pdf = $ts->getPdf(); $this->sendEmail($pdf, $template); + } else { - + $pdf = $ts->getPdf(); $filename = "templates/{$this->hash}.pdf"; Storage::disk(config('filesystems.default'))->put($filename, $pdf); - + return $pdf; } } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 9ee5d9796402..02abf677a7c9 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -514,6 +514,8 @@ class TemplateService 'custom_value2' => $payment->custom_value2 ?? '', 'custom_value3' => $payment->custom_value3 ?? '', 'custom_value4' => $payment->custom_value4 ?? '', + 'created_at' => $this->translateDate($payment->created_at, $payment->client->date_format(), $payment->client->locale()), + 'updated_at' => $this->translateDate($payment->updated_at, $payment->client->date_format(), $payment->client->locale()), 'client' => [ 'name' => $payment->client->present()->name(), 'balance' => $payment->client->balance, @@ -587,27 +589,11 @@ class TemplateService { $payments = $payments->map(function ($payment) { - // nlog(microtime(true)); return $this->transformPayment($payment); })->toArray(); - + return $payments; - // $it = new PaymentTransformer(); - // $it->setDefaultIncludes(['client','invoices','paymentables']); - // $manager = new Manager(); - // $manager->parseIncludes(['client','invoices','paymentables']); - // $resource = new \League\Fractal\Resource\Collection($payments, $it, null); - // $resources = $manager->createData($resource)->toArray(); - // foreach($resources['data'] as $key => $resource) { - - // $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; - // $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; - // $resources['data'][$key]['invoices'] = $invoice['invoices']['data'] ?? []; - - // } - - // return $resources['data']; } diff --git a/lang/en/texts.php b/lang/en/texts.php index a5bc8f47feda..aa407bc9b054 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5161,6 +5161,8 @@ $LANG = array( 'show_document_preview' => 'Show Document Preview', 'cash_accounting' => 'Cash accounting', 'click_or_drop_files_here' => 'Click or drop files here', + 'payment_refund_receipt' => 'Payment Refund Receipt # :number', + 'payment_receipt' => 'Payment Receipt # :number', ); return $LANG; From c6d6150a3279a293348e669f7e8f37ca328c8471 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 15:20:43 +1100 Subject: [PATCH 064/109] Upgrading payment engine for templates --- app/Mail/Engine/PaymentEmailEngine.php | 72 ++++++++++++++------------ 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index df4dd211cf17..9b5c4554a729 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -95,46 +95,54 @@ class PaymentEmailEngine extends BaseEmailEngine ->setViewText(''); if ($this->client->getSetting('pdf_email_attachment') !== false && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - $this->payment->invoices->each(function ($invoice) { - if($this->is_refund && strlen($invoice->client->getSetting('payment_refund_design_id')) > 2) { - $pdf = (new TemplateAction( - [$this->payment->hashed_id], - $invoice->client->getSetting('payment_refund_design_id'), - Payment::class, - $this->payment->user_id, - $this->payment->company, - $this->payment->company->db, - 'nohash', - false - ))->handle(); + $template_in_use = false; - $file_name = ctrans('texts.payment_refund_receipt', ['number' => $this->payment->number ]) . '.pdf'; - $file_name = str_replace(' ', '_', $file_name); + if($this->is_refund && strlen($this->payment->client->getSetting('payment_refund_design_id')) > 2) { + $pdf = (new TemplateAction( + [$this->payment->hashed_id], + $this->payment->client->getSetting('payment_refund_design_id'), + Payment::class, + $this->payment->user_id, + $this->payment->company, + $this->payment->company->db, + 'nohash', + false + ))->handle(); - } - elseif(!$this->is_refund && strlen($invoice->client->getSetting('payment_receipt_design_id')) > 2){ - $pdf = (new TemplateAction( - [$this->payment->hashed_id], - $invoice->client->getSetting('payment_refund_design_id'), - Payment::class, - $this->payment->user_id, - $this->payment->company, - $this->payment->company->db, - 'nohash', - false))->handle(); - - $file_name = ctrans('texts.payment_receipt', ['number' => $this->payment->number ]) . '.pdf'; - $file_name = str_replace(' ', '_', $file_name); + $file_name = ctrans('texts.payment_refund_receipt', ['number' => $this->payment->number ]) . '.pdf'; + $file_name = str_replace(' ', '_', $file_name); + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); + $template_in_use = true; - } - else { + } elseif(!$this->is_refund && strlen($this->payment->client->getSetting('payment_receipt_design_id')) > 2) { + $pdf = (new TemplateAction( + [$this->payment->hashed_id], + $this->payment->client->getSetting('payment_receipt_design_id'), + Payment::class, + $this->payment->user_id, + $this->payment->company, + $this->payment->company->db, + 'nohash', + false + ))->handle(); + + $file_name = ctrans('texts.payment_receipt', ['number' => $this->payment->number ]) . '.pdf'; + $file_name = str_replace(' ', '_', $file_name); + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); + $template_in_use = true; + + } + + $this->payment->invoices->each(function ($invoice) use($template_in_use){ + + if(!$template_in_use) + { $pdf = ((new CreateRawPdf($invoice->invitations->first(), $invoice->company->db))->handle()); $file_name = $invoice->numberFormatter().'.pdf'; + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); } - $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); - //attach invoice documents also to payments if ($this->client->getSetting('document_email_attachment') !== false) { foreach ($invoice->documents as $document) { From 59a2163a33e6130536eb42497b78e0f2b207bb6d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 16:06:37 +1100 Subject: [PATCH 065/109] Template action fixes --- app/Services/Template/TemplateService.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 02abf677a7c9..088e7c250e84 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -470,6 +470,7 @@ class TemplateService 'refunded' => Number::formatMoney($credit->pivot->refunded, $payment->client), 'net' => Number::formatMoney($credit->pivot->amount - $credit->pivot->refunded, $payment->client), 'is_credit' => true, + 'date' => $this->translateDate($credit->date, $payment->client->date_format(), $payment->client->locale()), 'created_at' => $this->translateDate($credit->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), 'updated_at' => $this->translateDate($credit->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), 'timestamp' => $credit->pivot->created_at->timestamp, @@ -486,6 +487,7 @@ class TemplateService 'refunded' => Number::formatMoney($invoice->pivot->refunded, $payment->client), 'net' => Number::formatMoney($invoice->pivot->amount - $invoice->pivot->refunded, $payment->client), 'is_credit' => false, + 'date' => $this->translateDate($invoice->date, $payment->client->date_format(), $payment->client->locale()), 'created_at' => $this->translateDate($invoice->pivot->created_at, $payment->client->date_format(), $payment->client->locale()), 'updated_at' => $this->translateDate($invoice->pivot->updated_at, $payment->client->date_format(), $payment->client->locale()), 'timestamp' => $invoice->pivot->created_at->timestamp, From aa3be068766bca0b48ea44fbbd4dd7cdc718037f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 19:46:00 +1100 Subject: [PATCH 066/109] Add refund activities --- app/Services/Template/TemplateService.php | 35 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 088e7c250e84..36c28eeb7422 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -18,6 +18,7 @@ use App\Models\Design; use App\Models\Company; use App\Models\Payment; use App\Models\Project; +use App\Models\Activity; use App\Utils\HtmlEngine; use League\Fractal\Manager; use App\Models\PurchaseOrder; @@ -25,6 +26,7 @@ use App\Utils\VendorHtmlEngine; 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\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; @@ -34,7 +36,6 @@ use App\Transformers\InvoiceTransformer; use App\Transformers\ProjectTransformer; use App\Transformers\PurchaseOrderTransformer; use League\Fractal\Serializer\ArraySerializer; -use App\Utils\Traits\Pdf\PdfMaker; class TemplateService { @@ -525,15 +526,45 @@ class TemplateService 'credit_balance' => $payment->client->credit_balance, ], 'paymentables' => $pivot, + 'refund_activity' => $this->getPaymentRefundActivity($payment), ]; - + return $data; + } + private function getPaymentRefundActivity(Payment $payment): array + { + + return Activity::where('activity_type_id', 40) + ->where('payment_id', $payment->id) + ->where('company_id', $payment->company_id) + ->orderBy('id', 'asc') + ->cursor() + ->map(function ($a) use ($payment){ + + $date = \Carbon\Carbon::parse($a->created_at)->addSeconds($a->payment->client->timezone_offset()); + $date = $this->translateDate($date, $a->payment->client->date_format(), $a->payment->client->locale()); + $notes = explode("-", $a->notes); + + try { + $amount = explode(":", reset($notes)); + $amount = Number::formatMoney(end($amount), $payment->client); + $notes = ctrans('texts.status_partially_refunded_amount', ['amount' => $amount]); + } + catch(\Exception $e){ + } + + $entity = ctrans('texts.invoice'); + + return "{$date} {$entity} #{$a->invoice->number} {$notes}\n"; + + })->toArray(); } + public function processQuotes($quotes): array { $it = new QuoteTransformer(); From c44310fa09b4a02f7e0d48736f0cb1b7bd6a3c86 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 8 Oct 2023 21:03:07 +1100 Subject: [PATCH 067/109] Updates for passing refund meta into templates --- app/Http/Controllers/PaymentController.php | 3 - app/Models/Payment.php | 17 ++++-- app/Services/Payment/RefundPayment.php | 24 ++------ app/Services/Template/TemplateAction.php | 5 +- app/Services/Template/TemplateService.php | 60 ++++++++++++------- app/Utils/PaymentHtmlEngine.php | 10 +++- ...nd_meta_and_category_to_payments_table.php | 26 ++++++++ 7 files changed, 93 insertions(+), 52 deletions(-) create mode 100644 database/migrations/2023_10_08_092508_add_refund_meta_and_category_to_payments_table.php diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index 413f8213ef77..adc3500acaeb 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -14,7 +14,6 @@ namespace App\Http\Controllers; use App\Events\Payment\PaymentWasUpdated; use App\Factory\PaymentFactory; use App\Filters\PaymentFilters; -use App\Http\Requests\Payment\ActionPaymentRequest; use App\Http\Requests\Payment\CreatePaymentRequest; use App\Http\Requests\Payment\DestroyPaymentRequest; use App\Http\Requests\Payment\EditPaymentRequest; @@ -24,14 +23,12 @@ use App\Http\Requests\Payment\StorePaymentRequest; use App\Http\Requests\Payment\UpdatePaymentRequest; use App\Http\Requests\Payment\UploadPaymentRequest; use App\Models\Account; -use App\Models\Invoice; use App\Models\Payment; use App\Repositories\PaymentRepository; use App\Transformers\PaymentTransformer; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Request; use Illuminate\Http\Response; /** diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 3773e8237d99..7898f1b41d80 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -30,6 +30,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int $id * @property int $company_id * @property int $client_id + * @property int $category_id * @property int|null $project_id * @property int|null $vendor_id * @property int|null $user_id @@ -58,6 +59,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $exchange_currency_id * @property \App\Models\Paymentable $paymentable * @property object|null $meta + * @property object|null $refund_meta * @property string|null $custom_value1 * @property string|null $custom_value2 * @property string|null $custom_value3 @@ -151,12 +153,12 @@ class Payment extends BaseModel 'number', 'exchange_currency_id', 'exchange_rate', - // 'is_manual', 'private_notes', 'custom_value1', 'custom_value2', 'custom_value3', 'custom_value4', + 'category_id', ]; protected $casts = [ @@ -167,6 +169,7 @@ class Payment extends BaseModel 'deleted_at' => 'timestamp', 'is_deleted' => 'bool', 'meta' => 'object', + 'refund_meta' => 'array', ]; protected $with = [ @@ -436,11 +439,6 @@ class Payment extends BaseModel public function getLink() :string { - // if (Ninja::isHosted()) { - // $domain = isset($this->company->portal_domain) ? $this->company->portal_domain : $this->company->domain(); - // } else { - // $domain = config('ninja.app_url'); - // } if (Ninja::isHosted()) { $domain = $this->company->domain(); @@ -476,4 +474,11 @@ class Payment extends BaseModel return $use_react_url ? config('ninja.react_url')."/#/payments/{$this->hashed_id}/edit" : config('ninja.app_url'); } + public function setRefundMeta(array $data) + { + $tmp_meta = $this->refund_meta ?? []; + $tmp_meta[] = $data; + + $this->refund_meta = $tmp_meta; + } } diff --git a/app/Services/Payment/RefundPayment.php b/app/Services/Payment/RefundPayment.php index 007f1df6efbf..c3e5c442019f 100644 --- a/app/Services/Payment/RefundPayment.php +++ b/app/Services/Payment/RefundPayment.php @@ -23,33 +23,15 @@ use stdClass; class RefundPayment { - public $payment; - public $refund_data; - - private $credit_note; - - private $total_refund; - - private $gateway_refund_status; - - private $activity_repository; + private float $total_refund = 0; private bool $refund_failed = false; private string $refund_failed_message = ''; - public function __construct($payment, $refund_data) + public function __construct(public Payment $payment, public array $refund_data) { - $this->payment = $payment; - - $this->refund_data = $refund_data; - - $this->total_refund = 0; - - $this->gateway_refund_status = false; - - $this->activity_repository = new ActivityRepository(); } public function run() @@ -135,6 +117,8 @@ class RefundPayment $this->payment->refunded += $this->total_refund; } + $this->payment->setRefundMeta($this->refund_data); + return $this; } diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index 0449a86263ea..c1a8ebbd1054 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -74,7 +74,8 @@ class TemplateAction implements ShouldQueue * */ public function handle() - { nlog("inside template action"); + { + // nlog("inside template action"); MultiDB::setDb($this->db); @@ -109,7 +110,7 @@ class TemplateAction implements ShouldQueue $ts = $template_service->build($data); - nlog($ts->getHtml()); + // nlog($ts->getHtml()); if($this->send_email) { $pdf = $ts->getPdf(); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 36c28eeb7422..4e3a2ace4564 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -16,6 +16,7 @@ use App\Models\Client; use App\Models\Credit; use App\Models\Design; use App\Models\Company; +use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; use App\Models\Activity; @@ -529,37 +530,56 @@ class TemplateService 'refund_activity' => $this->getPaymentRefundActivity($payment), ]; + nlog($this->getPaymentRefundActivity($payment)); + return $data; } + /** + * [ + "id" => 12, + "date" => "2023-10-08", + "invoices" => [ + [ + "amount" => 1, + "invoice_id" => 23, + "id" => null, + ], + ], + "q" => "/api/v1/payments/refund", + "email_receipt" => "true", + "gateway_refund" => false, + "send_email" => false, + ], + * + * @param Payment $payment + * @return array + */ private function getPaymentRefundActivity(Payment $payment): array { - return Activity::where('activity_type_id', 40) - ->where('payment_id', $payment->id) - ->where('company_id', $payment->company_id) - ->orderBy('id', 'asc') - ->cursor() - ->map(function ($a) use ($payment){ - - $date = \Carbon\Carbon::parse($a->created_at)->addSeconds($a->payment->client->timezone_offset()); - $date = $this->translateDate($date, $a->payment->client->date_format(), $a->payment->client->locale()); - $notes = explode("-", $a->notes); - - try { - $amount = explode(":", reset($notes)); - $amount = Number::formatMoney(end($amount), $payment->client); - $notes = ctrans('texts.status_partially_refunded_amount', ['amount' => $amount]); - } - catch(\Exception $e){ - } + return collect($payment->refund_meta ?? []) + ->map(function ($refund) use($payment){ + $date = \Carbon\Carbon::parse($refund['date'])->addSeconds($payment->client->timezone_offset()); + $date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale()); $entity = ctrans('texts.invoice'); - return "{$date} {$entity} #{$a->invoice->number} {$notes}\n"; + $map = []; - })->toArray(); + foreach($refund['invoices'] as $refunded_invoice) { + $invoice = Invoice::withTrashed()->find($refunded_invoice['invoice_id']); + $amount = Number::formatMoney($refunded_invoice['amount'], $payment->client); + $notes = ctrans('texts.status_partially_refunded_amount', ['amount' => $amount]); + + array_push($map, "{$date} {$entity} #{$invoice->number} {$notes}\n"); + + } + + return $map; + + })->flatten()->toArray(); } diff --git a/app/Utils/PaymentHtmlEngine.php b/app/Utils/PaymentHtmlEngine.php index e3b0be94c06d..eaa8e902e413 100644 --- a/app/Utils/PaymentHtmlEngine.php +++ b/app/Utils/PaymentHtmlEngine.php @@ -64,7 +64,15 @@ class PaymentHtmlEngine $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['$public_notes'] = ['value' => $this->payment->public_notes, 'label' => ctrans('texts.notes')]; + + $data['$font_size'] = ['value' => $this->settings->font_size . 'px !important;', 'label' => '']; + $data['$font_name'] = ['value' => Helpers::resolveFont($this->settings->primary_font)['name'], 'label' => '']; + $data['$font_url'] = ['value' => Helpers::resolveFont($this->settings->primary_font)['url'], 'label' => '']; + $data['$secondary_font_name'] = ['value' => Helpers::resolveFont($this->settings->secondary_font)['name'], 'label' => '']; + $data['$secondary_font_url'] = ['value' => Helpers::resolveFont($this->settings->secondary_font)['url'], 'label' => '']; + $data['$invoiceninja.whitelabel'] = ['value' => 'https://invoicing.co/images/new_logo.png', 'label' => '']; + $data['$primary_color'] = ['value' => $this->settings->primary_color, 'label' => '']; + $data['$secondary_color'] = ['value' => $this->settings->secondary_color, 'label' => '']; $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')]; $data['$payment2'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'payment2', $this->payment->custom_value2, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'payment2')]; diff --git a/database/migrations/2023_10_08_092508_add_refund_meta_and_category_to_payments_table.php b/database/migrations/2023_10_08_092508_add_refund_meta_and_category_to_payments_table.php new file mode 100644 index 000000000000..b738ff15616b --- /dev/null +++ b/database/migrations/2023_10_08_092508_add_refund_meta_and_category_to_payments_table.php @@ -0,0 +1,26 @@ +text('refund_meta')->nullable(); + $table->unsignedInteger('category_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + } +}; From 149637bb107d3dd6380fd06e5dd2d2fe3d56e9a3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 12 Oct 2023 09:17:28 +1100 Subject: [PATCH 068/109] Working on statement templates --- app/Services/Client/Statement.php | 138 ++++++++++++---------- app/Services/Template/TemplateService.php | 39 +++++- 2 files changed, 110 insertions(+), 67 deletions(-) diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 68d1f29aa531..a30df8c714a8 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -12,24 +12,25 @@ namespace App\Services\Client; -use App\Factory\InvoiceFactory; -use App\Factory\InvoiceInvitationFactory; -use App\Factory\InvoiceItemFactory; +use App\Utils\Number; use App\Models\Client; +use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; use App\Models\Payment; -use App\Services\PdfMaker\Design as PdfMakerDesign; -use App\Services\PdfMaker\PdfMaker; -use App\Utils\HostedPDF\NinjaPdf; use App\Utils\HtmlEngine; -use App\Utils\Number; -use App\Utils\PhantomJS\Phantom; -use App\Utils\Traits\Pdf\PdfMaker as PdfMakerTrait; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\DB; -use App\Models\Credit; +use App\Factory\InvoiceFactory; use App\Utils\Traits\MakesHash; +use App\Utils\PhantomJS\Phantom; +use App\Utils\HostedPDF\NinjaPdf; +use Illuminate\Support\Facades\DB; +use App\Factory\InvoiceItemFactory; +use App\Services\PdfMaker\PdfMaker; +use App\Factory\InvoiceInvitationFactory; +use Illuminate\Database\Eloquent\Builder; +use App\Services\PdfMaker\Design as PdfMakerDesign; +use App\Utils\Traits\Pdf\PdfMaker as PdfMakerTrait; class Statement { @@ -54,6 +55,12 @@ class Statement $html = new HtmlEngine($this->getInvitation()); + $variables = $html->generateLabelsAndValues(); + + if($this->client->getSetting('statement_design_id') != '') { + return $this->templateStatement($variables); + } + if ($this->getDesign()->is_custom) { $this->options['custom_partials'] = \json_decode(\json_encode($this->getDesign()->design), true); @@ -62,8 +69,6 @@ class Statement $template = new PdfMakerDesign(strtolower($this->getDesign()->name), $this->options); } - $variables = $html->generateLabelsAndValues(); - $state = [ 'template' => $template->elements([ 'client' => $this->client, @@ -71,9 +76,9 @@ class Statement 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, '$product' => $this->getDesign()->design->product, 'variables' => $variables, - 'invoices' => $this->getInvoices(), - 'payments' => $this->getPayments(), - 'credits' => $this->getCredits(), + 'invoices' => $this->getInvoices()->cursor(), + 'payments' => $this->getPayments()->cursor(), + 'credits' => $this->getCredits()->cursor(), 'aging' => $this->getAging(), ], \App\Services\PdfMaker\Design::STATEMENT), 'variables' => $variables, @@ -81,44 +86,65 @@ class Statement 'client' => $this->client, 'entity' => $this->entity, 'variables' => $variables, - 'invoices' => $this->getInvoices(), - 'payments' => $this->getPayments(), - 'credits' => $this->getCredits(), + 'invoices' => $this->getInvoices()->cursor(), + 'payments' => $this->getPayments()->cursor(), + 'credits' => $this->getCredits()->cursor(), 'aging' => $this->getAging(), ], 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; - if($this->options['template'] ?? false){ + - $template = Design::where('id', $this->decodePrimaryKey($this->options['template'])) - ->where('company_id', $this->client->company_id) - ->first(); + $maker = new PdfMaker($state); - $ts = $template->service()->build([ - 'client' => $this->client, - 'entity' => $this->entity, - 'variables' => $variables, - 'invoices' => $this->getInvoices(), - 'payments' => $this->getPayments(), - 'credits' => $this->getCredits(), - 'aging' => $this->getAging(), - ]); + $maker + ->design($template) + ->build(); - $html = $ts->getHtml(); - + $pdf = null; + $html = $maker->getCompiledHTML(true); + + + if ($this->rollback) { + \DB::connection(config('database.default'))->rollBack(); } - else { - $maker = new PdfMaker($state); + $pdf = $this->convertToPdf($html); - $maker - ->design($template) - ->build(); + $maker = null; + $state = null; - $pdf = null; - $html = $maker->getCompiledHTML(true); - } + return $pdf; + } + + private function templateStatement($variables) + {nlog($this->options); + if(isset($this->options['template'])) + $statement_design_id = $this->options['template']; + else + $statement_design_id = $this->client->getSetting('statement_design_id'); + + $template = Design::where('id', $this->decodePrimaryKey($statement_design_id)) + ->where('company_id', $this->client->company_id) + ->first(); + + $ts = $template->service()->build([ + 'variables' => $variables, + 'invoices' => $this->getInvoices()->get(), + 'payments' => $this->getPayments()->get(), + 'credits' => $this->getCredits()->get(), + 'aging' => $this->getAging(), + ]); + + $html = $ts->getHtml(); + + return $this->convertToPdf($html); + } + + private function convertToPdf(string $html): mixed + { + $pdf = false; try { if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { @@ -132,16 +158,9 @@ class Statement nlog(print_r($e->getMessage(), 1)); } - if ($this->rollback) { - \DB::connection(config('database.default'))->rollBack(); - } - - $maker = null; - $state = null; return $pdf; } - /** * Setup correct entity instance. * @@ -253,9 +272,9 @@ class Statement /** * The collection of invoices for the statement. * - * @return Invoice[]|\Illuminate\Support\LazyCollection + * @return Builder */ - public function getInvoices(): \Illuminate\Support\LazyCollection + public function getInvoices(): Builder { return Invoice::withTrashed() ->with('payments.type') @@ -265,8 +284,7 @@ class Statement ->whereIn('status_id', $this->invoiceStatuses()) ->whereBetween('date', [Carbon::parse($this->options['start_date']), Carbon::parse($this->options['end_date'])]) ->orderBy('due_date', 'ASC') - ->orderBy('date', 'ASC') - ->cursor(); + ->orderBy('date', 'ASC'); } private function invoiceStatuses() :array @@ -297,9 +315,9 @@ class Statement /** * The collection of payments for the statement. * - * @return Payment[]|\Illuminate\Support\LazyCollection + * @return Builder */ - protected function getPayments(): \Illuminate\Support\LazyCollection + protected function getPayments(): Builder { return Payment::withTrashed() ->with('client.country', 'invoices') @@ -308,16 +326,15 @@ class Statement ->where('client_id', $this->client->id) ->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]) ->whereBetween('date', [Carbon::parse($this->options['start_date']), Carbon::parse($this->options['end_date'])]) - ->orderBy('date', 'ASC') - ->cursor(); + ->orderBy('date', 'ASC'); } /** * The collection of credits for the statement. * - * @return Credit[]|\Illuminate\Support\LazyCollection + * @return Builder */ - protected function getCredits(): \Illuminate\Support\LazyCollection + protected function getCredits(): Builder { return Credit::withTrashed() ->with('client.country', 'invoices') @@ -330,8 +347,7 @@ class Statement $query->whereDate('due_date', '>=', $this->options['end_date']) ->orWhereNull('due_date'); }) - ->orderBy('date', 'ASC') - ->cursor(); + ->orderBy('date', 'ASC'); } /** diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 4e3a2ace4564..5fc3605927bd 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -71,10 +71,13 @@ class TemplateService $this->document->validateOnParse = true; $loader = new \Twig\Loader\FilesystemLoader(storage_path()); - $this->twig = new \Twig\Environment($loader); + $this->twig = new \Twig\Environment($loader,[ + 'debug' => true, + ]); $string_extension = new \Twig\Extension\StringLoaderExtension(); $this->twig->addExtension($string_extension); $this->twig->addExtension(new IntlExtension()); + $this->twig->addExtension(new \Twig\Extension\DebugExtension()); $function = new \Twig\TwigFunction('img', function ($string, $style = '') { return ''; @@ -123,7 +126,12 @@ class TemplateService return $this; } - + + /** + * Returns the HTML as string + * + * @return string + */ public function getHtml(): string { return $this->compiled_html; @@ -172,6 +180,22 @@ class TemplateService nlog($e->getMessage()); throw ($e); } + catch(\Twig\Error\Error $e) { + nlog("error = " .$e->getMessage()); + throw ($e); + } + catch(\Twig\Error\RuntimeError $e) { + nlog("runtime = " .$e->getMessage()); + throw ($e); + } + catch(\Twig\Error\LoaderError $e) { + nlog("loader = " . $e->getMessage()); + throw ($e); + } + catch(\Twig\Error\SecurityError $e) { + nlog("security = " . $e->getMessage()); + throw ($e); + } $template = $template->render($this->data); @@ -284,7 +308,7 @@ class TemplateService $processed = []; - if(in_array($key, ['tasks','projects']) || !$value->first() ) + if(in_array($key, ['tasks','projects','aging']) || is_array($value) || !$value->first() ) return $processed; match ($key) { @@ -295,6 +319,8 @@ class TemplateService 'tasks' => $processed = [], 'projects' => $processed = [], 'purchase_orders' => (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], + 'aging' => $processed = [], + default => $processed = [], }; return $processed; @@ -317,6 +343,8 @@ class TemplateService 'tasks' => $processed = $this->processTasks($value), 'projects' => $processed = $this->processProjects($value), 'purchase_orders' => $processed = $this->processPurchaseOrders($value), + 'aging' => $processed = $value, + default => $processed = [], }; return $processed; @@ -333,7 +361,6 @@ class TemplateService if($invoice->payments ?? false) { $payments = $invoice->payments->map(function ($payment) { - // nlog(microtime(true)); return $this->transformPayment($payment); })->toArray(); } @@ -530,8 +557,8 @@ class TemplateService 'refund_activity' => $this->getPaymentRefundActivity($payment), ]; - nlog($this->getPaymentRefundActivity($payment)); - + nlog($data); + return $data; } From 1cf829b137a77507693623d9921ec3b6441fb476 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 12 Oct 2023 12:13:08 +1100 Subject: [PATCH 069/109] Working on statement templates --- app/Services/Client/Statement.php | 28 +++-- app/Services/Template/TemplateService.php | 123 +++++++++++++--------- 2 files changed, 95 insertions(+), 56 deletions(-) diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index a30df8c714a8..4cca2b8bb770 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -30,12 +30,15 @@ use App\Services\PdfMaker\PdfMaker; use App\Factory\InvoiceInvitationFactory; use Illuminate\Database\Eloquent\Builder; use App\Services\PdfMaker\Design as PdfMakerDesign; +use App\Utils\Traits\MakesDates; use App\Utils\Traits\Pdf\PdfMaker as PdfMakerTrait; class Statement { use PdfMakerTrait; use MakesHash; + use MakesDates; + /** * @var Invoice|Payment|null */ @@ -55,12 +58,20 @@ class Statement $html = new HtmlEngine($this->getInvitation()); - $variables = $html->generateLabelsAndValues(); + $variables = []; if($this->client->getSetting('statement_design_id') != '') { + + $variables['values']['$start_date'] = $this->translateDate($this->options['start_date'], $this->client->date_format(), $this->client->locale()); + $variables['values']['$end_date'] = $this->translateDate($this->options['end_date'], $this->client->date_format(), $this->client->locale()); + $variables['labels']['$start_date_label'] = ctrans('texts.start_date'); + $variables['labels']['$end_date_label'] = ctrans('texts.end_date'); + return $this->templateStatement($variables); } + $variables = $html->generateLabelsAndValues(); + if ($this->getDesign()->is_custom) { $this->options['custom_partials'] = \json_decode(\json_encode($this->getDesign()->design), true); @@ -119,7 +130,7 @@ class Statement } private function templateStatement($variables) - {nlog($this->options); + { if(isset($this->options['template'])) $statement_design_id = $this->options['template']; else @@ -130,11 +141,11 @@ class Statement ->first(); $ts = $template->service()->build([ - 'variables' => $variables, + 'variables' => collect([$variables]), 'invoices' => $this->getInvoices()->get(), - 'payments' => $this->getPayments()->get(), - 'credits' => $this->getCredits()->get(), - 'aging' => $this->getAging(), + 'payments' => $this->options['show_payments_table'] ? $this->getPayments()->get() : collect([]), + 'credits' => $this->options['show_credits_table'] ? $this->getCredits()->get() : [], + 'aging' => $this->options['show_aging_table'] ? $this->getAging() : [], ]); $html = $ts->getHtml(); @@ -305,7 +316,6 @@ class Statement case 'unpaid': return [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]; - default: return [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL, Invoice::STATUS_PAID]; @@ -337,7 +347,7 @@ class Statement protected function getCredits(): Builder { return Credit::withTrashed() - ->with('client.country', 'invoices') + ->with('client.country','invoice') ->where('is_deleted', false) ->where('company_id', $this->client->company_id) ->where('client_id', $this->client->id) @@ -386,7 +396,7 @@ class Statement * @param mixed $range * @return string */ - private function getAgingAmount($range) + private function getAgingAmount($range): string { $ranges = $this->calculateDateRanges($range); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 5fc3605927bd..d7b0264e928a 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -308,10 +308,11 @@ class TemplateService $processed = []; - if(in_array($key, ['tasks','projects','aging']) || is_array($value) || !$value->first() ) + if(in_array($key, ['tasks','projects','aging']) || !$value->first() ) return $processed; match ($key) { + 'variables' => $processed = $value->first() ?? [], 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], @@ -455,35 +456,6 @@ class TemplateService })->toArray(); } - public function processInvoicesBak($invoices): array - { - $it = new InvoiceTransformer(); - $it->setDefaultIncludes(['client','payments', 'credits']); - $manager = new Manager(); - $manager->parseIncludes(['client','payments','payments.type','credits']); - $resource = new \League\Fractal\Resource\Collection($invoices, $it, null); - $invoices = $manager->createData($resource)->toArray(); - - foreach($invoices['data'] as $key => $invoice) - { - - $invoices['data'][$key]['client'] = $invoice['client']['data'] ?? []; - $invoices['data'][$key]['client']['contacts'] = $invoice['client']['data']['contacts']['data'] ?? []; - $invoices['data'][$key]['payments'] = $invoice['payments']['data'] ?? []; - $invoices['data'][$key]['credits'] = $invoice['credits']['data'] ?? []; - - if($invoice['payments']['data'] ?? false) { - foreach($invoice['payments']['data'] as $keyx => $payment) { - $invoices['data'][$key]['payments'][$keyx]['paymentables'] = $payment['paymentables']['data'] ?? []; - $invoices['data'][$key]['payments'][$keyx]['type'] = $payment['type']['data'] ?? []; - } - } - - } - - return $invoices['data']; - } - private function transformPayment(Payment $payment): array { @@ -558,7 +530,7 @@ class TemplateService ]; nlog($data); - + return $data; } @@ -610,8 +582,6 @@ class TemplateService } - - public function processQuotes($quotes): array { $it = new QuoteTransformer(); @@ -641,24 +611,75 @@ class TemplateService */ public function processCredits($credits): array { - $it = new CreditTransformer(); - $it->setDefaultIncludes(['client']); - $manager = new Manager(); - $resource = new \League\Fractal\Resource\Collection($credits, $it, Credit::class); - $resources = $manager->createData($resource)->toArray(); + $credits = collect($credits) + ->map(function ($credit){ - foreach($resources['data'] as $key => $resource) { + return [ + 'amount' => Number::formatMoney($credit->amount, $credit->client), + 'balance' => Number::formatMoney($credit->balance, $credit->client), + 'balance_raw' => $credit->balance, + 'number' => $credit->number ?: '', + 'discount' => $credit->discount, + 'po_number' => $credit->po_number ?: '', + 'date' => $this->translateDate($credit->date, $credit->client->date_format(), $credit->client->locale()), + 'last_sent_date' => $this->translateDate($credit->last_sent_date, $credit->client->date_format(), $credit->client->locale()), + 'next_send_date' => $this->translateDate($credit->next_send_date, $credit->client->date_format(), $credit->client->locale()), + 'due_date' => $this->translateDate($credit->due_date, $credit->client->date_format(), $credit->client->locale()), + 'terms' => $credit->terms ?: '', + 'public_notes' => $credit->public_notes ?: '', + 'private_notes' => $credit->private_notes ?: '', + 'uses_inclusive_taxes' => (bool) $credit->uses_inclusive_taxes, + 'tax_name1' => $credit->tax_name1 ?? '', + 'tax_rate1' => (float) $credit->tax_rate1, + 'tax_name2' => $credit->tax_name2 ?? '', + 'tax_rate2' => (float) $credit->tax_rate2, + 'tax_name3' => $credit->tax_name3 ?? '', + 'tax_rate3' => (float) $credit->tax_rate3, + 'total_taxes' => Number::formatMoney($credit->total_taxes, $credit->client), + 'total_taxes_raw' => $credit->total_taxes, + 'is_amount_discount' => (bool) $credit->is_amount_discount ?? false, + 'footer' => $credit->footer ?? '', + 'partial' => $credit->partial ?? 0, + 'partial_due_date' => $this->translateDate($credit->partial_due_date, $credit->client->date_format(), $credit->client->locale()), + 'custom_value1' => (string) $credit->custom_value1 ?: '', + 'custom_value2' => (string) $credit->custom_value2 ?: '', + 'custom_value3' => (string) $credit->custom_value3 ?: '', + 'custom_value4' => (string) $credit->custom_value4 ?: '', + 'custom_surcharge1' => (float) $credit->custom_surcharge1, + 'custom_surcharge2' => (float) $credit->custom_surcharge2, + 'custom_surcharge3' => (float) $credit->custom_surcharge3, + 'custom_surcharge4' => (float) $credit->custom_surcharge4, + 'exchange_rate' => (float) $credit->exchange_rate, + 'custom_surcharge_tax1' => (bool) $credit->custom_surcharge_tax1, + 'custom_surcharge_tax2' => (bool) $credit->custom_surcharge_tax2, + 'custom_surcharge_tax3' => (bool) $credit->custom_surcharge_tax3, + 'custom_surcharge_tax4' => (bool) $credit->custom_surcharge_tax4, + 'line_items' => $credit->line_items ? $this->padLineItems($credit->line_items, $credit->client): (array) [], + 'reminder1_sent' => $this->translateDate($credit->reminder1_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder2_sent' => $this->translateDate($credit->reminder2_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder3_sent' => $this->translateDate($credit->reminder3_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder_last_sent' => $this->translateDate($credit->reminder_last_sent, $credit->client->date_format(), $credit->client->locale()), + 'paid_to_date' => Number::formatMoney($credit->paid_to_date, $credit->client), + 'auto_bill_enabled' => (bool) $credit->auto_bill_enabled, + 'client' => [ + 'name' => $credit->client->present()->name(), + 'balance' => $credit->client->balance, + 'payment_balance' => $credit->client->payment_balance, + 'credit_balance' => $credit->client->credit_balance, + ], + 'payments' => [], + 'total_tax_map' => $credit->calc()->getTotalTaxMap(), + 'line_tax_map' => $credit->calc()->getTaxMap(), + ]; - $resources['data'][$key]['client'] = $resource['client']['data'] ?? []; - $resources['data'][$key]['client']['contacts'] = $resource['client']['data']['contacts']['data'] ?? []; - - } - - return $resources['data']; + }); + return $credits->toArray(); } - + + + /** * Pushes payments through the appropriate transformer * @@ -668,7 +689,7 @@ class TemplateService public function processPayments($payments): array { - $payments = $payments->map(function ($payment) { + $payments = collect($payments)->map(function ($payment) { return $this->transformPayment($payment); })->toArray(); @@ -736,4 +757,12 @@ class TemplateService { return $this->company; } + + public function overrideVariables($variables): self + { + $this->variables = $variables; + + return $this; + } + } \ No newline at end of file From 9294e2c347d28f5f93e196ce943d63d88af47eaf Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 13 Oct 2023 13:43:59 +1100 Subject: [PATCH 070/109] Minor Fixes for templates --- app/Services/Client/Statement.php | 4 ++-- app/Services/Pdf/PdfMock.php | 25 +++++++++++++---------- app/Services/Template/TemplateService.php | 6 ++++++ lang/en/texts.php | 2 ++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 4cca2b8bb770..7bd42e14cef9 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -144,8 +144,8 @@ class Statement 'variables' => collect([$variables]), 'invoices' => $this->getInvoices()->get(), 'payments' => $this->options['show_payments_table'] ? $this->getPayments()->get() : collect([]), - 'credits' => $this->options['show_credits_table'] ? $this->getCredits()->get() : [], - 'aging' => $this->options['show_aging_table'] ? $this->getAging() : [], + 'credits' => $this->options['show_credits_table'] ? $this->getCredits()->get() : collect([]), + 'aging' => $this->options['show_aging_table'] ? $this->getAging() : collect([]), ]); $html = $ts->getHtml(); diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index c120168f2427..c7b98de46a71 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -195,7 +195,6 @@ class PdfMock { return ['values' => [ - '$client.shipping_postal_code' => '46420', '$client.billing_postal_code' => '11243', '$company.city_state_postal' => 'Beveley Hills, CA, 90210', @@ -496,6 +495,8 @@ class PdfMock '$show_shipping_address' => $this->settings->show_shipping_address ? 'flex' : 'none', '$show_shipping_address_block' => $this->settings->show_shipping_address ? 'block' : 'none', '$show_shipping_address_visibility' => $this->settings->show_shipping_address ? 'visible' : 'hidden', + '$start_date' => '31/01/2023', + '$end_date' => '31/12/2023', ], 'labels' => $this->mockTranslatedLabels(), ]; @@ -811,21 +812,23 @@ class PdfMock '$tax_label' => ctrans('texts.tax'), '$dir_label' => '', '$to_label' => ctrans('texts.to'), + '$start_date_label' => ctrans('texts.start_date'), + '$end_date_label' => ctrans('texts.end_date'), ]; } - + private function getVendorStubVariables() { return ['values' => [ - '$vendor.billing_postal_code' => '06270-5526', - '$company.postal_city_state' => '29359 New Loy, Delaware', - '$company.city_state_postal' => 'New Loy, Delaware 29359', - '$product.gross_line_total' => '', - '$purchase_order.po_number' => 'PO12345', - '$vendor.postal_city_state' => '06270-5526 Jameyhaven, West Virginia', - '$vendor.city_state_postal' => 'Jameyhaven, West Virginia 06270-5526', - '$purchase_order.due_date' => '02-12-2021', - '$vendor.billing_address1' => '589', + '$vendor.billing_postal_code' => '06270-5526', + '$company.postal_city_state' => '29359 New Loy, Delaware', + '$company.city_state_postal' => 'New Loy, Delaware 29359', + '$product.gross_line_total' => '', + '$purchase_order.po_number' => 'PO12345', + '$vendor.postal_city_state' => '06270-5526 Jameyhaven, West Virginia', + '$vendor.city_state_postal' => 'Jameyhaven, West Virginia 06270-5526', + '$purchase_order.due_date' => '02-12-2021', + '$vendor.billing_address1' => '589', '$vendor.billing_address2' => '761 Odessa Centers Suite 673', '$invoiceninja.whitelabel' => 'https://invoicing.co/images/new_logo.png', '$purchase_order.custom1' => 'Custom 1', diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index d7b0264e928a..8c4bd93b8ba3 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -84,6 +84,12 @@ class TemplateService }); $this->twig->addFunction($function); + $filter = new \Twig\TwigFilter('sum', function (array $array, string $column) { + return array_sum(array_column($array, $column)); + }); + + $this->twig->addFilter($filter); + return $this; } diff --git a/lang/en/texts.php b/lang/en/texts.php index aa407bc9b054..68ebe6f49f11 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5163,6 +5163,8 @@ $LANG = array( 'click_or_drop_files_here' => 'Click or drop files here', 'payment_refund_receipt' => 'Payment Refund Receipt # :number', 'payment_receipt' => 'Payment Receipt # :number', + 'load_template_description' => 'The template will be applied to following:', + 'run_template' => 'Run template', ); return $LANG; From 89e58b7693f9632186ae9e8f86b800e447fff1db Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 24 Oct 2023 16:00:13 +1100 Subject: [PATCH 071/109] WOrking on merging twig inside of custom designs --- app/Jobs/Entity/CreateRawPdf.php | 138 ++++++++++++---------- app/Services/Pdf/PdfBuilder.php | 49 +++++++- app/Services/Pdf/PdfService.php | 4 +- app/Services/Template/TemplateService.php | 7 +- 4 files changed, 125 insertions(+), 73 deletions(-) diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 1be6cd24e114..aae40197a7a4 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -23,6 +23,7 @@ use App\Models\QuoteInvitation; use App\Utils\Traits\MakesHash; use App\Models\CreditInvitation; use App\Models\RecurringInvoice; +use App\Services\Pdf\PdfService; use App\Utils\PhantomJS\Phantom; use App\Models\InvoiceInvitation; use App\Utils\HostedPDF\NinjaPdf; @@ -123,87 +124,96 @@ class CreateRawPdf implements ShouldQueue $file_path = $path.$this->entity->numberFormatter().'.pdf'; - $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->entity->client->getSetting($entity_design_id)); - $design = Design::query()->withTrashed()->find($entity_design_id); +$ps = new PdfService($this->invitation, 'product', [ + 'client' => $this->entity->client, + "{$this->entity_string}s" => [$this->entity], +]); - /* Catch all in case migration doesn't pass back a valid design */ - if (! $design) { - $design = Design::query()->find(2); - } +$pdf = $ps->boot()->getPdf(); - $html = new HtmlEngine($this->invitation); - if ($design->is_custom) { - $options = [ - 'custom_partials' => json_decode(json_encode($design->design), true), - ]; - $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); - } else { - $template = new PdfMakerDesign(strtolower($design->name)); - } + // $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->entity->client->getSetting($entity_design_id)); - $variables = $html->generateLabelsAndValues(); + // $design = Design::query()->withTrashed()->find($entity_design_id); - $state = [ - 'template' => $template->elements([ - 'client' => $this->entity->client, - 'entity' => $this->entity, - 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, - '$product' => $design->design->product, - 'variables' => $variables, - ]), - 'variables' => $variables, - 'options' => [ - 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), - 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), - 'client' => $this->entity->client, - 'entity' => $this->entity, - 'variables' => $variables, - ], - 'process_markdown' => $this->entity->client->company->markdown_enabled, - ]; + // /* Catch all in case migration doesn't pass back a valid design */ + // if (! $design) { + // $design = Design::query()->find(2); + // } - $maker = new PdfMakerService($state); + // $html = new HtmlEngine($this->invitation); - $maker - ->design($template) - ->build(); + // if ($design->is_custom) { + // $options = [ + // 'custom_partials' => json_decode(json_encode($design->design), true), + // ]; + // $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); + // } else { + // $template = new PdfMakerDesign(strtolower($design->name)); + // } - $pdf = null; + // $variables = $html->generateLabelsAndValues(); - try { - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); + // $state = [ + // 'template' => $template->elements([ + // 'client' => $this->entity->client, + // 'entity' => $this->entity, + // 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, + // '$product' => $design->design->product, + // 'variables' => $variables, + // ]), + // 'variables' => $variables, + // 'options' => [ + // 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), + // 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), + // 'client' => $this->entity->client, + // 'entity' => $this->entity, + // 'variables' => $variables, + // ], + // 'process_markdown' => $this->entity->client->company->markdown_enabled, + // ]; - $finfo = new \finfo(FILEINFO_MIME); + // $maker = new PdfMakerService($state); - //fallback in case hosted PDF fails. - if ($finfo->buffer($pdf) != 'application/pdf; charset=binary') { - $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + // $maker + // ->design($template) + // ->build(); - $numbered_pdf = $this->pageNumbering($pdf, $this->company); + // $pdf = null; - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - } - } else { - $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + // try { + // if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + // $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, $this->company); + // $finfo = new \finfo(FILEINFO_MIME); - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - } - } catch (\Exception $e) { - nlog(print_r($e->getMessage(), 1)); - } + // //fallback in case hosted PDF fails. + // if ($finfo->buffer($pdf) != 'application/pdf; charset=binary') { + // $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); - if (config('ninja.log_pdf_html')) { - info($maker->getCompiledHTML()); - } + // $numbered_pdf = $this->pageNumbering($pdf, $this->company); + + // if ($numbered_pdf) { + // $pdf = $numbered_pdf; + // } + // } + // } else { + // $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + + // $numbered_pdf = $this->pageNumbering($pdf, $this->company); + + // if ($numbered_pdf) { + // $pdf = $numbered_pdf; + // } + // } + // } catch (\Exception $e) { + // nlog(print_r($e->getMessage(), 1)); + // } + + // if (config('ninja.log_pdf_html')) { + // info($maker->getCompiledHTML()); + // } if ($pdf) { $maker =null; diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 2852345f2f7a..cae7ecaa94de 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -11,13 +11,14 @@ namespace App\Services\Pdf; -use App\Models\Credit; -use App\Models\Quote; -use App\Utils\Helpers; -use App\Utils\Traits\MakesDates; use DOMDocument; -use Illuminate\Support\Carbon; +use App\Models\Quote; +use App\Models\Credit; +use App\Utils\Helpers; use Illuminate\Support\Str; +use Illuminate\Support\Carbon; +use App\Utils\Traits\MakesDates; +use App\Services\Template\TemplateService; use League\CommonMark\CommonMarkConverter; class PdfBuilder @@ -67,6 +68,7 @@ class PdfBuilder ->buildSections() ->getEmptyElements() ->updateElementProperties() + ->parseTwigElements() ->updateVariables(); return $this; @@ -104,6 +106,40 @@ class PdfBuilder return $this; } + private function parseTwigElements() + { + + $replacements = []; + $contents = $this->document->getElementsByTagName('ninja'); + + $template_service = new TemplateService(); + $data = $template_service->processData($this->service->options)->getData(); + + $twig = $template_service->twig; + + foreach ($contents as $content) { + + $template = $content->ownerDocument->saveHTML($content); + + $template = $twig->createTemplate(html_entity_decode($template)); + $template = $template->render($data); + + $f = $this->document->createDocumentFragment(); + $f->appendXML($template); + $replacements[] = $f; + + } + + foreach($contents as $key => $content) { + $content->parentNode->replaceChild($replacements[$key], $content); + } + + $contents = null; + + return $this; + + } + public function setDocument($document): self { $this->document = $document; @@ -1091,7 +1127,8 @@ class PdfBuilder } elseif (Str::startsWith($variable, '$custom_surcharge')) { $_variable = ltrim($variable, '$'); // $custom_surcharge1 -> custom_surcharge1 - $visible = intval($this->service->config->entity->{$_variable}) != 0; + // $visible = intval($this->service->config->entity->{$_variable}) != 0; + $visible = intval(str_replace(['0','.'], '', $this->service->config->entity->{$_variable})) != 0; $elements[1]['elements'][] = ['element' => 'div', 'elements' => [ ['element' => 'span', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']], diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index d7fde2b8cc5a..3f3bc07343a4 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -61,7 +61,7 @@ class PdfService } public function boot(): self - { + {nlog("booties"); $this->init(); return $this; @@ -104,7 +104,7 @@ class PdfService $html = $this->builder->getCompiledHTML(); if (config('ninja.log_pdf_html')) { - info($html); + nlog($html); } return $html; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 8c4bd93b8ba3..4efdc9d8f04b 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -156,7 +156,12 @@ class TemplateService } - private function processData($data): self + public function getData(): array + { + return $this->data; + } + + public function processData($data): self { $this->data = $this->preProcessDataBlocks($data); From d5339d0864753cec3dc8b88cca9cabac9d5bff3c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 24 Oct 2023 16:26:16 +1100 Subject: [PATCH 072/109] Improvements for twig --- app/Jobs/Entity/CreateRawPdf.php | 148 ++++++++++++++++--------------- app/Services/Pdf/PdfService.php | 12 ++- 2 files changed, 86 insertions(+), 74 deletions(-) diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index aae40197a7a4..4f1619587e9a 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -90,6 +90,17 @@ class CreateRawPdf implements ShouldQueue public function handle() { + /** Testing this override to improve PDF generation performance */ + $ps = new PdfService($this->invitation, 'product', [ + 'client' => $this->entity->client, + "{$this->entity_string}s" => [$this->entity], + ]); + + $pdf = $ps->boot()->getPdf(); + nlog("pdf timer = ". $ps->execution_time); + + + /* Forget the singleton*/ App::forgetInstance('translator'); @@ -124,96 +135,87 @@ class CreateRawPdf implements ShouldQueue $file_path = $path.$this->entity->numberFormatter().'.pdf'; + $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->entity->client->getSetting($entity_design_id)); -$ps = new PdfService($this->invitation, 'product', [ - 'client' => $this->entity->client, - "{$this->entity_string}s" => [$this->entity], -]); + $design = Design::query()->withTrashed()->find($entity_design_id); -$pdf = $ps->boot()->getPdf(); + /* Catch all in case migration doesn't pass back a valid design */ + if (! $design) { + $design = Design::query()->find(2); + } + $html = new HtmlEngine($this->invitation); - // $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->entity->client->getSetting($entity_design_id)); + if ($design->is_custom) { + $options = [ + 'custom_partials' => json_decode(json_encode($design->design), true), + ]; + $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); + } else { + $template = new PdfMakerDesign(strtolower($design->name)); + } - // $design = Design::query()->withTrashed()->find($entity_design_id); + $variables = $html->generateLabelsAndValues(); - // /* Catch all in case migration doesn't pass back a valid design */ - // if (! $design) { - // $design = Design::query()->find(2); - // } + $state = [ + 'template' => $template->elements([ + 'client' => $this->entity->client, + 'entity' => $this->entity, + 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, + '$product' => $design->design->product, + 'variables' => $variables, + ]), + 'variables' => $variables, + 'options' => [ + 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), + 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), + 'client' => $this->entity->client, + 'entity' => $this->entity, + 'variables' => $variables, + ], + 'process_markdown' => $this->entity->client->company->markdown_enabled, + ]; - // $html = new HtmlEngine($this->invitation); + $maker = new PdfMakerService($state); - // if ($design->is_custom) { - // $options = [ - // 'custom_partials' => json_decode(json_encode($design->design), true), - // ]; - // $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); - // } else { - // $template = new PdfMakerDesign(strtolower($design->name)); - // } + $maker + ->design($template) + ->build(); - // $variables = $html->generateLabelsAndValues(); + $pdf = null; - // $state = [ - // 'template' => $template->elements([ - // 'client' => $this->entity->client, - // 'entity' => $this->entity, - // 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, - // '$product' => $design->design->product, - // 'variables' => $variables, - // ]), - // 'variables' => $variables, - // 'options' => [ - // 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), - // 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), - // 'client' => $this->entity->client, - // 'entity' => $this->entity, - // 'variables' => $variables, - // ], - // 'process_markdown' => $this->entity->client->company->markdown_enabled, - // ]; + try { + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - // $maker = new PdfMakerService($state); + $finfo = new \finfo(FILEINFO_MIME); - // $maker - // ->design($template) - // ->build(); + //fallback in case hosted PDF fails. + if ($finfo->buffer($pdf) != 'application/pdf; charset=binary') { + $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); - // $pdf = null; + $numbered_pdf = $this->pageNumbering($pdf, $this->company); - // try { - // if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - // $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); + if ($numbered_pdf) { + $pdf = $numbered_pdf; + } + } + } else { + $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); - // $finfo = new \finfo(FILEINFO_MIME); + $numbered_pdf = $this->pageNumbering($pdf, $this->company); - // //fallback in case hosted PDF fails. - // if ($finfo->buffer($pdf) != 'application/pdf; charset=binary') { - // $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + if ($numbered_pdf) { + $pdf = $numbered_pdf; + } + } + } catch (\Exception $e) { + nlog(print_r($e->getMessage(), 1)); + } - // $numbered_pdf = $this->pageNumbering($pdf, $this->company); - - // if ($numbered_pdf) { - // $pdf = $numbered_pdf; - // } - // } - // } else { - // $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); - - // $numbered_pdf = $this->pageNumbering($pdf, $this->company); - - // if ($numbered_pdf) { - // $pdf = $numbered_pdf; - // } - // } - // } catch (\Exception $e) { - // nlog(print_r($e->getMessage(), 1)); - // } - - // if (config('ninja.log_pdf_html')) { - // info($maker->getCompiledHTML()); - // } + if (config('ninja.log_pdf_html')) { + info($maker->getCompiledHTML()); + } if ($pdf) { $maker =null; diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index 3f3bc07343a4..f680e389019e 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -44,6 +44,10 @@ class PdfService public array $options; + private float $start_time; + + public float $execution_time; + const DELIVERY_NOTE = 'delivery_note'; const STATEMENT = 'statement'; const PURCHASE_ORDER = 'purchase_order'; @@ -61,7 +65,9 @@ class PdfService } public function boot(): self - {nlog("booties"); + { + $this->start_time = microtime(true); + $this->init(); return $this; @@ -90,6 +96,8 @@ class PdfService throw new \Exception($e->getMessage(), $e->getCode()); } + $this->execution_time = microtime(true) - $this->start_time; + return $pdf; } @@ -107,6 +115,8 @@ class PdfService nlog($html); } + $this->execution_time = microtime(true) - $this->start_time; + return $html; } From c116b48a259ea414ed1c3173c469f1a4cbb736b8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 19:04:27 +1100 Subject: [PATCH 073/109] Fixes for creating faker data --- app/Console/Commands/CreateSingleAccount.php | 10 +- app/Http/Controllers/PreviewController.php | 23 +- app/Services/Pdf/PdfService.php | 4 +- app/Services/Template/TemplateService.php | 326 ++++--- app/Utils/Traits/GeneratesCounter.php | 8 +- composer.lock | 849 +++++++----------- ...3_09_09_135250_client_and_company_type.php | 27 - 7 files changed, 513 insertions(+), 734 deletions(-) delete mode 100644 database/migrations/2023_09_09_135250_client_and_company_type.php diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index 2bc1b4c8dedc..481ce0ba647b 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -349,15 +349,17 @@ class CreateSingleAccount extends Command }); - Project::query()->cursor()->each(function ($p) { + Project::query()->with('client')->whereNotNull('client_id')->cursor()->each(function ($p) { - if(!isset($p->number)) { + if($p && $p->client && !isset($p->number)) { $p->number = $this->getNextProjectNumber($p); $p->save(); } }); + $this->info("finished"); + } private function createSubsData($company, $user) @@ -940,11 +942,11 @@ class CreateSingleAccount extends Command } } - private function createRecurringInvoice($client) + private function createRecurringInvoice(Client $client) { $faker = Factory::create(); - $invoice = RecurringInvoiceFactory::create($client->company->id, $client->user->id); //stub the company and user_id + $invoice = RecurringInvoiceFactory::create($client->company_id, $client->user_id); //stub the company and user_id $invoice->client_id = $client->id; $dateable = Carbon::now()->subDays(rand(0, 90)); $invoice->date = $dateable; diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 44b9ca714f70..d297e3bcfa89 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -11,31 +11,16 @@ namespace App\Http\Controllers; -<<<<<<< HEAD -======= -use App\Models\Task; ->>>>>>> support_for_custom_statement_designs use App\Utils\Ninja; use App\Models\Quote; use App\Models\Client; use App\Models\Credit; -<<<<<<< HEAD use App\Models\Invoice; -======= -use App\Models\Vendor; -use App\Models\Invoice; -use App\Models\Payment; -use App\Models\Project; ->>>>>>> support_for_custom_statement_designs use App\Utils\HtmlEngine; use App\Libraries\MultiDB; use App\Factory\QuoteFactory; use App\Jobs\Util\PreviewPdf; use App\Models\ClientContact; -<<<<<<< HEAD -======= -use App\Models\PurchaseOrder; ->>>>>>> support_for_custom_statement_designs use App\Services\Pdf\PdfMock; use App\Factory\CreditFactory; use App\Factory\InvoiceFactory; @@ -49,10 +34,7 @@ use Illuminate\Support\Facades\DB; use App\Services\PdfMaker\PdfMaker; use Illuminate\Support\Facades\App; use App\Repositories\QuoteRepository; -<<<<<<< HEAD use Illuminate\Support\Facades\Cache; -======= ->>>>>>> support_for_custom_statement_designs use App\Repositories\CreditRepository; use App\Utils\Traits\MakesInvoiceHtml; use Turbo124\Beacon\Facades\LightLogs; @@ -61,10 +43,7 @@ use App\Utils\Traits\Pdf\PageNumbering; use App\Factory\RecurringInvoiceFactory; use Illuminate\Support\Facades\Response; use App\DataMapper\Analytics\LivePreview; -<<<<<<< HEAD -======= use App\Services\Template\TemplateService; ->>>>>>> support_for_custom_statement_designs use App\Repositories\RecurringInvoiceRepository; use App\Http\Requests\Preview\DesignPreviewRequest; use App\Services\PdfMaker\Design as PdfDesignModel; @@ -123,7 +102,7 @@ class PreviewController extends BaseController if(!$entity_obj->id) { $entity_obj->design_id = intval($this->decodePrimaryKey($settings->{$entity_prop."_design_id"})); $entity_obj->footer = empty($entity_obj->footer) ? $settings->{$entity_prop."_footer"} : $entity_obj->footer; - $entity_obj->terms = empty($entity_obj->term) ? $settings->{$entity_prop."_terms"} : $entity_obj->terms; + $entity_obj->terms = empty($entity_obj->terms) ? $settings->{$entity_prop."_terms"} : $entity_obj->terms; $entity_obj->public_notes = empty($entity_obj->public_notes) ? $request->getClient()->public_notes : $entity_obj->public_notes; $invitation->{$request->entity} = $entity_obj; } diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index f680e389019e..e730423cc744 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -66,7 +66,6 @@ class PdfService public function boot(): self { - $this->start_time = microtime(true); $this->init(); @@ -109,6 +108,7 @@ class PdfService */ public function getHtml(): string { + $html = $this->builder->getCompiledHTML(); if (config('ninja.log_pdf_html')) { @@ -127,6 +127,8 @@ class PdfService */ public function init(): self { + $this->start_time = microtime(true); + $this->config = (new PdfConfiguration($this))->init(); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 4efdc9d8f04b..538e5257027d 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,32 +11,27 @@ namespace App\Services\Template; -use App\Utils\Number; use App\Models\Client; -use App\Models\Credit; -use App\Models\Design; use App\Models\Company; +use App\Models\Design; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; -use App\Models\Activity; -use App\Utils\HtmlEngine; -use League\Fractal\Manager; use App\Models\PurchaseOrder; -use App\Utils\VendorHtmlEngine; -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\Transformers\TaskTransformer; -use App\Transformers\QuoteTransformer; -use App\Services\Template\TemplateMock; -use App\Transformers\CreditTransformer; -use App\Transformers\InvoiceTransformer; use App\Transformers\ProjectTransformer; use App\Transformers\PurchaseOrderTransformer; +use App\Transformers\QuoteTransformer; +use App\Transformers\TaskTransformer; +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\Traits\Pdf\PdfMaker; +use App\Utils\VendorHtmlEngine; +use League\Fractal\Manager; use League\Fractal\Serializer\ArraySerializer; +use Twig\Extra\Intl\IntlExtension; class TemplateService { @@ -71,7 +66,7 @@ class TemplateService $this->document->validateOnParse = true; $loader = new \Twig\Loader\FilesystemLoader(storage_path()); - $this->twig = new \Twig\Environment($loader,[ + $this->twig = new \Twig\Environment($loader, [ 'debug' => true, ]); $string_extension = new \Twig\Extension\StringLoaderExtension(); @@ -106,7 +101,7 @@ class TemplateService ->processData($data) ->parseNinjaBlocks() ->processVariables($data) - ->parseVariables(); + ->parseVariables(); return $this; } @@ -171,7 +166,7 @@ class TemplateService /** * Parses all Ninja tags in the document - * + * * @return self */ private function parseNinjaBlocks(): self @@ -186,24 +181,19 @@ class TemplateService try { $template = $this->twig->createTemplate(html_entity_decode($template)); - } - catch(\Twig\Error\SyntaxError $e) { + } catch(\Twig\Error\SyntaxError $e) { nlog($e->getMessage()); throw ($e); - } - catch(\Twig\Error\Error $e) { + } catch(\Twig\Error\Error $e) { nlog("error = " .$e->getMessage()); throw ($e); - } - catch(\Twig\Error\RuntimeError $e) { + } catch(\Twig\Error\RuntimeError $e) { nlog("runtime = " .$e->getMessage()); throw ($e); - } - catch(\Twig\Error\LoaderError $e) { + } catch(\Twig\Error\LoaderError $e) { nlog("loader = " . $e->getMessage()); throw ($e); - } - catch(\Twig\Error\SecurityError $e) { + } catch(\Twig\Error\SecurityError $e) { nlog("security = " . $e->getMessage()); throw ($e); } @@ -229,7 +219,7 @@ class TemplateService /** * Parses all variables in the document - * + * * @return self */ private function parseVariables(): self @@ -239,8 +229,7 @@ class TemplateService foreach($this->variables as $key => $variable) { - if(isset($variable['labels']) && isset($variable['values'])) - { + if(isset($variable['labels']) && isset($variable['values'])) { $html = strtr($html, $variable['labels']); $html = strtr($html, $variable['values']); } @@ -271,8 +260,9 @@ class TemplateService */ private function compose(): self { - if(!$this->template) + if(!$this->template) { return $this; + } $html = ''; $html .= $this->template->design->includes; @@ -287,7 +277,7 @@ class TemplateService } /** - * Inject the template components + * Inject the template components * manually * * @return self @@ -319,11 +309,12 @@ class TemplateService $processed = []; - if(in_array($key, ['tasks','projects','aging']) || !$value->first() ) + if(in_array($key, ['tasks','projects','aging']) || !$value->first()) { return $processed; + } match ($key) { - 'variables' => $processed = $value->first() ?? [], + 'variables' => $processed = $value->first() ?? [], 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues() ?? [], @@ -343,7 +334,7 @@ class TemplateService private function preProcessDataBlocks($data): array { - return collect($data)->map(function ($value, $key){ + return collect($data)->map(function ($value, $key) { $processed = []; @@ -367,75 +358,75 @@ class TemplateService public function processInvoices($invoices): array { $invoices = collect($invoices) - ->map(function ($invoice){ + ->map(function ($invoice) { - $payments = []; + $payments = []; - if($invoice->payments ?? false) { - $payments = $invoice->payments->map(function ($payment) { - return $this->transformPayment($payment); - })->toArray(); - } + if($invoice->payments ?? false) { + $payments = $invoice->payments->map(function ($payment) { + return $this->transformPayment($payment); + })->toArray(); + } - return [ - 'amount' => Number::formatMoney($invoice->amount, $invoice->client), - 'balance' => Number::formatMoney($invoice->balance, $invoice->client), - 'balance_raw' => $invoice->balance, - 'number' => $invoice->number ?: '', - 'discount' => $invoice->discount, - 'po_number' => $invoice->po_number ?: '', - 'date' => $this->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()), - 'last_sent_date' => $this->translateDate($invoice->last_sent_date, $invoice->client->date_format(), $invoice->client->locale()), - 'next_send_date' => $this->translateDate($invoice->next_send_date, $invoice->client->date_format(), $invoice->client->locale()), - 'due_date' => $this->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()), - 'terms' => $invoice->terms ?: '', - 'public_notes' => $invoice->public_notes ?: '', - 'private_notes' => $invoice->private_notes ?: '', - 'uses_inclusive_taxes' => (bool) $invoice->uses_inclusive_taxes, - 'tax_name1' => $invoice->tax_name1 ?? '', - 'tax_rate1' => (float) $invoice->tax_rate1, - 'tax_name2' => $invoice->tax_name2 ?? '', - 'tax_rate2' => (float) $invoice->tax_rate2, - 'tax_name3' => $invoice->tax_name3 ?? '', - 'tax_rate3' => (float) $invoice->tax_rate3, - 'total_taxes' => Number::formatMoney($invoice->total_taxes, $invoice->client), - 'total_taxes_raw' => $invoice->total_taxes, - 'is_amount_discount' => (bool) $invoice->is_amount_discount ?? false, - 'footer' => $invoice->footer ?? '', - 'partial' => $invoice->partial ?? 0, - 'partial_due_date' => $this->translateDate($invoice->partial_due_date, $invoice->client->date_format(), $invoice->client->locale()), - 'custom_value1' => (string) $invoice->custom_value1 ?: '', - 'custom_value2' => (string) $invoice->custom_value2 ?: '', - 'custom_value3' => (string) $invoice->custom_value3 ?: '', - 'custom_value4' => (string) $invoice->custom_value4 ?: '', - 'custom_surcharge1' => (float) $invoice->custom_surcharge1, - 'custom_surcharge2' => (float) $invoice->custom_surcharge2, - 'custom_surcharge3' => (float) $invoice->custom_surcharge3, - 'custom_surcharge4' => (float) $invoice->custom_surcharge4, - 'exchange_rate' => (float) $invoice->exchange_rate, - 'custom_surcharge_tax1' => (bool) $invoice->custom_surcharge_tax1, - 'custom_surcharge_tax2' => (bool) $invoice->custom_surcharge_tax2, - 'custom_surcharge_tax3' => (bool) $invoice->custom_surcharge_tax3, - 'custom_surcharge_tax4' => (bool) $invoice->custom_surcharge_tax4, - 'line_items' => $invoice->line_items ? $this->padLineItems($invoice->line_items, $invoice->client): (array) [], - 'reminder1_sent' => $this->translateDate($invoice->reminder1_sent, $invoice->client->date_format(), $invoice->client->locale()), - 'reminder2_sent' => $this->translateDate($invoice->reminder2_sent, $invoice->client->date_format(), $invoice->client->locale()), - 'reminder3_sent' => $this->translateDate($invoice->reminder3_sent, $invoice->client->date_format(), $invoice->client->locale()), - 'reminder_last_sent' => $this->translateDate($invoice->reminder_last_sent, $invoice->client->date_format(), $invoice->client->locale()), - 'paid_to_date' => Number::formatMoney($invoice->paid_to_date, $invoice->client), - 'auto_bill_enabled' => (bool) $invoice->auto_bill_enabled, - 'client' => [ - 'name' => $invoice->client->present()->name(), - 'balance' => $invoice->client->balance, - 'payment_balance' => $invoice->client->payment_balance, - 'credit_balance' => $invoice->client->credit_balance, - ], - 'payments' => $payments, - 'total_tax_map' => $invoice->calc()->getTotalTaxMap(), - 'line_tax_map' => $invoice->calc()->getTaxMap(), - ]; + return [ + 'amount' => Number::formatMoney($invoice->amount, $invoice->client), + 'balance' => Number::formatMoney($invoice->balance, $invoice->client), + 'balance_raw' => $invoice->balance, + 'number' => $invoice->number ?: '', + 'discount' => $invoice->discount, + 'po_number' => $invoice->po_number ?: '', + 'date' => $this->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()), + 'last_sent_date' => $this->translateDate($invoice->last_sent_date, $invoice->client->date_format(), $invoice->client->locale()), + 'next_send_date' => $this->translateDate($invoice->next_send_date, $invoice->client->date_format(), $invoice->client->locale()), + 'due_date' => $this->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'terms' => $invoice->terms ?: '', + 'public_notes' => $invoice->public_notes ?: '', + 'private_notes' => $invoice->private_notes ?: '', + 'uses_inclusive_taxes' => (bool) $invoice->uses_inclusive_taxes, + 'tax_name1' => $invoice->tax_name1 ?? '', + 'tax_rate1' => (float) $invoice->tax_rate1, + 'tax_name2' => $invoice->tax_name2 ?? '', + 'tax_rate2' => (float) $invoice->tax_rate2, + 'tax_name3' => $invoice->tax_name3 ?? '', + 'tax_rate3' => (float) $invoice->tax_rate3, + 'total_taxes' => Number::formatMoney($invoice->total_taxes, $invoice->client), + 'total_taxes_raw' => $invoice->total_taxes, + 'is_amount_discount' => (bool) $invoice->is_amount_discount ?? false, + 'footer' => $invoice->footer ?? '', + 'partial' => $invoice->partial ?? 0, + 'partial_due_date' => $this->translateDate($invoice->partial_due_date, $invoice->client->date_format(), $invoice->client->locale()), + 'custom_value1' => (string) $invoice->custom_value1 ?: '', + 'custom_value2' => (string) $invoice->custom_value2 ?: '', + 'custom_value3' => (string) $invoice->custom_value3 ?: '', + 'custom_value4' => (string) $invoice->custom_value4 ?: '', + 'custom_surcharge1' => (float) $invoice->custom_surcharge1, + 'custom_surcharge2' => (float) $invoice->custom_surcharge2, + 'custom_surcharge3' => (float) $invoice->custom_surcharge3, + 'custom_surcharge4' => (float) $invoice->custom_surcharge4, + 'exchange_rate' => (float) $invoice->exchange_rate, + 'custom_surcharge_tax1' => (bool) $invoice->custom_surcharge_tax1, + 'custom_surcharge_tax2' => (bool) $invoice->custom_surcharge_tax2, + 'custom_surcharge_tax3' => (bool) $invoice->custom_surcharge_tax3, + 'custom_surcharge_tax4' => (bool) $invoice->custom_surcharge_tax4, + 'line_items' => $invoice->line_items ? $this->padLineItems($invoice->line_items, $invoice->client): (array) [], + 'reminder1_sent' => $this->translateDate($invoice->reminder1_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder2_sent' => $this->translateDate($invoice->reminder2_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder3_sent' => $this->translateDate($invoice->reminder3_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'reminder_last_sent' => $this->translateDate($invoice->reminder_last_sent, $invoice->client->date_format(), $invoice->client->locale()), + 'paid_to_date' => Number::formatMoney($invoice->paid_to_date, $invoice->client), + 'auto_bill_enabled' => (bool) $invoice->auto_bill_enabled, + 'client' => [ + 'name' => $invoice->client->present()->name(), + 'balance' => $invoice->client->balance, + 'payment_balance' => $invoice->client->payment_balance, + 'credit_balance' => $invoice->client->credit_balance, + ], + 'payments' => $payments, + 'total_tax_map' => $invoice->calc()->getTotalTaxMap(), + 'line_tax_map' => $invoice->calc()->getTaxMap(), + ]; - }); + }); return $invoices->toArray(); @@ -443,7 +434,7 @@ class TemplateService public function padLineItems(array $items, Client $client): array { - return collect($items)->map(function ($item) use ($client){ + return collect($items)->map(function ($item) use ($client) { $item->cost_raw = $item->cost ?? 0; $item->discount_raw = $item->discount ?? 0; @@ -454,8 +445,9 @@ class TemplateService $item->cost = Number::formatMoney($item->cost_raw, $client); - if($item->is_amount_discount) + if($item->is_amount_discount) { $item->discount = Number::formatMoney($item->discount_raw, $client); + } $item->line_total = Number::formatMoney($item->line_total_raw, $client); $item->gross_line_total = Number::formatMoney($item->gross_line_total_raw, $client); @@ -570,7 +562,7 @@ class TemplateService { return collect($payment->refund_meta ?? []) - ->map(function ($refund) use($payment){ + ->map(function ($refund) use ($payment) { $date = \Carbon\Carbon::parse($refund['date'])->addSeconds($payment->client->timezone_offset()); $date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale()); @@ -579,7 +571,7 @@ class TemplateService $map = []; foreach($refund['invoices'] as $refunded_invoice) { - $invoice = Invoice::withTrashed()->find($refunded_invoice['invoice_id']); + $invoice = Invoice::withTrashed()->find($refunded_invoice['invoice_id']); $amount = Number::formatMoney($refunded_invoice['amount'], $payment->client); $notes = ctrans('texts.status_partially_refunded_amount', ['amount' => $amount]); @@ -623,67 +615,67 @@ class TemplateService public function processCredits($credits): array { $credits = collect($credits) - ->map(function ($credit){ + ->map(function ($credit) { - return [ - 'amount' => Number::formatMoney($credit->amount, $credit->client), - 'balance' => Number::formatMoney($credit->balance, $credit->client), - 'balance_raw' => $credit->balance, - 'number' => $credit->number ?: '', - 'discount' => $credit->discount, - 'po_number' => $credit->po_number ?: '', - 'date' => $this->translateDate($credit->date, $credit->client->date_format(), $credit->client->locale()), - 'last_sent_date' => $this->translateDate($credit->last_sent_date, $credit->client->date_format(), $credit->client->locale()), - 'next_send_date' => $this->translateDate($credit->next_send_date, $credit->client->date_format(), $credit->client->locale()), - 'due_date' => $this->translateDate($credit->due_date, $credit->client->date_format(), $credit->client->locale()), - 'terms' => $credit->terms ?: '', - 'public_notes' => $credit->public_notes ?: '', - 'private_notes' => $credit->private_notes ?: '', - 'uses_inclusive_taxes' => (bool) $credit->uses_inclusive_taxes, - 'tax_name1' => $credit->tax_name1 ?? '', - 'tax_rate1' => (float) $credit->tax_rate1, - 'tax_name2' => $credit->tax_name2 ?? '', - 'tax_rate2' => (float) $credit->tax_rate2, - 'tax_name3' => $credit->tax_name3 ?? '', - 'tax_rate3' => (float) $credit->tax_rate3, - 'total_taxes' => Number::formatMoney($credit->total_taxes, $credit->client), - 'total_taxes_raw' => $credit->total_taxes, - 'is_amount_discount' => (bool) $credit->is_amount_discount ?? false, - 'footer' => $credit->footer ?? '', - 'partial' => $credit->partial ?? 0, - 'partial_due_date' => $this->translateDate($credit->partial_due_date, $credit->client->date_format(), $credit->client->locale()), - 'custom_value1' => (string) $credit->custom_value1 ?: '', - 'custom_value2' => (string) $credit->custom_value2 ?: '', - 'custom_value3' => (string) $credit->custom_value3 ?: '', - 'custom_value4' => (string) $credit->custom_value4 ?: '', - 'custom_surcharge1' => (float) $credit->custom_surcharge1, - 'custom_surcharge2' => (float) $credit->custom_surcharge2, - 'custom_surcharge3' => (float) $credit->custom_surcharge3, - 'custom_surcharge4' => (float) $credit->custom_surcharge4, - 'exchange_rate' => (float) $credit->exchange_rate, - 'custom_surcharge_tax1' => (bool) $credit->custom_surcharge_tax1, - 'custom_surcharge_tax2' => (bool) $credit->custom_surcharge_tax2, - 'custom_surcharge_tax3' => (bool) $credit->custom_surcharge_tax3, - 'custom_surcharge_tax4' => (bool) $credit->custom_surcharge_tax4, - 'line_items' => $credit->line_items ? $this->padLineItems($credit->line_items, $credit->client): (array) [], - 'reminder1_sent' => $this->translateDate($credit->reminder1_sent, $credit->client->date_format(), $credit->client->locale()), - 'reminder2_sent' => $this->translateDate($credit->reminder2_sent, $credit->client->date_format(), $credit->client->locale()), - 'reminder3_sent' => $this->translateDate($credit->reminder3_sent, $credit->client->date_format(), $credit->client->locale()), - 'reminder_last_sent' => $this->translateDate($credit->reminder_last_sent, $credit->client->date_format(), $credit->client->locale()), - 'paid_to_date' => Number::formatMoney($credit->paid_to_date, $credit->client), - 'auto_bill_enabled' => (bool) $credit->auto_bill_enabled, - 'client' => [ - 'name' => $credit->client->present()->name(), - 'balance' => $credit->client->balance, - 'payment_balance' => $credit->client->payment_balance, - 'credit_balance' => $credit->client->credit_balance, - ], - 'payments' => [], - 'total_tax_map' => $credit->calc()->getTotalTaxMap(), - 'line_tax_map' => $credit->calc()->getTaxMap(), - ]; + return [ + 'amount' => Number::formatMoney($credit->amount, $credit->client), + 'balance' => Number::formatMoney($credit->balance, $credit->client), + 'balance_raw' => $credit->balance, + 'number' => $credit->number ?: '', + 'discount' => $credit->discount, + 'po_number' => $credit->po_number ?: '', + 'date' => $this->translateDate($credit->date, $credit->client->date_format(), $credit->client->locale()), + 'last_sent_date' => $this->translateDate($credit->last_sent_date, $credit->client->date_format(), $credit->client->locale()), + 'next_send_date' => $this->translateDate($credit->next_send_date, $credit->client->date_format(), $credit->client->locale()), + 'due_date' => $this->translateDate($credit->due_date, $credit->client->date_format(), $credit->client->locale()), + 'terms' => $credit->terms ?: '', + 'public_notes' => $credit->public_notes ?: '', + 'private_notes' => $credit->private_notes ?: '', + 'uses_inclusive_taxes' => (bool) $credit->uses_inclusive_taxes, + 'tax_name1' => $credit->tax_name1 ?? '', + 'tax_rate1' => (float) $credit->tax_rate1, + 'tax_name2' => $credit->tax_name2 ?? '', + 'tax_rate2' => (float) $credit->tax_rate2, + 'tax_name3' => $credit->tax_name3 ?? '', + 'tax_rate3' => (float) $credit->tax_rate3, + 'total_taxes' => Number::formatMoney($credit->total_taxes, $credit->client), + 'total_taxes_raw' => $credit->total_taxes, + 'is_amount_discount' => (bool) $credit->is_amount_discount ?? false, + 'footer' => $credit->footer ?? '', + 'partial' => $credit->partial ?? 0, + 'partial_due_date' => $this->translateDate($credit->partial_due_date, $credit->client->date_format(), $credit->client->locale()), + 'custom_value1' => (string) $credit->custom_value1 ?: '', + 'custom_value2' => (string) $credit->custom_value2 ?: '', + 'custom_value3' => (string) $credit->custom_value3 ?: '', + 'custom_value4' => (string) $credit->custom_value4 ?: '', + 'custom_surcharge1' => (float) $credit->custom_surcharge1, + 'custom_surcharge2' => (float) $credit->custom_surcharge2, + 'custom_surcharge3' => (float) $credit->custom_surcharge3, + 'custom_surcharge4' => (float) $credit->custom_surcharge4, + 'exchange_rate' => (float) $credit->exchange_rate, + 'custom_surcharge_tax1' => (bool) $credit->custom_surcharge_tax1, + 'custom_surcharge_tax2' => (bool) $credit->custom_surcharge_tax2, + 'custom_surcharge_tax3' => (bool) $credit->custom_surcharge_tax3, + 'custom_surcharge_tax4' => (bool) $credit->custom_surcharge_tax4, + 'line_items' => $credit->line_items ? $this->padLineItems($credit->line_items, $credit->client): (array) [], + 'reminder1_sent' => $this->translateDate($credit->reminder1_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder2_sent' => $this->translateDate($credit->reminder2_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder3_sent' => $this->translateDate($credit->reminder3_sent, $credit->client->date_format(), $credit->client->locale()), + 'reminder_last_sent' => $this->translateDate($credit->reminder_last_sent, $credit->client->date_format(), $credit->client->locale()), + 'paid_to_date' => Number::formatMoney($credit->paid_to_date, $credit->client), + 'auto_bill_enabled' => (bool) $credit->auto_bill_enabled, + 'client' => [ + 'name' => $credit->client->present()->name(), + 'balance' => $credit->client->balance, + 'payment_balance' => $credit->client->payment_balance, + 'credit_balance' => $credit->client->credit_balance, + ], + 'payments' => [], + 'total_tax_map' => $credit->calc()->getTotalTaxMap(), + 'line_tax_map' => $credit->calc()->getTaxMap(), + ]; - }); + }); return $credits->toArray(); @@ -776,4 +768,4 @@ class TemplateService return $this; } -} \ No newline at end of file +} diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index ab5355a329bf..89c69b107391 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -794,16 +794,16 @@ trait GeneratesCounter $replace = []; $search[] = '{$user_custom1}'; - $replace[] = $entity->user->custom_value1; + $replace[] = $entity->user->custom_value1 ?? ''; $search[] = '{$user_custom2}'; - $replace[] = $entity->user->custom_value2; + $replace[] = $entity->user->custom_value2 ?? ''; $search[] = '{$user_custom3}'; - $replace[] = $entity->user->custom_value3; + $replace[] = $entity->user->custom_value3 ?? ''; $search[] = '{$user_custom4}'; - $replace[] = $entity->user->custom_value4; + $replace[] = $entity->user->custom_value4 ?? ''; return str_replace($search, $replace, $pattern); } diff --git a/composer.lock b/composer.lock index a20b5f49c0e6..4990ad4c88e7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,11 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], -<<<<<<< HEAD - "content-hash": "f0ad0b9b101d54a8530ab494539e9590", -======= - "content-hash": "0e0f7606a875b132577ee735309b1247", ->>>>>>> support_for_custom_statement_designs + "content-hash": "ccb40a561924dd86196ff48a3c6f803d", "packages": [ { "name": "afosto/yaac", @@ -435,16 +431,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" + "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/5545a4fa310aec39f54279fdacebcce33b3ff382", + "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382", "shasum": "" }, "require": { @@ -483,39 +479,26 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.3" }, - "time": "2023-07-20T16:49:55+00:00" + "time": "2023-10-16T20:10:06+00:00" }, { "name": "aws/aws-sdk-php", -<<<<<<< HEAD - "version": "3.283.0", + "version": "3.283.11", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "5084c03431ecda0003e35d7fc7a12eeca4242685" + "reference": "348b68edcc83062c329cf7540c4c92d061d27d9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5084c03431ecda0003e35d7fc7a12eeca4242685", - "reference": "5084c03431ecda0003e35d7fc7a12eeca4242685", -======= - "version": "3.282.0", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "79a3ed5bb573f592823f8b1cffe0dbac3132e6b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/79a3ed5bb573f592823f8b1cffe0dbac3132e6b4", - "reference": "79a3ed5bb573f592823f8b1cffe0dbac3132e6b4", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/348b68edcc83062c329cf7540c4c92d061d27d9c", + "reference": "348b68edcc83062c329cf7540c4c92d061d27d9c", "shasum": "" }, "require": { - "aws/aws-crt-php": "^1.0.4", + "aws/aws-crt-php": "^1.2.3", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", @@ -591,15 +574,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", -<<<<<<< HEAD - "source": "https://github.com/aws/aws-sdk-php/tree/3.283.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.283.11" }, - "time": "2023-10-04T18:08:32+00:00" -======= - "source": "https://github.com/aws/aws-sdk-php/tree/3.282.0" - }, - "time": "2023-09-28T18:09:20+00:00" ->>>>>>> support_for_custom_statement_designs + "time": "2023-10-24T18:10:38+00:00" }, { "name": "bacon/bacon-qr-code", @@ -709,16 +686,16 @@ }, { "name": "braintree/braintree_php", - "version": "6.13.0", + "version": "6.14.0", "source": { "type": "git", "url": "https://github.com/braintree/braintree_php.git", - "reference": "c7bdef50c9692f1f9f9bf982e452aec0d137f5ec" + "reference": "084ed5bb728bc32ad444c6d043c87b409cca72d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/braintree/braintree_php/zipball/c7bdef50c9692f1f9f9bf982e452aec0d137f5ec", - "reference": "c7bdef50c9692f1f9f9bf982e452aec0d137f5ec", + "url": "https://api.github.com/repos/braintree/braintree_php/zipball/084ed5bb728bc32ad444c6d043c87b409cca72d7", + "reference": "084ed5bb728bc32ad444c6d043c87b409cca72d7", "shasum": "" }, "require": { @@ -752,9 +729,9 @@ "description": "Braintree PHP Client Library", "support": { "issues": "https://github.com/braintree/braintree_php/issues", - "source": "https://github.com/braintree/braintree_php/tree/6.13.0" + "source": "https://github.com/braintree/braintree_php/tree/6.14.0" }, - "time": "2023-08-30T21:46:13+00:00" + "time": "2023-10-18T22:00:15+00:00" }, { "name": "brick/math", @@ -813,16 +790,16 @@ }, { "name": "checkout/checkout-sdk-php", - "version": "3.0.15", + "version": "3.0.17", "source": { "type": "git", "url": "https://github.com/checkout/checkout-sdk-php.git", - "reference": "18a2278eb28cb1141b1cb189d4a2ee86b1837350" + "reference": "dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/18a2278eb28cb1141b1cb189d4a2ee86b1837350", - "reference": "18a2278eb28cb1141b1cb189d4a2ee86b1837350", + "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27", + "reference": "dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27", "shasum": "" }, "require": { @@ -875,9 +852,9 @@ ], "support": { "issues": "https://github.com/checkout/checkout-sdk-php/issues", - "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.15" + "source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.17" }, - "time": "2023-09-19T14:42:51+00:00" + "time": "2023-10-20T22:35:30+00:00" }, { "name": "cleverit/ubl_invoice", @@ -1376,16 +1353,16 @@ }, { "name": "doctrine/dbal", - "version": "3.7.0", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf" + "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/00d03067f07482f025d41ab55e4ba0db5eca2cdf", - "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2", + "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2", "shasum": "" }, "require": { @@ -1469,7 +1446,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.7.0" + "source": "https://github.com/doctrine/dbal/tree/3.7.1" }, "funding": [ { @@ -1485,7 +1462,7 @@ "type": "tidelift" } ], - "time": "2023-09-26T20:56:55+00:00" + "time": "2023-10-06T05:06:20+00:00" }, { "name": "doctrine/deprecations", @@ -1926,16 +1903,16 @@ }, { "name": "egulias/email-validator", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", - "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", "shasum": "" }, "require": { @@ -1944,8 +1921,8 @@ "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^4.30" + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -1981,7 +1958,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" }, "funding": [ { @@ -1989,7 +1966,7 @@ "type": "github" } ], - "time": "2023-01-14T14:17:03+00:00" + "time": "2023-10-06T06:47:41+00:00" }, { "name": "endroid/qr-code", @@ -2255,21 +2232,21 @@ }, { "name": "fruitcake/php-cors", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/fruitcake/php-cors.git", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "symfony/http-foundation": "^4.4|^5.4|^6" + "symfony/http-foundation": "^4.4|^5.4|^6|^7" }, "require-dev": { "phpstan/phpstan": "^1.4", @@ -2279,7 +2256,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -2310,7 +2287,7 @@ ], "support": { "issues": "https://github.com/fruitcake/php-cors/issues", - "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" }, "funding": [ { @@ -2322,7 +2299,7 @@ "type": "github" } ], - "time": "2022-02-20T15:07:15+00:00" + "time": "2023-10-12T05:21:21+00:00" }, { "name": "gocardless/gocardless-pro", @@ -2510,16 +2487,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.318.0", + "version": "v0.321.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "908a866797b9731352e650997112c8c3a0347ac5" + "reference": "bf0aa8b1cb272f45c1f73270ad113047625c5937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/908a866797b9731352e650997112c8c3a0347ac5", - "reference": "908a866797b9731352e650997112c8c3a0347ac5", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/bf0aa8b1cb272f45c1f73270ad113047625c5937", + "reference": "bf0aa8b1cb272f45c1f73270ad113047625c5937", "shasum": "" }, "require": { @@ -2548,22 +2525,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.318.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.321.0" }, - "time": "2023-10-02T01:10:14+00:00" + "time": "2023-10-23T01:08:38+00:00" }, { "name": "google/auth", - "version": "v1.30.0", + "version": "v1.32.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "6028b072aa444d7edecbed603431322026704627" + "reference": "999e9ce8b9d17914f04e1718271a0a46da4de2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/6028b072aa444d7edecbed603431322026704627", - "reference": "6028b072aa444d7edecbed603431322026704627", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/999e9ce8b9d17914f04e1718271a0a46da4de2f3", + "reference": "999e9ce8b9d17914f04e1718271a0a46da4de2f3", "shasum": "" }, "require": { @@ -2606,9 +2583,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.30.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.32.1" }, - "time": "2023-09-07T19:13:44+00:00" + "time": "2023-10-17T21:13:22+00:00" }, { "name": "graham-campbell/result-type", @@ -3420,16 +3397,16 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.30", + "version": "v1.0.31", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "b5e85651fe2e53eef82aa086c9245b7f5229433f" + "reference": "d1cdb2100aed1cec67b25a660da5e4cc31cf7e09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/b5e85651fe2e53eef82aa086c9245b7f5229433f", - "reference": "b5e85651fe2e53eef82aa086c9245b7f5229433f", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/d1cdb2100aed1cec67b25a660da5e4cc31cf7e09", + "reference": "d1cdb2100aed1cec67b25a660da5e4cc31cf7e09", "shasum": "" }, "require": { @@ -3487,9 +3464,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.30" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.31" }, - "time": "2023-09-30T13:42:02+00:00" + "time": "2023-10-12T16:05:51+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -4310,29 +4287,16 @@ }, { "name": "laravel/framework", -<<<<<<< HEAD - "version": "v10.26.2", + "version": "v10.29.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "6e5440f7c518f26b4495e5d7e4796ec239e26df9" + "reference": "2d002849a16ad131110a50cbea4d64dbb78515a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/6e5440f7c518f26b4495e5d7e4796ec239e26df9", - "reference": "6e5440f7c518f26b4495e5d7e4796ec239e26df9", -======= - "version": "v10.25.2", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "6014dd456b414b305fb0b408404efdcec18e64bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/6014dd456b414b305fb0b408404efdcec18e64bc", - "reference": "6014dd456b414b305fb0b408404efdcec18e64bc", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/laravel/framework/zipball/2d002849a16ad131110a50cbea4d64dbb78515a3", + "reference": "2d002849a16ad131110a50cbea4d64dbb78515a3", "shasum": "" }, "require": { @@ -4365,7 +4329,7 @@ "symfony/console": "^6.2", "symfony/error-handler": "^6.2", "symfony/finder": "^6.2", - "symfony/http-foundation": "^6.2", + "symfony/http-foundation": "^6.3", "symfony/http-kernel": "^6.2", "symfony/mailer": "^6.2", "symfony/mime": "^6.2", @@ -4432,13 +4396,15 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", "orchestra/testbench-core": "^8.12", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", "predis/predis": "^2.0.2", "symfony/cache": "^6.2", - "symfony/http-client": "^6.2.4" + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -4519,44 +4485,27 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, -<<<<<<< HEAD - "time": "2023-10-03T14:24:20+00:00" + "time": "2023-10-24T13:48:53+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.11", + "version": "v0.1.12", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "cce65a90e64712909ea1adc033e1d88de8455ffd" + "reference": "b35f249028c22016e45e48626e19e5d42fd827ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/cce65a90e64712909ea1adc033e1d88de8455ffd", - "reference": "cce65a90e64712909ea1adc033e1d88de8455ffd", -======= - "time": "2023-09-28T14:08:59+00:00" - }, - { - "name": "laravel/prompts", - "version": "v0.1.10", - "source": { - "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "37ed55f6950d921a87d5beeab16d03f8de26b060" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/37ed55f6950d921a87d5beeab16d03f8de26b060", - "reference": "37ed55f6950d921a87d5beeab16d03f8de26b060", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/laravel/prompts/zipball/b35f249028c22016e45e48626e19e5d42fd827ff", + "reference": "b35f249028c22016e45e48626e19e5d42fd827ff", "shasum": "" }, "require": { "ext-mbstring": "*", "illuminate/collections": "^10.0|^11.0", "php": "^8.1", - "symfony/console": "^6.2" + "symfony/console": "^6.2|^7.0" }, "conflict": { "illuminate/console": ">=10.17.0 <10.25.0", @@ -4591,28 +4540,22 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", -<<<<<<< HEAD - "source": "https://github.com/laravel/prompts/tree/v0.1.11" + "source": "https://github.com/laravel/prompts/tree/v0.1.12" }, - "time": "2023-10-03T01:07:35+00:00" -======= - "source": "https://github.com/laravel/prompts/tree/v0.1.10" - }, - "time": "2023-09-29T07:26:07+00:00" ->>>>>>> support_for_custom_statement_designs + "time": "2023-10-18T14:18:57+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" + "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", - "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/076fe2cf128bd54b4341cdc6d49b95b34e101e4c", + "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c", "shasum": "" }, "require": { @@ -4659,7 +4602,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-07-14T13:56:28+00:00" + "time": "2023-10-17T13:38:16+00:00" }, { "name": "laravel/slack-notification-channel", @@ -4925,20 +4868,20 @@ }, { "name": "lcobucci/clock", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/lcobucci/clock.git", - "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc" + "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc", - "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/30a854ceb22bd87d83a7a4563b3f6312453945fc", + "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0", + "php": "~8.2.0", "psr/clock": "^1.0" }, "provide": { @@ -4946,13 +4889,13 @@ }, "require-dev": { "infection/infection": "^0.26", - "lcobucci/coding-standard": "^9.0", + "lcobucci/coding-standard": "^10.0.0", "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.27" + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.0.17" }, "type": "library", "autoload": { @@ -4973,7 +4916,7 @@ "description": "Yet another clock abstraction", "support": { "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.0.0" + "source": "https://github.com/lcobucci/clock/tree/3.1.0" }, "funding": [ { @@ -4985,7 +4928,7 @@ "type": "patreon" } ], - "time": "2022-12-19T15:00:24+00:00" + "time": "2023-03-20T19:12:25+00:00" }, { "name": "lcobucci/jwt", @@ -5339,16 +5282,16 @@ }, { "name": "league/flysystem", - "version": "3.16.0", + "version": "3.18.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729" + "reference": "015633a05aee22490495159237a5944091d8281e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4fdf372ca6b63c6e281b1c01a624349ccb757729", - "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/015633a05aee22490495159237a5944091d8281e", + "reference": "015633a05aee22490495159237a5944091d8281e", "shasum": "" }, "require": { @@ -5366,8 +5309,8 @@ "symfony/http-client": "<5.2" }, "require-dev": { - "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.1", + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", "aws/aws-sdk-php": "^3.220.0", "composer/semver": "^3.0", "ext-fileinfo": "*", @@ -5377,7 +5320,7 @@ "google/cloud-storage": "^1.23", "microsoft/azure-storage-blob": "^1.1", "phpseclib/phpseclib": "^3.0.14", - "phpstan/phpstan": "^0.12.26", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.3.1" }, @@ -5413,7 +5356,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.16.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.18.0" }, "funding": [ { @@ -5425,7 +5368,7 @@ "type": "github" } ], - "time": "2023-09-07T19:22:17+00:00" + "time": "2023-10-20T17:59:40+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -5495,16 +5438,16 @@ }, { "name": "league/flysystem-local", - "version": "3.16.0", + "version": "3.18.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781" + "reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ec7383f25642e6fd4bb0c9554fc2311245391781", - "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e7381ef7643f658b87efb7dbe98fe538fb1bbf32", + "reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32", "shasum": "" }, "require": { @@ -5539,7 +5482,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.16.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.18.0" }, "funding": [ { @@ -5551,7 +5494,7 @@ "type": "github" } ], - "time": "2023-08-30T10:23:59+00:00" + "time": "2023-10-19T20:07:13+00:00" }, { "name": "league/fractal", @@ -5625,16 +5568,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", - "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", "shasum": "" }, "require": { @@ -5665,7 +5608,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" }, "funding": [ { @@ -5677,7 +5620,7 @@ "type": "tidelift" } ], - "time": "2023-08-05T12:09:49+00:00" + "time": "2023-10-17T14:13:20+00:00" }, { "name": "league/oauth1-client", @@ -5893,16 +5836,16 @@ }, { "name": "microsoft/microsoft-graph", - "version": "1.107.0", + "version": "1.108.0", "source": { "type": "git", "url": "https://github.com/microsoftgraph/msgraph-sdk-php.git", - "reference": "63fed05d4d9c348db094f8d8a1d44ff9ce6887c7" + "reference": "96b940ab530c693832648bdf5ffbb975e29d2233" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/63fed05d4d9c348db094f8d8a1d44ff9ce6887c7", - "reference": "63fed05d4d9c348db094f8d8a1d44ff9ce6887c7", + "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/96b940ab530c693832648bdf5ffbb975e29d2233", + "reference": "96b940ab530c693832648bdf5ffbb975e29d2233", "shasum": "" }, "require": { @@ -5939,22 +5882,22 @@ "homepage": "https://developer.microsoft.com/en-us/graph", "support": { "issues": "https://github.com/microsoftgraph/msgraph-sdk-php/issues", - "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.107.0" + "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.108.0" }, - "time": "2023-09-27T06:43:40+00:00" + "time": "2023-10-11T11:00:38+00:00" }, { "name": "mollie/mollie-api-php", - "version": "v2.61.0", + "version": "v2.62.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a" + "reference": "feb6d52859ed1ea7a65b25bb6cbfaadb04b33827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/d3ec7a191985aa57bec9b4425a665e95b4ba346a", - "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/feb6d52859ed1ea7a65b25bb6cbfaadb04b33827", + "reference": "feb6d52859ed1ea7a65b25bb6cbfaadb04b33827", "shasum": "" }, "require": { @@ -6031,9 +5974,9 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.61.0" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.62.0" }, - "time": "2023-07-31T15:37:46+00:00" + "time": "2023-10-23T11:22:58+00:00" }, { "name": "moneyphp/money", @@ -6535,16 +6478,16 @@ }, { "name": "nette/schema", - "version": "v1.2.4", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", - "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", "shasum": "" }, "require": { @@ -6591,9 +6534,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.4" + "source": "https://github.com/nette/schema/tree/v1.2.5" }, - "time": "2023-08-05T18:56:25+00:00" + "time": "2023-10-05T20:37:59+00:00" }, { "name": "nette/utils", @@ -6825,16 +6768,16 @@ }, { "name": "nwidart/laravel-modules", - "version": "v10.0.0", + "version": "10.0.2", "source": { "type": "git", "url": "https://github.com/nWidart/laravel-modules.git", - "reference": "35e514f13cb8ae8dce093e9794785fea27319d81" + "reference": "ef67a7367223ab96539136116d69405d1c21c321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nWidart/laravel-modules/zipball/35e514f13cb8ae8dce093e9794785fea27319d81", - "reference": "35e514f13cb8ae8dce093e9794785fea27319d81", + "url": "https://api.github.com/repos/nWidart/laravel-modules/zipball/ef67a7367223ab96539136116d69405d1c21c321", + "reference": "ef67a7367223ab96539136116d69405d1c21c321", "shasum": "" }, "require": { @@ -6894,7 +6837,7 @@ ], "support": { "issues": "https://github.com/nWidart/laravel-modules/issues", - "source": "https://github.com/nWidart/laravel-modules/tree/v10.0.0" + "source": "https://github.com/nWidart/laravel-modules/tree/10.0.2" }, "funding": [ { @@ -6902,7 +6845,7 @@ "type": "github" } ], - "time": "2023-02-16T11:08:15+00:00" + "time": "2023-10-18T19:14:29+00:00" }, { "name": "nyholm/psr7", @@ -7344,22 +7287,22 @@ }, { "name": "payfast/payfast-php-sdk", - "version": "v1.1.4", + "version": "v1.1.5", "source": { "type": "git", - "url": "https://github.com/PayFast/payfast-php-sdk.git", - "reference": "897e88dabc99283e891d6f8dbad25ccca7a787b9" + "url": "https://github.com/Payfast/payfast-php-sdk.git", + "reference": "902b2cfa7318ad947ed0eba953eea4a3831c526a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PayFast/payfast-php-sdk/zipball/897e88dabc99283e891d6f8dbad25ccca7a787b9", - "reference": "897e88dabc99283e891d6f8dbad25ccca7a787b9", + "url": "https://api.github.com/repos/Payfast/payfast-php-sdk/zipball/902b2cfa7318ad947ed0eba953eea4a3831c526a", + "reference": "902b2cfa7318ad947ed0eba953eea4a3831c526a", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": ">=6.0.0", - "php": ">=7.2.5" + "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^9" @@ -7367,7 +7310,7 @@ "type": "library", "autoload": { "psr-4": { - "PayFast\\": "lib/" + "Payfast\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7376,11 +7319,11 @@ ], "authors": [ { - "name": "Claire Grant", - "email": "claire.grant@payfast.co.za" + "name": "Payfast", + "email": "support@payfast.help" } ], - "description": "PayFast PHP Library", + "description": "Payfast PHP Library", "keywords": [ "api", "onsite", @@ -7388,11 +7331,11 @@ "php" ], "support": { - "issues": "https://github.com/PayFast/payfast-php-sdk/issues", - "source": "https://github.com/PayFast/payfast-php-sdk/tree/v1.1.4" + "issues": "https://github.com/Payfast/payfast-php-sdk/issues", + "source": "https://github.com/Payfast/payfast-php-sdk/tree/v1.1.5" }, "abandoned": true, - "time": "2022-12-20T10:39:51+00:00" + "time": "2023-10-11T09:57:01+00:00" }, { "name": "php-http/client-common", @@ -7786,31 +7729,26 @@ }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "ef4905bfb492ff389eb7f12e26925a0f20073050" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/ef4905bfb492ff389eb7f12e26925a0f20073050", + "reference": "ef4905bfb492ff389eb7f12e26925a0f20073050", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -7837,9 +7775,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.2.0" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2023-10-24T09:20:26+00:00" }, { "name": "php-jsonpointer/php-jsonpointer", @@ -8085,16 +8023,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.23", + "version": "3.0.33", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "866cc78fbd82462ffd880e3f65692afe928bed50" + "reference": "33fa69b2514a61138dd48e7a49f99445711e0ad0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/866cc78fbd82462ffd880e3f65692afe928bed50", - "reference": "866cc78fbd82462ffd880e3f65692afe928bed50", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/33fa69b2514a61138dd48e7a49f99445711e0ad0", + "reference": "33fa69b2514a61138dd48e7a49f99445711e0ad0", "shasum": "" }, "require": { @@ -8175,7 +8113,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.23" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.33" }, "funding": [ { @@ -8191,7 +8129,7 @@ "type": "tidelift" } ], - "time": "2023-09-18T17:22:01+00:00" + "time": "2023-10-21T14:00:39+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -8816,16 +8754,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.21", + "version": "v0.11.22", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "bcb22101107f3bf770523b65630c9d547f60c540" + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", - "reference": "bcb22101107f3bf770523b65630c9d547f60c540", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", "shasum": "" }, "require": { @@ -8854,7 +8792,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-0.11": "0.11.x-dev" }, "bamarni-bin": { "bin-links": false, @@ -8890,9 +8828,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" }, - "time": "2023-09-17T21:15:54+00:00" + "time": "2023-10-14T21:56:36+00:00" }, { "name": "pusher/pusher-php-server", @@ -9519,16 +9457,16 @@ }, { "name": "sentry/sentry", - "version": "3.21.0", + "version": "3.22.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f" + "reference": "c0e3df5a5c1d133cd9461e7672568ff07042c19d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/624aafc22b84b089ffa43b71fb01e0096505ec4f", - "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c0e3df5a5c1d133cd9461e7672568ff07042c19d", + "reference": "c0e3df5a5c1d133cd9461e7672568ff07042c19d", "shasum": "" }, "require": { @@ -9546,7 +9484,7 @@ "psr/http-factory": "^1.0", "psr/http-factory-implementation": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0", "symfony/polyfill-php80": "^1.17" }, "conflict": { @@ -9603,7 +9541,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.21.0" + "source": "https://github.com/getsentry/sentry-php/tree/3.22.0" }, "funding": [ { @@ -9615,33 +9553,20 @@ "type": "custom" } ], - "time": "2023-07-31T15:31:24+00:00" + "time": "2023-10-23T20:34:53+00:00" }, { "name": "sentry/sentry-laravel", -<<<<<<< HEAD - "version": "3.8.1", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "b6142a80fa9360a10b786d2da032339602d0e362" + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/b6142a80fa9360a10b786d2da032339602d0e362", - "reference": "b6142a80fa9360a10b786d2da032339602d0e362", -======= - "version": "3.8.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "c7e7611553f9f90af10ed98dde1a680220f02e4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/c7e7611553f9f90af10ed98dde1a680220f02e4d", - "reference": "c7e7611553f9f90af10ed98dde1a680220f02e4d", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/1293e5732f8405e12f000cdf5dee78c927a18de0", + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0", "shasum": "" }, "require": { @@ -9708,11 +9633,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", -<<<<<<< HEAD - "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.1" -======= - "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.0" ->>>>>>> support_for_custom_statement_designs + "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.2" }, "funding": [ { @@ -9724,11 +9645,7 @@ "type": "custom" } ], -<<<<<<< HEAD - "time": "2023-10-04T10:21:16+00:00" -======= - "time": "2023-09-05T11:02:34+00:00" ->>>>>>> support_for_custom_statement_designs + "time": "2023-10-12T14:38:46+00:00" }, { "name": "setasign/fpdf", @@ -10160,16 +10077,16 @@ }, { "name": "spatie/laravel-data", - "version": "3.9.0", + "version": "3.9.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "21bad55113a1e1e5180a0f89b695f02ce1732aef" + "reference": "dea1e755549a9b54f5895097cc56b9f244f97867" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/21bad55113a1e1e5180a0f89b695f02ce1732aef", - "reference": "21bad55113a1e1e5180a0f89b695f02ce1732aef", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/dea1e755549a9b54f5895097cc56b9f244f97867", + "reference": "dea1e755549a9b54f5895097cc56b9f244f97867", "shasum": "" }, "require": { @@ -10231,7 +10148,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/3.9.0" + "source": "https://github.com/spatie/laravel-data/tree/3.9.2" }, "funding": [ { @@ -10239,7 +10156,7 @@ "type": "github" } ], - "time": "2023-09-15T12:04:39+00:00" + "time": "2023-10-20T10:18:36+00:00" }, { "name": "spatie/laravel-package-tools", @@ -10419,16 +10336,16 @@ }, { "name": "stripe/stripe-php", - "version": "v12.5.0", + "version": "v12.8.0", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "a4249b4a90437844f6c35e8701f8c68acd206f56" + "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/a4249b4a90437844f6c35e8701f8c68acd206f56", - "reference": "a4249b4a90437844f6c35e8701f8c68acd206f56", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6b6f4a775ad46fee4b1df2df4fdfa574365b1621", + "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621", "shasum": "" }, "require": { @@ -10439,7 +10356,6 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "3.5.0", - "php-coveralls/php-coveralls": "^2.5", "phpstan/phpstan": "^1.2", "phpunit/phpunit": "^5.7 || ^9.0" }, @@ -10473,9 +10389,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v12.5.0" + "source": "https://github.com/stripe/stripe-php/tree/v12.8.0" }, - "time": "2023-09-28T23:06:27+00:00" + "time": "2023-10-16T18:04:12+00:00" }, { "name": "symfony/console", @@ -11058,16 +10974,16 @@ }, { "name": "symfony/http-client", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d" + "reference": "ab8446f997efb9913627e9da10fa784d2182fe92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d", - "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d", + "url": "https://api.github.com/repos/symfony/http-client/zipball/ab8446f997efb9913627e9da10fa784d2182fe92", + "reference": "ab8446f997efb9913627e9da10fa784d2182fe92", "shasum": "" }, "require": { @@ -11130,7 +11046,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.5" + "source": "https://github.com/symfony/http-client/tree/v6.3.6" }, "funding": [ { @@ -11146,7 +11062,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T15:57:12+00:00" + "time": "2023-10-06T10:08:56+00:00" }, { "name": "symfony/http-client-contracts", @@ -11228,16 +11144,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957" + "reference": "c186627f52febe09c6d5270b04f8462687a250a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957", - "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c186627f52febe09c6d5270b04f8462687a250a6", + "reference": "c186627f52febe09c6d5270b04f8462687a250a6", "shasum": "" }, "require": { @@ -11247,12 +11163,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^5.4|^6.0", + "symfony/cache": "^6.3", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", @@ -11285,7 +11201,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.5" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.6" }, "funding": [ { @@ -11301,20 +11217,20 @@ "type": "tidelift" } ], - "time": "2023-09-04T21:33:54+00:00" + "time": "2023-10-17T11:32:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc" + "reference": "4945f5001b06ff9080cd3d8f1f9f069094c0d156" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc", - "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4945f5001b06ff9080cd3d8f1f9f069094c0d156", + "reference": "4945f5001b06ff9080cd3d8f1f9f069094c0d156", "shasum": "" }, "require": { @@ -11398,7 +11314,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.5" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.6" }, "funding": [ { @@ -11414,7 +11330,7 @@ "type": "tidelift" } ], - "time": "2023-09-30T06:37:04+00:00" + "time": "2023-10-21T13:12:51+00:00" }, { "name": "symfony/intl", @@ -11580,16 +11496,16 @@ }, { "name": "symfony/mailgun-mailer", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "b467aba49c8240a71f7027c213d9d140ba1abce7" + "reference": "8d9741467c53750dc8ccda23a1cdb91cda732571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/b467aba49c8240a71f7027c213d9d140ba1abce7", - "reference": "b467aba49c8240a71f7027c213d9d140ba1abce7", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/8d9741467c53750dc8ccda23a1cdb91cda732571", + "reference": "8d9741467c53750dc8ccda23a1cdb91cda732571", "shasum": "" }, "require": { @@ -11629,7 +11545,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.5" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.6" }, "funding": [ { @@ -11645,7 +11561,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T17:30:10+00:00" + "time": "2023-10-12T13:32:47+00:00" }, { "name": "symfony/mime", @@ -13341,16 +13257,16 @@ }, { "name": "symfony/translation", - "version": "v6.3.3", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" + "reference": "869b26c7a9d4b8a48afdd77ab36031909c87e3a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "url": "https://api.github.com/repos/symfony/translation/zipball/869b26c7a9d4b8a48afdd77ab36031909c87e3a2", + "reference": "869b26c7a9d4b8a48afdd77ab36031909c87e3a2", "shasum": "" }, "require": { @@ -13416,7 +13332,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.3" + "source": "https://github.com/symfony/translation/tree/v6.3.6" }, "funding": [ { @@ -13432,7 +13348,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-10-17T11:32:53+00:00" }, { "name": "symfony/translation-contracts", @@ -13588,16 +13504,16 @@ }, { "name": "symfony/validator", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47" + "reference": "254290aa13d591883eb36327cbe80689cee38ffb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", - "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", + "url": "https://api.github.com/repos/symfony/validator/zipball/254290aa13d591883eb36327cbe80689cee38ffb", + "reference": "254290aa13d591883eb36327cbe80689cee38ffb", "shasum": "" }, "require": { @@ -13664,7 +13580,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.3.5" + "source": "https://github.com/symfony/validator/tree/v6.3.6" }, "funding": [ { @@ -13680,20 +13596,20 @@ "type": "tidelift" } ], - "time": "2023-09-29T07:41:15+00:00" + "time": "2023-10-20T16:20:17+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", - "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", "shasum": "" }, "require": { @@ -13748,7 +13664,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" }, "funding": [ { @@ -13764,7 +13680,7 @@ "type": "tidelift" } ], - "time": "2023-09-12T10:11:35+00:00" + "time": "2023-10-12T18:45:56+00:00" }, { "name": "symfony/yaml", @@ -13952,8 +13868,6 @@ "source": "https://github.com/turbo124/beacon/tree/v1.5.2" }, "time": "2023-10-01T07:13:02+00:00" -<<<<<<< HEAD -======= }, { "name": "twig/intl-extra", @@ -14089,7 +14003,6 @@ } ], "time": "2023-08-28T11:09:02+00:00" ->>>>>>> support_for_custom_statement_designs }, { "name": "twilio/sdk", @@ -14746,29 +14659,16 @@ }, { "name": "brianium/paratest", -<<<<<<< HEAD - "version": "v7.2.8", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "882b02d197328138686bb06ce7d8cbb98fc0a16c" + "reference": "2951d3f773ea91451c7440f48122287778634b0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/882b02d197328138686bb06ce7d8cbb98fc0a16c", - "reference": "882b02d197328138686bb06ce7d8cbb98fc0a16c", -======= - "version": "v7.2.7", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "1526eb4fd195f65075456dee394d14742ae0a66c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/1526eb4fd195f65075456dee394d14742ae0a66c", - "reference": "1526eb4fd195f65075456dee394d14742ae0a66c", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/2951d3f773ea91451c7440f48122287778634b0d", + "reference": "2951d3f773ea91451c7440f48122287778634b0d", "shasum": "" }, "require": { @@ -14776,28 +14676,28 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", + "fidry/cpu-core-counter": "^0.5.1", "jean85/pretty-package-versions": "^2.0.5", "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "phpunit/php-code-coverage": "^10.1.3", - "phpunit/php-file-iterator": "^4.0.2", + "phpunit/php-code-coverage": "^10.1.7", + "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-timer": "^6.0", - "phpunit/phpunit": "^10.3.2", + "phpunit/phpunit": "^10.4.1", "sebastian/environment": "^6.0.1", - "symfony/console": "^6.3.4", - "symfony/process": "^6.3.4" + "symfony/console": "^6.3.4 || ^7.0.0", + "symfony/process": "^6.3.4 || ^7.0.0" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "infection/infection": "^0.27.0", - "phpstan/phpstan": "^1.10.32", + "infection/infection": "^0.27.4", + "phpstan/phpstan": "^1.10.38", "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-phpunit": "^1.3.14", + "phpstan/phpstan-phpunit": "^1.3.15", "phpstan/phpstan-strict-rules": "^1.5.1", "squizlabs/php_codesniffer": "^3.7.2", - "symfony/filesystem": "^6.3.1" + "symfony/filesystem": "^6.3.1 || ^7.0.0" }, "bin": [ "bin/paratest", @@ -14838,11 +14738,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", -<<<<<<< HEAD - "source": "https://github.com/paratestphp/paratest/tree/v7.2.8" -======= - "source": "https://github.com/paratestphp/paratest/tree/v7.2.7" ->>>>>>> support_for_custom_statement_designs + "source": "https://github.com/paratestphp/paratest/tree/v7.3.0" }, "funding": [ { @@ -14854,11 +14750,7 @@ "type": "paypal" } ], -<<<<<<< HEAD - "time": "2023-10-04T13:38:04+00:00" -======= - "time": "2023-09-14T14:10:09+00:00" ->>>>>>> support_for_custom_statement_designs + "time": "2023-10-10T15:11:25+00:00" }, { "name": "composer/class-map-generator", @@ -14935,16 +14827,16 @@ }, { "name": "composer/pcre", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { @@ -14986,7 +14878,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -15002,7 +14894,7 @@ "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/semver", @@ -15285,29 +15177,16 @@ }, { "name": "friendsofphp/php-cs-fixer", -<<<<<<< HEAD - "version": "v3.34.1", + "version": "v3.35.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3" + "reference": "ec1ccc264994b6764882669973ca435cf05bab08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3", - "reference": "98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3", -======= - "version": "v3.34.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "7c7a4ad2ed8fe50df3e25528218b13d383608f23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7c7a4ad2ed8fe50df3e25528218b13d383608f23", - "reference": "7c7a4ad2ed8fe50df3e25528218b13d383608f23", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08", + "reference": "ec1ccc264994b6764882669973ca435cf05bab08", "shasum": "" }, "require": { @@ -15328,9 +15207,6 @@ "symfony/process": "^5.4 || ^6.0", "symfony/stopwatch": "^5.4 || ^6.0" }, - "conflict": { - "stevebauman/unfinalize": "*" - }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", @@ -15343,8 +15219,6 @@ "phpspec/prophecy": "^1.16", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "phpunitgoodpractices/polyfill": "^1.6", - "phpunitgoodpractices/traits": "^1.9.2", "symfony/phpunit-bridge": "^6.2.3", "symfony/yaml": "^5.4 || ^6.0" }, @@ -15384,11 +15258,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", -<<<<<<< HEAD - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.34.1" -======= - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.34.0" ->>>>>>> support_for_custom_statement_designs + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.35.1" }, "funding": [ { @@ -15396,11 +15266,7 @@ "type": "github" } ], -<<<<<<< HEAD - "time": "2023-10-03T23:51:05+00:00" -======= - "time": "2023-09-29T15:34:26+00:00" ->>>>>>> support_for_custom_statement_designs + "time": "2023-10-12T13:47:26+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -15514,16 +15380,16 @@ }, { "name": "maximebf/debugbar", - "version": "v1.19.0", + "version": "v1.19.1", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "30f65f18f7ac086255a77a079f8e0dcdd35e828e" + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30f65f18f7ac086255a77a079f8e0dcdd35e828e", - "reference": "30f65f18f7ac086255a77a079f8e0dcdd35e828e", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/03dd40a1826f4d585ef93ef83afa2a9874a00523", + "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523", "shasum": "" }, "require": { @@ -15574,9 +15440,9 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.0" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.1" }, - "time": "2023-09-19T19:53:10+00:00" + "time": "2023-10-12T08:10:52+00:00" }, { "name": "mockery/mockery", @@ -15724,16 +15590,16 @@ }, { "name": "nunomaduro/collision", - "version": "v7.9.0", + "version": "v7.10.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "296d0cf9fe462837ac0da8a568b56fc026b132da" + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/296d0cf9fe462837ac0da8a568b56fc026b132da", - "reference": "296d0cf9fe462837ac0da8a568b56fc026b132da", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", "shasum": "" }, "require": { @@ -15742,19 +15608,22 @@ "php": "^8.1.0", "symfony/console": "^6.3.4" }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, "require-dev": { - "brianium/paratest": "^7.2.7", - "laravel/framework": "^10.23.1", - "laravel/pint": "^1.13.1", + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", "laravel/sail": "^1.25.0", "laravel/sanctum": "^3.3.1", "laravel/tinker": "^2.8.2", "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.11.0", - "pestphp/pest": "^2.19.1", - "phpunit/phpunit": "^10.3.5", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.3.0" + "spatie/laravel-ignition": "^2.3.1" }, "type": "library", "extra": { @@ -15813,7 +15682,7 @@ "type": "patreon" } ], - "time": "2023-09-19T10:45:09+00:00" + "time": "2023-10-11T15:45:01+00:00" }, { "name": "nunomaduro/larastan", @@ -16111,29 +15980,16 @@ }, { "name": "phpstan/phpstan", -<<<<<<< HEAD - "version": "1.10.37", + "version": "1.10.39", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e" + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/058ba07e92f744d4dcf6061ae75283d0c6456f2e", - "reference": "058ba07e92f744d4dcf6061ae75283d0c6456f2e", -======= - "version": "1.10.36", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "ffa3089511121a672e62969404e4fddc753f9b15" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa3089511121a672e62969404e4fddc753f9b15", - "reference": "ffa3089511121a672e62969404e4fddc753f9b15", ->>>>>>> support_for_custom_statement_designs + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", "shasum": "" }, "require": { @@ -16182,8 +16038,7 @@ "type": "tidelift" } ], -<<<<<<< HEAD - "time": "2023-10-02T16:18:37+00:00" + "time": "2023-10-17T15:46:26+00:00" }, { "name": "phpunit/php-code-coverage", @@ -16197,22 +16052,6 @@ "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", -======= - "time": "2023-09-29T14:07:45+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", - "reference": "56f33548fe522c8d82da7ff3824b42829d324364", ->>>>>>> support_for_custom_statement_designs "shasum": "" }, "require": { @@ -16269,11 +16108,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", -<<<<<<< HEAD "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" -======= - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" ->>>>>>> support_for_custom_statement_designs }, "funding": [ { @@ -16281,11 +16116,7 @@ "type": "github" } ], -<<<<<<< HEAD "time": "2023-10-04T15:34:17+00:00" -======= - "time": "2023-09-19T04:59:03+00:00" ->>>>>>> support_for_custom_statement_designs }, { "name": "phpunit/php-file-iterator", @@ -16532,16 +16363,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.5", + "version": "10.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", - "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/62bd7af13d282deeb95650077d28ba3600ca321c", + "reference": "62bd7af13d282deeb95650077d28ba3600ca321c", "shasum": "" }, "require": { @@ -16581,7 +16412,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-main": "10.4-dev" } }, "autoload": { @@ -16613,7 +16444,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.1" }, "funding": [ { @@ -16629,7 +16460,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:42:37+00:00" + "time": "2023-10-08T05:01:11+00:00" }, { "name": "sebastian/cli-parser", @@ -17610,35 +17441,35 @@ }, { "name": "spatie/flare-client-php", - "version": "1.4.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544" + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5f2c6a7a0d2c1d90c12559dc7828fd942911a544", - "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", "nesbot/carbon": "^2.62.1", "php": "^8.0", "spatie/backtrace": "^1.5.2", - "symfony/http-foundation": "^5.0|^6.0", - "symfony/mime": "^5.2|^6.0", - "symfony/process": "^5.2|^6.0", - "symfony/var-dumper": "^5.2|^6.0" + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" }, "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.3.0", - "pestphp/pest": "^1.20", + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0" + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" }, "type": "library", "extra": { @@ -17668,7 +17499,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.2" + "source": "https://github.com/spatie/flare-client-php/tree/1.4.3" }, "funding": [ { @@ -17676,20 +17507,20 @@ "type": "github" } ], - "time": "2023-07-28T08:07:24+00:00" + "time": "2023-10-17T15:54:07+00:00" }, { "name": "spatie/ignition", - "version": "1.11.2", + "version": "1.11.3", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa" + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/48b23411ca4bfbc75c75dfc638b6b36159c375aa", - "reference": "48b23411ca4bfbc75c75dfc638b6b36159c375aa", + "url": "https://api.github.com/repos/spatie/ignition/zipball/3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", "shasum": "" }, "require": { @@ -17698,19 +17529,19 @@ "php": "^8.0", "spatie/backtrace": "^1.5.3", "spatie/flare-client-php": "^1.4.0", - "symfony/console": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "require-dev": { - "illuminate/cache": "^9.52", + "illuminate/cache": "^9.52|^10.0|^11.0", "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "psr/simple-cache-implementation": "*", - "symfony/cache": "^6.0", - "symfony/process": "^5.4|^6.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", "vlucas/phpdotenv": "^5.5" }, "suggest": { @@ -17759,20 +17590,20 @@ "type": "github" } ], - "time": "2023-09-19T15:29:52+00:00" + "time": "2023-10-18T14:09:40+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.3.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "4ed813d16edb5a1ab0d7f4b1d116c37ee8cdf3c0" + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/4ed813d16edb5a1ab0d7f4b1d116c37ee8cdf3c0", - "reference": "4ed813d16edb5a1ab0d7f4b1d116c37ee8cdf3c0", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8", "shasum": "" }, "require": { @@ -17851,7 +17682,7 @@ "type": "github" } ], - "time": "2023-08-23T06:24:34+00:00" + "time": "2023-10-09T12:55:26+00:00" }, { "name": "spaze/phpstan-stripe", diff --git a/database/migrations/2023_09_09_135250_client_and_company_type.php b/database/migrations/2023_09_09_135250_client_and_company_type.php deleted file mode 100644 index 4fb7f69afceb..000000000000 --- a/database/migrations/2023_09_09_135250_client_and_company_type.php +++ /dev/null @@ -1,27 +0,0 @@ -string('classification')->nullable(); - }); - - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - // - } -}; From d2a7b60c7445c5676fa22160445762f7b9847d9d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 19:21:21 +1100 Subject: [PATCH 074/109] Fixes for using credits on subscriptions --- app/Services/Subscription/SubscriptionService.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 3794273d82d4..a9707222d9ea 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -888,6 +888,7 @@ class SubscriptionService $credit_repo = new CreditRepository(); $credit = CreditFactory::create($this->subscription->company_id, $this->subscription->user_id); + $credit->status_id = Credit::STATUS_SENT; $credit->date = now()->format('Y-m-d'); $credit->subscription_id = $this->subscription->id; $credit->discount = $last_invoice->discount; @@ -972,7 +973,7 @@ class SubscriptionService $invoice->service()->markPaid()->save(); } - return $invoice; + return $invoice->fresh(); } From 566c0695dc842cd1d6ff5929b81945b706bf0e9b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 19:39:42 +1100 Subject: [PATCH 075/109] Updates for composer lock --- app/Services/Pdf/PdfService.php | 2 ++ composer.lock | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index e730423cc744..31d724fbbc0c 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -62,6 +62,8 @@ class PdfService $this->document_type = $document_type; $this->options = $options; + + $this->start_time = microtime(true); } public function boot(): self diff --git a/composer.lock b/composer.lock index 4990ad4c88e7..e1e0f74679ae 100644 --- a/composer.lock +++ b/composer.lock @@ -4868,20 +4868,20 @@ }, { "name": "lcobucci/clock", - "version": "3.1.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/lcobucci/clock.git", - "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc" + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/30a854ceb22bd87d83a7a4563b3f6312453945fc", - "reference": "30a854ceb22bd87d83a7a4563b3f6312453945fc", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc", "shasum": "" }, "require": { - "php": "~8.2.0", + "php": "~8.1.0 || ~8.2.0", "psr/clock": "^1.0" }, "provide": { @@ -4889,13 +4889,13 @@ }, "require-dev": { "infection/infection": "^0.26", - "lcobucci/coding-standard": "^10.0.0", + "lcobucci/coding-standard": "^9.0", "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.10.7", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.10", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.0.17" + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.27" }, "type": "library", "autoload": { @@ -4916,7 +4916,7 @@ "description": "Yet another clock abstraction", "support": { "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.1.0" + "source": "https://github.com/lcobucci/clock/tree/3.0.0" }, "funding": [ { @@ -4928,7 +4928,7 @@ "type": "patreon" } ], - "time": "2023-03-20T19:12:25+00:00" + "time": "2022-12-19T15:00:24+00:00" }, { "name": "lcobucci/jwt", From 6313761003e46786f0bdcba911a631c1f624fa19 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 20:21:02 +1100 Subject: [PATCH 076/109] Add vendor display name to vendor transformer --- app/Transformers/VendorTransformer.php | 1 + openapi/api-docs.yaml | 12987 ++++++++++++----------- openapi/components/schemas/vendor.yaml | 5 + 3 files changed, 6502 insertions(+), 6491 deletions(-) diff --git a/app/Transformers/VendorTransformer.php b/app/Transformers/VendorTransformer.php index 29aeafa703cd..537c98f62f0d 100644 --- a/app/Transformers/VendorTransformer.php +++ b/app/Transformers/VendorTransformer.php @@ -105,6 +105,7 @@ class VendorTransformer extends EntityTransformer 'number' => (string) $vendor->number ?: '', 'language_id' => (string) $vendor->language_id ?: '', 'classification' => (string) $vendor->classification ?: '', + 'display_name' => (string) $vendor->present()->name(), ]; } } diff --git a/openapi/api-docs.yaml b/openapi/api-docs.yaml index f5d9ac5a9279..a84e3b19354e 100644 --- a/openapi/api-docs.yaml +++ b/openapi/api-docs.yaml @@ -8236,392 +8236,6 @@ paths: default: $ref: "#/components/responses/default" - /api/v1/vendors: - get: - tags: - - vendors - summary: "List vendors" - description: "Lists vendors, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the vendors, these are handled by the VendorFilters class which defines the methods available" - operationId: getVendors - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - $ref: "#/components/parameters/index" - responses: - 200: - description: "A list of vendors" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/Vendor' - meta: - type: object - $ref: '#/components/schemas/Meta' - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - post: - tags: - - vendors - summary: "Create vendor" - description: "Adds a vendor to a company" - operationId: storeVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "Returns the saved clivendorent object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/vendors/{id}": - get: - tags: - - vendors - summary: "Show vendor" - description: "Displays a vendor by id" - operationId: showVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The vendor Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the vendor object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - put: - tags: - - vendors - summary: "Update vendor" - description: "Handles the updating of a vendor by id" - operationId: updateVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Vendor Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the vendor object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - delete: - tags: - - vendors - summary: "Delete vendor" - description: "Handles the deletion of a vendor by id" - operationId: deleteVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Vendor Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns a HTTP status" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/vendors/{id}/edit": - get: - tags: - - vendors - summary: "Edit vendor" - description: "Displays a vendor by id" - operationId: editVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Vendor Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the vendor object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/vendors/create: - get: - tags: - - vendors - summary: "Blank vendor" - description: "Returns a blank vendor with default values" - operationId: getVendorsCreate - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "A blank vendor object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/vendors/bulk: - post: - tags: - - vendors - summary: "Bulk vendor actions" - description: "" - operationId: bulkVendors - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/index" - requestBody: - description: "User credentials" - required: true - content: - application/json: - schema: - type: array - items: - description: "Array of hashed IDs to be bulk 'actioned" - type: integer - example: "[0,1,2,3]" - responses: - 200: - description: "The Vendor User response" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/vendors/{id}/upload": - put: - tags: - - vendors - summary: "Uploads a vendor document" - description: "Handles the uploading of a document to a vendor" - operationId: uploadVendor - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Vendor Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Vendor object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Vendor" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" /api/v1/products: get: tags: @@ -9065,59 +8679,21 @@ paths: default: $ref: '#/components/responses/default' - /api/v1/recurring_invoices: + /api/v1/tasks: get: tags: - - Recurring Invoices - summary: "List recurring invoices" - description: | - Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list. - - operationId: getRecurringInvoices + - tasks + summary: "List tasks" + description: "Lists tasks, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the tasks, these are handled by the TaskFilters class which defines the methods available" + operationId: getTasks parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - - $ref: "#/components/parameters/client_id" - - $ref: "#/components/parameters/created_at" - - $ref: "#/components/parameters/updated_at" - - $ref: "#/components/parameters/is_deleted" - - $ref: "#/components/parameters/filter_deleted_clients" - - $ref: "#/components/parameters/vendor_id" - - name: filter - in: query - description: | - Searches across a range of columns including: - - custom_value1 - - custom_value2 - - custom_value3 - - custom_value4 - required: false - schema: - type: string - example: ?filter=bob - - name: client_status - in: query - description: | - A comma separated list of invoice status strings. Valid options include: - - all - - active - - paused - - completed - required: false - schema: - type: string - example: ?client_status=active,paused - - name: sort - in: query - description: Returns the list sorted by column in ascending or descending order. - required: false - schema: - type: string - example: id|desc number|desc balance|asc + - $ref: "#/components/parameters/index" responses: 200: - description: "A list of recurring_invoices" + description: "A list of tasks" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9133,7 +8709,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/RecurringInvoice' + $ref: '#/components/schemas/Task' meta: type: object $ref: '#/components/schemas/Meta' @@ -9151,17 +8727,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - Recurring Invoices - summary: "Create recurring invoice" - description: "Adds a Recurring Invoice to the system" - operationId: storeRecurringInvoice + - tasks + summary: "Create task" + description: "Adds an task to a company" + operationId: storeTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "Returns the saved RecurringInvoice object" + description: "Returns the saved task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9172,7 +8748,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9185,21 +8761,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - "/api/v1/recurring_invoices/{id}": + "/api/v1/tasks/{id}": get: tags: - - Recurring Invoices - summary: "Show recurring invoice" - description: "Displays an RecurringInvoice by id" - operationId: showRecurringInvoice + - tasks + summary: "Show task" + description: "Displays a task by id" + operationId: showTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9207,7 +8782,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9218,7 +8793,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9233,17 +8808,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - Recurring Invoices - summary: "Update recurring invoice" - description: "Handles the updating of an RecurringInvoice by id" - operationId: updateRecurringInvoice + - tasks + summary: "Update task" + description: "Handles the updating of a task by id" + operationId: updateTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The RecurringInvoice Hashed ID" + description: "The task Hashed ID" required: true schema: type: string @@ -9251,7 +8826,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9262,7 +8837,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9277,17 +8852,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - Recurring Invoices - summary: "Delete recurring invoice" - description: "Handles the deletion of an RecurringInvoice by id" - operationId: deleteRecurringInvoice + - tasks + summary: "Delete task" + description: "Handles the deletion of a task by id" + operationId: deleteTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9315,20 +8890,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/recurring_invoices/{id}/edit": + "/api/v1/tasks/{id}/edit": get: tags: - - Recurring Invoices - summary: "Edit recurring invoice" - description: "Displays an RecurringInvoice by id" - operationId: editRecurringInvoice + - tasks + summary: "Edit task" + description: "Displays a task by id" + operationId: editTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9336,7 +8911,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the client object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9347,7 +8922,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9360,21 +8935,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - /api/v1/recurring_invoices/create: + /api/v1/tasks/create: get: tags: - - Recurring Invoices - summary: "Blank recurring invoice" - description: "Returns a blank object with default values" - operationId: getRecurringInvoicesCreate + - tasks + summary: "Blank task" + description: "Returns a blank task with default values" + operationId: getTasksCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank RecurringInvoice object" + description: "A blank task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9385,7 +8959,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9398,55 +8972,31 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/recurring_invoices/bulk: + /api/v1/tasks/bulk: post: tags: - - Recurring Invoices - summary: "Bulk recurring invoice actions" - description: | - There are multiple actions that are available including: - - operationId: bulkRecurringInvoices + - tasks + summary: "Bulk task actions" + description: "" + operationId: bulkTasks parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/index" requestBody: - description: "Bulk action details" + description: "User credentials" required: true content: application/json: schema: - type: object - properties: - action: - type: string - description: | - The action to be performed, options include: - - `start` - Starts (or restarts) the recurring invoice. **note** if the recurring invoice has been stopped for a long time, it will attempt to catch back up firing a new Invoice every hour per interval that has been missed. - If you do not wish to have the recurring invoice catch up, you should set the next_send_date to the correct date you wish the recurring invoice to commence from. - - `stop` - Stops the recurring invoice. - - `send_now` - Force sends the recurring invoice - this option is only available when the recurring invoice is in a draft state. - - `restore` - Restores the recurring invoice from an archived or deleted state. - - `archive` - Archives the recurring invoice. The recurring invoice will not fire in this state. - - `delete` - Deletes a recurring invoice. - ids: - type: array - items: - description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']" - type: string - example: - action: start - ids: "['D2J234DFA','D2J234DFA','D2J234DFA']" + type: array + items: + description: "Array of hashed IDs to be bulk 'actioned" + type: integer + example: "[0,1,2,3]" responses: 200: - description: "The RecurringInvoice response" + description: "The Task User response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9457,7 +9007,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9470,115 +9020,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/recurring_invoices/{id}/{action}": - get: - deprecated: true - tags: - - Recurring Invoices - summary: "Custom recurring invoice action" - description: "Performs a custom action on an RecurringInvoice.\n\n The current range of actions are as follows\n - clone_to_RecurringInvoice\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email" - operationId: actionRecurringInvoice - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The RecurringInvoice Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - - name: action - in: path - description: "The action string to be performed" - required: true - schema: - type: string - format: string - example: clone_to_quote - responses: - 200: - description: "Returns the RecurringInvoice object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/RecurringInvoice" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/recurring_invoice/{invitation_key}/download": - get: - tags: - - Recurring Invoices - summary: "Download recurring invoice PDF" - description: "Downloads a specific invoice" - operationId: downloadRecurringInvoice - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: invitation_key - in: path - description: "The Recurring Invoice Invitation Key" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the recurring invoice pdf" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/recurring_invoices/{id}/upload": + "/api/v1/tasks/{id}/upload": put: tags: - - Recurring Invoices - summary: "Add recurring invoice document" - description: "Handles the uploading of a document to a recurring_invoice" - operationId: uploadRecurringInvoice + - tasks + summary: "Uploads a task document" + description: "Handles the uploading of a document to a task" + operationId: uploadTask parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9586,7 +9041,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the Task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9597,7 +9052,426 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/tasks/sort: + post: + tags: + - tasks + summary: "Sort tasks on KanBan" + description: "Sorts tasks after drag and drop on the KanBan." + operationId: sortTasks + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "Returns an Ok, 200 HTTP status" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/projects: + get: + tags: + - projects + summary: "List projects" + description: "Lists projects" + operationId: getProjects + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - $ref: "#/components/parameters/index" + responses: + 200: + description: "A list of projects" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Project' + meta: + type: object + $ref: '#/components/schemas/Meta' + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + post: + tags: + - projects + summary: "Create project" + description: "Adds an project to a company" + operationId: storeProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "Returns the saved project object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/projects/{id}": + get: + tags: + - projects + summary: "Show project" + description: "Displays a project by id" + operationId: showProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Project Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the expense object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + put: + tags: + - projects + summary: "Update project" + description: "Handles the updating of a project by id" + operationId: updateProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Project Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the project object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + delete: + tags: + - projects + summary: "Delete project" + description: "Handles the deletion of a project by id" + operationId: deleteProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Project Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns a HTTP status" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/projects/{id}/edit": + get: + tags: + - projects + summary: "Edit project" + description: "Displays a project by id" + operationId: editProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Project Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the project object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/projects/create: + get: + tags: + - projects + summary: "Blank project" + description: "Returns a blank object with default values" + operationId: getProjectsCreate + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "A blank project object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/projects/bulk: + post: + tags: + - projects + summary: "Bulk project actions" + description: "" + operationId: bulkProjects + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/index" + requestBody: + description: "User credentials" + required: true + content: + application/json: + schema: + type: array + items: + description: "Array of hashed IDs to be bulk 'actioned" + type: integer + example: "[0,1,2,3]" + responses: + 200: + description: "The Project User response" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/projects/{id}/upload": + put: + tags: + - projects + summary: "Uploads a project document" + description: "Handles the uploading of a document to a project" + operationId: uploadProject + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Project Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Project object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Project" 401: $ref: "#/components/responses/401" 403: @@ -10784,21 +10658,56 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects: + /api/v1/payments: get: tags: - - projects - summary: "List projects" - description: "Lists projects" - operationId: getProjects + - payments + summary: "List payments" + description: "Lists payments, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the payments, these are handled by the PaymentFilters class which defines the methods available" + operationId: getPayments parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - - $ref: "#/components/parameters/index" + - $ref: "#/components/parameters/status" + - $ref: "#/components/parameters/client_id" + - $ref: "#/components/parameters/created_at" + - $ref: "#/components/parameters/updated_at" + - $ref: "#/components/parameters/is_deleted" + - $ref: "#/components/parameters/filter_deleted_clients" + - $ref: "#/components/parameters/vendor_id" + - name: filter + in: query + description: | + Searches across a range of columns including: + - amount + - date + - custom_value1 + - custom_value2 + - custom_value3 + - custom_value4 + required: false + schema: + type: string + example: ?filter=10 + - name: number + in: query + description: | + Search payments by payment number + required: false + schema: + type: string + example: ?number=0001 + - name: sort + in: query + description: Returns the list sorted by column in ascending or descending order. + required: false + schema: + type: string + example: id|desc number|desc balance|asc responses: 200: - description: "A list of projects" + description: "A list of payments" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10814,7 +10723,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Project' + $ref: '#/components/schemas/Payment' meta: type: object $ref: '#/components/schemas/Meta' @@ -10832,17 +10741,24 @@ paths: $ref: "#/components/responses/default" post: tags: - - projects - summary: "Create project" - description: "Adds an project to a company" - operationId: storeProject + - payments + summary: "Create payment" + description: "Adds an Payment to the system" + operationId: storePayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" + requestBody: + description: "The payment request" + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/Payment" responses: 200: - description: "Returns the saved project object" + description: "Returns the saved Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10853,7 +10769,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -10866,20 +10782,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/projects/{id}": + + "/api/v1/payments/{id}": get: tags: - - projects - summary: "Show project" - description: "Displays a project by id" - operationId: showProject + - payments + summary: "Show payment" + description: "Displays an Payment by id" + operationId: showPayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -10887,7 +10804,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the expense object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10898,7 +10815,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -10913,17 +10830,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - projects - summary: "Update project" - description: "Handles the updating of a project by id" - operationId: updateProject + - payments + summary: "Update payment" + description: "Handles the updating of an Payment by id" + operationId: updatePayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -10931,7 +10848,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the project object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10942,7 +10859,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -10957,17 +10874,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - projects - summary: "Delete project" - description: "Handles the deletion of a project by id" - operationId: deleteProject + - payments + summary: "Delete payment" + description: "Handles the deletion of an Payment by id" + operationId: deletePayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -10995,20 +10912,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/projects/{id}/edit": + "/api/v1/payments/{id}/edit": get: tags: - - projects - summary: "Edit project" - description: "Displays a project by id" - operationId: editProject + - payments + summary: "Edit payment" + description: "Displays an Payment by id" + operationId: editPayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11016,7 +10933,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the project object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11027,7 +10944,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11040,20 +10957,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects/create: + /api/v1/payments/create: get: tags: - - projects - summary: "Blank project" + - payments + summary: "Blank payment" description: "Returns a blank object with default values" - operationId: getProjectsCreate + operationId: getPaymentsCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank project object" + description: "A blank Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11064,7 +10981,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11077,13 +10994,57 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects/bulk: + /api/v1/payments/refund: post: tags: - - projects - summary: "Bulk project actions" + - payments + summary: "Refund payment" + description: "Adds an Refund to the system" + operationId: storeRefund + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + requestBody: + description: "The refund request" + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/Payment" + responses: + 200: + description: "Returns the saved Payment object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Payment" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/payments/bulk: + post: + tags: + - payments + summary: "Bulk payment actions" description: "" - operationId: bulkProjects + operationId: bulkPayments parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" @@ -11101,7 +11062,7 @@ paths: example: "[0,1,2,3]" responses: 200: - description: "The Project User response" + description: "The Payment response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11112,7 +11073,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11125,455 +11086,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/projects/{id}/upload": - put: - tags: - - projects - summary: "Uploads a project document" - description: "Handles the uploading of a document to a project" - operationId: uploadProject - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Project Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Project object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Project" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/quotes: - get: - tags: - - quotes - summary: "List quotes" - description: "Lists quotes, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the quotes, these are handled by the QuoteFilters class which defines the methods available" - operationId: getQuotes - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - $ref: "#/components/parameters/status" - - $ref: "#/components/parameters/client_id" - - $ref: "#/components/parameters/created_at" - - $ref: "#/components/parameters/updated_at" - - $ref: "#/components/parameters/is_deleted" - - $ref: "#/components/parameters/filter_deleted_clients" - - $ref: "#/components/parameters/vendor_id" - - name: filter - in: query - description: | - Searches across a range of columns including: - - number - - custom_value1 - - custom_value2 - - custom_value3 - - custom_value4 - required: false - schema: - type: string - example: ?filter=bob - - name: client_status - in: query - description: | - A comma separated list of quote status strings. Valid options include: - - all - - draft - - sent - - approved - - expired - - upcoming - required: false - schema: - type: string - example: ?client_status=paid,unpaid - - name: number - in: query - description: | - Search quote by quote number - required: false - schema: - type: string - example: ?number=Q-001 - - name: sort - in: query - description: Returns the list sorted by column in ascending or descending order. - required: false - schema: - type: string - example: id|desc number|desc balance|asc - responses: - 200: - description: "A list of quotes" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/Quote' - meta: - type: object - $ref: '#/components/schemas/Meta' - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - post: - tags: - - quotes - summary: "Create quote" - description: "Adds an Quote to the system" - operationId: storeQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "Returns the saved Quote object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/quotes/{id}": - get: - tags: - - quotes - summary: "Show quote" - description: "Displays an Quote by id" - operationId: showQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - put: - tags: - - quotes - summary: "Update quote" - description: "Handles the updating of an Quote by id" - operationId: updateQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - delete: - tags: - - quotes - summary: "Delete quote" - description: "Handles the deletion of an Quote by id" - operationId: deleteQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns a HTTP status" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/quotes/{id}/edit": - get: - tags: - - quotes - summary: "Edit quote" - description: "Displays an Quote by id" - operationId: editQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/quotes/create: - get: - tags: - - quotes - summary: "Blank quote" - description: "Returns a blank object with default values" - operationId: getQuotesCreate - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "A blank Quote object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/quotes/bulk: - post: - tags: - - quotes - summary: "Bulk quote actions" - description: "" - operationId: bulkQuotes - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/index" - requestBody: - description: "Hashed ids" - required: true - content: - application/json: - schema: - type: array - items: - description: "Array of hashed IDs to be bulk 'actioned" - type: integer - example: "[0,1,2,3]" - responses: - 200: - description: "The Quote response" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Quote" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/quotes/{id}/{action}": + "/api/v1/payments/{id}/{action}": get: deprecated: true tags: - - quotes - summary: "Performs a custom action on an Quote" - description: "Performs a custom action on an Quote.\n\n The current range of actions are as follows\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - convert\n - convert_to_invoice\n - email" - operationId: actionQuote + - payments + summary: "Custom payment actions" + description: "Performs a custom action on an Payment.\n\n The current range of actions are as follows\n - clone_to_Payment\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email" + operationId: actionPayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Quote Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11589,7 +11116,7 @@ paths: example: clone_to_quote responses: 200: - description: "Returns the Quote object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11600,7 +11127,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Quote" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11613,61 +11140,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/quote/{invitation_key}/download": - get: - tags: - - quotes - summary: "Download quote PDF" - description: "Downloads a specific quote" - operationId: downloadQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: invitation_key - in: path - description: "The Quote Invitation Key" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the quote pdf" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - "/api/v1/quotes/{id}/upload": + + "/api/v1/payments/{id}/upload": put: tags: - - quotes - summary: "Upload a quote document" - description: "Handles the uploading of a document to a quote" - operationId: uploadQuote + - payments + summary: "Upload a payment document" + description: "Handles the uploading of a document to a payment" + operationId: uploadPayment parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Quote Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11675,7 +11162,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Quote object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11686,7 +11173,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Quote" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -12412,18 +11899,19 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments: + /api/v1/recurring_invoices: get: tags: - - payments - summary: "List payments" - description: "Lists payments, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the payments, these are handled by the PaymentFilters class which defines the methods available" - operationId: getPayments + - Recurring Invoices + summary: "List recurring invoices" + description: | + Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list. + + operationId: getRecurringInvoices parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - - $ref: "#/components/parameters/status" - $ref: "#/components/parameters/client_id" - $ref: "#/components/parameters/created_at" - $ref: "#/components/parameters/updated_at" @@ -12434,8 +11922,6 @@ paths: in: query description: | Searches across a range of columns including: - - amount - - date - custom_value1 - custom_value2 - custom_value3 @@ -12443,15 +11929,19 @@ paths: required: false schema: type: string - example: ?filter=10 - - name: number + example: ?filter=bob + - name: client_status in: query description: | - Search payments by payment number + A comma separated list of invoice status strings. Valid options include: + - all + - active + - paused + - completed required: false schema: type: string - example: ?number=0001 + example: ?client_status=active,paused - name: sort in: query description: Returns the list sorted by column in ascending or descending order. @@ -12461,7 +11951,7 @@ paths: example: id|desc number|desc balance|asc responses: 200: - description: "A list of payments" + description: "A list of recurring_invoices" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12477,7 +11967,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Payment' + $ref: '#/components/schemas/RecurringInvoice' meta: type: object $ref: '#/components/schemas/Meta' @@ -12495,24 +11985,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - payments - summary: "Create payment" - description: "Adds an Payment to the system" - operationId: storePayment + - Recurring Invoices + summary: "Create recurring invoice" + description: "Adds a Recurring Invoice to the system" + operationId: storeRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - requestBody: - description: "The payment request" - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/Payment" responses: 200: - description: "Returns the saved Payment object" + description: "Returns the saved RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12523,7 +12006,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12537,20 +12020,20 @@ paths: default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}": + "/api/v1/recurring_invoices/{id}": get: tags: - - payments - summary: "Show payment" - description: "Displays an Payment by id" - operationId: showPayment + - Recurring Invoices + summary: "Show recurring invoice" + description: "Displays an RecurringInvoice by id" + operationId: showRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12558,7 +12041,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12569,7 +12052,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12584,17 +12067,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - payments - summary: "Update payment" - description: "Handles the updating of an Payment by id" - operationId: updatePayment + - Recurring Invoices + summary: "Update recurring invoice" + description: "Handles the updating of an RecurringInvoice by id" + operationId: updateRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12602,7 +12085,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12613,7 +12096,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12628,17 +12111,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - payments - summary: "Delete payment" - description: "Handles the deletion of an Payment by id" - operationId: deletePayment + - Recurring Invoices + summary: "Delete recurring invoice" + description: "Handles the deletion of an RecurringInvoice by id" + operationId: deleteRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12666,20 +12149,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}/edit": + "/api/v1/recurring_invoices/{id}/edit": get: tags: - - payments - summary: "Edit payment" - description: "Displays an Payment by id" - operationId: editPayment + - Recurring Invoices + summary: "Edit recurring invoice" + description: "Displays an RecurringInvoice by id" + operationId: editRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12687,7 +12170,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12698,7 +12181,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12711,20 +12194,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments/create: + + /api/v1/recurring_invoices/create: get: tags: - - payments - summary: "Blank payment" + - Recurring Invoices + summary: "Blank recurring invoice" description: "Returns a blank object with default values" - operationId: getPaymentsCreate + operationId: getRecurringInvoicesCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank Payment object" + description: "A blank RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12735,7 +12219,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12748,75 +12232,55 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments/refund: + /api/v1/recurring_invoices/bulk: post: tags: - - payments - summary: "Refund payment" - description: "Adds an Refund to the system" - operationId: storeRefund - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - requestBody: - description: "The refund request" - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/Payment" - responses: - 200: - description: "Returns the saved Payment object" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" - content: - application/json: - schema: - $ref: "#/components/schemas/Payment" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/payments/bulk: - post: - tags: - - payments - summary: "Bulk payment actions" - description: "" - operationId: bulkPayments + - Recurring Invoices + summary: "Bulk recurring invoice actions" + description: | + There are multiple actions that are available including: + + operationId: bulkRecurringInvoices parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/index" requestBody: - description: "User credentials" + description: "Bulk action details" required: true content: application/json: schema: - type: array - items: - description: "Array of hashed IDs to be bulk 'actioned" - type: integer - example: "[0,1,2,3]" + type: object + properties: + action: + type: string + description: | + The action to be performed, options include: + - `start` + Starts (or restarts) the recurring invoice. **note** if the recurring invoice has been stopped for a long time, it will attempt to catch back up firing a new Invoice every hour per interval that has been missed. + If you do not wish to have the recurring invoice catch up, you should set the next_send_date to the correct date you wish the recurring invoice to commence from. + - `stop` + Stops the recurring invoice. + - `send_now` + Force sends the recurring invoice - this option is only available when the recurring invoice is in a draft state. + - `restore` + Restores the recurring invoice from an archived or deleted state. + - `archive` + Archives the recurring invoice. The recurring invoice will not fire in this state. + - `delete` + Deletes a recurring invoice. + ids: + type: array + items: + description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']" + type: string + example: + action: start + ids: "['D2J234DFA','D2J234DFA','D2J234DFA']" responses: 200: - description: "The Payment response" + description: "The RecurringInvoice response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12827,7 +12291,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12840,21 +12304,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}/{action}": + "/api/v1/recurring_invoices/{id}/{action}": get: deprecated: true tags: - - payments - summary: "Custom payment actions" - description: "Performs a custom action on an Payment.\n\n The current range of actions are as follows\n - clone_to_Payment\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email" - operationId: actionPayment + - Recurring Invoices + summary: "Custom recurring invoice action" + description: "Performs a custom action on an RecurringInvoice.\n\n The current range of actions are as follows\n - clone_to_RecurringInvoice\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email" + operationId: actionRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12870,7 +12334,7 @@ paths: example: clone_to_quote responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12881,7 +12345,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12894,21 +12358,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - "/api/v1/payments/{id}/upload": - put: + "/api/v1/recurring_invoice/{invitation_key}/download": + get: tags: - - payments - summary: "Upload a payment document" - description: "Handles the uploading of a document to a payment" - operationId: uploadPayment + - Recurring Invoices + summary: "Download recurring invoice PDF" + description: "Downloads a specific invoice" + operationId: downloadRecurringInvoice parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - - name: id + - name: invitation_key in: path - description: "The Payment Hashed ID" + description: "The Recurring Invoice Invitation Key" required: true schema: type: string @@ -12916,7 +12379,48 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the recurring invoice pdf" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/recurring_invoices/{id}/upload": + put: + tags: + - Recurring Invoices + summary: "Add recurring invoice document" + description: "Handles the uploading of a document to a recurring_invoice" + operationId: uploadRecurringInvoice + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The RecurringInvoice Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12927,7 +12431,536 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/quotes: + get: + tags: + - quotes + summary: "List quotes" + description: "Lists quotes, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the quotes, these are handled by the QuoteFilters class which defines the methods available" + operationId: getQuotes + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - $ref: "#/components/parameters/status" + - $ref: "#/components/parameters/client_id" + - $ref: "#/components/parameters/created_at" + - $ref: "#/components/parameters/updated_at" + - $ref: "#/components/parameters/is_deleted" + - $ref: "#/components/parameters/filter_deleted_clients" + - $ref: "#/components/parameters/vendor_id" + - name: filter + in: query + description: | + Searches across a range of columns including: + - number + - custom_value1 + - custom_value2 + - custom_value3 + - custom_value4 + required: false + schema: + type: string + example: ?filter=bob + - name: client_status + in: query + description: | + A comma separated list of quote status strings. Valid options include: + - all + - draft + - sent + - approved + - expired + - upcoming + required: false + schema: + type: string + example: ?client_status=paid,unpaid + - name: number + in: query + description: | + Search quote by quote number + required: false + schema: + type: string + example: ?number=Q-001 + - name: sort + in: query + description: Returns the list sorted by column in ascending or descending order. + required: false + schema: + type: string + example: id|desc number|desc balance|asc + responses: + 200: + description: "A list of quotes" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Quote' + meta: + type: object + $ref: '#/components/schemas/Meta' + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + post: + tags: + - quotes + summary: "Create quote" + description: "Adds an Quote to the system" + operationId: storeQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "Returns the saved Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/quotes/{id}": + get: + tags: + - quotes + summary: "Show quote" + description: "Displays an Quote by id" + operationId: showQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + put: + tags: + - quotes + summary: "Update quote" + description: "Handles the updating of an Quote by id" + operationId: updateQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + delete: + tags: + - quotes + summary: "Delete quote" + description: "Handles the deletion of an Quote by id" + operationId: deleteQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns a HTTP status" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/quotes/{id}/edit": + get: + tags: + - quotes + summary: "Edit quote" + description: "Displays an Quote by id" + operationId: editQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/quotes/create: + get: + tags: + - quotes + summary: "Blank quote" + description: "Returns a blank object with default values" + operationId: getQuotesCreate + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "A blank Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + /api/v1/quotes/bulk: + post: + tags: + - quotes + summary: "Bulk quote actions" + description: "" + operationId: bulkQuotes + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/index" + requestBody: + description: "Hashed ids" + required: true + content: + application/json: + schema: + type: array + items: + description: "Array of hashed IDs to be bulk 'actioned" + type: integer + example: "[0,1,2,3]" + responses: + 200: + description: "The Quote response" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/quotes/{id}/{action}": + get: + deprecated: true + tags: + - quotes + summary: "Performs a custom action on an Quote" + description: "Performs a custom action on an Quote.\n\n The current range of actions are as follows\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - convert\n - convert_to_invoice\n - email" + operationId: actionQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + - name: action + in: path + description: "The action string to be performed" + required: true + schema: + type: string + format: string + example: clone_to_quote + responses: + 200: + description: "Returns the Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/quote/{invitation_key}/download": + get: + tags: + - quotes + summary: "Download quote PDF" + description: "Downloads a specific quote" + operationId: downloadQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: invitation_key + in: path + description: "The Quote Invitation Key" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the quote pdf" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + 401: + $ref: "#/components/responses/401" + 403: + $ref: "#/components/responses/403" + 422: + $ref: '#/components/responses/422' + 429: + $ref: '#/components/responses/429' + 5XX: + description: 'Server error' + default: + $ref: "#/components/responses/default" + "/api/v1/quotes/{id}/upload": + put: + tags: + - quotes + summary: "Upload a quote document" + description: "Handles the uploading of a document to a quote" + operationId: uploadQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote object" + headers: + X-MINIMUM-CLIENT-VERSION: + $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" + X-RateLimit-Remaining: + $ref: "#/components/headers/X-RateLimit-Remaining" + X-RateLimit-Limit: + $ref: "#/components/headers/X-RateLimit-Limit" + content: + application/json: + schema: + $ref: "#/components/schemas/Quote" 401: $ref: "#/components/responses/401" 403: @@ -13419,13 +13452,13 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks: + /api/v1/vendors: get: tags: - - tasks - summary: "List tasks" - description: "Lists tasks, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the tasks, these are handled by the TaskFilters class which defines the methods available" - operationId: getTasks + - vendors + summary: "List vendors" + description: "Lists vendors, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the vendors, these are handled by the VendorFilters class which defines the methods available" + operationId: getVendors parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" @@ -13433,7 +13466,7 @@ paths: - $ref: "#/components/parameters/index" responses: 200: - description: "A list of tasks" + description: "A list of vendors" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13449,7 +13482,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Task' + $ref: '#/components/schemas/Vendor' meta: type: object $ref: '#/components/schemas/Meta' @@ -13467,17 +13500,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - tasks - summary: "Create task" - description: "Adds an task to a company" - operationId: storeTask + - vendors + summary: "Create vendor" + description: "Adds a vendor to a company" + operationId: storeVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "Returns the saved task object" + description: "Returns the saved clivendorent object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13488,7 +13521,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13501,20 +13534,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}": + "/api/v1/vendors/{id}": get: tags: - - tasks - summary: "Show task" - description: "Displays a task by id" - operationId: showTask + - vendors + summary: "Show vendor" + description: "Displays a vendor by id" + operationId: showVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Task Hashed ID" + description: "The vendor Hashed ID" required: true schema: type: string @@ -13522,7 +13555,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the task object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13533,7 +13566,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13548,17 +13581,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - tasks - summary: "Update task" - description: "Handles the updating of a task by id" - operationId: updateTask + - vendors + summary: "Update vendor" + description: "Handles the updating of a vendor by id" + operationId: updateVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13566,7 +13599,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the task object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13577,7 +13610,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13592,17 +13625,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - tasks - summary: "Delete task" - description: "Handles the deletion of a task by id" - operationId: deleteTask + - vendors + summary: "Delete vendor" + description: "Handles the deletion of a vendor by id" + operationId: deleteVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13630,20 +13663,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}/edit": + "/api/v1/vendors/{id}/edit": get: tags: - - tasks - summary: "Edit task" - description: "Displays a task by id" - operationId: editTask + - vendors + summary: "Edit vendor" + description: "Displays a vendor by id" + operationId: editVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13651,7 +13684,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the client object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13662,7 +13695,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13675,20 +13708,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks/create: + /api/v1/vendors/create: get: tags: - - tasks - summary: "Blank task" - description: "Returns a blank task with default values" - operationId: getTasksCreate + - vendors + summary: "Blank vendor" + description: "Returns a blank vendor with default values" + operationId: getVendorsCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank task object" + description: "A blank vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13699,7 +13732,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13712,13 +13745,13 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks/bulk: + /api/v1/vendors/bulk: post: tags: - - tasks - summary: "Bulk task actions" + - vendors + summary: "Bulk vendor actions" description: "" - operationId: bulkTasks + operationId: bulkVendors parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" @@ -13736,7 +13769,7 @@ paths: example: "[0,1,2,3]" responses: 200: - description: "The Task User response" + description: "The Vendor User response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13747,7 +13780,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13760,20 +13793,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}/upload": + "/api/v1/vendors/{id}/upload": put: tags: - - tasks - summary: "Uploads a task document" - description: "Handles the uploading of a document to a task" - operationId: uploadTask + - vendors + summary: "Uploads a vendor document" + description: "Handles the uploading of a document to a vendor" + operationId: uploadVendor parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" - name: id in: path - description: "The Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13781,7 +13814,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Task object" + description: "Returns the Vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13792,40 +13825,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" - 401: - $ref: "#/components/responses/401" - 403: - $ref: "#/components/responses/403" - 422: - $ref: '#/components/responses/422' - 429: - $ref: '#/components/responses/429' - 5XX: - description: 'Server error' - default: - $ref: "#/components/responses/default" - /api/v1/tasks/sort: - post: - tags: - - tasks - summary: "Sort tasks on KanBan" - description: "Sorts tasks after drag and drop on the KanBan." - operationId: sortTasks - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "Returns an Ok, 200 HTTP status" - headers: - X-MINIMUM-CLIENT-VERSION: - $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" - X-RateLimit-Remaining: - $ref: "#/components/headers/X-RateLimit-Remaining" - X-RateLimit-Limit: - $ref: "#/components/headers/X-RateLimit-Limit" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13931,43 +13931,43 @@ components: - last: https://invoicing.co/api/v1/invoices?page=1 - prev: null - next: null - 403: - description: 'Authorization error' - content: - application/json: - schema: - $ref: '#components/schemas/AuthorizationError' - - default: - description: 'Unexpected Error' - content: - application/json: - schema: - $ref: '#/components/schemas/Error' 429: description: 'Rate Limit Exceeded' content: application/json: schema: $ref: '#/components/schemas/RateLimiterError' + + 403: + description: 'Authorization error' + content: + application/json: + schema: + $ref: '#components/schemas/AuthorizationError' 422: description: 'Validation error' content: application/json: schema: $ref: '#/components/schemas/ValidationError' - 401: - description: 'Authentication error' + default: + description: 'Unexpected Error' content: application/json: schema: - $ref: '#components/schemas/AuthenticationError' + $ref: '#/components/schemas/Error' 400: description: 'Invalid user input' content: application/json: schema: $ref: '#components/schemas/InvalidInputError' + 401: + description: 'Authentication error' + content: + application/json: + schema: + $ref: '#components/schemas/AuthenticationError' parameters: X-API-SECRET: name: X-API-SECRET @@ -14543,243 +14543,194 @@ components: type: string example: JSON type: object - Credit: + Product: + type: object properties: id: - description: "The unique hashed ID of the credit" + type: string + description: 'The hashed product ID.' + example: eP01N + readOnly: true + company_id: + type: string + description: 'The hashed ID of the company that owns this product.' + example: eP01N + readOnly: true + user_id: + type: string + description: 'The hashed ID of the user that created this product.' + example: n30m4 + readOnly: true + assigned_user_id: + type: string + description: 'The hashed ID of the user assigned to this product.' + example: pR0j3 + project_id: + type: string + description: 'The hashed ID of the project that this product is associated with.' + example: pR0j3 + vendor_id: + type: string + description: 'The hashed ID of the vendor that this product is associated with.' + example: pR0j3 + custom_value1: + type: string + description: 'Custom value field 1.' + example: 'Custom value 1' + custom_value2: + type: string + description: 'Custom value field 2.' + example: 'Custom value 2' + custom_value3: + type: string + description: 'Custom value field 3.' + example: 'Custom value 3' + custom_value4: + type: string + description: 'Custom value field 4.' + example: 'Custom value 4' + product_key: + type: string + description: 'The product key.' + example: '1234' + notes: + type: string + description: 'Notes about the product.' + example: 'These are some notes about the product.' + cost: + type: number + format: double + description: 'The cost of the product. (Your purchase price for this product)' + example: 10.0 + price: + type: number + format: double + description: 'The price of the product that you are charging.' + example: 20.0 + quantity: + type: number + format: double + description: 'The quantity of the product. (used as a default)' + example: 5.0 + tax_name1: + type: string + description: 'The name of tax 1.' + example: 'Tax 1' + tax_rate1: + type: number + format: double + description: 'The rate of tax 1.' + example: 10.0 + tax_name2: + type: string + description: 'The name of tax 2.' + example: 'Tax 2' + tax_rate2: + type: number + format: double + description: 'The rate of tax 2.' + example: 5.0 + tax_name3: + type: string + description: 'The name of tax 3.' + example: 'Tax 3' + tax_rate3: + type: number + format: double + description: 'The rate of tax 3.' + example: 0.0 + archived_at: + type: integer + format: timestamp + description: 'The timestamp when the product was archived.' + example: '2022-03-18T15:00:00Z' + readOnly: true + created_at: + type: integer + format: timestamp + description: 'The timestamp when the product was created.' + example: '2022-03-18T15:00:00Z' + readOnly: true + updated_at: + description: Timestamp + type: integer + format: timestamp + example: '2022-03-18T12:34:56.789Z' + readOnly: true + is_deleted: + type: boolean + description: 'Boolean flag determining if the product has been deleted' + example: false + readOnly: true + in_stock_quantity: + type: integer + format: int32 + description: The quantity of the product that is currently in stock + default: 0 + stock_notification: + type: boolean + description: Indicates whether stock notifications are enabled for this product + default: true + stock_notification_threshold: + type: integer + format: int32 + description: The minimum quantity threshold for which stock notifications will be triggered + default: 0 + max_quantity: + type: integer + format: int32 + description: The maximum quantity that can be ordered for this product + product_image: + type: string + description: The URL of the product image + format: uri-reference + tax_id: + type: string + default: '1' + description: | + The tax category id for this product.' + + The following constants are available (default = '1') + + ``` + PRODUCT_TYPE_PHYSICAL = '1' + PRODUCT_TYPE_SERVICE = '2' + PRODUCT_TYPE_DIGITAL = '3' + PRODUCT_TYPE_SHIPPING = '4' + PRODUCT_TYPE_EXEMPT = '5' + PRODUCT_TYPE_REDUCED_TAX = '6' + PRODUCT_TYPE_OVERRIDE_TAX = '7' + PRODUCT_TYPE_ZERO_RATED = '8' + PRODUCT_TYPE_REVERSE_TAX = '9' + ``` + example: '1' + + ExpenseCategory: + properties: + id: + description: 'The expense hashed id' type: string example: Opnel5aKBz + name: + description: 'The expense category name' + type: string + example: Accounting user_id: - description: "The unique hashed ID of the user associated with the credit" + description: 'The user hashed id' type: string - example: 1a2b3c4d5e - assigned_user_id: - description: "The unique hashed ID of the assigned user responsible for the credit" - type: string - example: 6f7g8h9i0j - company_id: - description: "The unique hashed ID of the company associated with the credit" - type: string - example: k1l2m3n4o5 - client_id: - description: "The unique hashed ID of the client associated with the credit" - type: string - example: p1q2r3s4t5 - status_id: - description: "The ID representing the current status of the credit" - type: string - example: 3 - invoice_id: - description: "The unique hashed ID of the linked invoice to which the credit is applied" - type: string - example: u1v2w3x4y5 - number: - description: "The unique alphanumeric credit number per company" - type: string - example: QUOTE_101 - po_number: - description: "The purchase order number referred to by the credit" - type: string - example: PO_12345 - terms: - description: "The terms associated with the credit" - type: string - example: "Net 30" - public_notes: - description: "Public notes for the credit" - type: string - example: "Thank you for your business." - private_notes: - description: "Private notes for internal use, not visible to the client" - type: string - example: "Client is requesting a discount." - footer: - description: "The footer text for the credit" - type: string - example: "Footer text goes here." - custom_value1: - description: "Custom value 1 for additional credit information" - type: string - example: "Custom data 1" - custom_value2: - description: "Custom value 2 for additional credit information" - type: string - example: "Custom data 2" - custom_value3: - description: "Custom value 3 for additional credit information" - type: string - example: "Custom data 3" - custom_value4: - description: "Custom value 4 for additional credit information" - type: string - example: "Custom data 4" - tax_name1: - description: "The name of the first tax applied to the credit" - type: string - example: "VAT" - tax_name2: - description: "The name of the second tax applied to the credit" - type: string - example: "GST" - tax_rate1: - description: "The rate of the first tax applied to the credit" - type: number - format: float - example: 10.00 - tax_rate2: - description: "The rate of the second tax applied to the credit" - type: number - format: float - example: 5.00 - tax_name3: - description: "The name of the third tax applied to the credit" - type: string - example: "PST" - tax_rate3: - description: "The rate of the third tax applied to the credit" - type: number - format: float - example: 8.00 - total_taxes: - description: "The total amount of taxes for the credit" - type: number - format: float - example: 23.00 - line_items: - type: array - description: 'An array of objects which define the line items of the credit' - items: - $ref: '#/components/schemas/InvoiceItem' - amount: - description: "The total amount of the credit" - type: number - format: float - example: 100.00 - balance: - description: "The outstanding balance of the credit" - type: number - format: float - example: 50.00 - paid_to_date: - description: "The total amount paid to date for the credit" - type: number - format: float - example: 50.00 - discount: - description: "The discount applied to the credit" - type: number - format: float - example: 10.00 - partial: - description: "The partial amount applied to the credit" - type: number - format: float - example: 20.00 - is_amount_discount: - description: "Indicates whether the discount applied is a fixed amount or a percentage" - type: boolean - example: true + example: XS987sD is_deleted: - description: "Indicates whether the credit has been deleted" - type: boolean - example: false - uses_inclusive_taxes: - description: "Indicates whether the tax rates applied to the credit are inclusive or exclusive" + description: 'Flag determining whether the expense category has been deleted' type: boolean example: true - date: - description: "The date the credit was issued" - type: string - format: date - example: "1994-07-30" - last_sent_date: - description: "The date the credit was last sent out" - type: string - format: date - example: "1994-07-30" - next_send_date: - description: "The next scheduled date for sending a credit reminder" - type: string - format: date - example: "1994-07-30" - partial_due_date: - description: "The due date for the partial amount of the credit" - type: string - format: date - example: "1994-07-30" - due_date: - description: "The due date for the total amount of the credit" - type: string - format: date - example: "1994-07-30" - settings: - $ref: "#/components/schemas/CompanySettings" - last_viewed: - description: "The timestamp of the last time the credit was viewed" - type: number - format: integer - example: 1434342123 updated_at: - description: "The timestamp of the last time the credit was updated" - type: number - format: integer - example: 1434342123 - archived_at: - description: "The timestamp of the last time the credit was archived" - type: number - format: integer - example: 1434342123 - custom_surcharge1: - description: "First custom surcharge amount" - type: number - format: float - example: 10.00 - custom_surcharge2: - description: 'Second Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge3: - description: 'Third Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge4: - description: 'Fourth Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge_tax1: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - type: object - - GenericBulkAction: - properties: - action: - type: string - example: archive - description: 'The action to perform ie. archive / restore / delete' - ids: - type: array - items: - format: string - type: string - example: 2J234DFA,D2J234DFA,D2J234DFA - description: string array of client hashed ids + description: 'The updated at timestamp' + type: integer + example: '2' + created_at: + description: 'The created at timestamp' + type: integer + example: '2' type: object ProductRequest: type: object @@ -14941,1411 +14892,228 @@ components: ``` example: '1' - CompanyLedger: + CompanyToken: properties: - entity_id: - description: 'This field will reference one of the following entity hashed ID payment_id, invoice_id or credit_id' + name: + description: 'The token name' + type: string + example: 'Token Name' + token: + description: 'The token value' + type: string + example: AS3df3jUUH765fhfd9KJuidj3JShjA + is_system: + description: 'Determines whether the token is created by the system rather than a user' + type: boolean + example: 'true' + type: object + Document: + properties: + id: + description: 'The document hashed id' type: string example: AS3df3A - notes: - description: 'The notes which reference this entry of the ledger' + user_id: + description: 'The user hashed id' type: string - example: 'Credit note for invoice #3212' - balance: - description: 'The client balance' - type: number - format: float - example: '10.00' - adjustment: - description: 'The amount the client balance is adjusted by' - type: number - format: float - example: '10.00' - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' + example: '' + assigned_user_id: + description: 'The assigned user hashed id' + type: string + example: '' + project_id: + description: 'The project associated with this document' + type: string + example: '' + vendor_id: + description: 'The vendor associated with this documents' + type: string + example: '' + name: + description: 'The document name' + type: string + example: Beauty + url: + description: 'The document url' + type: string + example: Beauty + preview: + description: 'The document preview url' + type: string + example: Beauty + type: + description: 'The document type' + type: string + example: Beauty + disk: + description: 'The document disk' + type: string + example: Beauty + hash: + description: 'The document hashed' + type: string + example: Beauty + is_deleted: + description: 'Flag to determine if the document is deleted' + type: boolean + example: true + is_default: + description: 'Flag to determine if the document is a default doc' + type: boolean + example: true created_at: description: Timestamp type: number format: integer - example: '1434342123' - type: object - Invoice: - properties: - id: - description: 'The invoice hashed id' - type: string - example: Opnel5aKBz - readOnly: true - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - readOnly: true - assigned_user_id: - description: 'The assigned user hashed id' - type: string - example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true - client_id: - description: 'The client hashed id' - type: string - example: Opnel5aKBz - status_id: - description: 'The invoice status variable' - type: string - example: '4' - number: - description: 'The invoice number - is a unique alpha numeric number per invoice per company' - type: string - example: INV_101 - po_number: - description: 'The purchase order associated with this invoice' - type: string - example: PO-1234 - terms: - description: 'The invoice terms' - type: string - example: 'These are invoice terms' - public_notes: - description: 'The public notes of the invoice' - type: string - example: 'These are some public notes' - private_notes: - description: 'The private notes of the invoice' - type: string - example: 'These are some private notes' - footer: - description: 'The invoice footer notes' - type: string - example: '' - custom_value1: - description: 'A custom field value' - type: string - example: '2022-10-01' - custom_value2: - description: 'A custom field value' - type: string - example: 'Something custom' - custom_value3: - description: 'A custom field value' - type: string - example: '' - custom_value4: - description: 'A custom field value' - type: string - example: '' - tax_name1: - description: 'The tax name' - type: string - example: '' - tax_name2: - description: 'The tax name' - type: string - example: '' - tax_rate1: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_rate2: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_name3: - description: 'The tax name' - type: string - example: '' - tax_rate3: - description: 'The tax rate' - type: number - format: float - example: '10.00' - total_taxes: - description: 'The total taxes for the invoice' - type: number - format: float - example: '10.00' - line_items: - type: array - description: 'An array of objects which define the line items of the invoice' - items: - $ref: '#/components/schemas/InvoiceItem' - invitations: - type: array - description: 'An array of objects which define the invitations of the invoice' - items: - $ref: '#/components/schemas/InvoiceInvitation' - amount: - description: 'The invoice amount' - type: number - format: float - example: '10.00' - balance: - description: 'The invoice balance' - type: number - format: float - example: '10.00' - paid_to_date: - description: 'The amount paid on the invoice to date' - type: number - format: float - example: '10.00' - discount: - description: 'The invoice discount, can be an amount or a percentage' - type: number - format: float - example: '10.00' - partial: - description: 'The deposit/partial amount' - type: number - format: float - example: '10.00' - is_amount_discount: - description: 'Flag determining if the discount is an amount or a percentage' - type: boolean - example: true - is_deleted: - description: 'Defines if the invoice has been deleted' - type: boolean - example: true - uses_inclusive_taxes: - description: 'Defines the type of taxes used as either inclusive or exclusive' - type: boolean - example: true - date: - description: 'The Invoice Date' - type: string - format: date - example: '1994-07-30' - last_sent_date: - description: 'The last date the invoice was sent out' - type: string - format: date - example: '1994-07-30' - next_send_date: - description: 'The Next date for a reminder to be sent' - type: string - format: date - example: '1994-07-30' - partial_due_date: - description: 'The due date for the deposit/partial amount' - type: string - format: date - example: '1994-07-30' - due_date: - description: 'The due date of the invoice' - type: string - format: date - example: '1994-07-30' - last_viewed: - description: Timestamp - type: number - format: integer - example: '1434342123' + example: '134341234234' updated_at: description: Timestamp type: number format: integer - example: '1434342123' - archived_at: + example: '134341234234' + deleted_at: description: Timestamp type: number format: integer - example: '1434342123' - custom_surcharge1: - description: 'First Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge2: - description: 'Second Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge3: - description: 'Third Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge4: - description: 'Fourth Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge_tax1: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - project_id: - description: 'The project associated with this invoice' - type: string - example: Opnel5aKBz - auto_bill_tries: - description: 'The number of times the invoice has attempted to be auto billed' - type: integer - example: '1' - readOnly: true - auto_bill_enabled: - description: 'Boolean flag determining if the invoice is set to auto bill' - type: boolean - example: true - subscription_id: - description: 'The subscription associated with this invoice' - type: string - example: Opnel5aKBz - + example: '134341234234' type: object - Company: + Payment: properties: id: - description: "The unique hashed identifier for the company" - type: string - example: WJxbojagwO - size_id: - description: "The unique identifier representing the company's size category" - type: string - example: '2' - industry_id: - description: "The unique identifier representing the company's industry category" - type: string - example: '5' - slack_webhook_url: - description: "The URL for the company's Slack webhook notifications" - type: string - example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' - google_analytics_key: - description: "The company's Google Analytics tracking ID" - type: string - example: 'UA-123456789-1' - portal_mode: - description: "The mode determining how client-facing URLs are structured (e.g., subdomain, domain, or iframe)" - type: string - example: subdomain - subdomain: - description: "The subdomain prefix for the company's domain (e.g., 'acme' in acme.domain.com)" - type: string - example: acme - portal_domain: - description: "The fully qualified domain used for client-facing URLs" - type: string - example: 'https://subdomain.invoicing.co' - enabled_tax_rates: - description: "The number of tax rates used per entity" - type: integer - example: '2' - fill_products: - description: "A flag determining whether to auto-fill product descriptions based on the product key" - type: boolean - example: true - convert_products: - description: "A flag determining whether to convert products between different types or units" - type: boolean - example: true - update_products: - description: "A flag determining whether to update product descriptions when the description changes" - type: boolean - example: true - show_product_details: - description: "A flag determining whether to display product details in the user interface" - type: boolean - example: true - show_product_cost: - description: "A flag determining whether to display product cost is shown in the user interface" - type: boolean - example: true - custom_fields: - description: "A mapping of custom fields for various objects within the company" - type: object - enable_product_cost: - description: "A flag determining whether to show or hide the product cost field in the user interface" - type: boolean - example: true - enable_product_quantity: - description: "A flag determining whether to show or hide the product quantity field in the user interface" - type: boolean - example: true - default_quantity: - description: "A flag determining whether to use a default quantity for products" - type: boolean - example: true - custom_surcharge_taxes1: - description: "A flag determining whether to apply taxes on custom surcharge amounts for the first custom surcharge field" - type: boolean - example: true - custom_surcharge_taxes2: - description: "A flag determining whether to apply taxes on custom surcharge amounts for the second custom surcharge field" - type: boolean - example: true - custom_surcharge_taxes3: - description: "A flag determining whether to apply taxes on custom surcharge amounts for the third custom surcharge field" - type: boolean - example: true - custom_surcharge_taxes4: - description: "A flag determining whether to apply taxes on custom surcharge amounts for the fourth custom" - logo: - description: "The company logo file in binary format" - type: string - format: binary - example: logo.png - company_key: - description: "The static company key hash used to identify the Company" - readOnly: true - type: string - example: "Vnb14bRlwiFjc5ckte6cfbygTRkn5IMQ" - client_can_register: - description: "A flag determining whether clients can register for the client portal" - type: boolean - example: true - enabled_modules: - type: integer - description: | - Bitmask representation of the modules that are enabled in the application - - ``` - self::ENTITY_RECURRING_INVOICE => 1, - self::ENTITY_CREDIT => 2, - self::ENTITY_QUOTE => 4, - self::ENTITY_TASK => 8, - self::ENTITY_EXPENSE => 16, - self::ENTITY_PROJECT => 32, - self::ENTITY_VENDOR => 64, - self::ENTITY_TICKET => 128, - self::ENTITY_PROPOSAL => 256, - self::ENTITY_RECURRING_EXPENSE => 512, - self::ENTITY_RECURRING_TASK => 1024, - self::ENTITY_RECURRING_QUOTE => 2048, - ``` - - The default per_page value is 20. - - example: 2048 - db: - readOnly: true - type: string - example: 'db-ninja-01' - first_day_of_week: - description: "The first day of the week for the company" - type: string - example: '1' - first_month_of_year: - description: "The first month for the company financial year" - type: string - example: '1' - enabled_item_tax_rates: - description: "The number of tax rates used per item" - type: integer - example: 2 - is_large: - description: "A flag determining whether the company is considered large" - type: boolean - example: true - default_auto_bill: - type: enum - example: 'always' - description: | - A flag determining whether to auto-bill clients by default - - values: - - - always - Always auto bill - - disabled - Never auto bill - - optin - Allow the client to select their auto bill status with the default being disabled - - optout -Allow the client to select their auto bill status with the default being enabled - mark_expenses_invoiceable: - description: "A flag determining whether to mark expenses as invoiceable by default" - type: boolean - example: true - mark_expenses_paid: - description: "A flag determining whether to mark expenses as paid by default" - type: boolean - example: true - invoice_expense_documents: - description: "A flag determining whether to include expense documents on invoices by default" - type: boolean - example: true - auto_start_tasks: - description: "A flag determining whether to auto-start tasks by default" - type: boolean - example: true - invoice_task_timelog: - description: "A flag determining whether to include task time logs on invoices by default" - type: boolean - example: true - invoice_task_documents: - description: "A flag determining whether to include task documents on invoices by default" - type: boolean - example: true - show_tasks_table: - description: "A flag determining whether to show the tasks table on invoices by default" - type: boolean - example: true - is_disabled: - description: "A flag determining whether the company is disabled" - type: boolean - example: true - default_task_is_date_based: - description: "A flag determining whether to default tasks to be date-based" - type: boolean - example: true - enable_product_discount: - description: "A flag determining whether to show or hide the product discount field in the user interface" - type: boolean - example: true - calculate_expense_tax_by_amount: - description: "A flag determining whether to calculate expense taxes by amount" - type: boolean - example: true - expense_inclusive_taxes: - description: "A flag determining whether to include taxes in the expense amount" - type: boolean - example: true - session_timeout: - description: "The session timeout for the company" - type: integer - example: 60 - oauth_password_required: - description: "A flag determining whether to require a password for `dangerous` actions when using OAuth" - type: boolean - example: true - invoice_task_datelog: - description: "A flag determining whether to include task date logs on invoices by default" - type: boolean - example: true - default_password_timeout: - description: "The default password timeout for the company" - type: integer - example: 60 - show_task_end_date: - description: "A flag determining whether to show the task end date on invoices by default" - type: boolean - example: true - markdown_enabled: - description: "A flag determining whether markdown is enabled for the company" - type: boolean - example: true - report_include_drafts: - description: "A flag determining whether to include draft invoices in reports" - type: boolean - example: true - client_registration_fields: - description: "The client registration fields for the company" - type: object - stop_on_unpaid_recurring: - description: "A flag determining whether to stop recurring invoices when they are unpaid" - type: boolean - example: true - use_quote_terms_on_conversion: - description: "A flag determining whether to use quote terms on conversion to an invoice" - type: boolean - example: true - enable_applying_payments: - description: "A flag determining whether to enable applying payments to invoices" - type: boolean - example: true - track_inventory: - description: "A flag determining whether to track inventory for the company" - type: boolean - example: true - inventory_notification_threshold: - description: "The inventory notification threshold for the company" - type: integer - example: 60 - stock_notification: - description: "A flag determining whether to send stock notifications for the company" - type: boolean - example: true - matomo_url: - description: "The Matomo URL for the company" - type: string - example: 'https://matomo.example.com' - matomo_id: - description: "The Matomo ID for the company" - type: string - example: '1' - enabled_expense_tax_rates: - description: "The number of tax rates used per expense" - type: integer - example: 2 - invoice_task_project: - description: "A flag determining whether to include the project on invoices by default" - type: boolean - example: true - report_include_deleted: - description: "A flag determining whether to include deleted invoices in reports" - type: boolean - example: true - invoice_task_lock: - description: "A flag determining whether to lock tasks when invoiced" - type: boolean - example: true - convert_payment_currency: - description: "A flag determining whether to convert the payment currency" - type: boolean - example: true - convert_expense_currency: - description: "A flag determining whether to convert the expense currency" - type: boolean - example: true - notify_vendor_when_paid: - description: "A flag determining whether to notify the vendor when an expense is paid" - type: boolean - example: true - invoice_task_hours: - description: "A flag determining whether to include the task hours on invoices by default" - type: boolean - example: true - calculate_taxes: - description: "A flag determining whether to calculate taxes for the company" - type: boolean - example: true - tax_data: - description: "The tax data for the company" - type: object - e_invoice_certificate: - description: "The e-invoice certificate for the company" - type: string - example: '-----BEGIN CERTIFICATE-----' - e_invoice_certificate_passphrase: - description: "The e-invoice certificate passphrase for the company" - type: string - example: 'secret' - origin_tax_data: - description: "The origin tax data for the company" - type: object - invoice_task_project_header: - description: "A flag determining whether to include the project header on invoices by default" - type: boolean - example: true - invoice_task_item_description: - description: "A flag determining whether to include the item description on invoices by default" - type: boolean - example: true - - settings: - $ref: '#/components/schemas/CompanySettings' - type: object - InvoiceRequest: - required: - - client_id - properties: - id: - description: 'The invoice hashed id' + description: 'The payment hashed id' type: string example: Opnel5aKBz - readOnly: true - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The assigned user hashed id' - type: string - example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true client_id: description: 'The client hashed id' type: string example: Opnel5aKBz - status_id: - description: 'The invoice status variable' - type: string - example: '4' - readOnly: true - number: - description: 'The invoice number - is a unique alpha numeric number per invoice per company' - type: string - example: INV_101 - po_number: - description: 'The purchase order associated with this invoice' - type: string - example: PO-1234 - terms: - description: 'The invoice terms' - type: string - example: 'These are invoice terms' - public_notes: - description: 'The public notes of the invoice' - type: string - example: 'These are some public notes' - private_notes: - description: 'The private notes of the invoice' - type: string - example: 'These are some private notes' - footer: - description: 'The invoice footer notes' - type: string - example: '' - custom_value1: - description: 'A custom field value' - type: string - example: '2022-10-01' - custom_value2: - description: 'A custom field value' - type: string - example: 'Something custom' - custom_value3: - description: 'A custom field value' - type: string - example: '' - custom_value4: - description: 'A custom field value' - type: string - example: '' - tax_name1: - description: 'The tax name' - type: string - example: '' - tax_name2: - description: 'The tax name' - type: string - example: '' - tax_rate1: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_rate2: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_name3: - description: 'The tax name' - type: string - example: '' - tax_rate3: - description: 'The tax rate' - type: number - format: float - example: '10.00' - total_taxes: - description: 'The total taxes for the invoice' - type: number - format: float - example: '10.00' - readOnly: - line_items: - type: array - description: 'An array of objects which define the line items of the invoice' - items: - $ref: '#/components/schemas/InvoiceItem' - invitations: - type: array - description: 'An array of objects which define the invitations of the invoice' - items: - $ref: '#/components/schemas/InvoiceInvitationRequest' - amount: - description: 'The invoice amount' - type: number - format: float - example: '10.00' - readOnly: true - balance: - description: 'The invoice balance' - type: number - format: float - example: '10.00' - readOnly: true - paid_to_date: - description: 'The amount paid on the invoice to date' - type: number - format: float - example: '10.00' - readOnly: true - discount: - description: 'The invoice discount, can be an amount or a percentage' - type: number - format: float - example: '10.00' - partial: - description: 'The deposit/partial amount' - type: number - format: float - example: '10.00' - is_amount_discount: - description: 'Flag determining if the discount is an amount or a percentage' - type: boolean - example: true - is_deleted: - description: 'Defines if the invoice has been deleted' - type: boolean - example: true - readOnly: true - uses_inclusive_taxes: - description: 'Defines the type of taxes used as either inclusive or exclusive' - type: boolean - example: true - date: - description: 'The Invoice Date' - type: string - format: date - example: '1994-07-30' - last_sent_date: - description: 'The last date the invoice was sent out' - type: string - format: date - example: '1994-07-30' - readOnly: true - next_send_date: - description: 'The Next date for a reminder to be sent' - type: string - format: date - example: '1994-07-30' - readOnly: true - partial_due_date: - description: 'The due date for the deposit/partial amount' - type: string - format: date - example: '1994-07-30' - due_date: - description: 'The due date of the invoice' - type: string - format: date - example: '1994-07-30' - last_viewed: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - custom_surcharge1: - description: 'First Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge2: - description: 'Second Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge3: - description: 'Third Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge4: - description: 'Fourth Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge_tax1: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - project_id: - description: 'The project associated with this invoice' + invitation_id: + description: 'The invitation hashed id' type: string example: Opnel5aKBz - type: object - SystemLog: - properties: - id: - description: 'The account hashed id' + client_contact_id: + description: 'The client contact hashed id' type: string - example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A + example: Opnel5aKBz user_id: - description: 'The user_id hashed id' + description: 'The user hashed id' type: string - example: AS3df3A - client_id: - description: 'The client_id hashed id' - type: string - example: AS3df3A - event_id: - description: 'The Log Type ID' - type: integer - example: 1 - category_id: - description: 'The Category Type ID' - type: integer - example: 1 + example: Opnel5aKBz type_id: - description: 'The Type Type ID' - type: integer - example: 1 - log: - description: 'The json object of the error' - type: object - example: '{''key'':''value''}' - updated_at: - description: Timestamp + description: 'The Payment Type ID' type: string - example: '2' - created_at: - description: Timestamp + example: '1' + date: + description: 'The Payment date' type: string - example: '2' - type: object - Expense: - properties: - id: - description: 'The expense hashed id' + example: 1-1-2014 + transaction_reference: + description: 'The transaction reference as defined by the payment gateway' type: string - example: Opnel5aKBz - user_id: - description: 'The user hashed id' - type: string - example: '' + example: xcsSxcs124asd assigned_user_id: description: 'The assigned user hashed id' type: string - example: '' - company_id: - description: 'The company hashed id' - type: string - example: '' - client_id: - description: 'The client hashed id' - type: string - example: '' - invoice_id: - description: 'The related invoice hashed id' - type: string - example: '' - bank_id: - description: 'The bank id related to this expense' - type: string - example: '' - invoice_currency_id: - description: 'The currency id of the related invoice' - type: string - example: '' - expense_currency_id: - description: 'The currency id of the expense' - type: string - example: '' - invoice_category_id: - description: 'The invoice category id' - type: string - example: '' - payment_type_id: - description: 'The payment type id' - type: string - example: '' - recurring_expense_id: - description: 'The related recurring expense this expense was created from' - type: string - example: '' + example: Opnel5aKBz private_notes: - description: 'The private notes of the expense' + description: 'The private notes of the payment' type: string - example: '' - public_notes: - description: 'The public notes of the expense' - type: string - example: '' - transaction_reference: - description: 'The transaction references of the expense' - type: string - example: '' - transcation_id: - description: 'The transaction id of the expense' - type: string - example: '' - custom_value1: - description: 'A custom value' - type: string - example: '' - custom_value2: - description: 'A custom value' - type: string - example: '' - custom_value3: - description: 'A custom value' - type: string - example: '' - custom_value4: - description: 'A custom value' - type: string - example: '' - tax_name1: - description: 'Tax name' - type: string - example: '' - tax_name2: - description: 'Tax name' - type: string - example: '' - tax_rate1: - description: 'Tax rate' - type: number - format: float - example: '10.00' - tax_rate2: - description: 'Tax rate' - type: number - format: float - example: '10.00' - tax_name3: - description: 'Tax name' - type: string - example: '' - tax_rate3: - description: 'Tax rate' - type: number - format: float - example: '10.00' - amount: - description: 'The total expense amont' - type: number - format: float - example: '10.00' - foreign_amount: - description: 'The total foreign amount of the expense' - type: number - format: float - example: '10.00' - exchange_rate: - description: 'The exchange rate at the time of the expense' - type: number - format: float - example: '0.80' - date: - description: 'The expense date formate Y-m-d' - type: string - example: '2022-12-01' - payment_date: - description: 'The date of payment for the expense, format Y-m-d' - type: string - example: '' - should_be_invoiced: - description: 'Flag whether the expense should be invoiced' + example: 'The payment was refunded due to error' + is_manual: + description: 'Flags whether the payment was made manually or processed via a gateway' type: boolean example: true is_deleted: - description: 'Boolean determining whether the expense has been deleted' + description: 'Defines if the payment has been deleted' type: boolean example: true - invoice_documents: - description: 'Passing the expense documents over to the invoice' - type: boolean - example: true - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - type: object - BankTransaction: - properties: - id: - description: 'The bank integration hashed id' - type: string - example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A - user_id: - description: 'The user hashed id' - type: string - example: AS3df3A - transaction_id: - description: 'The id of the transaction rule' - type: integer - example: 343434 amount: - description: 'The transaction amount' + description: 'The amount of this payment' type: number example: 10 - currency_id: - description: 'The currency ID of the currency' + refunded: + description: 'The refunded amount of this payment' + type: number + example: 10 + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + company_gateway_id: + description: 'The company gateway id' type: string - example: '1' - account_type: - description: 'The account type' + example: '3' + paymentables: + $ref: '#/components/schemas/Paymentable' + invoices: + description: '' + type: array + items: + $ref: '#/components/schemas/InvoicePaymentable' + credits: + description: '' + type: array + items: + $ref: '#/components/schemas/CreditPaymentable' + number: + description: 'The payment number - is a unique alpha numeric number per payment per company' type: string - example: creditCard - description: - description: 'The description of the transaction' + example: PAY_101 + type: object + + BankTransactionRule: + properties: + id: + description: 'The bank transaction rules hashed id' type: string - example: 'Potato purchases for kevin' - category_id: - description: 'The category id' - type: integer - example: 1 - category_type: - description: 'The category description' + example: AS3df3A + company_id: + description: 'The company hashed id' type: string - example: Expenses - base_type: - description: 'Either CREDIT or DEBIT' + example: AS3df3A + user_id: + description: 'The user hashed id' + type: string + example: AS3df3A + name: + description: 'The name of the transaction' + type: string + example: 'Rule 1' + rules: + description: 'A mapped collection of the sub rules for the BankTransactionRule' + type: array + items: + $ref: '#/components/schemas/BTRules' + auto_convert: + description: 'Flags whether the rule converts the transaction automatically' + type: boolean + example: true + matches_on_all: + description: 'Flags whether all subrules are required for the match' + type: boolean + example: true + applies_to: + description: 'Flags whether the rule applies to a CREDIT or DEBIT' type: string example: CREDIT - date: - description: 'The date of the transaction' - type: string - example: '2022-09-01' - bank_account_id: - description: 'The ID number of the bank account' - type: integer - example: '1' - type: object - ExpenseCategory: - properties: - id: - description: 'The expense hashed id' - type: string - example: Opnel5aKBz - name: - description: 'The expense category name' - type: string - example: Accounting - user_id: - description: 'The user hashed id' - type: string - example: XS987sD - is_deleted: - description: 'Flag determining whether the expense category has been deleted' - type: boolean - example: true - updated_at: - description: 'The updated at timestamp' - type: integer - example: '2' - created_at: - description: 'The created at timestamp' - type: integer - example: '2' - type: object - BankIntegration: - properties: - id: - description: 'The bank integration hashed id' - type: string - example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A - user_id: - description: 'The user hashed id' - type: string - example: AS3df3A - provider_bank_name: - description: 'The providers bank name' - type: string - example: 'Chase Bank' - bank_account_id: - description: 'The bank account id' - type: integer - example: '1233434' - bank_account_name: - description: 'The name of the account' - type: string - example: 'My Checking Acc' - bank_account_number: - description: 'The account number' - type: string - example: '111 234 2332' - bank_account_status: - description: 'The status of the bank account' - type: string - example: ACTIVE - bank_account_type: - description: 'The type of account' - type: string - example: CREDITCARD - balance: - description: 'The current bank balance if available' - type: number - example: '1000000' - currency: - description: 'iso_3166_3 code' - type: string - example: USD - type: object - Subscription: - properties: - id: - description: Unique identifier for the subscription - type: string - example: Opnel5aKBz - user_id: - description: Unique identifier for the user associated with the subscription - type: string - example: Ua6Rw4pVbS - product_id: - description: Unique identifier for the product associated with the subscription - type: string - example: Pr5Ft7yBmC - company_id: - description: Unique identifier for the company associated with the subscription - type: string - example: Co7Vn3yLmW - recurring_invoice_id: - description: Unique identifier for the recurring invoice associated with the subscription - type: string - example: Ri2Yt8zJkP - is_recurring: - description: Indicates whether the subscription is recurring - type: boolean - example: 'true' - frequency_id: - description: 'integer const representation of the frequency' - type: string - example: '1' - auto_bill: - description: 'enum setting' - type: string - example: always - promo_code: - description: Promotional code applied to the subscription - type: string - example: PROMOCODE4U - promo_discount: - description: Discount percentage or amount applied to the subscription - type: number - example: 10 - is_amount_discount: - description: Indicates whether the discount is a fixed amount - type: boolean - example: 'true' - allow_cancellation: - description: Indicates whether the subscription can be cancelled - type: boolean - example: 'true' - per_seat_enabled: - description: Indicates whether the subscription pricing is per seat - type: boolean - example: 'true' - currency_id: - description: Unique identifier for the currency used in the subscription - type: integer - example: '1' - max_seats_limit: - description: Maximum number of seats allowed for the subscription - type: integer - example: '100' - trial_enabled: - description: Indicates whether the subscription has a trial period - type: boolean - example: 'true' - trial_duration: - description: Duration of the trial period in days - type: integer - example: '14' - allow_query_overrides: - description: Indicates whether query overrides are allowed for the subscription - type: boolean - example: 'true' - allow_plan_changes: - description: Indicates whether plan changes are allowed for the subscription - type: boolean - example: 'true' - refund_period: - description: Number of days within which refunds can be requested - type: integer - example: '30' - webhook_configuration: - description: Webhook configuration for the subscription - type: string - example: 'expand reference for this' - is_deleted: - description: Indicates whether the subscription has been deleted - type: boolean - example: 'false' - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - created_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - updated_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - type: object - BulkAction: - type: array - items: - type: integer - example: '[0,1,2,3,]' - FillableInvoice: - properties: - assigned_user_id: - description: "The assigned user's hashed ID" - type: string - example: 'a1b2c3d4' client_id: - description: "The client's hashed ID" + description: 'The client hashed id' type: string - example: 'x1y2z3a4' - number: - description: "The unique alphanumeric invoice number for each invoice per company" + example: AS3df3A + vendor_id: + description: 'The vendor hashed id' type: string - example: INV_101 - po_number: - description: "The purchase order number associated with the invoice" + example: AS3df3A + category_id: + description: 'The category hashed id' type: string - example: 'PO12345' - terms: - description: "The terms and conditions for the invoice" - type: string - example: 'Net 30' - public_notes: - description: "Public notes visible to the client on the invoice" - type: string - example: 'Thank you for your business.' - private_notes: - description: "Private notes for internal use only" - type: string - example: 'Client is a slow payer.' - footer: - description: "The footer text displayed on the invoice" - type: string - example: 'Authorized Signature' - custom_value1: - description: "First custom value for additional information" - type: string - example: 'Project ABC' - custom_value2: - description: "Second custom value for additional information" - type: string - example: 'Department XYZ' - custom_value3: - description: "Third custom value for additional information" - type: string - example: 'Location 123' - custom_value4: - description: "Fourth custom value for additional information" - type: string - example: 'Currency USD' - tax_name1: - description: "Name of the first tax applied to the invoice" - type: string - example: 'VAT' - tax_name2: - description: "Name of the second tax applied to the invoice" - type: string - example: 'GST' - tax_rate1: - description: "Rate of the first tax applied to the invoice" - type: number - example: 10.00 - tax_rate2: - description: "Rate of the second tax applied to the invoice" - type: number - example: 5.00 - tax_name3: - description: "Name of the third tax applied to the invoice" - type: string - example: 'PST' - tax_rate3: - description: "Rate of the third tax applied to the invoice" - type: number - example: 8.00 - line_items: - type: array - description: 'An array of objects which define the line items of the invoice' - items: - $ref: '#/components/schemas/InvoiceItem' - discount: - description: "The discount applied to the invoice" - type: number - example: 10.00 - partial: - description: "The partial amount applied to the invoice" - type: number - example: 20.00 - is_amount_discount: - description: "Indicates whether the discount applied is a fixed amount or a percentage" - type: boolean - example: true - uses_inclusive_taxes: - description: "Indicates whether the tax rates applied to the invoice are inclusive or exclusive" - type: boolean - example: true - date: - description: "The date the invoice was issued" - type: string - example: '1994-07-30' - partial_due_date: - description: "The due date for the partial payment" - type: string - example: '1994-08-15' - due_date: - description: "The due date for the invoice" - type: string - example: '1994-08-30' - custom_surcharge1: - description: "First custom surcharge applied to the invoice" - type: number - example: 10.00 - custom_surcharge2: - description: "Second custom surcharge applied to the invoice" - type: number - example: 15.00 - custom_surcharge3: - description: "Third custom surcharge applied to the invoice" - type: number - example: 5.00 - custom_surcharge4: - description: "Fourth custom surcharge applied to the invoice" - type: number - example: 20.00 + example: AS3df3A type: object RecurringQuote: properties: @@ -16573,1813 +15341,6 @@ components: type: boolean example: true type: object - Paymentable: - properties: - id: - description: 'The paymentable hashed id' - type: string - example: AS3df3A - invoice_id: - description: 'The invoice hashed id' - type: string - example: AS3df3A - credit_id: - description: 'The credit hashed id' - type: string - example: AS3df3A - refunded: - description: 'The amount that has been refunded for this payment' - type: number - format: float - example: '10.00' - amount: - description: 'The amount that has been applied to the payment' - type: number - format: float - example: '10.00' - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - created_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - type: object - Meta: - properties: - pagination: - $ref: '#/components/schemas/Pagination' - Pagination: - type: object - properties: - total: - type: integer - description: 'The total number of items' - example: 1 - readOnly: true - count: - type: integer - description: 'The number of items per page' - example: 1 - readOnly: true - per_page: - type: integer - description: 'The number of items per page' - example: 1 - readOnly: true - current_page: - type: integer - description: 'The current page number' - example: 1 - readOnly: true - total_pages: - type: integer - description: 'The total number of pages' - example: 1 - readOnly: true - links: - type: array - description: 'The pagination links' - readOnly: true - Project: - type: object - properties: - id: - description: 'The project hashed id' - type: string - example: Opnel5aKBz - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - assigned_user_id: - description: The assigned user identifier associated with the project - type: string - example: Opnel5aKBz - client_id: - type: string - example: Opnel5aKBz - description: The client identifier associated with the project - name: - type: string - description: The name of the project - example: 'New Project' - task_rate: - type: number - format: float - example: 10 - description: The default rate per task for the project - due_date: - type: string - format: date - example: '2019-01-01' - description: The due date for the project - private_notes: - type: string - description: Private notes associated with the project - budgeted_hours: - type: number - format: float - description: The number of budgeted hours for the project - custom_value1: - type: string - description: Custom value field 1 - custom_value2: - type: string - description: Custom value field 2 - custom_value3: - type: string - description: Custom value field 3 - custom_value4: - type: string - description: Custom value field 4 - created_at: - type: number - format: integer - example: 134341234234 - description: The timestamp of the project creation - updated_at: - type: number - format: integer - example: 134341234234 - description: The timestamp of the last project update - archived_at: - type: number - format: integer - example: 134341234234 - description: The timestamp of the project deletion - public_notes: - type: string - description: Public notes associated with the project - is_deleted: - type: boolean - description: A flag indicating if the project is deleted - number: - type: string - description: The project number - color: - type: string - description: The color associated with the project - required: - - id - - user_id - - company_id - - name - - task_rate - - budgeted_hours - - is_deleted - - color - - Client: - properties: - id: - description: 'The unique identifier of the client' - type: string - example: Opnel5aKBz - readOnly: true - contacts: - type: array - items: - $ref: '#/components/schemas/ClientContact' - user_id: - description: 'The unique identifier of the user who created the client' - type: string - example: Ua6Rw4pVbS - readOnly: true - assigned_user_id: - description: 'The unique identifier of the user who has been assigned the client' - type: string - example: Ua6Rw4pVbS - company_id: - description: 'The unique identifier of the company the client belongs to' - type: string - example: Co7Vn3yLmW - readOnly: true - name: - description: 'The name of the client company or organization' - type: string - example: "Jim's Housekeeping" - website: - description: 'The website URL of the client company or organization' - type: string - example: 'https://www.jims-housekeeping.com' - private_notes: - description: 'Notes that are only visible to the user who created the client' - type: string - example: 'Client prefers email communication over phone calls' - client_hash: - description: 'A unique hash value for the client' - type: string - example: asdfkjhk342hjhbfdvmnfb1 - readOnly: true - industry_id: - description: 'The unique identifier of the industry the client operates in' - type: number - example: '5' - size_id: - description: 'The unique identifier for the size category of the client company or organization' - type: number - example: '2' - address1: - description: "First line of the client's address" - type: string - example: '123 Main St' - address2: - description: "Second line of the client's address, if needed" - type: string - example: 'Apt 4B' - city: - description: 'The city the client is located in' - type: string - example: 'Beverly Hills' - state: - description: 'The state, province, or locality the client is located in' - type: string - example: 'California' - postal_code: - description: 'The postal code or ZIP code of the client' - type: string - example: '90210' - phone: - description: "The client's phone number" - type: string - example: '555-3434-3434' - country_id: - description: "The unique identifier of the client's country" - type: number - format: integer - example: '1' - custom_value1: - description: 'A custom field for storing additional information' - type: string - example: 'Preferred contact: Email' - custom_value2: - description: 'A custom field for storing additional information' - type: string - example: 'Account manager: John Doe' - custom_value3: - description: 'A custom field for storing additional information' - type: string - example: 'VIP client: Yes' - custom_value4: - description: 'A custom field for storing additional information' - type: string - example: 'Annual contract value: $50,000' - vat_number: - description: "The client's VAT (Value Added Tax) number, if applicable" - type: string - example: 'VAT123456' - id_number: - description: 'A unique identification number for the client, such as a tax ID or business registration number' - type: string - number: - description: 'A system-assigned unique number for the client, typically used for invoicing purposes' - type: string - example: 'CL-0001' - shipping_address1: - description: "First line of the client's shipping address" - type: string - example: '5 Wallaby Way' - shipping_address2: - description: "Second line of the client's shipping address, if needed" - type: string - example: 'Suite 5' - shipping_city: - description: "The city of the client's shipping address" - type: string - example: 'Perth' - shipping_state: - description: "The state, province, or locality of the client's shipping address" - type: string - example: 'Western Australia' - shipping_postal_code: - description: "The postal code or ZIP code of the client's shipping address" - type: string - example: '6110' - shipping_country_id: - description: "The unique identifier of the country for the client's shipping address" - type: number - format: integer - example: '4' - is_deleted: - description: 'A boolean value indicating whether the client has been deleted or not' - type: boolean - example: false - readOnly: true - balance: - description: 'The outstanding balance the client owes' - type: number - format: float - example: '500.00' - readOnly: true - paid_to_date: - description: 'The total amount the client has paid to date' - type: number - format: float - example: '2000.00' - readOnly: true - credit_balance: - description: 'The available credit balance for the client to use on future purchases' - type: number - format: float - example: '100.00' - readOnly: true - last_login: - description: "The timestamp of the client's last login" - type: number - format: integer - example: '1628686031' - readOnly: true - created_at: - description: 'The timestamp when the client was created' - type: number - format: integer - example: '1617629031' - readOnly: true - updated_at: - description: 'The timestamp when the client was last updated' - type: number - format: integer - example: '1628445631' - readOnly: true - group_settings_id: - description: 'The group settings assigned to the client' - type: string - example: Opnel5aKBz - routing_id: - description: 'The routing address id for e-invoicing for this client' - type: string - example: Opnel5aKBz3489-dfkiu-2239-sdsd - is_tax_exempt: - description: 'Flag which defines if the client is exempt from taxes' - type: boolean - example: false - has_valid_vat_number: - description: 'Flag which defines if the client has a valid VAT number' - type: boolean - example: false - readOnly: true - payment_balance: - description: 'Defines the payment balance the client has on file (pre payments / over payments / unapplied amounts)' - type: number - example: 100 - readOnly: true - settings: - $ref: '#/components/schemas/ClientSettings' - type: object - Vendor: - properties: - id: - description: 'The hashed id of the vendor. This is a unique identifier for the vendor.' - type: string - example: Opnel5aKBz - readOnly: true - user_id: - description: 'The hashed id of the user who created the vendor. This is a unique identifier for the user.' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.' - type: string - example: Opnel5aKBz - company_id: - description: 'The hashed id of the company. This is a unique identifier for the company.' - type: string - example: Opnel5aKBz - client_id: - description: 'The hashed id of the client. This is a unique identifier for the client.' - type: string - example: Opnel5aKBz - contacts: - type: array - items: - $ref: '#/components/schemas/VendorContact' - description: 'An array of contacts associated with the vendor.' - name: - description: 'The name of the vendor.' - type: string - example: 'Harry cafe de wheels' - classification: - description: 'The classification of the vendor.' - type: string - example: 'individual' - website: - description: 'The website of the vendor.' - type: string - example: www.harry.com - private_notes: - description: 'The private notes of the vendor. These notes are only visible to users with appropriate permissions.' - type: string - example: 'Shhh, do not tell the vendor' - industry_id: - description: 'The industry id of the vendor. This is a unique identifier for the industry.' - type: string - example: '1' - size_id: - description: 'The size id of the vendor. This is a unique identifier for the size of the vendor.' - type: string - example: '' - address1: - description: 'The first line of the vendor''s address.' - type: string - example: '' - address2: - description: 'The second line of the vendor''s address.' - type: string - example: '' - city: - description: 'The city of the vendor''s address.' - type: string - example: '' - state: - description: 'The state of the vendor''s address.' - type: string - example: '' - postal_code: - description: 'The postal code of the vendor''s address.' - type: string - example: '' - phone: - description: 'The phone number of the vendor.' - type: string - example: 555-3434-3434 - country_id: - description: 'The country id of the vendor. This is a unique identifier for the country.' - type: string - example: '' - currency_id: - description: 'The currency id of the vendor. This is a unique identifier for the currency.' - type: string - example: '4' - custom_value1: - description: 'The value of the first custom field for the vendor.' - type: string - example: '' - custom_value2: - description: 'The value of the second custom field for the vendor.' - type: string - example: '' - custom_value3: - description: 'The value of the third custom field for the vendor.' - type: string - example: '' - custom_value4: - description: 'The value of the fourth custom field for the vendor.' - type: string - example: '' - vat_number: - description: 'The VAT number of the vendor.' - type: string - example: '' - id_number: - description: 'The ID number of the vendor.' - type: string - example: '' - number: - description: 'The number of the vendor' - type: string - example: '11234' - is_deleted: - description: 'Boolean flag determining if the vendor has been deleted' - type: boolean - example: true - language_id: - description: 'The language id of the vendor. This is a unique identifier for the language.' - type: string - example: '1' - vendor_hash: - description: 'The vendor hash of the vendor. This is a unique identifier for the vendor.' - type: string - example: 'aaa-sss-www' - readOnly: true - transaction_name: - description: 'The transaction name of the vendor.' - type: string - example: 'aaa-sss-www' - last_login: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - created_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - updated_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - settings: - $ref: '#/components/schemas/CompanySettings' - type: object - VendorContact: - properties: - id: - description: 'The hashed id of the vendor contact' - type: string - example: Opnel5aKBz - readOnly: true - user_id: - description: 'The hashed id of the user id' - type: string - example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - vendor_id: - description: 'The hashed id of the vendor' - type: string - example: Opnel5aKBz - first_name: - description: 'The first name of the contact' - type: string - example: Harry - last_name: - description: 'The last name of the contact' - type: string - example: Windsor - phone: - description: 'The contacts phone number' - type: string - example: 555-123-1234 - custom_value1: - description: 'A custom value' - type: string - example: '2022-10-10' - custom_value2: - description: 'A custom value' - type: string - example: $1000 - custom_value3: - description: 'A custom value' - type: string - example: '' - custom_value4: - description: 'A custom value' - type: string - example: '' - email: - description: 'The contact email address' - type: string - example: harry@windsor.com - is_primary: - description: 'Boolean flag determining if the contact is the primary contact for the vendor' - type: boolean - example: true - created_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - updated_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - deleted_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - readOnly: true - type: object - Quote: - properties: - id: - description: 'The unique hashed identifier for the quote' - type: string - example: Opnel5aKBz - user_id: - description: 'The unique hashed identifier for the user who created the quote' - type: string - example: '' - assigned_user_id: - description: 'The unique hashed identifier for the user assigned to the quote' - type: string - example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the quote' - type: string - example: '' - client_id: - description: 'The unique hashed identifier for the client associated with the quote' - type: string - example: '' - status_id: - description: 'The status of the quote represented by a unique identifier' - type: string - example: '' - number: - description: 'The unique alpha-numeric quote number for the quote per company' - type: string - example: QUOTE_101 - po_number: - description: 'The purchase order number associated with the quote' - type: string - example: PO-1234 - terms: - description: 'The terms and conditions for the quote' - type: string - example: 'These are some quote terms. Valid for 14 days.' - public_notes: - description: 'Publicly visible notes associated with the quote' - type: string - example: 'These are public notes which the client may see' - private_notes: - description: 'Privately visible notes associated with the quote, not disclosed to the client' - type: string - example: 'These are private notes, not to be disclosed to the client' - footer: - description: 'The footer text of the quote' - type: string - example: 'The text goes in the footer of the quote' - custom_value1: - description: 'First custom value field for additional information' - type: string - example: 'A custom value' - custom_value2: - description: 'Second custom value field for additional information' - type: string - example: 'A custom value' - custom_value3: - description: 'Third custom value field for additional information' - type: string - example: 'A custom value' - custom_value4: - description: 'Fourth custom value field for additional information' - type: string - example: 'A custom value' - tax_name1: - description: 'The name of the first tax applied to the quote' - type: string - example: GST - tax_name2: - description: 'The name of the second tax applied to the quote' - type: string - example: VAT - tax_rate1: - description: 'The rate of the first tax applied to the quote' - type: number - format: float - example: 10.00 - tax_rate2: - description: 'The rate of the second tax applied to the quote' - type: number - format: float - example: 10.00 - tax_name3: - description: 'The name of the third tax applied to the quote' - type: string - example: '' - tax_rate3: - description: 'The rate of the third tax applied to the quote' - type: number - format: float - example: 10.00 - total_taxes: - description: 'The total amount of taxes for the quote' - type: number - format: float - example: 10.00 - line_items: - type: array - description: 'An array of objects which define the line items of the quote' - items: - $ref: '#/components/schemas/InvoiceItem' - amount: - description: 'The total amount of the quote before taxes and discounts' - type: number - format: float - example: 10.00 - balance: - description: 'The balance due for the quote after accounting for payments' - type: number - format: float - example: 10.00 - paid_to_date: - description: 'The total amount paid on the quote so far' - type: number - format: float - example: 10.00 - discount: - description: 'The discount amount or percentage applied to the quote' - type: number - format: float - example: 10.00 - partial: - description: 'The partial or deposit amount for the quote' - type: number - format: float - example: 10.00 - is_amount_discount: - description: 'Boolean flag indicating if the discount is a fixed amount or a percentage' - type: boolean - example: true - is_deleted: - description: 'Boolean flag indicating if the quote has been deleted' - type: boolean - example: false - uses_inclusive_taxes: - description: 'Boolean flag indicating if the taxes used are inclusive or exclusive' - type: boolean - example: true - date: - description: 'The date the quote was created' - type: string - format: date - example: '1994-07-30' - last_sent_date: - description: 'The last date the quote was sent to the client' - type: string - format: date - example: '1994-07-30' - next_send_date: - description: 'The next scheduled date for sending a reminder for the quote' - type: string - format: date - example: '1994-07-30' - partial_due_date: - description: 'The due date for the partial or deposit amount' - type: string - format: date - example: '1994-07-30' - due_date: - description: 'The due date for the total amount of the quote' - type: string - format: date - example: '1994-07-30' - settings: - $ref: '#/components/schemas/CompanySettings' - last_viewed: - description: 'The timestamp of the last time the quote was viewed' - type: number - format: integer - example: 1434342123 - updated_at: - description: 'The timestamp of the last update to the quote' - type: number - format: integer - example: 1434342123 - archived_at: - description: 'The timestamp of when the quote was archived' - type: number - format: integer - example: 1434342123 - custom_surcharge1: - description: 'First custom surcharge amount for the quote' - type: number - format: float - example: 10.00 - custom_surcharge2: - description: 'Second custom surcharge amount for the quote' - type: number - format: float - example: 10.00 - custom_surcharge3: - description: 'Third custom surcharge amount for the quote' - type: number - format: float - example: 10.00 - custom_surcharge4: - description: 'Fourth custom surcharge amount for the quote' - type: number - format: float - example: 10.00 - custom_surcharge_tax1: - description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount' - type: boolean - example: true - type: object - Payment: - properties: - id: - description: 'The payment hashed id' - type: string - example: Opnel5aKBz - client_id: - description: 'The client hashed id' - type: string - example: Opnel5aKBz - invitation_id: - description: 'The invitation hashed id' - type: string - example: Opnel5aKBz - client_contact_id: - description: 'The client contact hashed id' - type: string - example: Opnel5aKBz - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - type_id: - description: 'The Payment Type ID' - type: string - example: '1' - date: - description: 'The Payment date' - type: string - example: 1-1-2014 - transaction_reference: - description: 'The transaction reference as defined by the payment gateway' - type: string - example: xcsSxcs124asd - assigned_user_id: - description: 'The assigned user hashed id' - type: string - example: Opnel5aKBz - private_notes: - description: 'The private notes of the payment' - type: string - example: 'The payment was refunded due to error' - is_manual: - description: 'Flags whether the payment was made manually or processed via a gateway' - type: boolean - example: true - is_deleted: - description: 'Defines if the payment has been deleted' - type: boolean - example: true - amount: - description: 'The amount of this payment' - type: number - example: 10 - refunded: - description: 'The refunded amount of this payment' - type: number - example: 10 - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - company_gateway_id: - description: 'The company gateway id' - type: string - example: '3' - paymentables: - $ref: '#/components/schemas/Paymentable' - invoices: - description: '' - type: array - items: - $ref: '#/components/schemas/InvoicePaymentable' - credits: - description: '' - type: array - items: - $ref: '#/components/schemas/CreditPaymentable' - number: - description: 'The payment number - is a unique alpha numeric number per payment per company' - type: string - example: PAY_101 - type: object - - Task: - properties: - id: - description: 'The hashed id of the task' - type: string - example: Opnel5aKBz - user_id: - description: 'The hashed id of the user who created the task' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The assigned user of the task' - type: string - example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - client_id: - description: 'The hashed if of the client' - type: string - example: Opnel5aKBz - invoice_id: - description: 'The hashed id of the invoice associated with the task' - type: string - example: Opnel5aKBz - project_id: - description: 'The hashed id of the project associated with the task' - type: string - example: Opnel5aKBz - number: - description: 'The number of the task' - type: string - example: TASK-123 - time_log: - description: 'An array of unix time stamps defining the start and end times of the task' - type: string - example: '[[1,2],[3,4]]' - is_running: - description: 'Determines if the task is still running' - type: boolean - example: true - is_deleted: - description: 'Boolean flag determining if the task has been deleted' - type: boolean - example: true - task_status_id: - description: 'The hashed id of the task status' - type: string - example: Opnel5aKBz - description: - description: 'The task description' - type: string - example: 'A wonder task to work on' - duration: - description: 'The task duration in seconds' - type: integer - example: '3600' - task_status_order: - description: 'The order of the task' - type: integer - example: '4' - rate: - description: 'The task rate' - type: number - example: 10.00 - custom_value1: - description: 'A custom value' - type: string - example: '2022-10-10' - custom_value2: - description: 'A custom value' - type: string - example: $1100 - custom_value3: - description: 'A custom value' - type: string - example: 'I need help' - custom_value4: - description: 'A custom value' - type: string - example: INV-3343 - is_date_based: - description: 'Boolean flag determining if the task is date based' - type: boolean - example: true - calculated_start_date: - description: 'The calculated start date of the task' - type: string - example: '2022-10-10' - readOnly: true - invoice_documents: - description: "Boolean flags which determines whether to include the task documents on the invoice" - type: boolean - example: true - created_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - readOnly: true - type: object - RecurringInvoice: - properties: - id: - description: 'The hashed id of the recurring invoice' - type: string - example: Opnel5aKBz - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The assigned user hashed id' - type: string - example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - client_id: - description: 'The client hashed id' - type: string - example: Opnel5aKBz - status_id: - description: 'The invoice status variable' - type: string - example: '4' - frequency_id: - description: 'The recurring invoice frequency' - type: number - example: '4' - remaining_cycles: - description: 'The number of invoices left to be generated' - type: number - example: '4' - number: - description: 'The recurringinvoice number - is a unique alpha numeric number per invoice per company' - type: string - example: INV_101 - po_number: - description: 'The purchase order associated with this recurring invoice' - type: string - example: PO-1234 - terms: - description: 'The invoice terms' - type: string - example: 'These are invoice terms' - public_notes: - description: 'The public notes of the invoice' - type: string - example: 'These are some public notes' - private_notes: - description: 'The private notes of the invoice' - type: string - example: 'These are some private notes' - footer: - description: 'The invoice footer notes' - type: string - example: '' - custom_value1: - description: 'A custom field value' - type: string - example: '2022-10-01' - custom_value2: - description: 'A custom field value' - type: string - example: 'Something custom' - custom_value3: - description: 'A custom field value' - type: string - example: '' - custom_value4: - description: 'A custom field value' - type: string - example: '' - tax_name1: - description: 'The tax name' - type: string - example: '' - tax_name2: - description: 'The tax name' - type: string - example: '' - tax_rate1: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_rate2: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_name3: - description: 'The tax name' - type: string - example: '' - tax_rate3: - description: 'The tax rate' - type: number - format: float - example: '10.00' - total_taxes: - description: 'The total taxes for the invoice' - type: number - format: float - example: '10.00' - line_items: - description: 'An array of objects which define the line items of the invoice' - type: object - example: '' - amount: - description: 'The invoice amount' - type: number - format: float - example: '10.00' - balance: - description: 'The invoice balance' - type: number - format: float - example: '10.00' - paid_to_date: - description: 'The amount paid on the invoice to date' - type: number - format: float - example: '10.00' - discount: - description: 'The invoice discount, can be an amount or a percentage' - type: number - format: float - example: '10.00' - partial: - description: 'The deposit/partial amount' - type: number - format: float - example: '10.00' - is_amount_discount: - description: 'Flag determining if the discount is an amount or a percentage' - type: boolean - example: true - is_deleted: - description: 'Defines if the invoice has been deleted' - type: boolean - example: true - uses_inclusive_taxes: - description: 'Defines the type of taxes used as either inclusive or exclusive' - type: boolean - example: true - date: - description: 'The Invoice Date' - type: string - format: date - example: '1994-07-30' - last_sent_date: - description: 'The last date the invoice was sent out' - type: string - format: date - example: '1994-07-30' - next_send_date: - description: 'The Next date for a reminder to be sent' - type: string - format: date - example: '1994-07-30' - partial_due_date: - description: 'The due date for the deposit/partial amount' - type: string - format: date - example: '1994-07-30' - due_date: - description: 'The due date of the invoice' - type: string - format: date - example: '1994-07-30' - settings: - $ref: '#/components/schemas/CompanySettings' - last_viewed: - description: Timestamp - type: number - format: integer - example: '1434342123' - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - custom_surcharge1: - description: 'First Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge2: - description: 'Second Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge3: - description: 'Third Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge4: - description: 'Fourth Custom Surcharge' - type: number - format: float - example: '10.00' - custom_surcharge_tax1: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Toggles charging taxes on custom surcharge amounts' - type: boolean - example: true - type: object - - InvoiceItem: - type: object - properties: - quantity: - type: integer - example: 1 - description: 'The quantity of the product offered for this line item' - cost: - type: number - format: float - example: 10.00 - description: 'The cost of the product offered for this line item' - product_key: - type: string - example: 'Product key' - description: 'The product key of the product offered for this line item (Referred to as Product in the product tab)' - product_cost: - type: number - format: float - example: 10.00 - description: 'The cost of the product offered for this line item (Referred to as Cost in the product tab)' - notes: - type: string - example: 'Item notes' - description: 'The notes/description for the product offered for this line item' - discount: - type: number - format: float - example: 5.00 - description: 'The discount applied to the product offered for this line item' - is_amount_discount: - type: boolean - example: false - description: 'Indicates whether the discount applied to the product offered for this line item is a fixed amount or a percentage' - tax_name1: - type: string - example: 'GST' - description: 'The name of the first tax applied to the product offered for this line item' - tax_rate1: - type: number - format: float - example: 10.00 - description: 'The rate of the first tax applied to the product offered for this line item' - tax_name2: - type: string - example: 'VAT' - description: 'The name of the second tax applied to the product offered for this line item' - tax_rate2: - type: number - format: float - example: 5.00 - description: 'The rate of the second tax applied to the product offered for this line item' - tax_name3: - type: string - example: 'CA Sales Tax' - description: 'The name of the third tax applied to the product offered for this line item' - tax_rate3: - type: number - format: float - example: 3.00 - description: 'The rate of the third tax applied to the product offered for this line item' - sort_id: - type: string - example: '0' - description: 'Deprecated' - deprecated: true - line_total: - type: number - format: float - example: 10.00 - description: 'The total amount of the product offered for this line item' - readOnly: true - gross_line_total: - type: number - format: float - example: 15.00 - description: 'The total amount of the product offered for this line item before discounts' - readOnly: true - tax_amount: - type: number - format: float - example: 1.00 - description: 'The total amount of tax applied to the product offered for this line item' - readOnly: true - date: - type: string - format: date-time - example: '2023-03-19T00:00:00Z' - description: 'Deprecated' - deprecated: true - custom_value1: - type: string - example: 'Custom value 1' - description: 'The first custom value of the product offered for this line item' - custom_value2: - type: string - example: 'Custom value 2' - description: 'The second custom value of the product offered for this line item' - custom_value3: - type: string - example: 'Custom value 3' - description: 'The third custom value of the product offered for this line item' - custom_value4: - type: string - example: 'Custom value 4' - description: 'The fourth custom value of the product offered for this line item' - type_id: - type: string - example: '1' - description: '1 = product, 2 = service, 3 unpaid gateway fee, 4 paid gateway fee, 5 late fee, 6 expense' - default: '1' - tax_id: - type: string - example: '1' - default: '1' - description: 'The tax ID of the product: 1 product, 2 service, 3 digital, 4 shipping, 5 exempt, 5 reduced tax, 7 override, 8 zero rate, 9 reverse tax' - Activity: - properties: - id: - description: 'The id field of the activity' - type: string - example: Opnel5aKBz - activity_type_id: - description: 'The activity type id' - type: string - example: Opnel5aKBz - client_id: - description: 'The client hashed id' - type: string - example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - invoice_id: - description: 'The invoice hashed id' - type: string - example: Opnel5aKBz - payment_id: - description: 'The payment hashed id' - type: string - example: Opnel5aKBz - credit_id: - description: 'The credit hashed id' - type: string - example: Opnel5aKBz - updated_at: - description: 'Unixtimestamp the last time the record was updated' - type: integer - example: '343421434' - expense_id: - description: 'The expense hashed id' - type: string - example: Opnel5aKBz - is_system: - description: 'Defines is the activity was performed by the system' - type: boolean - example: true - contact_id: - description: 'The contact hashed id' - type: string - example: Opnel5aKBz - task_id: - description: 'The task hashed id' - type: string - example: Opnel5aKBz - notes: - description: 'Activity Notes' - type: string - example: Opnel5aKBz - token_id: - description: 'The hashed ID of the token who performed the action' - type: string - example: Opnel5aKBz - ip: - description: 'The IP Address of the user who performed the action' - type: string - example: 192.168.1.252 - user: - $ref: '#/components/schemas/User' - client: - $ref: '#/components/schemas/Client' - contact: - $ref: '#/components/schemas/ClientContact' - recurring_invoice: - $ref: '#/components/schemas/RecurringInvoice' - invoice: - $ref: '#/components/schemas/Invoice' - credit: - $ref: '#/components/schemas/Credit' - quote: - $ref: '#/components/schemas/Quote' - payment: - $ref: '#/components/schemas/Payment' - expense: - $ref: '#/components/schemas/Expense' - task: - $ref: '#/components/schemas/Task' - purchase_order: - $ref: '#/components/schemas/PurchaseOrder' - vendor: - $ref: '#/components/schemas/Vendor' - vendor_contact: - $ref: '#/components/schemas/VendorContact' - type: object - - ProductBulkAction: - required: - - action - - ids - properties: - action: - type: string - example: archive - description: 'The action to perform ie. archive / restore / delete / set_tax_id' - ids: - type: array - items: - format: string - type: string - example: 2J234DFA,D2J234DFA,D2J234DFA - description: string array of client hashed ids - tax_id: - type: string - example: '1' - description: | - The tax rate id to set on the list of products - - The following constants are available (default = '1') - - ``` - PRODUCT_TYPE_PHYSICAL = '1' - PRODUCT_TYPE_SERVICE = '2' - PRODUCT_TYPE_DIGITAL = '3' - PRODUCT_TYPE_SHIPPING = '4' - PRODUCT_TYPE_EXEMPT = '5' - PRODUCT_TYPE_REDUCED_TAX = '6' - PRODUCT_TYPE_OVERRIDE_TAX = '7' - PRODUCT_TYPE_ZERO_RATED = '8' - PRODUCT_TYPE_REVERSE_TAX = '9' - ``` - type: object - RecurringExpense: - properties: - id: - description: 'The hashed id of the recurring expense' - type: string - example: Opnel5aKBz - user_id: - description: 'The hashed id of the user who created the recurring expense' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The hashed id of the user assigned to this recurring expense' - type: string - example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - client_id: - description: 'The hashed id of the client' - type: string - example: Opnel5aKBz - invoice_id: - description: 'The hashed id of the invoice' - type: string - example: Opnel5aKBz - bank_id: - description: 'The id of the bank associated with this recurring expense' - type: string - example: '22' - invoice_currency_id: - description: 'The currency id of the invoice associated with this recurring expense' - type: string - example: '1' - expense_currency_id: - description: 'The currency id of the expense associated with this recurring expense' - type: string - example: '1' - invoice_category_id: - description: 'The category id of the invoice' - type: string - example: '1' - payment_type_id: - description: 'The payment type id' - type: string - example: '1' - private_notes: - description: 'The recurring expense private notes' - type: string - example: 'Private and confidential' - public_notes: - description: 'The recurring expense public notes' - type: string - example: 'This is the best client in the world' - transaction_reference: - description: 'The recurring expense transaction reference' - type: string - example: EXP-1223-2333 - transcation_id: - description: 'The transaction id of the recurring expense' - type: string - example: '1233312312' - custom_value1: - description: 'Custom value field' - type: string - example: $1000 - custom_value2: - description: 'Custom value field' - type: string - example: '2022-10-10' - custom_value3: - description: 'Custom value field' - type: string - example: 'short text' - custom_value4: - description: 'Custom value field' - type: string - example: 'very long text' - tax_name1: - description: 'The tax name' - type: string - example: GST - tax_name2: - description: 'The tax name' - type: string - example: VAT - tax_rate1: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_rate2: - description: 'The tax rate' - type: number - format: float - example: '10.00' - tax_name3: - description: 'The tax name' - type: string - example: '' - tax_rate3: - description: 'The tax rate' - type: number - format: float - example: '10.00' - amount: - description: 'The total amount of the recurring expense' - type: number - format: float - example: '10.00' - frequency_id: - description: 'The frequency this recurring expense fires' - type: number - format: int - example: '1' - remaining_cycles: - description: 'The number of remaining cycles for this recurring expense' - type: number - format: int - example: '1' - foreign_amount: - description: 'The foreign currency amount of the recurring expense' - type: number - format: float - example: '10.00' - exchange_rate: - description: 'The exchange rate for the expernse' - type: number - format: float - example: '0.80' - date: - description: 'The date of the expense' - type: string - example: '' - payment_date: - description: 'The date the expense was paid' - type: string - example: '' - should_be_invoiced: - description: 'Boolean flag determining if the expense should be invoiced' - type: boolean - example: true - is_deleted: - description: 'Boolean flag determining if the recurring expense is deleted' - type: boolean - example: true - last_sent_date: - description: 'The Date it was sent last' - type: string - format: date - example: '1994-07-30' - next_send_date: - description: 'The next send date' - type: string - format: date - example: '1994-07-30' - invoice_documents: - description: 'Boolean flag determining if the documents associated with this expense should be passed onto the invoice if it is converted to an invoice' - type: boolean - example: true - updated_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - archived_at: - description: Timestamp - type: number - format: integer - example: '1434342123' - type: object - PaymentTerm: - properties: - num_days: - description: 'The payment term length in days' - type: integer - example: '1' - name: - description: 'The payment term length in string format' - type: string - example: 'NET 1' - created_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - updated_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - archived_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - type: object - ClientGatewayToken: - properties: - id: - description: 'The hashed id of the client gateway token' - type: string - example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: '2' - client_id: - description: 'The hashed_id of the client' - type: string - example: '2' - token: - description: 'The payment token' - type: string - example: '2' - routing_number: - description: 'THe bank account routing number' - type: string - example: '2' - company_gateway_id: - description: 'The hashed id of the company gateway' - type: string - example: '2' - is_default: - description: 'Flag determining if the token is the default payment method' - type: boolean - example: 'true' - type: object - User: - properties: - id: - description: 'The hashed id of the user' - type: string - example: Opnel5aKBz - readOnly: true - first_name: - description: 'The first name of the user' - type: string - example: Brad - last_name: - description: 'The last name of the user' - type: string - example: Pitt - email: - description: 'The users email address' - type: string - example: brad@pitt.com - phone: - description: 'The users phone number' - type: string - example: 555-1233-23232 - signature: - description: 'The users sign off signature' - type: string - example: 'Have a nice day!' - avatar: - description: 'The users avatar' - type: string - example: 'https://url.to.your/avatar.png' - accepted_terms_version: - description: 'The version of the invoice ninja terms that has been accepted by the user' - type: string - example: 1.0.1 - readOnly: true - oauth_user_id: - description: 'The provider id of the oauth entity' - type: string - example: jkhasdf789as6f675sdf768sdfs - readOnly: true - oauth_provider_id: - description: 'The oauth entity id' - type: string - example: google - readOnly: true - language_id: - description: 'The language id of the user' - type: string - example: 1 - verified_phone_number: - description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA' - type: boolean - example: true - readOnly: true - sms_verification_code: - description: 'The sms verification code for the user. Required to settings up 2FA' - type: string - example: '123456' - readOnly: true - oauth_user_token_expiry: - description: 'The expiry date of the oauth token' - type: string - example: '2022-10-10' - readOnly: true - has_password: - description: 'Boolean flag determining if the user has a password' - type: boolean - example: true - readOnly: true - last_confirmed_email_address: - description: 'The last confirmed email address of the user' - type: string - example: 'bob@gmail.com' - readOnly: true - custom_value1: - description: 'A custom value' - type: string - example: 'Custom value 1' - custom_value2: - description: 'A custom value' - type: string - example: '$1000' - custom_value3: - description: 'A custom value' - type: string - example: 'Custom value 3' - custom_value4: - description: 'A custom value' - type: string - example: 'Custom value 4' - is_deleted: - description: 'Boolean flag determining if the user has been deleted' - type: boolean - example: true - readOnly: true - google_2fa_secret: - description: 'The google 2fa secret for the user' - type: string - example: '123456' - readOnly: true - type: object CompanyGateway: properties: id: @@ -18422,1512 +15383,6 @@ components: type: object - Document: - properties: - id: - description: 'The document hashed id' - type: string - example: AS3df3A - user_id: - description: 'The user hashed id' - type: string - example: '' - assigned_user_id: - description: 'The assigned user hashed id' - type: string - example: '' - project_id: - description: 'The project associated with this document' - type: string - example: '' - vendor_id: - description: 'The vendor associated with this documents' - type: string - example: '' - name: - description: 'The document name' - type: string - example: Beauty - url: - description: 'The document url' - type: string - example: Beauty - preview: - description: 'The document preview url' - type: string - example: Beauty - type: - description: 'The document type' - type: string - example: Beauty - disk: - description: 'The document disk' - type: string - example: Beauty - hash: - description: 'The document hashed' - type: string - example: Beauty - is_deleted: - description: 'Flag to determine if the document is deleted' - type: boolean - example: true - is_default: - description: 'Flag to determine if the document is a default doc' - type: boolean - example: true - created_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - updated_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - deleted_at: - description: Timestamp - type: number - format: integer - example: '134341234234' - type: object - PurchaseOrder: - properties: - id: - description: 'The unique hashed identifier for the purchase order' - type: string - example: Opnel5aKBz - user_id: - description: 'The unique hashed identifier for the user who created the purchase order' - type: string - example: '' - assigned_user_id: - description: 'The unique hashed identifier for the user assigned to the purchase order' - type: string - example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the purchase order' - type: string - example: '' - vendor_id: - description: 'The unique hashed identifier for the vendor associated with the purchase order' - type: string - example: '' - status_id: - description: 'The status of the purchase order represented by a unique identifier' - type: string - example: '' - number: - description: 'The unique alpha-numeric purchase order number per company' - type: string - example: PO_101 - quote_number: - description: 'The quote number associated with this purchase order' - type: string - example: QUOTE_101 - terms: - description: 'The terms and conditions for the purchase order' - type: string - example: 'These are some purchase order terms. Valid for 14 days.' - public_notes: - description: 'Publicly visible notes associated with the purchase order' - type: string - example: 'These are public notes which the vendor may see' - private_notes: - description: 'Privately visible notes associated with the purchase order, not disclosed to the vendor' - type: string - example: 'These are private notes, not to be disclosed to the vendor' - footer: - description: 'The footer text of the purchase order' - type: string - example: 'The text goes in the footer of the purchase order' - custom_value1: - description: 'First custom value field for additional information' - type: string - example: 'A custom value' - custom_value2: - description: 'Second custom value field for additional information' - type: string - example: 'A custom value' - custom_value3: - description: 'Third custom value field for additional information' - type: string - example: 'A custom value' - custom_value4: - description: 'Fourth custom value field for additional information' - type: string - example: 'A custom value' - tax_name1: - description: 'The name of the first tax applied to the purchase order' - type: string - example: GST - tax_name2: - description: 'The name of the second tax applied to the purchase order' - type: string - example: VAT - tax_rate1: - description: 'The rate of the first tax applied to the purchase order' - type: number - format: float - example: 10.00 - tax_rate2: - description: 'The rate of the second tax applied to the purchase order' - type: number - format: float - example: 10.00 - tax_name3: - description: 'The name of the third tax applied to the purchase order' - type: string - example: '' - tax_rate3: - description: 'The rate of the third tax applied to the purchase order' - type: number - format: float - example: 10.00 - total_taxes: - description: 'The total amount of taxes applied to the purchase order' - type: number - format: float - example: 10.00 - line_items: - type: array - description: 'An array of objects which define the line items of the purchase order' - items: - $ref: '#/components/schemas/InvoiceItem' - amount: - description: 'The total amount of the purchase order before taxes and discounts' - type: number - format: float - example: 10.00 - balance: - description: 'The balance due for the purchase order after accounting for payments' - type: number - format: float - example: 10.00 - paid_to_date: - description: 'The total amount paid on the purchase order so far' - type: number - format: float - example: 10.00 - discount: - description: 'The discount amount or percentage applied to the purchase order' - type: number - format: float - example: 10.00 - partial: - description: 'The partial or deposit amount for the purchase order' - type: number - format: float - example: 10.00 - is_amount_discount: - description: 'Boolean flag indicating if the discount is a fixed amount or a percentage' - type: boolean - example: true - is_deleted: - description: 'Boolean flag indicating if the purchase order has been deleted' - type: boolean - example: false - uses_inclusive_taxes: - description: 'Boolean flag indicating if the taxes used are inclusive or exclusive' - type: boolean - example: true - date: - description: 'The date the purchase order was created' - type: string - format: date - example: '1994-07-30' - last_sent_date: - description: 'The last date the purchase order was sent to the vendor' - type: string - format: date - example: '1994-07-30' - next_send_date: - description: 'The next scheduled date for sending a reminder for the purchase order' - type: string - format: date - example: '1994-07-30' - partial_due_date: - description: 'The due date for the partial or deposit amount' - type: string - format: date - example: '1994-07-30' - due_date: - description: 'The due date for the total amount of the purchase order' - type: string - format: date - example: '1994-07-30' - settings: - $ref: '#/components/schemas/CompanySettings' - last_viewed: - description: Timestamp - type: number - format: integer - example: 1434342123 - updated_at: - description: Timestamp - type: number - format: integer - example: 1434342123 - archived_at: - description: Timestamp - type: number - format: integer - example: 1434342123 - custom_surcharge1: - description: 'First custom surcharge amount for the purchase order' - type: number - format: float - example: 10.00 - custom_surcharge2: - description: 'Second custom surcharge amount for the purchase order' - type: number - format: float - example: 10.00 - custom_surcharge3: - description: 'Third custom surcharge amount for the purchase order' - type: number - format: float - example: 10.00 - custom_surcharge4: - description: 'Fourth custom surcharge amount for the purchase order' - type: number - format: float - example: 10.00 - custom_surcharge_tax1: - description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax2: - description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax3: - description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount' - type: boolean - example: true - custom_surcharge_tax4: - description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount' - type: boolean - example: true - type: object - - - ClientSettings: - required: - - currency_id - properties: - currency_id: - description: 'The default currency id' - type: string - example: true - timezone_id: - description: 'The timezone id' - type: string - example: '15' - date_format_id: - description: 'The date format id' - type: string - example: '15' - military_time: - description: 'Toggles 12/24 hour time' - type: boolean - example: true - language_id: - description: 'The language id' - type: string - example: '1' - show_currency_code: - description: 'Toggles whether the currency symbol or code is shown' - type: boolean - example: true - payment_terms: - description: '-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days' - type: integer - example: '1' - company_gateway_ids: - description: 'A commad separate list of available gateways' - type: string - example: '1,2,3,4' - custom_value1: - description: 'A Custom Label' - type: string - example: 'Custom Label' - custom_value2: - description: 'A Custom Label' - type: string - example: 'Custom Label' - custom_value3: - description: 'A Custom Label' - type: string - example: 'Custom Label' - custom_value4: - description: 'A Custom Label' - type: string - example: 'Custom Label' - default_task_rate: - description: 'The default task rate' - type: number - format: float - example: '10.00' - send_reminders: - description: 'Toggles whether reminders are sent' - type: boolean - example: true - enable_client_portal_tasks: - description: 'Show/hide the tasks panel in the client portal' - type: boolean - example: true - email_style: - description: 'options include plain,light,dark,custom' - type: string - example: light - reply_to_email: - description: 'The reply to email address' - type: string - example: email@gmail.com - bcc_email: - description: 'A comma separate list of BCC emails' - type: string - example: 'email@gmail.com, contact@gmail.com' - pdf_email_attachment: - description: 'Toggles whether to attach PDF as attachment' - type: boolean - example: true - ubl_email_attachment: - description: 'Toggles whether to attach UBL as attachment' - type: boolean - example: true - email_style_custom: - description: 'The custom template' - type: string - example: '' - counter_number_applied: - description: 'enum when the invoice number counter is set, ie when_saved, when_sent, when_paid' - type: string - example: when_sent - quote_number_applied: - description: 'enum when the quote number counter is set, ie when_saved, when_sent' - type: string - example: when_sent - custom_message_dashboard: - description: 'A custom message which is displayed on the dashboard' - type: string - example: 'Please pay invoices immediately' - custom_message_unpaid_invoice: - description: 'A custom message which is displayed in the client portal when a client is viewing a unpaid invoice.' - type: string - example: 'Please pay invoices immediately' - custom_message_paid_invoice: - description: 'A custom message which is displayed in the client portal when a client is viewing a paid invoice.' - type: string - example: 'Thanks for paying this invoice!' - custom_message_unapproved_quote: - description: 'A custom message which is displayed in the client portal when a client is viewing a unapproved quote.' - type: string - example: 'Please approve quote' - lock_invoices: - description: 'Toggles whether invoices are locked once sent and cannot be modified further' - type: boolean - example: true - auto_archive_invoice: - description: 'Toggles whether a invoice is archived immediately following payment' - type: boolean - example: true - auto_archive_quote: - description: 'Toggles whether a quote is archived after being converted to a invoice' - type: boolean - example: true - auto_convert_quote: - description: 'Toggles whether a quote is converted to a invoice when approved' - type: boolean - example: true - inclusive_taxes: - description: 'Boolean flag determining whether inclusive or exclusive taxes are used' - type: boolean - example: true - task_number_pattern: - description: 'Allows customisation of the task number pattern' - type: string - example: '{$year}-{$counter}' - task_number_counter: - description: 'The incrementing counter for tasks' - type: integer - example: '1' - reminder_send_time: - description: 'Time from UTC +0 when the email will be sent to the client' - type: integer - example: '32400' - expense_number_pattern: - description: 'Allows customisation of the expense number pattern' - type: string - example: '{$year}-{$counter}' - expense_number_counter: - description: 'The incrementing counter for expenses' - type: integer - example: '1' - vendor_number_pattern: - description: 'Allows customisation of the vendor number pattern' - type: string - example: '{$year}-{$counter}' - vendor_number_counter: - description: 'The incrementing counter for vendors' - type: integer - example: '1' - ticket_number_pattern: - description: 'Allows customisation of the ticket number pattern' - type: string - example: '{$year}-{$counter}' - ticket_number_counter: - description: 'The incrementing counter for tickets' - type: integer - example: '1' - payment_number_pattern: - description: 'Allows customisation of the payment number pattern' - type: string - example: '{$year}-{$counter}' - payment_number_counter: - description: 'The incrementing counter for payments' - type: integer - example: '1' - invoice_number_pattern: - description: 'Allows customisation of the invoice number pattern' - type: string - example: '{$year}-{$counter}' - invoice_number_counter: - description: 'The incrementing counter for invoices' - type: integer - example: '1' - quote_number_pattern: - description: 'Allows customisation of the quote number pattern' - type: string - example: '{$year}-{$counter}' - quote_number_counter: - description: 'The incrementing counter for quotes' - type: integer - example: '1' - client_number_pattern: - description: 'Allows customisation of the client number pattern' - type: string - example: '{$year}-{$counter}' - client_number_counter: - description: 'The incrementing counter for clients' - type: integer - example: '1' - credit_number_pattern: - description: 'Allows customisation of the credit number pattern' - type: string - example: '{$year}-{$counter}' - credit_number_counter: - description: 'The incrementing counter for credits' - type: integer - example: '1' - recurring_invoice_number_prefix: - description: 'This string is prepended to the recurring invoice number' - type: string - example: R - reset_counter_frequency_id: - description: 'CONSTANT which is used to apply the frequency which the counters are reset' - type: integer - example: '1' - reset_counter_date: - description: 'The explicit date which is used to reset counters' - type: string - example: '2019-01-01' - counter_padding: - description: 'Pads the counter with leading zeros' - type: integer - example: '1' - shared_invoice_quote_counter: - description: 'Flags whether to share the counter for invoices and quotes' - type: boolean - example: true - update_products: - description: 'Determines if client fields are updated from third party APIs' - type: boolean - example: true - convert_products: - description: '' - type: boolean - example: true - fill_products: - description: 'Automatically fill products based on product_key' - type: boolean - example: true - invoice_terms: - description: 'The default invoice terms' - type: string - example: 'Invoice Terms are...' - quote_terms: - description: 'The default quote terms' - type: string - example: 'Quote Terms are...' - invoice_taxes: - description: 'Taxes can be applied to the invoice' - type: number - example: '1' - invoice_design_id: - description: 'The default design id (invoice, quote etc)' - type: string - example: '1' - quote_design_id: - description: 'The default design id (invoice, quote etc)' - type: string - example: '1' - invoice_footer: - description: 'The default invoice footer' - type: string - example: '1' - invoice_labels: - description: 'JSON string of invoice labels' - type: string - example: '1' - tax_rate1: - description: 'The tax rate (float)' - type: number - example: '10' - tax_name1: - description: 'The tax name' - type: string - example: GST - tax_rate2: - description: 'The tax rate (float)' - type: number - example: '10' - tax_name2: - description: 'The tax name' - type: string - example: GST - tax_rate3: - description: 'The tax rate (float)' - type: number - example: '10' - tax_name3: - description: 'The tax name' - type: string - example: GST - payment_type_id: - description: 'The default payment type id' - type: string - example: '1' - custom_fields: - description: 'JSON string of custom fields' - type: string - example: '{}' - email_footer: - description: 'The default email footer' - type: string - example: 'A default email footer' - email_sending_method: - description: 'The email driver to use to send email, options include default, gmail' - type: string - example: default - gmail_sending_user_id: - description: 'The hashed_id of the user account to send email from' - type: string - example: F76sd34D - email_subject_invoice: - description: '' - type: string - example: 'Your Invoice Subject' - email_subject_quote: - description: '' - type: string - example: 'Your Quote Subject' - email_subject_payment: - description: '' - type: string - example: 'Your Payment Subject' - email_template_invoice: - description: 'The full template for invoice emails' - type: string - example: '' - email_template_quote: - description: 'The full template for quote emails' - type: string - example: '' - email_template_payment: - description: 'The full template for payment emails' - type: string - example: '' - email_subject_reminder1: - description: 'Email subject for Reminder' - type: string - example: '' - email_subject_reminder2: - description: 'Email subject for Reminder' - type: string - example: '' - email_subject_reminder3: - description: 'Email subject for Reminder' - type: string - example: '' - email_subject_reminder_endless: - description: 'Email subject for endless reminders' - type: string - example: '' - email_template_reminder1: - description: 'The full template for Reminder 1' - type: string - example: '' - email_template_reminder2: - description: 'The full template for Reminder 2' - type: string - example: '' - email_template_reminder3: - description: 'The full template for Reminder 3' - type: string - example: '' - email_template_reminder_endless: - description: 'The full template for enless reminders' - type: string - example: '' - enable_portal_password: - description: 'Toggles whether a password is required to log into the client portal' - type: boolean - example: true - show_accept_invoice_terms: - description: 'Toggles whether the terms dialogue is shown to the client' - type: boolean - example: true - show_accept_quote_terms: - description: 'Toggles whether the terms dialogue is shown to the client' - type: boolean - example: true - require_invoice_signature: - description: 'Toggles whether a invoice signature is required' - type: boolean - example: true - require_quote_signature: - description: 'Toggles whether a quote signature is required' - type: boolean - example: true - name: - description: 'The company name' - type: string - example: 'Acme Co' - company_logo: - description: 'The company logo file' - type: object - example: logo.png - website: - description: 'The company website URL' - type: string - example: www.acme.com - address1: - description: 'The company address line 1' - type: string - example: 'Suite 888' - address2: - description: 'The company address line 2' - type: string - example: '5 Jimbo Way' - city: - description: 'The company city' - type: string - example: Sydney - state: - description: 'The company state' - type: string - example: Florisa - postal_code: - description: 'The company zip/postal code' - type: string - example: '90210' - phone: - description: 'The company phone' - type: string - example: 555-213-3948 - email: - description: 'The company email' - type: string - example: joe@acme.co - country_id: - description: 'The country ID' - type: string - example: '1' - vat_number: - description: 'The company VAT/TAX ID number' - type: string - example: '32 120 377 720' - page_size: - description: 'The default page size' - type: string - example: A4 - font_size: - description: 'The font size' - type: number - example: '9' - primary_font: - description: 'The primary font' - type: string - example: roboto - secondary_font: - description: 'The secondary font' - type: string - example: roboto - hide_paid_to_date: - description: 'Flags whether to hide the paid to date field' - type: boolean - example: false - embed_documents: - description: 'Toggled whether to embed documents in the PDF' - type: boolean - example: false - all_pages_header: - description: 'The header for the PDF' - type: boolean - example: false - all_pages_footer: - description: 'The footer for the PDF' - type: boolean - example: false - document_email_attachment: - description: 'Toggles whether to attach documents in the email' - type: boolean - example: false - enable_client_portal_password: - description: 'Toggles password protection of the client portal' - type: boolean - example: false - enable_email_markup: - description: 'Toggles the use of markdown in emails' - type: boolean - example: false - enable_client_portal_dashboard: - description: 'Toggles whether the client dashboard is shown in the client portal' - type: boolean - example: false - enable_client_portal: - description: 'Toggles whether the entire client portal is displayed to the client, or only the context' - type: boolean - example: false - email_template_statement: - description: 'The body of the email for statements' - type: string - example: 'template matter' - email_subject_statement: - description: 'The subject of the email for statements' - type: string - example: 'subject matter' - signature_on_pdf: - description: 'Toggles whether the signature (if available) is displayed on the PDF' - type: boolean - example: false - quote_footer: - description: 'The default quote footer' - type: string - example: 'the quote footer' - email_subject_custom1: - description: 'Custom reminder template subject' - type: string - example: 'Custom Subject 1' - email_subject_custom2: - description: 'Custom reminder template subject' - type: string - example: 'Custom Subject 2' - email_subject_custom3: - description: 'Custom reminder template subject' - type: string - example: 'Custom Subject 3' - email_template_custom1: - description: 'Custom reminder template body' - type: string - example: '' - email_template_custom2: - description: 'Custom reminder template body' - type: string - example: '' - email_template_custom3: - description: 'Custom reminder template body' - type: string - example: '' - enable_reminder1: - description: 'Toggles whether this reminder is enabled' - type: boolean - example: false - enable_reminder2: - description: 'Toggles whether this reminder is enabled' - type: boolean - example: false - enable_reminder3: - description: 'Toggles whether this reminder is enabled' - type: boolean - example: false - num_days_reminder1: - description: 'The Reminder interval' - type: number - example: '9' - num_days_reminder2: - description: 'The Reminder interval' - type: number - example: '9' - num_days_reminder3: - description: 'The Reminder interval' - type: number - example: '9' - schedule_reminder1: - description: '(enum: after_invoice_date, before_due_date, after_due_date)' - type: string - example: after_invoice_date - schedule_reminder2: - description: '(enum: after_invoice_date, before_due_date, after_due_date)' - type: string - example: after_invoice_date - schedule_reminder3: - description: '(enum: after_invoice_date, before_due_date, after_due_date)' - type: string - example: after_invoice_date - late_fee_amount1: - description: 'The late fee amount for reminder 1' - type: number - example: 10 - late_fee_amount2: - description: 'The late fee amount for reminder 2' - type: number - example: 20 - late_fee_amount3: - description: 'The late fee amount for reminder 2' - type: number - example: 100 - endless_reminder_frequency_id: - description: 'The frequency id of the endless reminder' - type: string - example: '1' - client_online_payment_notification: - description: 'Determines if a client should receive the notification for a online payment' - type: boolean - example: false - client_manual_payment_notification: - description: 'Determines if a client should receive the notification for a manually entered payment' - type: boolean - example: false - enable_e_invoice: - description: 'Determines if e-invoicing is enabled' - type: boolean - example: false - default_expense_payment_type_id: - description: 'The default payment type for expenses' - type: string - example: '0' - e_invoice_type: - description: 'The e-invoice type' - type: string - example: 'EN16931' - mailgun_endpoint: - description: 'The mailgun endpoint - used to determine whether US or EU endpoints are used' - type: string - example: 'api.mailgun.net or api.eu.mailgun.net' - client_initiated_payments: - description: 'Determines if clients can initiate payments directly from the client portal' - type: boolean - example: false - client_initiated_payments_minimum: - description: 'The minimum amount a client can pay' - type: number - example: 10 - sync_invoice_quote_columns: - description: 'Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns' - type: boolean - example: false - show_task_item_description: - description: 'Determines if the task item description is shown on the invoice' - type: boolean - example: false - allow_billable_task_items: - description: 'Determines if task items can be marked as billable' - type: boolean - example: false - accept_client_input_quote_approval: - description: 'Determines if clients can approve quotes and also pass through a PO Number reference' - type: boolean - example: false - custom_sending_email: - description: 'When using Mailgun or Postmark, the FROM email address can be customized using this setting.' - type: string - example: 'bob@gmail.com' - show_paid_stamp: - description: 'Determines if the PAID stamp is shown on the invoice' - type: boolean - example: false - show_shipping_address: - description: 'Determines if the shipping address is shown on the invoice' - type: boolean - example: false - company_logo_size: - description: 'The size of the company logo on the PDF - percentage value between 0 and 100' - type: number - example: 100 - show_email_footer: - description: 'Determines if the email footer is shown on emails' - type: boolean - example: false - email_alignment: - description: 'The alignment of the email body text, options include left / center / right' - type: string - example: 'left' - auto_bill_standard_invoices: - description: 'Determines if standard invoices are automatically billed when they are created or due' - type: boolean - example: false - postmark_secret: - description: 'The Postmark secret API key' - type: string - example: '123456' - mailgun_secret: - description: 'The Mailgun secret API key' - type: string - example: '123456' - mailgun_domain: - description: 'The Mailgun domain' - type: string - example: 'sandbox123456.mailgun.org' - send_email_on_mark_paid: - description: 'Determines if an email is sent when an invoice is marked as paid' - type: boolean - example: false - vendor_portal_enable_uploads: - description: 'Determines if vendors can upload files to the portal' - type: boolean - example: false - besr_id: - description: 'The BESR ID' - type: string - example: '123456' - qr_iban: - description: 'The IBAN for the QR code' - type: string - example: 'CH123456' - email_subject_purchase_order: - description: 'The email subject for purchase orders' - type: string - example: 'Purchase Order' - email_template_purchase_order: - description: 'The email template for purchase orders' - type: string - example: 'Please see attached your purchase order.' - require_purchase_order_signature: - description: 'Determines if a signature is required on purchase orders' - type: boolean - example: false - purchase_order_public_notes: - description: 'The public notes for purchase orders' - type: string - example: 'Please see attached your purchase order.' - purchase_order_terms: - description: 'The terms for purchase orders' - type: string - example: 'Please see attached your purchase order.' - purchase_order_footer: - description: 'The footer for purchase orders' - type: string - example: 'Please see attached your purchase order.' - purchase_order_design_id: - description: 'The design id for purchase orders' - type: string - example: 'hd677df' - purchase_order_number_pattern: - description: 'The pattern for purchase order numbers' - type: string - example: 'PO-000000' - purchase_order_number_counter: - description: 'The counter for purchase order numbers' - type: number - example: 1 - page_numbering_alignment: - description: 'The alignment for page numbering: options include left / center / right' - type: string - example: 'left' - page_numbering: - description: 'Determines if page numbering is enabled on Document PDFs' - type: boolean - example: false - auto_archive_invoice_cancelled: - description: 'Determines if invoices are automatically archived when they are cancelled' - type: boolean - example: false - email_from_name: - description: 'The FROM name for emails when using Custom emailers' - type: string - example: 'Bob Smith' - show_all_tasks_client_portal: - description: 'Determines if all tasks are shown on the client portal' - type: boolean - example: false - entity_send_time: - description: 'The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24' - type: integer - example: 9 - shared_invoice_credit_counter: - description: 'Determines if the invoice and credit counter are shared' - type: boolean - example: false - reply_to_name: - description: 'The reply to name for emails' - type: string - example: 'Bob Smith' - hide_empty_columns_on_pdf: - description: 'Determines if empty columns are hidden on PDFs' - type: boolean - example: false - enable_reminder_endless: - description: 'Determines if endless reminders are enabled' - type: boolean - example: false - use_credits_payment: - description: 'Determines if credits can be used as a payment method' - type: boolean - example: false - recurring_invoice_number_pattern: - description: 'The pattern for recurring invoice numbers' - type: string - example: 'R-000000' - recurring_invoice_number_counter: - description: 'The counter for recurring invoice numbers' - type: number - example: 1 - client_portal_under_payment_minimum: - description: 'The minimum payment payment' - type: number - example: 10 - auto_bill_date: - description: 'Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))' - type: string - example: 'on_send_date' - primary_color: - description: 'The primary color for the client portal / document highlights' - type: string - example: '#ffffff' - secondary_color: - description: 'The secondary color for the client portal / document highlights' - type: string - example: '#ffffff' - client_portal_allow_under_payment: - description: 'Determines if clients can pay invoices under the invoice amount due' - type: boolean - example: false - client_portal_allow_over_payment: - description: 'Determines if clients can pay invoices over the invoice amount' - type: boolean - example: false - auto_bill: - description: 'Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing' - type: string - example: 'off' - client_portal_terms: - description: 'The terms which are displayed on the client portal' - type: string - example: 'Please see attached your invoice.' - client_portal_privacy_policy: - description: 'The privacy policy which is displayed on the client portal' - type: string - example: 'These are the terms of use for using the client portal.' - client_can_register: - description: 'Determines if clients can register on the client portal' - type: boolean - example: false - portal_design_id: - description: 'The design id for the client portal' - type: string - example: 'hd677df' - late_fee_endless_percent: - description: 'The late fee percentage for endless late fees' - type: number - example: 10 - late_fee_endless_amount: - description: 'The late fee amount for endless late fees' - type: number - example: 10 - auto_email_invoice: - description: 'Determines if invoices are automatically emailed when they are created' - type: boolean - example: false - email_signature: - description: 'The email signature for emails' - type: string - example: 'Bob Smith' - type: object - Product: - type: object - properties: - id: - type: string - description: 'The hashed product ID.' - example: eP01N - readOnly: true - company_id: - type: string - description: 'The hashed ID of the company that owns this product.' - example: eP01N - readOnly: true - user_id: - type: string - description: 'The hashed ID of the user that created this product.' - example: n30m4 - readOnly: true - assigned_user_id: - type: string - description: 'The hashed ID of the user assigned to this product.' - example: pR0j3 - project_id: - type: string - description: 'The hashed ID of the project that this product is associated with.' - example: pR0j3 - vendor_id: - type: string - description: 'The hashed ID of the vendor that this product is associated with.' - example: pR0j3 - custom_value1: - type: string - description: 'Custom value field 1.' - example: 'Custom value 1' - custom_value2: - type: string - description: 'Custom value field 2.' - example: 'Custom value 2' - custom_value3: - type: string - description: 'Custom value field 3.' - example: 'Custom value 3' - custom_value4: - type: string - description: 'Custom value field 4.' - example: 'Custom value 4' - product_key: - type: string - description: 'The product key.' - example: '1234' - notes: - type: string - description: 'Notes about the product.' - example: 'These are some notes about the product.' - cost: - type: number - format: double - description: 'The cost of the product. (Your purchase price for this product)' - example: 10.0 - price: - type: number - format: double - description: 'The price of the product that you are charging.' - example: 20.0 - quantity: - type: number - format: double - description: 'The quantity of the product. (used as a default)' - example: 5.0 - tax_name1: - type: string - description: 'The name of tax 1.' - example: 'Tax 1' - tax_rate1: - type: number - format: double - description: 'The rate of tax 1.' - example: 10.0 - tax_name2: - type: string - description: 'The name of tax 2.' - example: 'Tax 2' - tax_rate2: - type: number - format: double - description: 'The rate of tax 2.' - example: 5.0 - tax_name3: - type: string - description: 'The name of tax 3.' - example: 'Tax 3' - tax_rate3: - type: number - format: double - description: 'The rate of tax 3.' - example: 0.0 - archived_at: - type: integer - format: timestamp - description: 'The timestamp when the product was archived.' - example: '2022-03-18T15:00:00Z' - readOnly: true - created_at: - type: integer - format: timestamp - description: 'The timestamp when the product was created.' - example: '2022-03-18T15:00:00Z' - readOnly: true - updated_at: - description: Timestamp - type: integer - format: timestamp - example: '2022-03-18T12:34:56.789Z' - readOnly: true - is_deleted: - type: boolean - description: 'Boolean flag determining if the product has been deleted' - example: false - readOnly: true - in_stock_quantity: - type: integer - format: int32 - description: The quantity of the product that is currently in stock - default: 0 - stock_notification: - type: boolean - description: Indicates whether stock notifications are enabled for this product - default: true - stock_notification_threshold: - type: integer - format: int32 - description: The minimum quantity threshold for which stock notifications will be triggered - default: 0 - max_quantity: - type: integer - format: int32 - description: The maximum quantity that can be ordered for this product - product_image: - type: string - description: The URL of the product image - format: uri-reference - tax_id: - type: string - default: '1' - description: | - The tax category id for this product.' - - The following constants are available (default = '1') - - ``` - PRODUCT_TYPE_PHYSICAL = '1' - PRODUCT_TYPE_SERVICE = '2' - PRODUCT_TYPE_DIGITAL = '3' - PRODUCT_TYPE_SHIPPING = '4' - PRODUCT_TYPE_EXEMPT = '5' - PRODUCT_TYPE_REDUCED_TAX = '6' - PRODUCT_TYPE_OVERRIDE_TAX = '7' - PRODUCT_TYPE_ZERO_RATED = '8' - PRODUCT_TYPE_REVERSE_TAX = '9' - ``` - example: '1' - - ClientContactRequest: - properties: - id: - description: 'The hashed if of the contact' - type: string - example: Opnel5aKBz - readOnly: true - first_name: - description: 'The first name of the contact' - type: string - example: John - last_name: - description: 'The last name of the contact' - type: string - example: Doe - phone: - description: 'The phone number of the contact' - type: string - example: 555-152-4524 - custom_value1: - description: 'A Custom field value' - type: string - example: '' - custom_value2: - description: 'A Custom field value' - type: string - example: '' - custom_value3: - description: 'A Custom field value' - type: string - example: '' - custom_value4: - description: 'A Custom field value' - type: string - example: '' - email: - description: 'The email of the contact' - type: string - example: '' - password: - description: 'The hashed password of the contact' - type: string - example: '*****' - send_email: - description: 'Boolean value determines is this contact should receive emails' - type: boolean - example: true - type: object - ClientRequest: - required: - - contacts - - country_id - properties: - id: - description: 'The unique identifier of the client' - type: string - example: Opnel5aKBz - readOnly: true - contacts: - type: array - description: 'A list of contacts associated with the client' - items: - $ref: '#/components/schemas/ClientContactRequest' - name: - description: 'The name of the client company or organization' - type: string - example: "Jim's Housekeeping" - website: - description: 'The website URL of the client company or organization' - type: string - example: 'https://www.jims-housekeeping.com' - private_notes: - description: 'Notes that are only visible to the user who created the client' - type: string - example: 'Client prefers email communication over phone calls' - industry_id: - description: 'The unique identifier of the industry the client operates in' - type: number - example: '5' - size_id: - description: 'The unique identifier for the size category of the client company or organization' - type: number - example: '2' - address1: - description: "First line of the client's address" - type: string - example: '123 Main St' - address2: - description: "Second line of the client's address, if needed" - type: string - example: 'Apt 4B' - city: - description: 'The city the client is located in' - type: string - example: 'Beverly Hills' - state: - description: 'The state, province, or locality the client is located in' - type: string - example: 'California' - postal_code: - description: 'The postal code or ZIP code of the client' - type: string - example: '90210' - phone: - description: "The client's phone number" - type: string - example: '555-3434-3434' - country_id: - description: "The unique identifier of the client's country" - type: number - format: integer - example: '1' - custom_value1: - description: 'A custom field for storing additional information' - type: string - example: 'Preferred contact: Email' - custom_value2: - description: 'A custom field for storing additional information' - type: string - example: 'Account manager: John Doe' - custom_value3: - description: 'A custom field for storing additional information' - type: string - example: 'VIP client: Yes' - custom_value4: - description: 'A custom field for storing additional information' - type: string - example: 'Annual contract value: $50,000' - vat_number: - description: "The client's VAT (Value Added Tax) number, if applicable" - type: string - example: 'VAT123456' - id_number: - description: 'A unique identification number for the client, such as a tax ID or business registration number' - type: string - number: - description: 'A system-assigned unique number for the client, typically used for invoicing purposes' - type: string - example: 'CL-0001' - shipping_address1: - description: "First line of the client's shipping address" - type: string - example: '5 Wallaby Way' - shipping_address2: - description: "Second line of the client's shipping address, if needed" - type: string - example: 'Suite 5' - shipping_city: - description: "The city of the client's shipping address" - type: string - example: 'Perth' - shipping_state: - description: "The state, province, or locality of the client's shipping address" - type: string - example: 'Western Australia' - shipping_postal_code: - description: "The postal code or ZIP code of the client's shipping address" - type: string - example: '6110' - shipping_country_id: - description: "The unique identifier of the country for the client's shipping address" - type: number - format: integer - example: '4' - is_deleted: - description: 'A boolean value indicating whether the client has been deleted or not' - type: boolean - example: false - readOnly: true - group_settings_id: - description: 'The group settings assigned to the client' - type: string - example: Opnel5aKBz - routing_id: - description: 'The routing address id for e-invoicing for this client' - type: string - example: Opnel5aKBz3489-dfkiu-2239-sdsd - is_tax_exempt: - description: 'Flag which defines if the client is exempt from taxes' - type: boolean - example: false - has_valid_vat_number: - description: 'Flag which defines if the client has a valid VAT number' - type: boolean - example: false - readOnly: true - classification: - description: 'The classification of the client' - type: string - example: 'individual' - settings: - $ref: '#/components/schemas/ClientSettings' - type: object - Error: - properties: - message: - description: 'Something terrible went wrong' - type: string - example: 'Unexpected error' - code: - description: 'The HTTP error code, ie 5xx 4xx' - type: integer - example: '500' - type: object - BTRules: - properties: - data_key: - description: 'The key to search' - type: string - example: 'description,amount' - operator: - description: 'The operator flag of the search' - type: string - example: '>' - value: - description: 'The value to search for' - type: string - example: bob - type: object CompanySettings: required: - currency_id @@ -20770,6 +16225,1630 @@ components: type: string example: 'individual' type: object + SystemLog: + properties: + id: + description: 'The account hashed id' + type: string + example: AS3df3A + company_id: + description: 'The company hashed id' + type: string + example: AS3df3A + user_id: + description: 'The user_id hashed id' + type: string + example: AS3df3A + client_id: + description: 'The client_id hashed id' + type: string + example: AS3df3A + event_id: + description: 'The Log Type ID' + type: integer + example: 1 + category_id: + description: 'The Category Type ID' + type: integer + example: 1 + type_id: + description: 'The Type Type ID' + type: integer + example: 1 + log: + description: 'The json object of the error' + type: object + example: '{''key'':''value''}' + updated_at: + description: Timestamp + type: string + example: '2' + created_at: + description: Timestamp + type: string + example: '2' + type: object + ClientGatewayToken: + properties: + id: + description: 'The hashed id of the client gateway token' + type: string + example: Opnel5aKBz + company_id: + description: 'The hashed id of the company' + type: string + example: '2' + client_id: + description: 'The hashed_id of the client' + type: string + example: '2' + token: + description: 'The payment token' + type: string + example: '2' + routing_number: + description: 'THe bank account routing number' + type: string + example: '2' + company_gateway_id: + description: 'The hashed id of the company gateway' + type: string + example: '2' + is_default: + description: 'Flag determining if the token is the default payment method' + type: boolean + example: 'true' + type: object + + GenericBulkAction: + properties: + action: + type: string + example: archive + description: 'The action to perform ie. archive / restore / delete' + ids: + type: array + items: + format: string + type: string + example: 2J234DFA,D2J234DFA,D2J234DFA + description: string array of client hashed ids + type: object + InvoiceInvitationRequest: + required: + - client_contact_id + properties: + id: + description: 'The entity invitation hashed id' + type: string + example: Opnel5aKBz + readOnly: true + client_contact_id: + description: 'The client contact hashed id' + type: string + example: Opnel5aKBz + key: + description: 'The invitation key' + type: string + example: Opnel5aKBz4343343566236gvbb + readOnly: true + link: + description: 'The invitation link' + type: string + example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb' + readOnly: true + sent_date: + description: 'The invitation sent date' + type: string + format: date-time + readOnly: true + viewed_date: + description: 'The invitation viewed date' + type: string + format: date-time + readOnly: true + opened_date: + description: 'The invitation opened date' + type: string + format: date-time + readOnly: true + updated_at: + description: 'Timestamp' + type: number + format: integer + example: '1434342123' + readOnly: true + archived_at: + description: 'Timestamp' + type: number + format: integer + example: '1434342123' + readOnly: true + email_error: + description: 'The email error' + type: string + example: 'The email error' + readOnly: true + email_status: + description: 'The email status' + type: string + readOnly: true + + Client: + properties: + id: + description: 'The unique identifier of the client' + type: string + example: Opnel5aKBz + readOnly: true + contacts: + type: array + items: + $ref: '#/components/schemas/ClientContact' + user_id: + description: 'The unique identifier of the user who created the client' + type: string + example: Ua6Rw4pVbS + readOnly: true + assigned_user_id: + description: 'The unique identifier of the user who has been assigned the client' + type: string + example: Ua6Rw4pVbS + company_id: + description: 'The unique identifier of the company the client belongs to' + type: string + example: Co7Vn3yLmW + readOnly: true + name: + description: 'The name of the client company or organization' + type: string + example: "Jim's Housekeeping" + website: + description: 'The website URL of the client company or organization' + type: string + example: 'https://www.jims-housekeeping.com' + private_notes: + description: 'Notes that are only visible to the user who created the client' + type: string + example: 'Client prefers email communication over phone calls' + client_hash: + description: 'A unique hash value for the client' + type: string + example: asdfkjhk342hjhbfdvmnfb1 + readOnly: true + industry_id: + description: 'The unique identifier of the industry the client operates in' + type: number + example: '5' + size_id: + description: 'The unique identifier for the size category of the client company or organization' + type: number + example: '2' + address1: + description: "First line of the client's address" + type: string + example: '123 Main St' + address2: + description: "Second line of the client's address, if needed" + type: string + example: 'Apt 4B' + city: + description: 'The city the client is located in' + type: string + example: 'Beverly Hills' + state: + description: 'The state, province, or locality the client is located in' + type: string + example: 'California' + postal_code: + description: 'The postal code or ZIP code of the client' + type: string + example: '90210' + phone: + description: "The client's phone number" + type: string + example: '555-3434-3434' + country_id: + description: "The unique identifier of the client's country" + type: number + format: integer + example: '1' + custom_value1: + description: 'A custom field for storing additional information' + type: string + example: 'Preferred contact: Email' + custom_value2: + description: 'A custom field for storing additional information' + type: string + example: 'Account manager: John Doe' + custom_value3: + description: 'A custom field for storing additional information' + type: string + example: 'VIP client: Yes' + custom_value4: + description: 'A custom field for storing additional information' + type: string + example: 'Annual contract value: $50,000' + vat_number: + description: "The client's VAT (Value Added Tax) number, if applicable" + type: string + example: 'VAT123456' + id_number: + description: 'A unique identification number for the client, such as a tax ID or business registration number' + type: string + number: + description: 'A system-assigned unique number for the client, typically used for invoicing purposes' + type: string + example: 'CL-0001' + shipping_address1: + description: "First line of the client's shipping address" + type: string + example: '5 Wallaby Way' + shipping_address2: + description: "Second line of the client's shipping address, if needed" + type: string + example: 'Suite 5' + shipping_city: + description: "The city of the client's shipping address" + type: string + example: 'Perth' + shipping_state: + description: "The state, province, or locality of the client's shipping address" + type: string + example: 'Western Australia' + shipping_postal_code: + description: "The postal code or ZIP code of the client's shipping address" + type: string + example: '6110' + shipping_country_id: + description: "The unique identifier of the country for the client's shipping address" + type: number + format: integer + example: '4' + is_deleted: + description: 'A boolean value indicating whether the client has been deleted or not' + type: boolean + example: false + readOnly: true + balance: + description: 'The outstanding balance the client owes' + type: number + format: float + example: '500.00' + readOnly: true + paid_to_date: + description: 'The total amount the client has paid to date' + type: number + format: float + example: '2000.00' + readOnly: true + credit_balance: + description: 'The available credit balance for the client to use on future purchases' + type: number + format: float + example: '100.00' + readOnly: true + last_login: + description: "The timestamp of the client's last login" + type: number + format: integer + example: '1628686031' + readOnly: true + created_at: + description: 'The timestamp when the client was created' + type: number + format: integer + example: '1617629031' + readOnly: true + updated_at: + description: 'The timestamp when the client was last updated' + type: number + format: integer + example: '1628445631' + readOnly: true + group_settings_id: + description: 'The group settings assigned to the client' + type: string + example: Opnel5aKBz + routing_id: + description: 'The routing address id for e-invoicing for this client' + type: string + example: Opnel5aKBz3489-dfkiu-2239-sdsd + is_tax_exempt: + description: 'Flag which defines if the client is exempt from taxes' + type: boolean + example: false + has_valid_vat_number: + description: 'Flag which defines if the client has a valid VAT number' + type: boolean + example: false + readOnly: true + payment_balance: + description: 'Defines the payment balance the client has on file (pre payments / over payments / unapplied amounts)' + type: number + example: 100 + readOnly: true + settings: + $ref: '#/components/schemas/ClientSettings' + type: object + CompanyUser: + properties: + permissions: + description: 'The company user permissions' + type: string + example: '[create_invoice]' + settings: + description: 'Settings that are used for the frontend applications to store user preferences / metadata' + type: object + example: 'json object' + react_settings: + description: 'Dedicated settings object for the react web application' + type: object' + example: 'json object' + is_owner: + description: 'Determines whether the user owns this company' + type: boolean + example: true + is_admin: + description: 'Determines whether the user is the admin of this company' + type: boolean + example: true + is_locked: + description: 'Determines whether the users access to this company has been locked' + type: boolean + example: true + updated_at: + description: 'The last time the record was modified, format Unix Timestamp' + type: integer + example: '1231232312321' + deleted_at: + description: 'Timestamp when the user was archived, format Unix Timestamp' + type: integer + example: '12312312321' + account: + $ref: '#/components/schemas/Account' + company: + $ref: '#/components/schemas/Company' + user: + $ref: '#/components/schemas/User' + token: + $ref: '#/components/schemas/CompanyToken' + type: object + Design: + properties: + id: + description: 'The design hashed id' + type: string + example: AS3df3A + name: + description: 'The design name' + type: string + example: Beauty + design: + description: 'The design HTML' + type: string + example: '' + is_custom: + description: 'Flag to determine if the design is a custom user design' + type: boolean + example: true + is_active: + description: 'Flag to determine if the design is available for use' + type: boolean + example: true + is_deleted: + description: 'Flag to determine if the design is deleted' + type: boolean + example: true + created_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + updated_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + deleted_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + type: object + InvoiceRequest: + required: + - client_id + properties: + id: + description: 'The invoice hashed id' + type: string + example: Opnel5aKBz + readOnly: true + user_id: + description: 'The user hashed id' + type: string + example: Opnel5aKBz + assigned_user_id: + description: 'The assigned user hashed id' + type: string + example: Opnel5aKBz + company_id: + description: 'The company hashed id' + type: string + example: Opnel5aKBz + readOnly: true + client_id: + description: 'The client hashed id' + type: string + example: Opnel5aKBz + status_id: + description: 'The invoice status variable' + type: string + example: '4' + readOnly: true + number: + description: 'The invoice number - is a unique alpha numeric number per invoice per company' + type: string + example: INV_101 + po_number: + description: 'The purchase order associated with this invoice' + type: string + example: PO-1234 + terms: + description: 'The invoice terms' + type: string + example: 'These are invoice terms' + public_notes: + description: 'The public notes of the invoice' + type: string + example: 'These are some public notes' + private_notes: + description: 'The private notes of the invoice' + type: string + example: 'These are some private notes' + footer: + description: 'The invoice footer notes' + type: string + example: '' + custom_value1: + description: 'A custom field value' + type: string + example: '2022-10-01' + custom_value2: + description: 'A custom field value' + type: string + example: 'Something custom' + custom_value3: + description: 'A custom field value' + type: string + example: '' + custom_value4: + description: 'A custom field value' + type: string + example: '' + tax_name1: + description: 'The tax name' + type: string + example: '' + tax_name2: + description: 'The tax name' + type: string + example: '' + tax_rate1: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_rate2: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_name3: + description: 'The tax name' + type: string + example: '' + tax_rate3: + description: 'The tax rate' + type: number + format: float + example: '10.00' + total_taxes: + description: 'The total taxes for the invoice' + type: number + format: float + example: '10.00' + readOnly: + line_items: + type: array + description: 'An array of objects which define the line items of the invoice' + items: + $ref: '#/components/schemas/InvoiceItem' + invitations: + type: array + description: 'An array of objects which define the invitations of the invoice' + items: + $ref: '#/components/schemas/InvoiceInvitationRequest' + amount: + description: 'The invoice amount' + type: number + format: float + example: '10.00' + readOnly: true + balance: + description: 'The invoice balance' + type: number + format: float + example: '10.00' + readOnly: true + paid_to_date: + description: 'The amount paid on the invoice to date' + type: number + format: float + example: '10.00' + readOnly: true + discount: + description: 'The invoice discount, can be an amount or a percentage' + type: number + format: float + example: '10.00' + partial: + description: 'The deposit/partial amount' + type: number + format: float + example: '10.00' + is_amount_discount: + description: 'Flag determining if the discount is an amount or a percentage' + type: boolean + example: true + is_deleted: + description: 'Defines if the invoice has been deleted' + type: boolean + example: true + readOnly: true + uses_inclusive_taxes: + description: 'Defines the type of taxes used as either inclusive or exclusive' + type: boolean + example: true + date: + description: 'The Invoice Date' + type: string + format: date + example: '1994-07-30' + last_sent_date: + description: 'The last date the invoice was sent out' + type: string + format: date + example: '1994-07-30' + readOnly: true + next_send_date: + description: 'The Next date for a reminder to be sent' + type: string + format: date + example: '1994-07-30' + readOnly: true + partial_due_date: + description: 'The due date for the deposit/partial amount' + type: string + format: date + example: '1994-07-30' + due_date: + description: 'The due date of the invoice' + type: string + format: date + example: '1994-07-30' + last_viewed: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + custom_surcharge1: + description: 'First Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge2: + description: 'Second Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge3: + description: 'Third Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge4: + description: 'Fourth Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge_tax1: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + project_id: + description: 'The project associated with this invoice' + type: string + example: Opnel5aKBz + type: object + FillableInvoice: + properties: + assigned_user_id: + description: "The assigned user's hashed ID" + type: string + example: 'a1b2c3d4' + client_id: + description: "The client's hashed ID" + type: string + example: 'x1y2z3a4' + number: + description: "The unique alphanumeric invoice number for each invoice per company" + type: string + example: INV_101 + po_number: + description: "The purchase order number associated with the invoice" + type: string + example: 'PO12345' + terms: + description: "The terms and conditions for the invoice" + type: string + example: 'Net 30' + public_notes: + description: "Public notes visible to the client on the invoice" + type: string + example: 'Thank you for your business.' + private_notes: + description: "Private notes for internal use only" + type: string + example: 'Client is a slow payer.' + footer: + description: "The footer text displayed on the invoice" + type: string + example: 'Authorized Signature' + custom_value1: + description: "First custom value for additional information" + type: string + example: 'Project ABC' + custom_value2: + description: "Second custom value for additional information" + type: string + example: 'Department XYZ' + custom_value3: + description: "Third custom value for additional information" + type: string + example: 'Location 123' + custom_value4: + description: "Fourth custom value for additional information" + type: string + example: 'Currency USD' + tax_name1: + description: "Name of the first tax applied to the invoice" + type: string + example: 'VAT' + tax_name2: + description: "Name of the second tax applied to the invoice" + type: string + example: 'GST' + tax_rate1: + description: "Rate of the first tax applied to the invoice" + type: number + example: 10.00 + tax_rate2: + description: "Rate of the second tax applied to the invoice" + type: number + example: 5.00 + tax_name3: + description: "Name of the third tax applied to the invoice" + type: string + example: 'PST' + tax_rate3: + description: "Rate of the third tax applied to the invoice" + type: number + example: 8.00 + line_items: + type: array + description: 'An array of objects which define the line items of the invoice' + items: + $ref: '#/components/schemas/InvoiceItem' + discount: + description: "The discount applied to the invoice" + type: number + example: 10.00 + partial: + description: "The partial amount applied to the invoice" + type: number + example: 20.00 + is_amount_discount: + description: "Indicates whether the discount applied is a fixed amount or a percentage" + type: boolean + example: true + uses_inclusive_taxes: + description: "Indicates whether the tax rates applied to the invoice are inclusive or exclusive" + type: boolean + example: true + date: + description: "The date the invoice was issued" + type: string + example: '1994-07-30' + partial_due_date: + description: "The due date for the partial payment" + type: string + example: '1994-08-15' + due_date: + description: "The due date for the invoice" + type: string + example: '1994-08-30' + custom_surcharge1: + description: "First custom surcharge applied to the invoice" + type: number + example: 10.00 + custom_surcharge2: + description: "Second custom surcharge applied to the invoice" + type: number + example: 15.00 + custom_surcharge3: + description: "Third custom surcharge applied to the invoice" + type: number + example: 5.00 + custom_surcharge4: + description: "Fourth custom surcharge applied to the invoice" + type: number + example: 20.00 + type: object + Paymentable: + properties: + id: + description: 'The paymentable hashed id' + type: string + example: AS3df3A + invoice_id: + description: 'The invoice hashed id' + type: string + example: AS3df3A + credit_id: + description: 'The credit hashed id' + type: string + example: AS3df3A + refunded: + description: 'The amount that has been refunded for this payment' + type: number + format: float + example: '10.00' + amount: + description: 'The amount that has been applied to the payment' + type: number + format: float + example: '10.00' + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + created_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + type: object + BankTransaction: + properties: + id: + description: 'The bank integration hashed id' + type: string + example: AS3df3A + company_id: + description: 'The company hashed id' + type: string + example: AS3df3A + user_id: + description: 'The user hashed id' + type: string + example: AS3df3A + transaction_id: + description: 'The id of the transaction rule' + type: integer + example: 343434 + amount: + description: 'The transaction amount' + type: number + example: 10 + currency_id: + description: 'The currency ID of the currency' + type: string + example: '1' + account_type: + description: 'The account type' + type: string + example: creditCard + description: + description: 'The description of the transaction' + type: string + example: 'Potato purchases for kevin' + category_id: + description: 'The category id' + type: integer + example: 1 + category_type: + description: 'The category description' + type: string + example: Expenses + base_type: + description: 'Either CREDIT or DEBIT' + type: string + example: CREDIT + date: + description: 'The date of the transaction' + type: string + example: '2022-09-01' + bank_account_id: + description: 'The ID number of the bank account' + type: integer + example: '1' + type: object + Meta: + properties: + pagination: + $ref: '#/components/schemas/Pagination' + Pagination: + type: object + properties: + total: + type: integer + description: 'The total number of items' + example: 1 + readOnly: true + count: + type: integer + description: 'The number of items per page' + example: 1 + readOnly: true + per_page: + type: integer + description: 'The number of items per page' + example: 1 + readOnly: true + current_page: + type: integer + description: 'The current page number' + example: 1 + readOnly: true + total_pages: + type: integer + description: 'The total number of pages' + example: 1 + readOnly: true + links: + type: array + description: 'The pagination links' + readOnly: true + + FeesAndLimits: + properties: + min_limit: + description: 'The minimum amount accepted for this gateway' + type: string + example: '2' + max_limit: + description: 'The maximum amount accepted for this gateway' + type: string + example: '2' + fee_amount: + description: 'The gateway fee amount' + type: number + format: float + example: '2.0' + fee_percent: + description: 'The gateway fee percentage' + type: number + format: float + example: '2.0' + fee_tax_name1: + description: 'Fee tax name' + type: string + example: GST + fee_tax_name2: + description: 'Fee tax name' + type: string + example: VAT + fee_tax_name3: + description: 'Fee tax name' + type: string + example: 'CA Sales Tax' + fee_tax_rate1: + description: 'The tax rate' + type: number + format: float + example: '10.0' + fee_tax_rate2: + description: 'The tax rate' + type: number + format: float + example: '17.5' + fee_tax_rate3: + description: 'The tax rate' + type: number + format: float + example: '25.0' + fee_cap: + description: 'If set the fee amount will be no higher than this amount' + type: number + format: float + example: '2.0' + adjust_fee_percent: + description: 'Adjusts the fee to match the exact gateway fee.' + type: boolean + example: true + type: object + InvoiceItem: + type: object + properties: + quantity: + type: integer + example: 1 + description: 'The quantity of the product offered for this line item' + cost: + type: number + format: float + example: 10.00 + description: 'The cost of the product offered for this line item' + product_key: + type: string + example: 'Product key' + description: 'The product key of the product offered for this line item (Referred to as Product in the product tab)' + product_cost: + type: number + format: float + example: 10.00 + description: 'The cost of the product offered for this line item (Referred to as Cost in the product tab)' + notes: + type: string + example: 'Item notes' + description: 'The notes/description for the product offered for this line item' + discount: + type: number + format: float + example: 5.00 + description: 'The discount applied to the product offered for this line item' + is_amount_discount: + type: boolean + example: false + description: 'Indicates whether the discount applied to the product offered for this line item is a fixed amount or a percentage' + tax_name1: + type: string + example: 'GST' + description: 'The name of the first tax applied to the product offered for this line item' + tax_rate1: + type: number + format: float + example: 10.00 + description: 'The rate of the first tax applied to the product offered for this line item' + tax_name2: + type: string + example: 'VAT' + description: 'The name of the second tax applied to the product offered for this line item' + tax_rate2: + type: number + format: float + example: 5.00 + description: 'The rate of the second tax applied to the product offered for this line item' + tax_name3: + type: string + example: 'CA Sales Tax' + description: 'The name of the third tax applied to the product offered for this line item' + tax_rate3: + type: number + format: float + example: 3.00 + description: 'The rate of the third tax applied to the product offered for this line item' + sort_id: + type: string + example: '0' + description: 'Deprecated' + deprecated: true + line_total: + type: number + format: float + example: 10.00 + description: 'The total amount of the product offered for this line item' + readOnly: true + gross_line_total: + type: number + format: float + example: 15.00 + description: 'The total amount of the product offered for this line item before discounts' + readOnly: true + tax_amount: + type: number + format: float + example: 1.00 + description: 'The total amount of tax applied to the product offered for this line item' + readOnly: true + date: + type: string + format: date-time + example: '2023-03-19T00:00:00Z' + description: 'Deprecated' + deprecated: true + custom_value1: + type: string + example: 'Custom value 1' + description: 'The first custom value of the product offered for this line item' + custom_value2: + type: string + example: 'Custom value 2' + description: 'The second custom value of the product offered for this line item' + custom_value3: + type: string + example: 'Custom value 3' + description: 'The third custom value of the product offered for this line item' + custom_value4: + type: string + example: 'Custom value 4' + description: 'The fourth custom value of the product offered for this line item' + type_id: + type: string + example: '1' + description: '1 = product, 2 = service, 3 unpaid gateway fee, 4 paid gateway fee, 5 late fee, 6 expense' + default: '1' + tax_id: + type: string + example: '1' + default: '1' + description: 'The tax ID of the product: 1 product, 2 service, 3 digital, 4 shipping, 5 exempt, 5 reduced tax, 7 override, 8 zero rate, 9 reverse tax' + Project: + type: object + properties: + id: + description: 'The project hashed id' + type: string + example: Opnel5aKBz + user_id: + description: 'The user hashed id' + type: string + example: Opnel5aKBz + assigned_user_id: + description: The assigned user identifier associated with the project + type: string + example: Opnel5aKBz + client_id: + type: string + example: Opnel5aKBz + description: The client identifier associated with the project + name: + type: string + description: The name of the project + example: 'New Project' + task_rate: + type: number + format: float + example: 10 + description: The default rate per task for the project + due_date: + type: string + format: date + example: '2019-01-01' + description: The due date for the project + private_notes: + type: string + description: Private notes associated with the project + budgeted_hours: + type: number + format: float + description: The number of budgeted hours for the project + custom_value1: + type: string + description: Custom value field 1 + custom_value2: + type: string + description: Custom value field 2 + custom_value3: + type: string + description: Custom value field 3 + custom_value4: + type: string + description: Custom value field 4 + created_at: + type: number + format: integer + example: 134341234234 + description: The timestamp of the project creation + updated_at: + type: number + format: integer + example: 134341234234 + description: The timestamp of the last project update + archived_at: + type: number + format: integer + example: 134341234234 + description: The timestamp of the project deletion + public_notes: + type: string + description: Public notes associated with the project + is_deleted: + type: boolean + description: A flag indicating if the project is deleted + number: + type: string + description: The project number + color: + type: string + description: The color associated with the project + required: + - id + - user_id + - company_id + - name + - task_rate + - budgeted_hours + - is_deleted + - color + + PaymentTerm: + properties: + num_days: + description: 'The payment term length in days' + type: integer + example: '1' + name: + description: 'The payment term length in string format' + type: string + example: 'NET 1' + created_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + updated_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + archived_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + type: object + BankIntegration: + properties: + id: + description: 'The bank integration hashed id' + type: string + example: AS3df3A + company_id: + description: 'The company hashed id' + type: string + example: AS3df3A + user_id: + description: 'The user hashed id' + type: string + example: AS3df3A + provider_bank_name: + description: 'The providers bank name' + type: string + example: 'Chase Bank' + bank_account_id: + description: 'The bank account id' + type: integer + example: '1233434' + bank_account_name: + description: 'The name of the account' + type: string + example: 'My Checking Acc' + bank_account_number: + description: 'The account number' + type: string + example: '111 234 2332' + bank_account_status: + description: 'The status of the bank account' + type: string + example: ACTIVE + bank_account_type: + description: 'The type of account' + type: string + example: CREDITCARD + balance: + description: 'The current bank balance if available' + type: number + example: '1000000' + currency: + description: 'iso_3166_3 code' + type: string + example: USD + type: object + PurchaseOrder: + properties: + id: + description: 'The unique hashed identifier for the purchase order' + type: string + example: Opnel5aKBz + user_id: + description: 'The unique hashed identifier for the user who created the purchase order' + type: string + example: '' + assigned_user_id: + description: 'The unique hashed identifier for the user assigned to the purchase order' + type: string + example: '' + company_id: + description: 'The unique hashed identifier for the company associated with the purchase order' + type: string + example: '' + vendor_id: + description: 'The unique hashed identifier for the vendor associated with the purchase order' + type: string + example: '' + status_id: + description: 'The status of the purchase order represented by a unique identifier' + type: string + example: '' + number: + description: 'The unique alpha-numeric purchase order number per company' + type: string + example: PO_101 + quote_number: + description: 'The quote number associated with this purchase order' + type: string + example: QUOTE_101 + terms: + description: 'The terms and conditions for the purchase order' + type: string + example: 'These are some purchase order terms. Valid for 14 days.' + public_notes: + description: 'Publicly visible notes associated with the purchase order' + type: string + example: 'These are public notes which the vendor may see' + private_notes: + description: 'Privately visible notes associated with the purchase order, not disclosed to the vendor' + type: string + example: 'These are private notes, not to be disclosed to the vendor' + footer: + description: 'The footer text of the purchase order' + type: string + example: 'The text goes in the footer of the purchase order' + custom_value1: + description: 'First custom value field for additional information' + type: string + example: 'A custom value' + custom_value2: + description: 'Second custom value field for additional information' + type: string + example: 'A custom value' + custom_value3: + description: 'Third custom value field for additional information' + type: string + example: 'A custom value' + custom_value4: + description: 'Fourth custom value field for additional information' + type: string + example: 'A custom value' + tax_name1: + description: 'The name of the first tax applied to the purchase order' + type: string + example: GST + tax_name2: + description: 'The name of the second tax applied to the purchase order' + type: string + example: VAT + tax_rate1: + description: 'The rate of the first tax applied to the purchase order' + type: number + format: float + example: 10.00 + tax_rate2: + description: 'The rate of the second tax applied to the purchase order' + type: number + format: float + example: 10.00 + tax_name3: + description: 'The name of the third tax applied to the purchase order' + type: string + example: '' + tax_rate3: + description: 'The rate of the third tax applied to the purchase order' + type: number + format: float + example: 10.00 + total_taxes: + description: 'The total amount of taxes applied to the purchase order' + type: number + format: float + example: 10.00 + line_items: + type: array + description: 'An array of objects which define the line items of the purchase order' + items: + $ref: '#/components/schemas/InvoiceItem' + amount: + description: 'The total amount of the purchase order before taxes and discounts' + type: number + format: float + example: 10.00 + balance: + description: 'The balance due for the purchase order after accounting for payments' + type: number + format: float + example: 10.00 + paid_to_date: + description: 'The total amount paid on the purchase order so far' + type: number + format: float + example: 10.00 + discount: + description: 'The discount amount or percentage applied to the purchase order' + type: number + format: float + example: 10.00 + partial: + description: 'The partial or deposit amount for the purchase order' + type: number + format: float + example: 10.00 + is_amount_discount: + description: 'Boolean flag indicating if the discount is a fixed amount or a percentage' + type: boolean + example: true + is_deleted: + description: 'Boolean flag indicating if the purchase order has been deleted' + type: boolean + example: false + uses_inclusive_taxes: + description: 'Boolean flag indicating if the taxes used are inclusive or exclusive' + type: boolean + example: true + date: + description: 'The date the purchase order was created' + type: string + format: date + example: '1994-07-30' + last_sent_date: + description: 'The last date the purchase order was sent to the vendor' + type: string + format: date + example: '1994-07-30' + next_send_date: + description: 'The next scheduled date for sending a reminder for the purchase order' + type: string + format: date + example: '1994-07-30' + partial_due_date: + description: 'The due date for the partial or deposit amount' + type: string + format: date + example: '1994-07-30' + due_date: + description: 'The due date for the total amount of the purchase order' + type: string + format: date + example: '1994-07-30' + settings: + $ref: '#/components/schemas/CompanySettings' + last_viewed: + description: Timestamp + type: number + format: integer + example: 1434342123 + updated_at: + description: Timestamp + type: number + format: integer + example: 1434342123 + archived_at: + description: Timestamp + type: number + format: integer + example: 1434342123 + custom_surcharge1: + description: 'First custom surcharge amount for the purchase order' + type: number + format: float + example: 10.00 + custom_surcharge2: + description: 'Second custom surcharge amount for the purchase order' + type: number + format: float + example: 10.00 + custom_surcharge3: + description: 'Third custom surcharge amount for the purchase order' + type: number + format: float + example: 10.00 + custom_surcharge4: + description: 'Fourth custom surcharge amount for the purchase order' + type: number + format: float + example: 10.00 + custom_surcharge_tax1: + description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount' + type: boolean + example: true + type: object + + + CompanyLedger: + properties: + entity_id: + description: 'This field will reference one of the following entity hashed ID payment_id, invoice_id or credit_id' + type: string + example: AS3df3A + notes: + description: 'The notes which reference this entry of the ledger' + type: string + example: 'Credit note for invoice #3212' + balance: + description: 'The client balance' + type: number + format: float + example: '10.00' + adjustment: + description: 'The amount the client balance is adjusted by' + type: number + format: float + example: '10.00' + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + created_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + type: object + Task: + properties: + id: + description: 'The hashed id of the task' + type: string + example: Opnel5aKBz + user_id: + description: 'The hashed id of the user who created the task' + type: string + example: Opnel5aKBz + assigned_user_id: + description: 'The assigned user of the task' + type: string + example: Opnel5aKBz + company_id: + description: 'The hashed id of the company' + type: string + example: Opnel5aKBz + client_id: + description: 'The hashed if of the client' + type: string + example: Opnel5aKBz + invoice_id: + description: 'The hashed id of the invoice associated with the task' + type: string + example: Opnel5aKBz + project_id: + description: 'The hashed id of the project associated with the task' + type: string + example: Opnel5aKBz + number: + description: 'The number of the task' + type: string + example: TASK-123 + time_log: + description: 'An array of unix time stamps defining the start and end times of the task' + type: string + example: '[[1,2],[3,4]]' + is_running: + description: 'Determines if the task is still running' + type: boolean + example: true + is_deleted: + description: 'Boolean flag determining if the task has been deleted' + type: boolean + example: true + task_status_id: + description: 'The hashed id of the task status' + type: string + example: Opnel5aKBz + description: + description: 'The task description' + type: string + example: 'A wonder task to work on' + duration: + description: 'The task duration in seconds' + type: integer + example: '3600' + task_status_order: + description: 'The order of the task' + type: integer + example: '4' + rate: + description: 'The task rate' + type: number + example: 10.00 + custom_value1: + description: 'A custom value' + type: string + example: '2022-10-10' + custom_value2: + description: 'A custom value' + type: string + example: $1100 + custom_value3: + description: 'A custom value' + type: string + example: 'I need help' + custom_value4: + description: 'A custom value' + type: string + example: INV-3343 + is_date_based: + description: 'Boolean flag determining if the task is date based' + type: boolean + example: true + calculated_start_date: + description: 'The calculated start date of the task' + type: string + example: '2022-10-10' + readOnly: true + invoice_documents: + description: "Boolean flags which determines whether to include the task documents on the invoice" + type: boolean + example: true + created_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + readOnly: true + type: object ClientContact: properties: id: @@ -20883,241 +17962,2836 @@ components: format: integer example: '134341234234' type: object - - FeesAndLimits: + ClientContactRequest: properties: - min_limit: - description: 'The minimum amount accepted for this gateway' + id: + description: 'The hashed if of the contact' type: string - example: '2' - max_limit: - description: 'The maximum amount accepted for this gateway' + example: Opnel5aKBz + readOnly: true + first_name: + description: 'The first name of the contact' type: string - example: '2' - fee_amount: - description: 'The gateway fee amount' - type: number - format: float - example: '2.0' - fee_percent: - description: 'The gateway fee percentage' - type: number - format: float - example: '2.0' - fee_tax_name1: - description: 'Fee tax name' + example: John + last_name: + description: 'The last name of the contact' type: string - example: GST - fee_tax_name2: - description: 'Fee tax name' + example: Doe + phone: + description: 'The phone number of the contact' type: string - example: VAT - fee_tax_name3: - description: 'Fee tax name' + example: 555-152-4524 + custom_value1: + description: 'A Custom field value' type: string - example: 'CA Sales Tax' - fee_tax_rate1: - description: 'The tax rate' - type: number - format: float - example: '10.0' - fee_tax_rate2: - description: 'The tax rate' - type: number - format: float - example: '17.5' - fee_tax_rate3: - description: 'The tax rate' - type: number - format: float - example: '25.0' - fee_cap: - description: 'If set the fee amount will be no higher than this amount' - type: number - format: float - example: '2.0' - adjust_fee_percent: - description: 'Adjusts the fee to match the exact gateway fee.' + example: '' + custom_value2: + description: 'A Custom field value' + type: string + example: '' + custom_value3: + description: 'A Custom field value' + type: string + example: '' + custom_value4: + description: 'A Custom field value' + type: string + example: '' + email: + description: 'The email of the contact' + type: string + example: '' + password: + description: 'The hashed password of the contact' + type: string + example: '*****' + send_email: + description: 'Boolean value determines is this contact should receive emails' type: boolean example: true type: object - Account: + VendorContact: properties: id: - description: 'The account hashed id' + description: 'The hashed id of the vendor contact' type: string - example: AS3df3A - account_sms_verified: - description: 'Boolean flag if the account has been verified by sms' + example: Opnel5aKBz + readOnly: true + user_id: + description: 'The hashed id of the user id' type: string - example: true - type: object - BankTransactionRule: - properties: - id: - description: 'The bank transaction rules hashed id' - type: string - example: AS3df3A + example: Opnel5aKBz company_id: - description: 'The company hashed id' + description: 'The hashed id of the company' type: string - example: AS3df3A + example: Opnel5aKBz + vendor_id: + description: 'The hashed id of the vendor' + type: string + example: Opnel5aKBz + first_name: + description: 'The first name of the contact' + type: string + example: Harry + last_name: + description: 'The last name of the contact' + type: string + example: Windsor + phone: + description: 'The contacts phone number' + type: string + example: 555-123-1234 + custom_value1: + description: 'A custom value' + type: string + example: '2022-10-10' + custom_value2: + description: 'A custom value' + type: string + example: $1000 + custom_value3: + description: 'A custom value' + type: string + example: '' + custom_value4: + description: 'A custom value' + type: string + example: '' + email: + description: 'The contact email address' + type: string + example: harry@windsor.com + is_primary: + description: 'Boolean flag determining if the contact is the primary contact for the vendor' + type: boolean + example: true + created_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + readOnly: true + updated_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + readOnly: true + deleted_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + readOnly: true + type: object + Subscription: + properties: + id: + description: Unique identifier for the subscription + type: string + example: Opnel5aKBz + user_id: + description: Unique identifier for the user associated with the subscription + type: string + example: Ua6Rw4pVbS + product_id: + description: Unique identifier for the product associated with the subscription + type: string + example: Pr5Ft7yBmC + company_id: + description: Unique identifier for the company associated with the subscription + type: string + example: Co7Vn3yLmW + recurring_invoice_id: + description: Unique identifier for the recurring invoice associated with the subscription + type: string + example: Ri2Yt8zJkP + is_recurring: + description: Indicates whether the subscription is recurring + type: boolean + example: 'true' + frequency_id: + description: 'integer const representation of the frequency' + type: string + example: '1' + auto_bill: + description: 'enum setting' + type: string + example: always + promo_code: + description: Promotional code applied to the subscription + type: string + example: PROMOCODE4U + promo_discount: + description: Discount percentage or amount applied to the subscription + type: number + example: 10 + is_amount_discount: + description: Indicates whether the discount is a fixed amount + type: boolean + example: 'true' + allow_cancellation: + description: Indicates whether the subscription can be cancelled + type: boolean + example: 'true' + per_seat_enabled: + description: Indicates whether the subscription pricing is per seat + type: boolean + example: 'true' + currency_id: + description: Unique identifier for the currency used in the subscription + type: integer + example: '1' + max_seats_limit: + description: Maximum number of seats allowed for the subscription + type: integer + example: '100' + trial_enabled: + description: Indicates whether the subscription has a trial period + type: boolean + example: 'true' + trial_duration: + description: Duration of the trial period in days + type: integer + example: '14' + allow_query_overrides: + description: Indicates whether query overrides are allowed for the subscription + type: boolean + example: 'true' + allow_plan_changes: + description: Indicates whether plan changes are allowed for the subscription + type: boolean + example: 'true' + refund_period: + description: Number of days within which refunds can be requested + type: integer + example: '30' + webhook_configuration: + description: Webhook configuration for the subscription + type: string + example: 'expand reference for this' + is_deleted: + description: Indicates whether the subscription has been deleted + type: boolean + example: 'false' + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + created_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + updated_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + type: object + BulkAction: + type: array + items: + type: integer + example: '[0,1,2,3,]' + BTRules: + properties: + data_key: + description: 'The key to search' + type: string + example: 'description,amount' + operator: + description: 'The operator flag of the search' + type: string + example: '>' + value: + description: 'The value to search for' + type: string + example: bob + type: object + Company: + properties: + id: + description: "The unique hashed identifier for the company" + type: string + example: WJxbojagwO + size_id: + description: "The unique identifier representing the company's size category" + type: string + example: '2' + industry_id: + description: "The unique identifier representing the company's industry category" + type: string + example: '5' + slack_webhook_url: + description: "The URL for the company's Slack webhook notifications" + type: string + example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' + google_analytics_key: + description: "The company's Google Analytics tracking ID" + type: string + example: 'UA-123456789-1' + portal_mode: + description: "The mode determining how client-facing URLs are structured (e.g., subdomain, domain, or iframe)" + type: string + example: subdomain + subdomain: + description: "The subdomain prefix for the company's domain (e.g., 'acme' in acme.domain.com)" + type: string + example: acme + portal_domain: + description: "The fully qualified domain used for client-facing URLs" + type: string + example: 'https://subdomain.invoicing.co' + enabled_tax_rates: + description: "The number of tax rates used per entity" + type: integer + example: '2' + fill_products: + description: "A flag determining whether to auto-fill product descriptions based on the product key" + type: boolean + example: true + convert_products: + description: "A flag determining whether to convert products between different types or units" + type: boolean + example: true + update_products: + description: "A flag determining whether to update product descriptions when the description changes" + type: boolean + example: true + show_product_details: + description: "A flag determining whether to display product details in the user interface" + type: boolean + example: true + show_product_cost: + description: "A flag determining whether to display product cost is shown in the user interface" + type: boolean + example: true + custom_fields: + description: "A mapping of custom fields for various objects within the company" + type: object + enable_product_cost: + description: "A flag determining whether to show or hide the product cost field in the user interface" + type: boolean + example: true + enable_product_quantity: + description: "A flag determining whether to show or hide the product quantity field in the user interface" + type: boolean + example: true + default_quantity: + description: "A flag determining whether to use a default quantity for products" + type: boolean + example: true + custom_surcharge_taxes1: + description: "A flag determining whether to apply taxes on custom surcharge amounts for the first custom surcharge field" + type: boolean + example: true + custom_surcharge_taxes2: + description: "A flag determining whether to apply taxes on custom surcharge amounts for the second custom surcharge field" + type: boolean + example: true + custom_surcharge_taxes3: + description: "A flag determining whether to apply taxes on custom surcharge amounts for the third custom surcharge field" + type: boolean + example: true + custom_surcharge_taxes4: + description: "A flag determining whether to apply taxes on custom surcharge amounts for the fourth custom" + logo: + description: "The company logo file in binary format" + type: string + format: binary + example: logo.png + company_key: + description: "The static company key hash used to identify the Company" + readOnly: true + type: string + example: "Vnb14bRlwiFjc5ckte6cfbygTRkn5IMQ" + client_can_register: + description: "A flag determining whether clients can register for the client portal" + type: boolean + example: true + enabled_modules: + type: integer + description: | + Bitmask representation of the modules that are enabled in the application + + ``` + self::ENTITY_RECURRING_INVOICE => 1, + self::ENTITY_CREDIT => 2, + self::ENTITY_QUOTE => 4, + self::ENTITY_TASK => 8, + self::ENTITY_EXPENSE => 16, + self::ENTITY_PROJECT => 32, + self::ENTITY_VENDOR => 64, + self::ENTITY_TICKET => 128, + self::ENTITY_PROPOSAL => 256, + self::ENTITY_RECURRING_EXPENSE => 512, + self::ENTITY_RECURRING_TASK => 1024, + self::ENTITY_RECURRING_QUOTE => 2048, + ``` + + The default per_page value is 20. + + example: 2048 + db: + readOnly: true + type: string + example: 'db-ninja-01' + first_day_of_week: + description: "The first day of the week for the company" + type: string + example: '1' + first_month_of_year: + description: "The first month for the company financial year" + type: string + example: '1' + enabled_item_tax_rates: + description: "The number of tax rates used per item" + type: integer + example: 2 + is_large: + description: "A flag determining whether the company is considered large" + type: boolean + example: true + default_auto_bill: + type: enum + example: 'always' + description: | + A flag determining whether to auto-bill clients by default + + values: + + - always - Always auto bill + - disabled - Never auto bill + - optin - Allow the client to select their auto bill status with the default being disabled + - optout -Allow the client to select their auto bill status with the default being enabled + mark_expenses_invoiceable: + description: "A flag determining whether to mark expenses as invoiceable by default" + type: boolean + example: true + mark_expenses_paid: + description: "A flag determining whether to mark expenses as paid by default" + type: boolean + example: true + invoice_expense_documents: + description: "A flag determining whether to include expense documents on invoices by default" + type: boolean + example: true + auto_start_tasks: + description: "A flag determining whether to auto-start tasks by default" + type: boolean + example: true + invoice_task_timelog: + description: "A flag determining whether to include task time logs on invoices by default" + type: boolean + example: true + invoice_task_documents: + description: "A flag determining whether to include task documents on invoices by default" + type: boolean + example: true + show_tasks_table: + description: "A flag determining whether to show the tasks table on invoices by default" + type: boolean + example: true + is_disabled: + description: "A flag determining whether the company is disabled" + type: boolean + example: true + default_task_is_date_based: + description: "A flag determining whether to default tasks to be date-based" + type: boolean + example: true + enable_product_discount: + description: "A flag determining whether to show or hide the product discount field in the user interface" + type: boolean + example: true + calculate_expense_tax_by_amount: + description: "A flag determining whether to calculate expense taxes by amount" + type: boolean + example: true + expense_inclusive_taxes: + description: "A flag determining whether to include taxes in the expense amount" + type: boolean + example: true + session_timeout: + description: "The session timeout for the company" + type: integer + example: 60 + oauth_password_required: + description: "A flag determining whether to require a password for `dangerous` actions when using OAuth" + type: boolean + example: true + invoice_task_datelog: + description: "A flag determining whether to include task date logs on invoices by default" + type: boolean + example: true + default_password_timeout: + description: "The default password timeout for the company" + type: integer + example: 60 + show_task_end_date: + description: "A flag determining whether to show the task end date on invoices by default" + type: boolean + example: true + markdown_enabled: + description: "A flag determining whether markdown is enabled for the company" + type: boolean + example: true + report_include_drafts: + description: "A flag determining whether to include draft invoices in reports" + type: boolean + example: true + client_registration_fields: + description: "The client registration fields for the company" + type: object + stop_on_unpaid_recurring: + description: "A flag determining whether to stop recurring invoices when they are unpaid" + type: boolean + example: true + use_quote_terms_on_conversion: + description: "A flag determining whether to use quote terms on conversion to an invoice" + type: boolean + example: true + enable_applying_payments: + description: "A flag determining whether to enable applying payments to invoices" + type: boolean + example: true + track_inventory: + description: "A flag determining whether to track inventory for the company" + type: boolean + example: true + inventory_notification_threshold: + description: "The inventory notification threshold for the company" + type: integer + example: 60 + stock_notification: + description: "A flag determining whether to send stock notifications for the company" + type: boolean + example: true + matomo_url: + description: "The Matomo URL for the company" + type: string + example: 'https://matomo.example.com' + matomo_id: + description: "The Matomo ID for the company" + type: string + example: '1' + enabled_expense_tax_rates: + description: "The number of tax rates used per expense" + type: integer + example: 2 + invoice_task_project: + description: "A flag determining whether to include the project on invoices by default" + type: boolean + example: true + report_include_deleted: + description: "A flag determining whether to include deleted invoices in reports" + type: boolean + example: true + invoice_task_lock: + description: "A flag determining whether to lock tasks when invoiced" + type: boolean + example: true + convert_payment_currency: + description: "A flag determining whether to convert the payment currency" + type: boolean + example: true + convert_expense_currency: + description: "A flag determining whether to convert the expense currency" + type: boolean + example: true + notify_vendor_when_paid: + description: "A flag determining whether to notify the vendor when an expense is paid" + type: boolean + example: true + invoice_task_hours: + description: "A flag determining whether to include the task hours on invoices by default" + type: boolean + example: true + calculate_taxes: + description: "A flag determining whether to calculate taxes for the company" + type: boolean + example: true + tax_data: + description: "The tax data for the company" + type: object + e_invoice_certificate: + description: "The e-invoice certificate for the company" + type: string + example: '-----BEGIN CERTIFICATE-----' + e_invoice_certificate_passphrase: + description: "The e-invoice certificate passphrase for the company" + type: string + example: 'secret' + origin_tax_data: + description: "The origin tax data for the company" + type: object + invoice_task_project_header: + description: "A flag determining whether to include the project header on invoices by default" + type: boolean + example: true + invoice_task_item_description: + description: "A flag determining whether to include the item description on invoices by default" + type: boolean + example: true + + settings: + $ref: '#/components/schemas/CompanySettings' + type: object + RecurringInvoice: + properties: + id: + description: 'The hashed id of the recurring invoice' + type: string + example: Opnel5aKBz user_id: description: 'The user hashed id' type: string - example: AS3df3A - name: - description: 'The name of the transaction' + example: Opnel5aKBz + assigned_user_id: + description: 'The assigned user hashed id' type: string - example: 'Rule 1' - rules: - description: 'A mapped collection of the sub rules for the BankTransactionRule' - type: array - items: - $ref: '#/components/schemas/BTRules' - auto_convert: - description: 'Flags whether the rule converts the transaction automatically' - type: boolean - example: true - matches_on_all: - description: 'Flags whether all subrules are required for the match' - type: boolean - example: true - applies_to: - description: 'Flags whether the rule applies to a CREDIT or DEBIT' + example: Opnel5aKBz + company_id: + description: 'The company hashed id' type: string - example: CREDIT + example: Opnel5aKBz client_id: description: 'The client hashed id' type: string - example: AS3df3A - vendor_id: - description: 'The vendor hashed id' + example: Opnel5aKBz + status_id: + description: 'The invoice status variable' type: string - example: AS3df3A - category_id: - description: 'The category hashed id' + example: '4' + frequency_id: + description: 'The recurring invoice frequency' + type: number + example: '4' + remaining_cycles: + description: 'The number of invoices left to be generated' + type: number + example: '4' + number: + description: 'The recurringinvoice number - is a unique alpha numeric number per invoice per company' type: string - example: AS3df3A - type: object - CompanyToken: - properties: - name: - description: 'The token name' + example: INV_101 + po_number: + description: 'The purchase order associated with this recurring invoice' type: string - example: 'Token Name' - token: - description: 'The token value' + example: PO-1234 + terms: + description: 'The invoice terms' type: string - example: AS3df3jUUH765fhfd9KJuidj3JShjA - is_system: - description: 'Determines whether the token is created by the system rather than a user' - type: boolean - example: 'true' - type: object - CompanyUser: - properties: - permissions: - description: 'The company user permissions' + example: 'These are invoice terms' + public_notes: + description: 'The public notes of the invoice' type: string - example: '[create_invoice]' - settings: - description: 'Settings that are used for the frontend applications to store user preferences / metadata' + example: 'These are some public notes' + private_notes: + description: 'The private notes of the invoice' + type: string + example: 'These are some private notes' + footer: + description: 'The invoice footer notes' + type: string + example: '' + custom_value1: + description: 'A custom field value' + type: string + example: '2022-10-01' + custom_value2: + description: 'A custom field value' + type: string + example: 'Something custom' + custom_value3: + description: 'A custom field value' + type: string + example: '' + custom_value4: + description: 'A custom field value' + type: string + example: '' + tax_name1: + description: 'The tax name' + type: string + example: '' + tax_name2: + description: 'The tax name' + type: string + example: '' + tax_rate1: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_rate2: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_name3: + description: 'The tax name' + type: string + example: '' + tax_rate3: + description: 'The tax rate' + type: number + format: float + example: '10.00' + total_taxes: + description: 'The total taxes for the invoice' + type: number + format: float + example: '10.00' + line_items: + description: 'An array of objects which define the line items of the invoice' type: object - example: 'json object' - react_settings: - description: 'Dedicated settings object for the react web application' - type: object' - example: 'json object' - is_owner: - description: 'Determines whether the user owns this company' + example: '' + amount: + description: 'The invoice amount' + type: number + format: float + example: '10.00' + balance: + description: 'The invoice balance' + type: number + format: float + example: '10.00' + paid_to_date: + description: 'The amount paid on the invoice to date' + type: number + format: float + example: '10.00' + discount: + description: 'The invoice discount, can be an amount or a percentage' + type: number + format: float + example: '10.00' + partial: + description: 'The deposit/partial amount' + type: number + format: float + example: '10.00' + is_amount_discount: + description: 'Flag determining if the discount is an amount or a percentage' type: boolean example: true - is_admin: - description: 'Determines whether the user is the admin of this company' + is_deleted: + description: 'Defines if the invoice has been deleted' type: boolean example: true - is_locked: - description: 'Determines whether the users access to this company has been locked' + uses_inclusive_taxes: + description: 'Defines the type of taxes used as either inclusive or exclusive' type: boolean example: true + date: + description: 'The Invoice Date' + type: string + format: date + example: '1994-07-30' + last_sent_date: + description: 'The last date the invoice was sent out' + type: string + format: date + example: '1994-07-30' + next_send_date: + description: 'The Next date for a reminder to be sent' + type: string + format: date + example: '1994-07-30' + partial_due_date: + description: 'The due date for the deposit/partial amount' + type: string + format: date + example: '1994-07-30' + due_date: + description: 'The due date of the invoice' + type: string + format: date + example: '1994-07-30' + settings: + $ref: '#/components/schemas/CompanySettings' + last_viewed: + description: Timestamp + type: number + format: integer + example: '1434342123' updated_at: - description: 'The last time the record was modified, format Unix Timestamp' - type: integer - example: '1231232312321' - deleted_at: - description: 'Timestamp when the user was archived, format Unix Timestamp' - type: integer - example: '12312312321' - account: - $ref: '#/components/schemas/Account' - company: - $ref: '#/components/schemas/Company' - user: - $ref: '#/components/schemas/User' - token: - $ref: '#/components/schemas/CompanyToken' + description: Timestamp + type: number + format: integer + example: '1434342123' + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + custom_surcharge1: + description: 'First Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge2: + description: 'Second Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge3: + description: 'Third Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge4: + description: 'Fourth Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge_tax1: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true type: object - InvoiceInvitationRequest: - required: - - client_contact_id + + Quote: properties: id: - description: 'The entity invitation hashed id' + description: 'The unique hashed identifier for the quote' + type: string + example: Opnel5aKBz + user_id: + description: 'The unique hashed identifier for the user who created the quote' + type: string + example: '' + assigned_user_id: + description: 'The unique hashed identifier for the user assigned to the quote' + type: string + example: '' + company_id: + description: 'The unique hashed identifier for the company associated with the quote' + type: string + example: '' + client_id: + description: 'The unique hashed identifier for the client associated with the quote' + type: string + example: '' + status_id: + description: 'The status of the quote represented by a unique identifier' + type: string + example: '' + number: + description: 'The unique alpha-numeric quote number for the quote per company' + type: string + example: QUOTE_101 + po_number: + description: 'The purchase order number associated with the quote' + type: string + example: PO-1234 + terms: + description: 'The terms and conditions for the quote' + type: string + example: 'These are some quote terms. Valid for 14 days.' + public_notes: + description: 'Publicly visible notes associated with the quote' + type: string + example: 'These are public notes which the client may see' + private_notes: + description: 'Privately visible notes associated with the quote, not disclosed to the client' + type: string + example: 'These are private notes, not to be disclosed to the client' + footer: + description: 'The footer text of the quote' + type: string + example: 'The text goes in the footer of the quote' + custom_value1: + description: 'First custom value field for additional information' + type: string + example: 'A custom value' + custom_value2: + description: 'Second custom value field for additional information' + type: string + example: 'A custom value' + custom_value3: + description: 'Third custom value field for additional information' + type: string + example: 'A custom value' + custom_value4: + description: 'Fourth custom value field for additional information' + type: string + example: 'A custom value' + tax_name1: + description: 'The name of the first tax applied to the quote' + type: string + example: GST + tax_name2: + description: 'The name of the second tax applied to the quote' + type: string + example: VAT + tax_rate1: + description: 'The rate of the first tax applied to the quote' + type: number + format: float + example: 10.00 + tax_rate2: + description: 'The rate of the second tax applied to the quote' + type: number + format: float + example: 10.00 + tax_name3: + description: 'The name of the third tax applied to the quote' + type: string + example: '' + tax_rate3: + description: 'The rate of the third tax applied to the quote' + type: number + format: float + example: 10.00 + total_taxes: + description: 'The total amount of taxes for the quote' + type: number + format: float + example: 10.00 + line_items: + type: array + description: 'An array of objects which define the line items of the quote' + items: + $ref: '#/components/schemas/InvoiceItem' + amount: + description: 'The total amount of the quote before taxes and discounts' + type: number + format: float + example: 10.00 + balance: + description: 'The balance due for the quote after accounting for payments' + type: number + format: float + example: 10.00 + paid_to_date: + description: 'The total amount paid on the quote so far' + type: number + format: float + example: 10.00 + discount: + description: 'The discount amount or percentage applied to the quote' + type: number + format: float + example: 10.00 + partial: + description: 'The partial or deposit amount for the quote' + type: number + format: float + example: 10.00 + is_amount_discount: + description: 'Boolean flag indicating if the discount is a fixed amount or a percentage' + type: boolean + example: true + is_deleted: + description: 'Boolean flag indicating if the quote has been deleted' + type: boolean + example: false + uses_inclusive_taxes: + description: 'Boolean flag indicating if the taxes used are inclusive or exclusive' + type: boolean + example: true + date: + description: 'The date the quote was created' + type: string + format: date + example: '1994-07-30' + last_sent_date: + description: 'The last date the quote was sent to the client' + type: string + format: date + example: '1994-07-30' + next_send_date: + description: 'The next scheduled date for sending a reminder for the quote' + type: string + format: date + example: '1994-07-30' + partial_due_date: + description: 'The due date for the partial or deposit amount' + type: string + format: date + example: '1994-07-30' + due_date: + description: 'The due date for the total amount of the quote' + type: string + format: date + example: '1994-07-30' + settings: + $ref: '#/components/schemas/CompanySettings' + last_viewed: + description: 'The timestamp of the last time the quote was viewed' + type: number + format: integer + example: 1434342123 + updated_at: + description: 'The timestamp of the last update to the quote' + type: number + format: integer + example: 1434342123 + archived_at: + description: 'The timestamp of when the quote was archived' + type: number + format: integer + example: 1434342123 + custom_surcharge1: + description: 'First custom surcharge amount for the quote' + type: number + format: float + example: 10.00 + custom_surcharge2: + description: 'Second custom surcharge amount for the quote' + type: number + format: float + example: 10.00 + custom_surcharge3: + description: 'Third custom surcharge amount for the quote' + type: number + format: float + example: 10.00 + custom_surcharge4: + description: 'Fourth custom surcharge amount for the quote' + type: number + format: float + example: 10.00 + custom_surcharge_tax1: + description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount' + type: boolean + example: true + type: object + Invoice: + properties: + id: + description: 'The invoice hashed id' type: string example: Opnel5aKBz readOnly: true - client_contact_id: - description: 'The client contact hashed id' + user_id: + description: 'The user hashed id' type: string example: Opnel5aKBz - key: - description: 'The invitation key' - type: string - example: Opnel5aKBz4343343566236gvbb readOnly: true - link: - description: 'The invitation link' + assigned_user_id: + description: 'The assigned user hashed id' type: string - example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb' + example: Opnel5aKBz + company_id: + description: 'The company hashed id' + type: string + example: Opnel5aKBz readOnly: true - sent_date: - description: 'The invitation sent date' + client_id: + description: 'The client hashed id' type: string - format: date-time + example: Opnel5aKBz + status_id: + description: 'The invoice status variable' + type: string + example: '4' + number: + description: 'The invoice number - is a unique alpha numeric number per invoice per company' + type: string + example: INV_101 + po_number: + description: 'The purchase order associated with this invoice' + type: string + example: PO-1234 + terms: + description: 'The invoice terms' + type: string + example: 'These are invoice terms' + public_notes: + description: 'The public notes of the invoice' + type: string + example: 'These are some public notes' + private_notes: + description: 'The private notes of the invoice' + type: string + example: 'These are some private notes' + footer: + description: 'The invoice footer notes' + type: string + example: '' + custom_value1: + description: 'A custom field value' + type: string + example: '2022-10-01' + custom_value2: + description: 'A custom field value' + type: string + example: 'Something custom' + custom_value3: + description: 'A custom field value' + type: string + example: '' + custom_value4: + description: 'A custom field value' + type: string + example: '' + tax_name1: + description: 'The tax name' + type: string + example: '' + tax_name2: + description: 'The tax name' + type: string + example: '' + tax_rate1: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_rate2: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_name3: + description: 'The tax name' + type: string + example: '' + tax_rate3: + description: 'The tax rate' + type: number + format: float + example: '10.00' + total_taxes: + description: 'The total taxes for the invoice' + type: number + format: float + example: '10.00' + line_items: + type: array + description: 'An array of objects which define the line items of the invoice' + items: + $ref: '#/components/schemas/InvoiceItem' + invitations: + type: array + description: 'An array of objects which define the invitations of the invoice' + items: + $ref: '#/components/schemas/InvoiceInvitation' + amount: + description: 'The invoice amount' + type: number + format: float + example: '10.00' + balance: + description: 'The invoice balance' + type: number + format: float + example: '10.00' + paid_to_date: + description: 'The amount paid on the invoice to date' + type: number + format: float + example: '10.00' + discount: + description: 'The invoice discount, can be an amount or a percentage' + type: number + format: float + example: '10.00' + partial: + description: 'The deposit/partial amount' + type: number + format: float + example: '10.00' + is_amount_discount: + description: 'Flag determining if the discount is an amount or a percentage' + type: boolean + example: true + is_deleted: + description: 'Defines if the invoice has been deleted' + type: boolean + example: true + uses_inclusive_taxes: + description: 'Defines the type of taxes used as either inclusive or exclusive' + type: boolean + example: true + date: + description: 'The Invoice Date' + type: string + format: date + example: '1994-07-30' + last_sent_date: + description: 'The last date the invoice was sent out' + type: string + format: date + example: '1994-07-30' + next_send_date: + description: 'The Next date for a reminder to be sent' + type: string + format: date + example: '1994-07-30' + partial_due_date: + description: 'The due date for the deposit/partial amount' + type: string + format: date + example: '1994-07-30' + due_date: + description: 'The due date of the invoice' + type: string + format: date + example: '1994-07-30' + last_viewed: + description: Timestamp + type: number + format: integer + example: '1434342123' + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + custom_surcharge1: + description: 'First Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge2: + description: 'Second Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge3: + description: 'Third Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge4: + description: 'Fourth Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge_tax1: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + project_id: + description: 'The project associated with this invoice' + type: string + example: Opnel5aKBz + auto_bill_tries: + description: 'The number of times the invoice has attempted to be auto billed' + type: integer + example: '1' readOnly: true - viewed_date: - description: 'The invitation viewed date' + auto_bill_enabled: + description: 'Boolean flag determining if the invoice is set to auto bill' + type: boolean + example: true + subscription_id: + description: 'The subscription associated with this invoice' type: string - format: date-time + example: Opnel5aKBz + + type: object + ClientRequest: + required: + - contacts + - country_id + properties: + id: + description: 'The unique identifier of the client' + type: string + example: Opnel5aKBz readOnly: true - opened_date: - description: 'The invitation opened date' + contacts: + type: array + description: 'A list of contacts associated with the client' + items: + $ref: '#/components/schemas/ClientContactRequest' + name: + description: 'The name of the client company or organization' type: string - format: date-time + example: "Jim's Housekeeping" + website: + description: 'The website URL of the client company or organization' + type: string + example: 'https://www.jims-housekeeping.com' + private_notes: + description: 'Notes that are only visible to the user who created the client' + type: string + example: 'Client prefers email communication over phone calls' + industry_id: + description: 'The unique identifier of the industry the client operates in' + type: number + example: '5' + size_id: + description: 'The unique identifier for the size category of the client company or organization' + type: number + example: '2' + address1: + description: "First line of the client's address" + type: string + example: '123 Main St' + address2: + description: "Second line of the client's address, if needed" + type: string + example: 'Apt 4B' + city: + description: 'The city the client is located in' + type: string + example: 'Beverly Hills' + state: + description: 'The state, province, or locality the client is located in' + type: string + example: 'California' + postal_code: + description: 'The postal code or ZIP code of the client' + type: string + example: '90210' + phone: + description: "The client's phone number" + type: string + example: '555-3434-3434' + country_id: + description: "The unique identifier of the client's country" + type: number + format: integer + example: '1' + custom_value1: + description: 'A custom field for storing additional information' + type: string + example: 'Preferred contact: Email' + custom_value2: + description: 'A custom field for storing additional information' + type: string + example: 'Account manager: John Doe' + custom_value3: + description: 'A custom field for storing additional information' + type: string + example: 'VIP client: Yes' + custom_value4: + description: 'A custom field for storing additional information' + type: string + example: 'Annual contract value: $50,000' + vat_number: + description: "The client's VAT (Value Added Tax) number, if applicable" + type: string + example: 'VAT123456' + id_number: + description: 'A unique identification number for the client, such as a tax ID or business registration number' + type: string + number: + description: 'A system-assigned unique number for the client, typically used for invoicing purposes' + type: string + example: 'CL-0001' + shipping_address1: + description: "First line of the client's shipping address" + type: string + example: '5 Wallaby Way' + shipping_address2: + description: "Second line of the client's shipping address, if needed" + type: string + example: 'Suite 5' + shipping_city: + description: "The city of the client's shipping address" + type: string + example: 'Perth' + shipping_state: + description: "The state, province, or locality of the client's shipping address" + type: string + example: 'Western Australia' + shipping_postal_code: + description: "The postal code or ZIP code of the client's shipping address" + type: string + example: '6110' + shipping_country_id: + description: "The unique identifier of the country for the client's shipping address" + type: number + format: integer + example: '4' + is_deleted: + description: 'A boolean value indicating whether the client has been deleted or not' + type: boolean + example: false + readOnly: true + group_settings_id: + description: 'The group settings assigned to the client' + type: string + example: Opnel5aKBz + routing_id: + description: 'The routing address id for e-invoicing for this client' + type: string + example: Opnel5aKBz3489-dfkiu-2239-sdsd + is_tax_exempt: + description: 'Flag which defines if the client is exempt from taxes' + type: boolean + example: false + has_valid_vat_number: + description: 'Flag which defines if the client has a valid VAT number' + type: boolean + example: false + readOnly: true + classification: + description: 'The classification of the client' + type: string + example: 'individual' + settings: + $ref: '#/components/schemas/ClientSettings' + type: object + Vendor: + properties: + id: + description: 'The hashed id of the vendor. This is a unique identifier for the vendor.' + type: string + example: Opnel5aKBz + readOnly: true + user_id: + description: 'The hashed id of the user who created the vendor. This is a unique identifier for the user.' + type: string + example: Opnel5aKBz + assigned_user_id: + description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.' + type: string + example: Opnel5aKBz + company_id: + description: 'The hashed id of the company. This is a unique identifier for the company.' + type: string + example: Opnel5aKBz + client_id: + description: 'The hashed id of the client. This is a unique identifier for the client.' + type: string + example: Opnel5aKBz + contacts: + type: array + items: + $ref: '#/components/schemas/VendorContact' + description: 'An array of contacts associated with the vendor.' + name: + description: 'The name of the vendor.' + type: string + example: 'Harry cafe de wheels' + classification: + description: 'The classification of the vendor.' + type: string + example: 'individual' + website: + description: 'The website of the vendor.' + type: string + example: www.harry.com + private_notes: + description: 'The private notes of the vendor. These notes are only visible to users with appropriate permissions.' + type: string + example: 'Shhh, do not tell the vendor' + industry_id: + description: 'The industry id of the vendor. This is a unique identifier for the industry.' + type: string + example: '1' + size_id: + description: 'The size id of the vendor. This is a unique identifier for the size of the vendor.' + type: string + example: '' + address1: + description: 'The first line of the vendor''s address.' + type: string + example: '' + address2: + description: 'The second line of the vendor''s address.' + type: string + example: '' + city: + description: 'The city of the vendor''s address.' + type: string + example: '' + state: + description: 'The state of the vendor''s address.' + type: string + example: '' + postal_code: + description: 'The postal code of the vendor''s address.' + type: string + example: '' + phone: + description: 'The phone number of the vendor.' + type: string + example: 555-3434-3434 + country_id: + description: 'The country id of the vendor. This is a unique identifier for the country.' + type: string + example: '' + currency_id: + description: 'The currency id of the vendor. This is a unique identifier for the currency.' + type: string + example: '4' + custom_value1: + description: 'The value of the first custom field for the vendor.' + type: string + example: '' + custom_value2: + description: 'The value of the second custom field for the vendor.' + type: string + example: '' + custom_value3: + description: 'The value of the third custom field for the vendor.' + type: string + example: '' + custom_value4: + description: 'The value of the fourth custom field for the vendor.' + type: string + example: '' + vat_number: + description: 'The VAT number of the vendor.' + type: string + example: '' + id_number: + description: 'The ID number of the vendor.' + type: string + example: '' + number: + description: 'The number of the vendor' + type: string + example: '11234' + is_deleted: + description: 'Boolean flag determining if the vendor has been deleted' + type: boolean + example: true + language_id: + description: 'The language id of the vendor. This is a unique identifier for the language.' + type: string + example: '1' + vendor_hash: + description: 'The vendor hash of the vendor. This is a unique identifier for the vendor.' + type: string + example: 'aaa-sss-www' + readOnly: true + transaction_name: + description: 'The transaction name of the vendor.' + type: string + example: 'aaa-sss-www' + last_login: + description: Timestamp + type: number + format: integer + example: '134341234234' + readOnly: true + created_at: + description: Timestamp + type: number + format: integer + example: '134341234234' readOnly: true updated_at: - description: 'Timestamp' + description: Timestamp + type: number + format: integer + example: '134341234234' + readOnly: true + display_name: + description: 'The display name of the vendor.' + type: string + example: 'Bob the vendor' + readOnly: true + settings: + $ref: '#/components/schemas/CompanySettings' + type: object + ClientSettings: + required: + - currency_id + properties: + currency_id: + description: 'The default currency id' + type: string + example: true + timezone_id: + description: 'The timezone id' + type: string + example: '15' + date_format_id: + description: 'The date format id' + type: string + example: '15' + military_time: + description: 'Toggles 12/24 hour time' + type: boolean + example: true + language_id: + description: 'The language id' + type: string + example: '1' + show_currency_code: + description: 'Toggles whether the currency symbol or code is shown' + type: boolean + example: true + payment_terms: + description: '-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days' + type: integer + example: '1' + company_gateway_ids: + description: 'A commad separate list of available gateways' + type: string + example: '1,2,3,4' + custom_value1: + description: 'A Custom Label' + type: string + example: 'Custom Label' + custom_value2: + description: 'A Custom Label' + type: string + example: 'Custom Label' + custom_value3: + description: 'A Custom Label' + type: string + example: 'Custom Label' + custom_value4: + description: 'A Custom Label' + type: string + example: 'Custom Label' + default_task_rate: + description: 'The default task rate' + type: number + format: float + example: '10.00' + send_reminders: + description: 'Toggles whether reminders are sent' + type: boolean + example: true + enable_client_portal_tasks: + description: 'Show/hide the tasks panel in the client portal' + type: boolean + example: true + email_style: + description: 'options include plain,light,dark,custom' + type: string + example: light + reply_to_email: + description: 'The reply to email address' + type: string + example: email@gmail.com + bcc_email: + description: 'A comma separate list of BCC emails' + type: string + example: 'email@gmail.com, contact@gmail.com' + pdf_email_attachment: + description: 'Toggles whether to attach PDF as attachment' + type: boolean + example: true + ubl_email_attachment: + description: 'Toggles whether to attach UBL as attachment' + type: boolean + example: true + email_style_custom: + description: 'The custom template' + type: string + example: '' + counter_number_applied: + description: 'enum when the invoice number counter is set, ie when_saved, when_sent, when_paid' + type: string + example: when_sent + quote_number_applied: + description: 'enum when the quote number counter is set, ie when_saved, when_sent' + type: string + example: when_sent + custom_message_dashboard: + description: 'A custom message which is displayed on the dashboard' + type: string + example: 'Please pay invoices immediately' + custom_message_unpaid_invoice: + description: 'A custom message which is displayed in the client portal when a client is viewing a unpaid invoice.' + type: string + example: 'Please pay invoices immediately' + custom_message_paid_invoice: + description: 'A custom message which is displayed in the client portal when a client is viewing a paid invoice.' + type: string + example: 'Thanks for paying this invoice!' + custom_message_unapproved_quote: + description: 'A custom message which is displayed in the client portal when a client is viewing a unapproved quote.' + type: string + example: 'Please approve quote' + lock_invoices: + description: 'Toggles whether invoices are locked once sent and cannot be modified further' + type: boolean + example: true + auto_archive_invoice: + description: 'Toggles whether a invoice is archived immediately following payment' + type: boolean + example: true + auto_archive_quote: + description: 'Toggles whether a quote is archived after being converted to a invoice' + type: boolean + example: true + auto_convert_quote: + description: 'Toggles whether a quote is converted to a invoice when approved' + type: boolean + example: true + inclusive_taxes: + description: 'Boolean flag determining whether inclusive or exclusive taxes are used' + type: boolean + example: true + task_number_pattern: + description: 'Allows customisation of the task number pattern' + type: string + example: '{$year}-{$counter}' + task_number_counter: + description: 'The incrementing counter for tasks' + type: integer + example: '1' + reminder_send_time: + description: 'Time from UTC +0 when the email will be sent to the client' + type: integer + example: '32400' + expense_number_pattern: + description: 'Allows customisation of the expense number pattern' + type: string + example: '{$year}-{$counter}' + expense_number_counter: + description: 'The incrementing counter for expenses' + type: integer + example: '1' + vendor_number_pattern: + description: 'Allows customisation of the vendor number pattern' + type: string + example: '{$year}-{$counter}' + vendor_number_counter: + description: 'The incrementing counter for vendors' + type: integer + example: '1' + ticket_number_pattern: + description: 'Allows customisation of the ticket number pattern' + type: string + example: '{$year}-{$counter}' + ticket_number_counter: + description: 'The incrementing counter for tickets' + type: integer + example: '1' + payment_number_pattern: + description: 'Allows customisation of the payment number pattern' + type: string + example: '{$year}-{$counter}' + payment_number_counter: + description: 'The incrementing counter for payments' + type: integer + example: '1' + invoice_number_pattern: + description: 'Allows customisation of the invoice number pattern' + type: string + example: '{$year}-{$counter}' + invoice_number_counter: + description: 'The incrementing counter for invoices' + type: integer + example: '1' + quote_number_pattern: + description: 'Allows customisation of the quote number pattern' + type: string + example: '{$year}-{$counter}' + quote_number_counter: + description: 'The incrementing counter for quotes' + type: integer + example: '1' + client_number_pattern: + description: 'Allows customisation of the client number pattern' + type: string + example: '{$year}-{$counter}' + client_number_counter: + description: 'The incrementing counter for clients' + type: integer + example: '1' + credit_number_pattern: + description: 'Allows customisation of the credit number pattern' + type: string + example: '{$year}-{$counter}' + credit_number_counter: + description: 'The incrementing counter for credits' + type: integer + example: '1' + recurring_invoice_number_prefix: + description: 'This string is prepended to the recurring invoice number' + type: string + example: R + reset_counter_frequency_id: + description: 'CONSTANT which is used to apply the frequency which the counters are reset' + type: integer + example: '1' + reset_counter_date: + description: 'The explicit date which is used to reset counters' + type: string + example: '2019-01-01' + counter_padding: + description: 'Pads the counter with leading zeros' + type: integer + example: '1' + shared_invoice_quote_counter: + description: 'Flags whether to share the counter for invoices and quotes' + type: boolean + example: true + update_products: + description: 'Determines if client fields are updated from third party APIs' + type: boolean + example: true + convert_products: + description: '' + type: boolean + example: true + fill_products: + description: 'Automatically fill products based on product_key' + type: boolean + example: true + invoice_terms: + description: 'The default invoice terms' + type: string + example: 'Invoice Terms are...' + quote_terms: + description: 'The default quote terms' + type: string + example: 'Quote Terms are...' + invoice_taxes: + description: 'Taxes can be applied to the invoice' + type: number + example: '1' + invoice_design_id: + description: 'The default design id (invoice, quote etc)' + type: string + example: '1' + quote_design_id: + description: 'The default design id (invoice, quote etc)' + type: string + example: '1' + invoice_footer: + description: 'The default invoice footer' + type: string + example: '1' + invoice_labels: + description: 'JSON string of invoice labels' + type: string + example: '1' + tax_rate1: + description: 'The tax rate (float)' + type: number + example: '10' + tax_name1: + description: 'The tax name' + type: string + example: GST + tax_rate2: + description: 'The tax rate (float)' + type: number + example: '10' + tax_name2: + description: 'The tax name' + type: string + example: GST + tax_rate3: + description: 'The tax rate (float)' + type: number + example: '10' + tax_name3: + description: 'The tax name' + type: string + example: GST + payment_type_id: + description: 'The default payment type id' + type: string + example: '1' + custom_fields: + description: 'JSON string of custom fields' + type: string + example: '{}' + email_footer: + description: 'The default email footer' + type: string + example: 'A default email footer' + email_sending_method: + description: 'The email driver to use to send email, options include default, gmail' + type: string + example: default + gmail_sending_user_id: + description: 'The hashed_id of the user account to send email from' + type: string + example: F76sd34D + email_subject_invoice: + description: '' + type: string + example: 'Your Invoice Subject' + email_subject_quote: + description: '' + type: string + example: 'Your Quote Subject' + email_subject_payment: + description: '' + type: string + example: 'Your Payment Subject' + email_template_invoice: + description: 'The full template for invoice emails' + type: string + example: '' + email_template_quote: + description: 'The full template for quote emails' + type: string + example: '' + email_template_payment: + description: 'The full template for payment emails' + type: string + example: '' + email_subject_reminder1: + description: 'Email subject for Reminder' + type: string + example: '' + email_subject_reminder2: + description: 'Email subject for Reminder' + type: string + example: '' + email_subject_reminder3: + description: 'Email subject for Reminder' + type: string + example: '' + email_subject_reminder_endless: + description: 'Email subject for endless reminders' + type: string + example: '' + email_template_reminder1: + description: 'The full template for Reminder 1' + type: string + example: '' + email_template_reminder2: + description: 'The full template for Reminder 2' + type: string + example: '' + email_template_reminder3: + description: 'The full template for Reminder 3' + type: string + example: '' + email_template_reminder_endless: + description: 'The full template for enless reminders' + type: string + example: '' + enable_portal_password: + description: 'Toggles whether a password is required to log into the client portal' + type: boolean + example: true + show_accept_invoice_terms: + description: 'Toggles whether the terms dialogue is shown to the client' + type: boolean + example: true + show_accept_quote_terms: + description: 'Toggles whether the terms dialogue is shown to the client' + type: boolean + example: true + require_invoice_signature: + description: 'Toggles whether a invoice signature is required' + type: boolean + example: true + require_quote_signature: + description: 'Toggles whether a quote signature is required' + type: boolean + example: true + name: + description: 'The company name' + type: string + example: 'Acme Co' + company_logo: + description: 'The company logo file' + type: object + example: logo.png + website: + description: 'The company website URL' + type: string + example: www.acme.com + address1: + description: 'The company address line 1' + type: string + example: 'Suite 888' + address2: + description: 'The company address line 2' + type: string + example: '5 Jimbo Way' + city: + description: 'The company city' + type: string + example: Sydney + state: + description: 'The company state' + type: string + example: Florisa + postal_code: + description: 'The company zip/postal code' + type: string + example: '90210' + phone: + description: 'The company phone' + type: string + example: 555-213-3948 + email: + description: 'The company email' + type: string + example: joe@acme.co + country_id: + description: 'The country ID' + type: string + example: '1' + vat_number: + description: 'The company VAT/TAX ID number' + type: string + example: '32 120 377 720' + page_size: + description: 'The default page size' + type: string + example: A4 + font_size: + description: 'The font size' + type: number + example: '9' + primary_font: + description: 'The primary font' + type: string + example: roboto + secondary_font: + description: 'The secondary font' + type: string + example: roboto + hide_paid_to_date: + description: 'Flags whether to hide the paid to date field' + type: boolean + example: false + embed_documents: + description: 'Toggled whether to embed documents in the PDF' + type: boolean + example: false + all_pages_header: + description: 'The header for the PDF' + type: boolean + example: false + all_pages_footer: + description: 'The footer for the PDF' + type: boolean + example: false + document_email_attachment: + description: 'Toggles whether to attach documents in the email' + type: boolean + example: false + enable_client_portal_password: + description: 'Toggles password protection of the client portal' + type: boolean + example: false + enable_email_markup: + description: 'Toggles the use of markdown in emails' + type: boolean + example: false + enable_client_portal_dashboard: + description: 'Toggles whether the client dashboard is shown in the client portal' + type: boolean + example: false + enable_client_portal: + description: 'Toggles whether the entire client portal is displayed to the client, or only the context' + type: boolean + example: false + email_template_statement: + description: 'The body of the email for statements' + type: string + example: 'template matter' + email_subject_statement: + description: 'The subject of the email for statements' + type: string + example: 'subject matter' + signature_on_pdf: + description: 'Toggles whether the signature (if available) is displayed on the PDF' + type: boolean + example: false + quote_footer: + description: 'The default quote footer' + type: string + example: 'the quote footer' + email_subject_custom1: + description: 'Custom reminder template subject' + type: string + example: 'Custom Subject 1' + email_subject_custom2: + description: 'Custom reminder template subject' + type: string + example: 'Custom Subject 2' + email_subject_custom3: + description: 'Custom reminder template subject' + type: string + example: 'Custom Subject 3' + email_template_custom1: + description: 'Custom reminder template body' + type: string + example: '' + email_template_custom2: + description: 'Custom reminder template body' + type: string + example: '' + email_template_custom3: + description: 'Custom reminder template body' + type: string + example: '' + enable_reminder1: + description: 'Toggles whether this reminder is enabled' + type: boolean + example: false + enable_reminder2: + description: 'Toggles whether this reminder is enabled' + type: boolean + example: false + enable_reminder3: + description: 'Toggles whether this reminder is enabled' + type: boolean + example: false + num_days_reminder1: + description: 'The Reminder interval' + type: number + example: '9' + num_days_reminder2: + description: 'The Reminder interval' + type: number + example: '9' + num_days_reminder3: + description: 'The Reminder interval' + type: number + example: '9' + schedule_reminder1: + description: '(enum: after_invoice_date, before_due_date, after_due_date)' + type: string + example: after_invoice_date + schedule_reminder2: + description: '(enum: after_invoice_date, before_due_date, after_due_date)' + type: string + example: after_invoice_date + schedule_reminder3: + description: '(enum: after_invoice_date, before_due_date, after_due_date)' + type: string + example: after_invoice_date + late_fee_amount1: + description: 'The late fee amount for reminder 1' + type: number + example: 10 + late_fee_amount2: + description: 'The late fee amount for reminder 2' + type: number + example: 20 + late_fee_amount3: + description: 'The late fee amount for reminder 2' + type: number + example: 100 + endless_reminder_frequency_id: + description: 'The frequency id of the endless reminder' + type: string + example: '1' + client_online_payment_notification: + description: 'Determines if a client should receive the notification for a online payment' + type: boolean + example: false + client_manual_payment_notification: + description: 'Determines if a client should receive the notification for a manually entered payment' + type: boolean + example: false + enable_e_invoice: + description: 'Determines if e-invoicing is enabled' + type: boolean + example: false + default_expense_payment_type_id: + description: 'The default payment type for expenses' + type: string + example: '0' + e_invoice_type: + description: 'The e-invoice type' + type: string + example: 'EN16931' + mailgun_endpoint: + description: 'The mailgun endpoint - used to determine whether US or EU endpoints are used' + type: string + example: 'api.mailgun.net or api.eu.mailgun.net' + client_initiated_payments: + description: 'Determines if clients can initiate payments directly from the client portal' + type: boolean + example: false + client_initiated_payments_minimum: + description: 'The minimum amount a client can pay' + type: number + example: 10 + sync_invoice_quote_columns: + description: 'Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns' + type: boolean + example: false + show_task_item_description: + description: 'Determines if the task item description is shown on the invoice' + type: boolean + example: false + allow_billable_task_items: + description: 'Determines if task items can be marked as billable' + type: boolean + example: false + accept_client_input_quote_approval: + description: 'Determines if clients can approve quotes and also pass through a PO Number reference' + type: boolean + example: false + custom_sending_email: + description: 'When using Mailgun or Postmark, the FROM email address can be customized using this setting.' + type: string + example: 'bob@gmail.com' + show_paid_stamp: + description: 'Determines if the PAID stamp is shown on the invoice' + type: boolean + example: false + show_shipping_address: + description: 'Determines if the shipping address is shown on the invoice' + type: boolean + example: false + company_logo_size: + description: 'The size of the company logo on the PDF - percentage value between 0 and 100' + type: number + example: 100 + show_email_footer: + description: 'Determines if the email footer is shown on emails' + type: boolean + example: false + email_alignment: + description: 'The alignment of the email body text, options include left / center / right' + type: string + example: 'left' + auto_bill_standard_invoices: + description: 'Determines if standard invoices are automatically billed when they are created or due' + type: boolean + example: false + postmark_secret: + description: 'The Postmark secret API key' + type: string + example: '123456' + mailgun_secret: + description: 'The Mailgun secret API key' + type: string + example: '123456' + mailgun_domain: + description: 'The Mailgun domain' + type: string + example: 'sandbox123456.mailgun.org' + send_email_on_mark_paid: + description: 'Determines if an email is sent when an invoice is marked as paid' + type: boolean + example: false + vendor_portal_enable_uploads: + description: 'Determines if vendors can upload files to the portal' + type: boolean + example: false + besr_id: + description: 'The BESR ID' + type: string + example: '123456' + qr_iban: + description: 'The IBAN for the QR code' + type: string + example: 'CH123456' + email_subject_purchase_order: + description: 'The email subject for purchase orders' + type: string + example: 'Purchase Order' + email_template_purchase_order: + description: 'The email template for purchase orders' + type: string + example: 'Please see attached your purchase order.' + require_purchase_order_signature: + description: 'Determines if a signature is required on purchase orders' + type: boolean + example: false + purchase_order_public_notes: + description: 'The public notes for purchase orders' + type: string + example: 'Please see attached your purchase order.' + purchase_order_terms: + description: 'The terms for purchase orders' + type: string + example: 'Please see attached your purchase order.' + purchase_order_footer: + description: 'The footer for purchase orders' + type: string + example: 'Please see attached your purchase order.' + purchase_order_design_id: + description: 'The design id for purchase orders' + type: string + example: 'hd677df' + purchase_order_number_pattern: + description: 'The pattern for purchase order numbers' + type: string + example: 'PO-000000' + purchase_order_number_counter: + description: 'The counter for purchase order numbers' + type: number + example: 1 + page_numbering_alignment: + description: 'The alignment for page numbering: options include left / center / right' + type: string + example: 'left' + page_numbering: + description: 'Determines if page numbering is enabled on Document PDFs' + type: boolean + example: false + auto_archive_invoice_cancelled: + description: 'Determines if invoices are automatically archived when they are cancelled' + type: boolean + example: false + email_from_name: + description: 'The FROM name for emails when using Custom emailers' + type: string + example: 'Bob Smith' + show_all_tasks_client_portal: + description: 'Determines if all tasks are shown on the client portal' + type: boolean + example: false + entity_send_time: + description: 'The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24' + type: integer + example: 9 + shared_invoice_credit_counter: + description: 'Determines if the invoice and credit counter are shared' + type: boolean + example: false + reply_to_name: + description: 'The reply to name for emails' + type: string + example: 'Bob Smith' + hide_empty_columns_on_pdf: + description: 'Determines if empty columns are hidden on PDFs' + type: boolean + example: false + enable_reminder_endless: + description: 'Determines if endless reminders are enabled' + type: boolean + example: false + use_credits_payment: + description: 'Determines if credits can be used as a payment method' + type: boolean + example: false + recurring_invoice_number_pattern: + description: 'The pattern for recurring invoice numbers' + type: string + example: 'R-000000' + recurring_invoice_number_counter: + description: 'The counter for recurring invoice numbers' + type: number + example: 1 + client_portal_under_payment_minimum: + description: 'The minimum payment payment' + type: number + example: 10 + auto_bill_date: + description: 'Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))' + type: string + example: 'on_send_date' + primary_color: + description: 'The primary color for the client portal / document highlights' + type: string + example: '#ffffff' + secondary_color: + description: 'The secondary color for the client portal / document highlights' + type: string + example: '#ffffff' + client_portal_allow_under_payment: + description: 'Determines if clients can pay invoices under the invoice amount due' + type: boolean + example: false + client_portal_allow_over_payment: + description: 'Determines if clients can pay invoices over the invoice amount' + type: boolean + example: false + auto_bill: + description: 'Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing' + type: string + example: 'off' + client_portal_terms: + description: 'The terms which are displayed on the client portal' + type: string + example: 'Please see attached your invoice.' + client_portal_privacy_policy: + description: 'The privacy policy which is displayed on the client portal' + type: string + example: 'These are the terms of use for using the client portal.' + client_can_register: + description: 'Determines if clients can register on the client portal' + type: boolean + example: false + portal_design_id: + description: 'The design id for the client portal' + type: string + example: 'hd677df' + late_fee_endless_percent: + description: 'The late fee percentage for endless late fees' + type: number + example: 10 + late_fee_endless_amount: + description: 'The late fee amount for endless late fees' + type: number + example: 10 + auto_email_invoice: + description: 'Determines if invoices are automatically emailed when they are created' + type: boolean + example: false + email_signature: + description: 'The email signature for emails' + type: string + example: 'Bob Smith' + type: object + RecurringExpense: + properties: + id: + description: 'The hashed id of the recurring expense' + type: string + example: Opnel5aKBz + user_id: + description: 'The hashed id of the user who created the recurring expense' + type: string + example: Opnel5aKBz + assigned_user_id: + description: 'The hashed id of the user assigned to this recurring expense' + type: string + example: Opnel5aKBz + company_id: + description: 'The hashed id of the company' + type: string + example: Opnel5aKBz + client_id: + description: 'The hashed id of the client' + type: string + example: Opnel5aKBz + invoice_id: + description: 'The hashed id of the invoice' + type: string + example: Opnel5aKBz + bank_id: + description: 'The id of the bank associated with this recurring expense' + type: string + example: '22' + invoice_currency_id: + description: 'The currency id of the invoice associated with this recurring expense' + type: string + example: '1' + expense_currency_id: + description: 'The currency id of the expense associated with this recurring expense' + type: string + example: '1' + invoice_category_id: + description: 'The category id of the invoice' + type: string + example: '1' + payment_type_id: + description: 'The payment type id' + type: string + example: '1' + private_notes: + description: 'The recurring expense private notes' + type: string + example: 'Private and confidential' + public_notes: + description: 'The recurring expense public notes' + type: string + example: 'This is the best client in the world' + transaction_reference: + description: 'The recurring expense transaction reference' + type: string + example: EXP-1223-2333 + transcation_id: + description: 'The transaction id of the recurring expense' + type: string + example: '1233312312' + custom_value1: + description: 'Custom value field' + type: string + example: $1000 + custom_value2: + description: 'Custom value field' + type: string + example: '2022-10-10' + custom_value3: + description: 'Custom value field' + type: string + example: 'short text' + custom_value4: + description: 'Custom value field' + type: string + example: 'very long text' + tax_name1: + description: 'The tax name' + type: string + example: GST + tax_name2: + description: 'The tax name' + type: string + example: VAT + tax_rate1: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_rate2: + description: 'The tax rate' + type: number + format: float + example: '10.00' + tax_name3: + description: 'The tax name' + type: string + example: '' + tax_rate3: + description: 'The tax rate' + type: number + format: float + example: '10.00' + amount: + description: 'The total amount of the recurring expense' + type: number + format: float + example: '10.00' + frequency_id: + description: 'The frequency this recurring expense fires' + type: number + format: int + example: '1' + remaining_cycles: + description: 'The number of remaining cycles for this recurring expense' + type: number + format: int + example: '1' + foreign_amount: + description: 'The foreign currency amount of the recurring expense' + type: number + format: float + example: '10.00' + exchange_rate: + description: 'The exchange rate for the expernse' + type: number + format: float + example: '0.80' + date: + description: 'The date of the expense' + type: string + example: '' + payment_date: + description: 'The date the expense was paid' + type: string + example: '' + should_be_invoiced: + description: 'Boolean flag determining if the expense should be invoiced' + type: boolean + example: true + is_deleted: + description: 'Boolean flag determining if the recurring expense is deleted' + type: boolean + example: true + last_sent_date: + description: 'The Date it was sent last' + type: string + format: date + example: '1994-07-30' + next_send_date: + description: 'The next send date' + type: string + format: date + example: '1994-07-30' + invoice_documents: + description: 'Boolean flag determining if the documents associated with this expense should be passed onto the invoice if it is converted to an invoice' + type: boolean + example: true + updated_at: + description: Timestamp type: number format: integer example: '1434342123' - readOnly: true archived_at: - description: 'Timestamp' + description: Timestamp type: number format: integer example: '1434342123' - readOnly: true - email_error: - description: 'The email error' + type: object + Activity: + properties: + id: + description: 'The id field of the activity' type: string - example: 'The email error' - readOnly: true - email_status: - description: 'The email status' + example: Opnel5aKBz + activity_type_id: + description: 'The activity type id' type: string - readOnly: true - + example: Opnel5aKBz + client_id: + description: 'The client hashed id' + type: string + example: Opnel5aKBz + company_id: + description: 'The company hashed id' + type: string + example: Opnel5aKBz + user_id: + description: 'The user hashed id' + type: string + example: Opnel5aKBz + invoice_id: + description: 'The invoice hashed id' + type: string + example: Opnel5aKBz + payment_id: + description: 'The payment hashed id' + type: string + example: Opnel5aKBz + credit_id: + description: 'The credit hashed id' + type: string + example: Opnel5aKBz + updated_at: + description: 'Unixtimestamp the last time the record was updated' + type: integer + example: '343421434' + expense_id: + description: 'The expense hashed id' + type: string + example: Opnel5aKBz + is_system: + description: 'Defines is the activity was performed by the system' + type: boolean + example: true + contact_id: + description: 'The contact hashed id' + type: string + example: Opnel5aKBz + task_id: + description: 'The task hashed id' + type: string + example: Opnel5aKBz + notes: + description: 'Activity Notes' + type: string + example: Opnel5aKBz + token_id: + description: 'The hashed ID of the token who performed the action' + type: string + example: Opnel5aKBz + ip: + description: 'The IP Address of the user who performed the action' + type: string + example: 192.168.1.252 + user: + $ref: '#/components/schemas/User' + client: + $ref: '#/components/schemas/Client' + contact: + $ref: '#/components/schemas/ClientContact' + recurring_invoice: + $ref: '#/components/schemas/RecurringInvoice' + invoice: + $ref: '#/components/schemas/Invoice' + credit: + $ref: '#/components/schemas/Credit' + quote: + $ref: '#/components/schemas/Quote' + payment: + $ref: '#/components/schemas/Payment' + expense: + $ref: '#/components/schemas/Expense' + task: + $ref: '#/components/schemas/Task' + purchase_order: + $ref: '#/components/schemas/PurchaseOrder' + vendor: + $ref: '#/components/schemas/Vendor' + vendor_contact: + $ref: '#/components/schemas/VendorContact' + type: object + Expense: + properties: + id: + description: 'The expense hashed id' + type: string + example: Opnel5aKBz + user_id: + description: 'The user hashed id' + type: string + example: '' + assigned_user_id: + description: 'The assigned user hashed id' + type: string + example: '' + company_id: + description: 'The company hashed id' + type: string + example: '' + client_id: + description: 'The client hashed id' + type: string + example: '' + invoice_id: + description: 'The related invoice hashed id' + type: string + example: '' + bank_id: + description: 'The bank id related to this expense' + type: string + example: '' + invoice_currency_id: + description: 'The currency id of the related invoice' + type: string + example: '' + expense_currency_id: + description: 'The currency id of the expense' + type: string + example: '' + invoice_category_id: + description: 'The invoice category id' + type: string + example: '' + payment_type_id: + description: 'The payment type id' + type: string + example: '' + recurring_expense_id: + description: 'The related recurring expense this expense was created from' + type: string + example: '' + private_notes: + description: 'The private notes of the expense' + type: string + example: '' + public_notes: + description: 'The public notes of the expense' + type: string + example: '' + transaction_reference: + description: 'The transaction references of the expense' + type: string + example: '' + transcation_id: + description: 'The transaction id of the expense' + type: string + example: '' + custom_value1: + description: 'A custom value' + type: string + example: '' + custom_value2: + description: 'A custom value' + type: string + example: '' + custom_value3: + description: 'A custom value' + type: string + example: '' + custom_value4: + description: 'A custom value' + type: string + example: '' + tax_name1: + description: 'Tax name' + type: string + example: '' + tax_name2: + description: 'Tax name' + type: string + example: '' + tax_rate1: + description: 'Tax rate' + type: number + format: float + example: '10.00' + tax_rate2: + description: 'Tax rate' + type: number + format: float + example: '10.00' + tax_name3: + description: 'Tax name' + type: string + example: '' + tax_rate3: + description: 'Tax rate' + type: number + format: float + example: '10.00' + amount: + description: 'The total expense amont' + type: number + format: float + example: '10.00' + foreign_amount: + description: 'The total foreign amount of the expense' + type: number + format: float + example: '10.00' + exchange_rate: + description: 'The exchange rate at the time of the expense' + type: number + format: float + example: '0.80' + date: + description: 'The expense date formate Y-m-d' + type: string + example: '2022-12-01' + payment_date: + description: 'The date of payment for the expense, format Y-m-d' + type: string + example: '' + should_be_invoiced: + description: 'Flag whether the expense should be invoiced' + type: boolean + example: true + is_deleted: + description: 'Boolean determining whether the expense has been deleted' + type: boolean + example: true + invoice_documents: + description: 'Passing the expense documents over to the invoice' + type: boolean + example: true + updated_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + archived_at: + description: Timestamp + type: number + format: integer + example: '1434342123' + type: object + Error: + properties: + message: + description: 'Something terrible went wrong' + type: string + example: 'Unexpected error' + code: + description: 'The HTTP error code, ie 5xx 4xx' + type: integer + example: '500' + type: object InvoiceInvitation: properties: id: @@ -21176,47 +20850,378 @@ components: type: string readOnly: true - Design: + + ProductBulkAction: + required: + - action + - ids + properties: + action: + type: string + example: archive + description: 'The action to perform ie. archive / restore / delete / set_tax_id' + ids: + type: array + items: + format: string + type: string + example: 2J234DFA,D2J234DFA,D2J234DFA + description: string array of client hashed ids + tax_id: + type: string + example: '1' + description: | + The tax rate id to set on the list of products + + The following constants are available (default = '1') + + ``` + PRODUCT_TYPE_PHYSICAL = '1' + PRODUCT_TYPE_SERVICE = '2' + PRODUCT_TYPE_DIGITAL = '3' + PRODUCT_TYPE_SHIPPING = '4' + PRODUCT_TYPE_EXEMPT = '5' + PRODUCT_TYPE_REDUCED_TAX = '6' + PRODUCT_TYPE_OVERRIDE_TAX = '7' + PRODUCT_TYPE_ZERO_RATED = '8' + PRODUCT_TYPE_REVERSE_TAX = '9' + ``` + type: object + User: properties: id: - description: 'The design hashed id' + description: 'The hashed id of the user' type: string - example: AS3df3A - name: - description: 'The design name' + example: Opnel5aKBz + readOnly: true + first_name: + description: 'The first name of the user' type: string - example: Beauty - design: - description: 'The design HTML' + example: Brad + last_name: + description: 'The last name of the user' type: string - example: '' - is_custom: - description: 'Flag to determine if the design is a custom user design' + example: Pitt + email: + description: 'The users email address' + type: string + example: brad@pitt.com + phone: + description: 'The users phone number' + type: string + example: 555-1233-23232 + signature: + description: 'The users sign off signature' + type: string + example: 'Have a nice day!' + avatar: + description: 'The users avatar' + type: string + example: 'https://url.to.your/avatar.png' + accepted_terms_version: + description: 'The version of the invoice ninja terms that has been accepted by the user' + type: string + example: 1.0.1 + readOnly: true + oauth_user_id: + description: 'The provider id of the oauth entity' + type: string + example: jkhasdf789as6f675sdf768sdfs + readOnly: true + oauth_provider_id: + description: 'The oauth entity id' + type: string + example: google + readOnly: true + language_id: + description: 'The language id of the user' + type: string + example: 1 + verified_phone_number: + description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA' type: boolean example: true - is_active: - description: 'Flag to determine if the design is available for use' + readOnly: true + sms_verification_code: + description: 'The sms verification code for the user. Required to settings up 2FA' + type: string + example: '123456' + readOnly: true + oauth_user_token_expiry: + description: 'The expiry date of the oauth token' + type: string + example: '2022-10-10' + readOnly: true + has_password: + description: 'Boolean flag determining if the user has a password' + type: boolean + example: true + readOnly: true + last_confirmed_email_address: + description: 'The last confirmed email address of the user' + type: string + example: 'bob@gmail.com' + readOnly: true + custom_value1: + description: 'A custom value' + type: string + example: 'Custom value 1' + custom_value2: + description: 'A custom value' + type: string + example: '$1000' + custom_value3: + description: 'A custom value' + type: string + example: 'Custom value 3' + custom_value4: + description: 'A custom value' + type: string + example: 'Custom value 4' + is_deleted: + description: 'Boolean flag determining if the user has been deleted' + type: boolean + example: true + readOnly: true + google_2fa_secret: + description: 'The google 2fa secret for the user' + type: string + example: '123456' + readOnly: true + type: object + Account: + properties: + id: + description: 'The account hashed id' + type: string + example: AS3df3A + account_sms_verified: + description: 'Boolean flag if the account has been verified by sms' + type: string + example: true + type: object + Credit: + properties: + id: + description: "The unique hashed ID of the credit" + type: string + example: Opnel5aKBz + user_id: + description: "The unique hashed ID of the user associated with the credit" + type: string + example: 1a2b3c4d5e + assigned_user_id: + description: "The unique hashed ID of the assigned user responsible for the credit" + type: string + example: 6f7g8h9i0j + company_id: + description: "The unique hashed ID of the company associated with the credit" + type: string + example: k1l2m3n4o5 + client_id: + description: "The unique hashed ID of the client associated with the credit" + type: string + example: p1q2r3s4t5 + status_id: + description: "The ID representing the current status of the credit" + type: string + example: 3 + invoice_id: + description: "The unique hashed ID of the linked invoice to which the credit is applied" + type: string + example: u1v2w3x4y5 + number: + description: "The unique alphanumeric credit number per company" + type: string + example: QUOTE_101 + po_number: + description: "The purchase order number referred to by the credit" + type: string + example: PO_12345 + terms: + description: "The terms associated with the credit" + type: string + example: "Net 30" + public_notes: + description: "Public notes for the credit" + type: string + example: "Thank you for your business." + private_notes: + description: "Private notes for internal use, not visible to the client" + type: string + example: "Client is requesting a discount." + footer: + description: "The footer text for the credit" + type: string + example: "Footer text goes here." + custom_value1: + description: "Custom value 1 for additional credit information" + type: string + example: "Custom data 1" + custom_value2: + description: "Custom value 2 for additional credit information" + type: string + example: "Custom data 2" + custom_value3: + description: "Custom value 3 for additional credit information" + type: string + example: "Custom data 3" + custom_value4: + description: "Custom value 4 for additional credit information" + type: string + example: "Custom data 4" + tax_name1: + description: "The name of the first tax applied to the credit" + type: string + example: "VAT" + tax_name2: + description: "The name of the second tax applied to the credit" + type: string + example: "GST" + tax_rate1: + description: "The rate of the first tax applied to the credit" + type: number + format: float + example: 10.00 + tax_rate2: + description: "The rate of the second tax applied to the credit" + type: number + format: float + example: 5.00 + tax_name3: + description: "The name of the third tax applied to the credit" + type: string + example: "PST" + tax_rate3: + description: "The rate of the third tax applied to the credit" + type: number + format: float + example: 8.00 + total_taxes: + description: "The total amount of taxes for the credit" + type: number + format: float + example: 23.00 + line_items: + type: array + description: 'An array of objects which define the line items of the credit' + items: + $ref: '#/components/schemas/InvoiceItem' + amount: + description: "The total amount of the credit" + type: number + format: float + example: 100.00 + balance: + description: "The outstanding balance of the credit" + type: number + format: float + example: 50.00 + paid_to_date: + description: "The total amount paid to date for the credit" + type: number + format: float + example: 50.00 + discount: + description: "The discount applied to the credit" + type: number + format: float + example: 10.00 + partial: + description: "The partial amount applied to the credit" + type: number + format: float + example: 20.00 + is_amount_discount: + description: "Indicates whether the discount applied is a fixed amount or a percentage" type: boolean example: true is_deleted: - description: 'Flag to determine if the design is deleted' + description: "Indicates whether the credit has been deleted" + type: boolean + example: false + uses_inclusive_taxes: + description: "Indicates whether the tax rates applied to the credit are inclusive or exclusive" type: boolean example: true - created_at: - description: Timestamp + date: + description: "The date the credit was issued" + type: string + format: date + example: "1994-07-30" + last_sent_date: + description: "The date the credit was last sent out" + type: string + format: date + example: "1994-07-30" + next_send_date: + description: "The next scheduled date for sending a credit reminder" + type: string + format: date + example: "1994-07-30" + partial_due_date: + description: "The due date for the partial amount of the credit" + type: string + format: date + example: "1994-07-30" + due_date: + description: "The due date for the total amount of the credit" + type: string + format: date + example: "1994-07-30" + settings: + $ref: "#/components/schemas/CompanySettings" + last_viewed: + description: "The timestamp of the last time the credit was viewed" type: number format: integer - example: '134341234234' + example: 1434342123 updated_at: - description: Timestamp + description: "The timestamp of the last time the credit was updated" type: number format: integer - example: '134341234234' - deleted_at: - description: Timestamp + example: 1434342123 + archived_at: + description: "The timestamp of the last time the credit was archived" type: number format: integer - example: '134341234234' + example: 1434342123 + custom_surcharge1: + description: "First custom surcharge amount" + type: number + format: float + example: 10.00 + custom_surcharge2: + description: 'Second Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge3: + description: 'Third Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge4: + description: 'Fourth Custom Surcharge' + type: number + format: float + example: '10.00' + custom_surcharge_tax1: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax2: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax3: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true + custom_surcharge_tax4: + description: 'Toggles charging taxes on custom surcharge amounts' + type: boolean + example: true type: object tags: - name: login diff --git a/openapi/components/schemas/vendor.yaml b/openapi/components/schemas/vendor.yaml index 1a600a20df01..26d92809f19d 100644 --- a/openapi/components/schemas/vendor.yaml +++ b/openapi/components/schemas/vendor.yaml @@ -145,6 +145,11 @@ format: integer example: '134341234234' readOnly: true + display_name: + description: 'The display name of the vendor.' + type: string + example: 'Bob the vendor' + readOnly: true settings: $ref: '#/components/schemas/CompanySettings' type: object \ No newline at end of file From bc0690fafcef2fce952e9c4aeff6f18b8e9a31aa Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 20:41:03 +1100 Subject: [PATCH 077/109] Fixes for time log validation --- app/Http/Requests/Task/StoreTaskRequest.php | 10 +++- app/Http/Requests/Task/UpdateTaskRequest.php | 26 +++++++++-- tests/Feature/TaskApiTest.php | 48 +++++++++++++------- 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 52d331d3ab92..124c1e7d9c9f 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -54,7 +54,15 @@ class StoreTaskRequest extends Request $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.$user->company()->id.',is_deleted,0'; } - $rules['timelog'] = ['bail','array',function ($attribute, $values, $fail) { + $rules['time_log'] = ['bail', function ($attribute, $values, $fail) { + + if(is_string($values)) + $values = json_decode($values, 1); + + if(!is_array($values)) { + return $fail('The '.$attribute.' is invalid. Must be an array.'); + } + foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 7107df9fe63f..f9d1d2d96f78 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -34,27 +34,43 @@ class UpdateTaskRequest extends Request if ($this->task->invoice_id && $this->task->company->invoice_task_lock) { return false; } + + /** @var \App\Models\User $user */ + $user = auth()->user(); - return auth()->user()->can('edit', $this->task); + return $user->can('edit', $this->task); } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = []; if (isset($this->number)) { - $rules['number'] = Rule::unique('tasks')->where('company_id', auth()->user()->company()->id)->ignore($this->task->id); + $rules['number'] = Rule::unique('tasks')->where('company_id', $user->company()->id)->ignore($this->task->id); } if (isset($this->client_id)) { - $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0'; } if (isset($this->project_id)) { - $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.$user->company()->id.',is_deleted,0'; } - $rules['timelog'] = ['bail','array',function ($attribute, $values, $fail) { + $rules['time_log'] = ['bail',function ($attribute, $values, $fail) { + + if(is_string($values)) { + $values = json_decode($values, 1); + } + + if(!is_array($values)) { + return $fail('The '.$attribute.' is invalid. Must be an array.'); + } + foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); diff --git a/tests/Feature/TaskApiTest.php b/tests/Feature/TaskApiTest.php index 2d7d9e4363fe..e93640852cb9 100644 --- a/tests/Feature/TaskApiTest.php +++ b/tests/Feature/TaskApiTest.php @@ -132,6 +132,26 @@ class TaskApiTest extends TestCase $this->assertEquals(41, $arr['data']['rate']); } + public function testTaskTimelogParse() + { + $data = [ + "description" => "xx", + "rate" => "6574", + "time_log" => "[[Oct 31, 2023 12:00 am,Oct 31, 2023 1:00 am]]" + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/tasks", $data); + + $response->assertStatus(422); + $arr = $response->json(); + + + + } + public function testTaskProjectRateSet() { @@ -579,19 +599,16 @@ class TaskApiTest extends TestCase public function testTimeLogValidation() { $data = [ - 'timelog' => $this->faker->firstName(), + 'time_log' => $this->faker->firstName(), ]; - try { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, - ])->post('/api/v1/tasks', $data); + ])->postJson('/api/v1/tasks', $data); + + $response->assertStatus(422); - $arr = $response->json(); - } catch (ValidationException $e) { - $response->assertStatus(302); - } } public function testTimeLogValidation1() @@ -629,19 +646,16 @@ class TaskApiTest extends TestCase public function testTimeLogValidation3() { $data = [ - 'timelog' => [["a","b",'d'],["c","d",'d']], + 'time_log' => [["a","b",'d'],["c","d",'d']], ]; - try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->post('/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); - $arr = $response->json(); - } catch (ValidationException $e) { - $response->assertStatus(302); - } } public function testTimeLogValidation4() From 1edb890b7ffe7e247a831f8779dd7f2aed5a866b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 20:42:55 +1100 Subject: [PATCH 078/109] Fixes for tests --- tests/Feature/Client/ClientMergeTest.php | 2 ++ tests/Feature/Export/ArDetailReportTest.php | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Client/ClientMergeTest.php b/tests/Feature/Client/ClientMergeTest.php index ef2c4ae62fd9..d6ff8069412a 100644 --- a/tests/Feature/Client/ClientMergeTest.php +++ b/tests/Feature/Client/ClientMergeTest.php @@ -37,6 +37,8 @@ class ClientMergeTest extends TestCase private $primary_contact; + public $faker; + protected function setUp(): void { parent::setUp(); diff --git a/tests/Feature/Export/ArDetailReportTest.php b/tests/Feature/Export/ArDetailReportTest.php index 0c196685290d..5b5c599162ac 100644 --- a/tests/Feature/Export/ArDetailReportTest.php +++ b/tests/Feature/Export/ArDetailReportTest.php @@ -19,6 +19,7 @@ use App\Models\Company; use App\Models\Invoice; use App\Models\User; use App\Services\Report\ARDetailReport; +use App\Utils\Traits\AppSetup; use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; use Tests\MockAccountData; @@ -30,6 +31,7 @@ use Tests\TestCase; class ArDetailReportTest extends TestCase { use MakesHash; + use AppSetup; public $faker; @@ -44,6 +46,8 @@ class ArDetailReportTest extends TestCase ); $this->withoutExceptionHandling(); + + $this->buildCache(true); } @@ -132,7 +136,6 @@ class ArDetailReportTest extends TestCase { $this->buildData(); - $this->payload = [ 'start_date' => '2000-01-01', 'end_date' => '2030-01-11', From 184adcad8f4494d41a5a374a0ca293335fd29fa5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 20:44:34 +1100 Subject: [PATCH 079/109] Return --- app/Http/Requests/Task/StoreTaskRequest.php | 4 ++-- app/Http/Requests/Task/UpdateTaskRequest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 124c1e7d9c9f..8f97f3ab5e90 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -65,12 +65,12 @@ class StoreTaskRequest extends Request foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { - $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); + return $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); } } if (!$this->checkTimeLog($values)) { - $fail('Please correct overlapping values'); + return $fail('Please correct overlapping values'); } }]; diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index f9d1d2d96f78..d0ab48a2980d 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -73,12 +73,12 @@ class UpdateTaskRequest extends Request foreach ($values as $k) { if (!is_int($k[0]) || !is_int($k[1])) { - $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); + return $fail('The '.$attribute.' - '.print_r($k, 1).' is invalid. Unix timestamps only.'); } } if (!$this->checkTimeLog($values)) { - $fail('Please correct overlapping values'); + return $fail('Please correct overlapping values'); } }]; From 23a43c219ca2c89f92cd0f3145fec6c11d29ab68 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 25 Oct 2023 20:56:56 +1100 Subject: [PATCH 080/109] Fixes for settings data --- app/DataMapper/Settings/SettingsData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/DataMapper/Settings/SettingsData.php b/app/DataMapper/Settings/SettingsData.php index b76379806ff6..4d99cccff18b 100644 --- a/app/DataMapper/Settings/SettingsData.php +++ b/app/DataMapper/Settings/SettingsData.php @@ -355,7 +355,7 @@ class SettingsData public string $email = ''; //@implemented - public string $country_id; //@implemented + public string $country_id = ''; //@implemented public string $vat_number = ''; //@implemented From 45f2f2135ad981710357ac8850e9ceb23866968d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 09:41:58 +1100 Subject: [PATCH 081/109] Minor fixes for live previews --- app/Http/Controllers/PreviewController.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index d297e3bcfa89..e448256aa7e7 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -117,11 +117,6 @@ class PreviewController extends BaseController $design = \App\Models\Design::query()->withTrashed()->find($entity_obj->design_id ?? 2); - /* Catch all in case migration doesn't pass back a valid design */ - if (! $design) { - $design = \App\Models\Design::query()->find(2); - } - if ($design->is_custom) { $options = [ 'custom_partials' => json_decode(json_encode($design->design), true), From 952f96de3b71ab3e39fbf4dac0f22f024bd07106 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 09:54:58 +1100 Subject: [PATCH 082/109] Fixes for twig static analysis --- app/Http/Controllers/PreviewController.php | 207 +-------------------- app/Services/Template/TemplateService.php | 71 ++++--- 2 files changed, 43 insertions(+), 235 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index e448256aa7e7..2cb31c4e3c1b 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -18,6 +18,7 @@ use App\Models\Credit; use App\Models\Invoice; use App\Utils\HtmlEngine; use App\Libraries\MultiDB; +use Twig\Error\SyntaxError; use App\Factory\QuoteFactory; use App\Jobs\Util\PreviewPdf; use App\Models\ClientContact; @@ -330,196 +331,6 @@ class PreviewController extends BaseController return $this->blankEntity(); } - - - /** - * @deprecated due to usage of transactions - * - * @param PreviewInvoiceRequest $request - * @return mixed - */ - public function livex(PreviewInvoiceRequest $request) - { - - if(Cache::has("preview_".auth()->user()->id)) - return response()->json(['message' => 'Please wait a few seconds before trying again, this many requests are not good.'], 400); - - if (Ninja::isHosted() && !in_array($request->getHost(), ['preview.invoicing.co','staging.invoicing.co'])) { - return response()->json(['message' => 'This server cannot handle this request.'], 400); - } - - Cache::put("preview_".auth()->user()->id, 60); - - $start = microtime(true); - - /** @var \App\Models\User $user */ - $user = auth()->user(); - - $company = $user->company(); - - MultiDB::setDb($company->db); - - if ($request->input('entity') == 'quote') { - $repo = new QuoteRepository(); - $entity_obj = QuoteFactory::create($company->id, $user->id); - $class = Quote::class; - } elseif ($request->input('entity') == 'credit') { - $repo = new CreditRepository(); - $entity_obj = CreditFactory::create($company->id, $user->id); - $class = Credit::class; - } elseif ($request->input('entity') == 'recurring_invoice') { - $repo = new RecurringInvoiceRepository(); - $entity_obj = RecurringInvoiceFactory::create($company->id, $user->id); - $class = RecurringInvoice::class; - } else { //assume it is either an invoice or a null object - $repo = new InvoiceRepository(); - $entity_obj = InvoiceFactory::create($company->id, $user->id); - $class = Invoice::class; - } - - try { - DB::connection(config('database.default'))->beginTransaction(); - - if ($request->has('entity_id')) { - - /** @var \App\Models\Quote | \App\Models\Invoice | \App\Models\RecurringInvoice | \App\Models\Credit $class */ - $temp_obj = $class::on(config('database.default')) - ->with('client.company') - ->where('id', $this->decodePrimaryKey($request->input('entity_id'))) - ->where('company_id', $company->id) - ->withTrashed() - ->first(); - - /** Prevents null values from being passed into entity_obj */ - if($temp_obj) - $entity_obj = $temp_obj; - } - - if ($request->has('footer') && !$request->filled('footer') && $request->input('entity') == 'recurring_invoice') { - $request->merge(['footer' => $company->settings->invoice_footer]); - } - - if ($request->has('terms') && !$request->filled('terms') && $request->input('entity') == 'recurring_invoice') { - $request->merge(['terms' => $company->settings->invoice_terms]); - } - - $entity_obj = $repo->save($request->all(), $entity_obj); - - if (! $request->has('entity_id')) { - $entity_obj->service()->fillDefaults()->save(); - } - - App::forgetInstance('translator'); - $t = app('translator'); - App::setLocale($entity_obj->client->locale()); - $t->replace(Ninja::transformTranslations($entity_obj->client->getMergedSettings())); - - $html = new HtmlEngine($entity_obj->invitations()->first()); - - /** @var \App\Models\Design $design */ - $design = \App\Models\Design::withTrashed()->find($entity_obj->design_id); - - /* Catch all in case migration doesn't pass back a valid design */ - if (! $design) { - $design = \App\Models\Design::find(2); - } - - if ($design->is_custom) { - $options = [ - 'custom_partials' => json_decode(json_encode($design->design), true), - ]; - $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); - } else { - $template = new PdfMakerDesign(strtolower($design->name)); - } - - $variables = $html->generateLabelsAndValues(); - - $state = [ - 'template' => $template->elements([ - 'client' => $entity_obj->client, - 'entity' => $entity_obj, - 'pdf_variables' => (array) $entity_obj->company->settings->pdf_variables, - '$product' => $design->design->product, - 'variables' => $variables, - ]), - 'variables' => $variables, - 'options' => [ - 'all_pages_header' => $entity_obj->client->getSetting('all_pages_header'), - 'all_pages_footer' => $entity_obj->client->getSetting('all_pages_footer'), - 'client' => $entity_obj->client, - 'entity' => $entity_obj, - 'variables' => $variables, - ], - 'process_markdown' => $entity_obj->client->company->markdown_enabled, - ]; - - $maker = new PdfMaker($state); - - $maker - ->design($template) - ->build(); - - DB::connection(config('database.default'))->rollBack(); - - if (request()->query('html') == 'true') { - $this->purgeCache(); - return $maker->getCompiledHTML(); - } - - } catch(\Exception $e) { - - $this->purgeCache(); - - DB::connection(config('database.default'))->rollBack(); - - if (DB::connection(config('database.default'))->transactionLevel() > 0) { - DB::connection(config('database.default'))->rollBack(); - } - - return response()->json(['message' => 'Error generating preview. Please retry again shortly.'], 400); - } - - //if phantom js...... inject here.. - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - $this->purgeCache(); - return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); - } - - /** @var \App\Models\User $user */ - $user = auth()->user(); - - /** @var \App\Models\Company $company */ - $company = $user->company(); - - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - - $numbered_pdf = $this->pageNumbering($pdf, $company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - $this->purgeCache(); - return $pdf; - } - - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $company))->handle(); - - if (Ninja::isHosted()) { - LightLogs::create(new LivePreview()) - ->increment() - ->batch(); - } - - $response = Response::make($file_path, 200); - $response->header('Content-Type', 'application/pdf'); - $response->header('Server-Timing', microtime(true)-$start); - - $this->purgeCache(); - return $response; - } - private function template() { @@ -531,27 +342,13 @@ class PreviewController extends BaseController $design_object = json_decode(json_encode(request()->input('design')),1); - // $client_id = Invoice::whereHas('payments')->company()->where('is_deleted', 0)->orderBy('id','desc')->first()->client_id; - // $vendor_id = PurchaseOrder::query()->company()->where('is_deleted', 0)->orderBy('id', 'desc')->first()->vendor_id; - - // $data = [ - // 'invoices' => Invoice::whereHas('payments')->company()->with('client','payments')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - // 'quotes' => Quote::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - // 'credits' => Credit::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - // 'payments' => Payment::query()->company()->with('client')->where('client_id', $client_id)->orderBy('id','desc')->take(4)->get(), - // 'purchase_orders' => PurchaseOrder::query()->company()->with('vendor')->where('vendor_id', $vendor_id)->orderBy('id','desc')->take(5)->get(), - // 'tasks' => Task::query()->company()->with('client','invoice')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), - // 'projects' => Project::query()->company()->with('tasks','client')->where('client_id', $client_id)->orderBy('id','desc')->take(2)->get(), - // ]; - - $ts = (new TemplateService()); try { $ts->setCompany($company) ->setTemplate($design_object) ->mock(); } - catch(\Twig\Error\SyntaxError $e) + catch(SyntaxError $e) { // return response()->json(['message' => 'Twig syntax is invalid.', 'errors' => new \stdClass], 422); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 538e5257027d..898dd63f893c 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,27 +11,38 @@ namespace App\Services\Template; +use Twig\TwigFilter; +use App\Utils\Number; +use Twig\Environment; +use Twig\Error\Error; use App\Models\Client; -use App\Models\Company; use App\Models\Design; +use Twig\TwigFunction; +use App\Models\Company; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; -use App\Models\PurchaseOrder; -use App\Transformers\ProjectTransformer; -use App\Transformers\PurchaseOrderTransformer; -use App\Transformers\QuoteTransformer; -use App\Transformers\TaskTransformer; -use App\Utils\HostedPDF\NinjaPdf; use App\Utils\HtmlEngine; -use App\Utils\Number; +use League\Fractal\Manager; +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\Utils\PaymentHtmlEngine; use App\Utils\Traits\MakesDates; +use App\Utils\HostedPDF\NinjaPdf; +use Twig\Loader\FilesystemLoader; use App\Utils\Traits\Pdf\PdfMaker; -use App\Utils\VendorHtmlEngine; -use League\Fractal\Manager; -use League\Fractal\Serializer\ArraySerializer; +use Twig\Extension\DebugExtension; use Twig\Extra\Intl\IntlExtension; +use App\Transformers\TaskTransformer; +use App\Transformers\QuoteTransformer; +use App\Transformers\ProjectTransformer; +use Twig\Extension\StringLoaderExtension; +use App\Transformers\PurchaseOrderTransformer; +use League\Fractal\Serializer\ArraySerializer; class TemplateService { @@ -39,7 +50,7 @@ class TemplateService private \DomDocument $document; - public \Twig\Environment $twig; + public Environment $twig; private string $compiled_html = ''; @@ -64,22 +75,22 @@ class TemplateService { $this->document = new \DOMDocument(); $this->document->validateOnParse = true; - - $loader = new \Twig\Loader\FilesystemLoader(storage_path()); - $this->twig = new \Twig\Environment($loader, [ + $loader = new FilesystemLoader(storage_path()); + $this->twig = new Environment($loader, [ 'debug' => true, ]); - $string_extension = new \Twig\Extension\StringLoaderExtension(); + + $string_extension = new StringLoaderExtension(); $this->twig->addExtension($string_extension); $this->twig->addExtension(new IntlExtension()); - $this->twig->addExtension(new \Twig\Extension\DebugExtension()); - - $function = new \Twig\TwigFunction('img', function ($string, $style = '') { + $this->twig->addExtension(new DebugExtension()); + + $function = new TwigFunction('img', function ($string, $style = '') { return ''; }); $this->twig->addFunction($function); - $filter = new \Twig\TwigFilter('sum', function (array $array, string $column) { + $filter = new TwigFilter('sum', function (array $array, string $column) { return array_sum(array_column($array, $column)); }); @@ -181,21 +192,21 @@ class TemplateService try { $template = $this->twig->createTemplate(html_entity_decode($template)); - } catch(\Twig\Error\SyntaxError $e) { + } catch(SyntaxError $e) { nlog($e->getMessage()); - throw ($e); - } catch(\Twig\Error\Error $e) { + continue; + } catch(Error $e) { nlog("error = " .$e->getMessage()); - throw ($e); - } catch(\Twig\Error\RuntimeError $e) { + continue; + } catch(RuntimeError $e) { nlog("runtime = " .$e->getMessage()); - throw ($e); - } catch(\Twig\Error\LoaderError $e) { + continue; + } catch(LoaderError $e) { nlog("loader = " . $e->getMessage()); - throw ($e); - } catch(\Twig\Error\SecurityError $e) { + continue; + } catch(SecurityError $e) { nlog("security = " . $e->getMessage()); - throw ($e); + continue; } $template = $template->render($this->data); From 4fe9e1cef4f4bfd461851f28e99ac7b3da526035 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 10:49:09 +1100 Subject: [PATCH 083/109] Refactor and removal of deprecated code paths --- app/Http/Controllers/PreviewController.php | 135 +++++++++++---------- app/Jobs/Credit/ZipCredits.php | 7 +- app/Jobs/Invoice/ZipInvoices.php | 21 +--- app/Jobs/Util/RefreshPdfs.php | 61 ---------- app/Listeners/Invoice/CreateInvoicePdf.php | 57 --------- app/Providers/EventServiceProvider.php | 4 - app/Services/PdfMaker/PdfMaker.php | 6 +- app/Services/Template/TemplateService.php | 2 +- 8 files changed, 80 insertions(+), 213 deletions(-) delete mode 100644 app/Jobs/Util/RefreshPdfs.php delete mode 100644 app/Listeners/Invoice/CreateInvoicePdf.php diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 2cb31c4e3c1b..cd64d5da4f0e 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -280,7 +280,7 @@ class PreviewController extends BaseController 'process_markdown' => $entity_obj->client->company->markdown_enabled, 'options' => [ 'client' => $entity_obj->client, - 'entity' => $entity_obj, + request()->input('entity_type', 'invoice')."s" => [$entity_obj], ] ]; @@ -433,7 +433,7 @@ class PreviewController extends BaseController 'process_markdown' => $invitation->invoice->client->company->markdown_enabled, 'options' => [ 'client' => $invitation->invoice->client, - 'entity' => $invitation->invoice, + 'invoices' => [$invitation->invoice], ] ]; @@ -485,79 +485,84 @@ class PreviewController extends BaseController /** @var \App\Models\Company $company */ $company = $user->company(); + try { + DB::connection($company->db)->beginTransaction(); - DB::connection($company->db)->beginTransaction(); + /** @var \App\Models\Client $client */ + $client = Client::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => $company->id, + ]); - /** @var \App\Models\Client $client */ - $client = Client::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => $company->id, - ]); + /** @var \App\Models\ClientContact $contact */ + $contact = ClientContact::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'is_primary' => 1, + 'send_email' => true, + ]); - /** @var \App\Models\ClientContact $contact */ - $contact = ClientContact::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => $company->id, - 'client_id' => $client->id, - 'is_primary' => 1, - 'send_email' => true, - ]); + /** @var \App\Models\Invoice $invoice */ - /** @var \App\Models\Invoice $invoice */ + $invoice = Invoice::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'terms' => $company->settings->invoice_terms, + 'footer' => $company->settings->invoice_footer, + 'public_notes' => 'Sample Public Notes', + ]); - $invoice = Invoice::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => $company->id, - 'client_id' => $client->id, - 'terms' => $company->settings->invoice_terms, - 'footer' => $company->settings->invoice_footer, - 'public_notes' => 'Sample Public Notes', - ]); + $invitation = InvoiceInvitation::factory()->create([ + 'user_id' => auth()->user()->id, + 'company_id' => $company->id, + 'invoice_id' => $invoice->id, + 'client_contact_id' => $contact->id, + ]); - $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => $company->id, - 'invoice_id' => $invoice->id, - 'client_contact_id' => $contact->id, - ]); + $invoice->setRelation('invitations', $invitation); + $invoice->setRelation('client', $client); + $invoice->setRelation('company', $company); + $invoice->load('client.company'); - $invoice->setRelation('invitations', $invitation); - $invoice->setRelation('client', $client); - $invoice->setRelation('company', $company); - $invoice->load('client.company'); + $design_object = json_decode(json_encode(request()->input('design'))); - $design_object = json_decode(json_encode(request()->input('design'))); + if (! is_object($design_object)) { + return response()->json(['message' => 'Invalid custom design object'], 400); + } - if (! is_object($design_object)) { - return response()->json(['message' => 'Invalid custom design object'], 400); + $html = new HtmlEngine($invoice->invitations()->first()); + + $design = new Design(Design::CUSTOM, ['custom_partials' => request()->design['design']]); + + $state = [ + 'template' => $design->elements([ + 'client' => $invoice->client, + 'entity' => $invoice, + 'pdf_variables' => (array) $invoice->company->settings->pdf_variables, + 'products' => request()->design['design']['product'], + ]), + 'variables' => $html->generateLabelsAndValues(), + 'process_markdown' => $invoice->client->company->markdown_enabled, + 'options' => [ + 'client' => $invoice->client, + 'invoices' => [$invoice], + ] + ]; + + $maker = new PdfMaker($state); + + $maker + ->design($design) + ->build(); + + DB::connection($company->db)->rollBack(); + } + catch(\Exception $e){ + DB::connection($company->db)->rollBack(); + return response()->json(['message' => $e->getMessage()], 400); } - - $html = new HtmlEngine($invoice->invitations()->first()); - - $design = new Design(Design::CUSTOM, ['custom_partials' => request()->design['design']]); - - $state = [ - 'template' => $design->elements([ - 'client' => $invoice->client, - 'entity' => $invoice, - 'pdf_variables' => (array) $invoice->company->settings->pdf_variables, - 'products' => request()->design['design']['product'], - ]), - 'variables' => $html->generateLabelsAndValues(), - 'process_markdown' => $invoice->client->company->markdown_enabled, - 'options' => [ - 'client' => $invoice->client, - 'entity' => $invoice, - ] - ]; - - $maker = new PdfMaker($state); - - $maker - ->design($design) - ->build(); - - DB::connection($company->db)->rollBack(); if (request()->query('html') == 'true') { return $maker->getCompiledHTML(); diff --git a/app/Jobs/Credit/ZipCredits.php b/app/Jobs/Credit/ZipCredits.php index 2239fad4f83c..625e02494cb5 100644 --- a/app/Jobs/Credit/ZipCredits.php +++ b/app/Jobs/Credit/ZipCredits.php @@ -11,7 +11,6 @@ namespace App\Jobs\Credit; -use App\Jobs\Entity\CreateEntityPdf; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; use App\Jobs\Util\UnlinkFile; @@ -31,8 +30,6 @@ class ZipCredits implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - public $settings; - public $tries = 1; public function __construct(protected array $credit_ids, protected Company $company, protected User $user) @@ -48,7 +45,7 @@ class ZipCredits implements ShouldQueue { MultiDB::setDb($this->company->db); - $this->settings = $this->company->settings; + $settings = $this->company->settings; $zipFile = new \PhpZip\ZipFile(); $file_name = now()->addSeconds($this->company->timezone_offset())->format('Y-m-d-h-m-s').'_'.str_replace(' ', '_', trans('texts.credits')).'.zip'; @@ -67,7 +64,7 @@ class ZipCredits implements ShouldQueue $nmo = new NinjaMailerObject; $nmo->mailable = new DownloadCredits(Storage::url($path.$file_name), $this->company); $nmo->to_user = $this->user; - $nmo->settings = $this->settings; + $nmo->settings = $settings; $nmo->company = $this->company; NinjaMailerJob::dispatch($nmo); diff --git a/app/Jobs/Invoice/ZipInvoices.php b/app/Jobs/Invoice/ZipInvoices.php index f7292988b0d1..82ddade1054e 100644 --- a/app/Jobs/Invoice/ZipInvoices.php +++ b/app/Jobs/Invoice/ZipInvoices.php @@ -11,7 +11,6 @@ namespace App\Jobs\Invoice; -use App\Jobs\Entity\CreateEntityPdf; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; use App\Jobs\Util\UnlinkFile; @@ -30,14 +29,6 @@ class ZipInvoices implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - public $invoices; - - private $company; - - private $user; - - public $settings; - public $tries = 1; /** @@ -47,15 +38,8 @@ class ZipInvoices implements ShouldQueue * @deprecated confirm to be deleted * Create a new job instance. */ - public function __construct($invoices, Company $company, User $user) + public function __construct(public mixed $invoices, public Company $company, public User $user) { - $this->invoices = $invoices; - - $this->company = $company; - - $this->user = $user; - - $this->settings = $company->settings; } /** @@ -66,6 +50,7 @@ class ZipInvoices implements ShouldQueue public function handle(): void { MultiDB::setDb($this->company->db); + $settings = $this->company->settings; // create new zip object $zipFile = new \PhpZip\ZipFile(); @@ -93,7 +78,7 @@ class ZipInvoices implements ShouldQueue $nmo = new NinjaMailerObject; $nmo->mailable = new DownloadInvoices(Storage::url($path.$file_name), $this->company); $nmo->to_user = $this->user; - $nmo->settings = $this->settings; + $nmo->settings = $settings; $nmo->company = $this->company; NinjaMailerJob::dispatch($nmo); diff --git a/app/Jobs/Util/RefreshPdfs.php b/app/Jobs/Util/RefreshPdfs.php deleted file mode 100644 index dba50bf67c69..000000000000 --- a/app/Jobs/Util/RefreshPdfs.php +++ /dev/null @@ -1,61 +0,0 @@ -company = $company; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - MultiDB::setDb($this->company->db); - - InvoiceInvitation::where('company_id', $this->company->id)->cursor()->each(function ($invitation) { - nlog("generating invoice pdf for {$invitation->invoice_id}"); - CreateEntityPdf::dispatch($invitation); - }); - - QuoteInvitation::where('company_id', $this->company->id)->cursor()->each(function ($invitation) { - nlog("generating quote pdf for {$invitation->quote_id}"); - CreateEntityPdf::dispatch($invitation); - }); - - CreditInvitation::where('company_id', $this->company->id)->cursor()->each(function ($invitation) { - nlog("generating credit pdf for {$invitation->credit_id}"); - CreateEntityPdf::dispatch($invitation); - }); - } -} \ No newline at end of file diff --git a/app/Listeners/Invoice/CreateInvoicePdf.php b/app/Listeners/Invoice/CreateInvoicePdf.php deleted file mode 100644 index a50c13ef46a3..000000000000 --- a/app/Listeners/Invoice/CreateInvoicePdf.php +++ /dev/null @@ -1,57 +0,0 @@ -company->db); - - if (isset($event->invoice)) { - $event->invoice->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation->load('invoice', 'contact.client.company')))->handle(); - }); - } - - if (isset($event->quote)) { - $event->quote->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation->load('quote', 'contact.client.company')))->handle(); - }); - } - - if (isset($event->credit)) { - $event->credit->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation->load('credit', 'contact.client.company')))->handle(); - }); - } - } -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 028eeb4dffc7..9a2d4754af0f 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -125,7 +125,6 @@ use App\Events\Document\DocumentWasCreated; use App\Events\Document\DocumentWasDeleted; use App\Events\Document\DocumentWasUpdated; use App\Events\Invoice\InvoiceWasCancelled; -use App\Listeners\Invoice\CreateInvoicePdf; use App\Listeners\Quote\QuoteEmailActivity; use App\Listeners\User\CreatedUserActivity; use App\Listeners\User\DeletedUserActivity; @@ -378,7 +377,6 @@ class EventServiceProvider extends ServiceProvider ], CreditWasUpdated::class => [ UpdatedCreditActivity::class, - CreateInvoicePdf::class, ], CreditWasEmailedAndFailed::class => [ ], @@ -459,7 +457,6 @@ class EventServiceProvider extends ServiceProvider ], InvoiceWasReversed::class => [ InvoiceReversedActivity::class, - CreateInvoicePdf::class, ], InvoiceWasCancelled::class => [ InvoiceCancelledActivity::class, @@ -515,7 +512,6 @@ class EventServiceProvider extends ServiceProvider ], QuoteWasUpdated::class => [ QuoteUpdatedActivity::class, - CreateInvoicePdf::class, ], QuoteWasEmailed::class => [ QuoteEmailActivity::class, diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index 2d028563f0a3..f54cbbf26677 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -80,14 +80,16 @@ class PdfMaker $replacements = []; $contents = $this->document->getElementsByTagName('ninja'); - $twig = (new TemplateService())->twig; + $ts = new TemplateService(); + $data = $ts->processData($this->options)->getData(); + $twig = $ts->twig; foreach ($contents as $content) { $template = $content->ownerDocument->saveHTML($content); $template = $twig->createTemplate(html_entity_decode($template)); - $template = $template->render($this->options); + $template = $template->render($data); $f = $this->document->createDocumentFragment(); $f->appendXML($template); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 898dd63f893c..6ca56d0bdde3 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -79,7 +79,7 @@ class TemplateService $this->twig = new Environment($loader, [ 'debug' => true, ]); - + $string_extension = new StringLoaderExtension(); $this->twig->addExtension($string_extension); $this->twig->addExtension(new IntlExtension()); From a669328a8036ae4794e86705bbd9be969b1d9aa2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 12:25:56 +1100 Subject: [PATCH 084/109] Refactor for PDF code paths --- .../ClientPortal/EntityViewController.php | 184 ------------------ .../ClientPortal/InvitationController.php | 38 +++- .../ClientPortal/InvoiceController.php | 2 +- .../ClientPortal/QuoteController.php | 4 +- app/Http/Controllers/CreditController.php | 13 +- app/Http/Controllers/InvoiceController.php | 4 +- .../Controllers/PurchaseOrderController.php | 1 - app/Http/Controllers/QuoteController.php | 15 +- .../RecurringInvoiceController.php | 2 +- app/Http/Livewire/PdfSlot.php | 2 +- app/Jobs/Credit/ZipCredits.php | 2 +- app/Jobs/Entity/CreateRawPdf.php | 11 +- app/Jobs/Quote/ZipQuotes.php | 2 +- app/Mail/Engine/CreditEmailEngine.php | 2 +- app/Mail/Engine/InvoiceEmailEngine.php | 2 +- app/Mail/Engine/PaymentEmailEngine.php | 2 +- app/Mail/Engine/QuoteEmailEngine.php | 2 +- app/Models/BaseModel.php | 2 +- app/Models/Credit.php | 9 +- app/Models/CreditInvitation.php | 5 +- app/Models/Invoice.php | 10 +- app/Models/InvoiceInvitation.php | 6 +- app/Models/PurchaseOrder.php | 1 + app/Models/Quote.php | 7 +- app/Models/QuoteInvitation.php | 6 +- app/Services/Credit/CreditService.php | 29 +-- app/Services/Credit/GetCreditPdf.php | 26 +-- app/Services/Email/EmailDefaults.php | 3 +- app/Services/Invoice/GetInvoicePdf.php | 20 +- app/Services/Invoice/InvoiceService.php | 37 +--- .../PurchaseOrder/PurchaseOrderService.php | 21 -- app/Services/Quote/GetQuotePdf.php | 18 +- app/Services/Quote/QuoteService.php | 26 --- app/Services/Recurring/GetInvoicePdf.php | 26 +-- .../ninja2020/view_entity/index.blade.php | 58 ------ routes/client.php | 5 +- tests/Feature/PdfCreatorTest.php | 22 --- tests/Feature/Template/TemplateTest.php | 6 +- tests/Integration/InvoiceUploadTest.php | 3 - tests/Unit/EInvoiceTest.php | 5 +- 40 files changed, 116 insertions(+), 523 deletions(-) delete mode 100644 app/Http/Controllers/ClientPortal/EntityViewController.php delete mode 100644 resources/views/themes/ninja2020/view_entity/index.blade.php diff --git a/app/Http/Controllers/ClientPortal/EntityViewController.php b/app/Http/Controllers/ClientPortal/EntityViewController.php deleted file mode 100644 index f5c40de3a312..000000000000 --- a/app/Http/Controllers/ClientPortal/EntityViewController.php +++ /dev/null @@ -1,184 +0,0 @@ -entity_types)) { - abort(404, 'Entity not found'); - } - - $invitation_entity = sprintf('App\\Models\\%sInvitation', ucfirst($entity_type)); - - $key = $entity_type.'_id'; - - $invitation = $invitation_entity::where('key', $invitation_key) - ->with('contact.client') - ->firstOrFail(); - - $contact = $invitation->contact; - $client = $contact->client; - $entity = $invitation->{$entity_type}; - - if (is_null($contact->password) || empty($contact->password)) { - return redirect("/client/password/reset?email={$contact->email}"); - } - - if ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) { - session()->flash("{$entity_type}_VIEW_{$entity->hashed_id}", true); - } - - if (! session("{$entity_type}_VIEW_{$entity->hashed_id}")) { - return redirect()->route('client.entity_view.password', compact('entity_type', 'invitation_key')); - } - - return $this->render('view_entity.index', [ - 'root' => 'themes', - 'entity' => $entity, - ]); - } - - /** - * Show the form for entering password. - * - * @param string $entity_type - * @param string $invitation_key - * - * @return Factory|View - */ - public function password(string $entity_type, string $invitation_key) - { - return $this->render('view_entity.password', [ - 'root' => 'themes', - 'entity_type' => $entity_type, - ]); - } - - /**` - * Handle the password check. - * - * @param string $entity_type - * @param string $invitation_key - * - * @return Redirector|RedirectResponse|mixed - */ - public function handlePassword(string $entity_type, string $invitation_key) - { - if (! in_array($entity_type, $this->entity_types)) { - abort(404, 'Entity not found'); - } - - $invitation_entity = sprintf('App\\Models\\%sInvitation', ucfirst($entity_type)); - - $key = $entity_type.'_id'; - - $invitation = $invitation_entity::where('key', $invitation_key)->firstOrFail(); - - $contact = $invitation->contact; - - $check = Hash::check(request()->password, $contact->password); - - $entity_class = sprintf('App\\Models\\%s', ucfirst($entity_type)); - - $entity = $entity_class::findOrFail($invitation->{$key}); - - if ($check) { - session()->flash("{$entity_type}_VIEW_{$entity->hashed_id}", true); - - return redirect()->route('client.entity_view', compact('entity_type', 'invitation_key')); - } - - session()->flash('PASSWORD_FAILED', true); - - return back(); - } - - public function handlePasswordSet(Request $request) - { - $entity_obj = 'App\Models\\'.ucfirst(Str::camel($request->entity_type)).'Invitation'; - $key = $request->entity_type.'_id'; - - $invitation = $entity_obj::where('key', $request->invitation_key) - ->whereHas($request->entity_type, function ($query) { - $query->where('is_deleted', 0); - }) - ->with('contact.client') - ->firstOrFail(); - - $contact = $invitation->contact; - $contact->password = Hash::make($request->password); - $contact->save(); - - $request->session()->invalidate(); - auth()->guard('contact')->loginUsingId($contact->id, true); - - if (! $invitation->viewed_date) { - $invitation->markViewed(); - - if (! session()->get('is_silent')) { - event(new InvitationWasViewed($invitation->{$request->entity_type}, $invitation, $invitation->{$request->entity_type}->company, Ninja::eventVars())); - } - - if (! session()->get('is_silent')) { - $this->fireEntityViewedEvent($invitation, $request->entity_type); - } - } - - return redirect()->route('client.'.$request->entity_type.'.show', [$request->entity_type => $this->encodePrimaryKey($invitation->{$key})]); - } - - private function fireEntityViewedEvent($invitation, $entity_string) - { - switch ($entity_string) { - case 'invoice': - event(new InvoiceWasViewed($invitation, $invitation->company, Ninja::eventVars())); - break; - case 'quote': - event(new QuoteWasViewed($invitation, $invitation->company, Ninja::eventVars())); - break; - case 'credit': - event(new CreditWasViewed($invitation, $invitation->company, Ninja::eventVars())); - break; - default: - // code... - break; - } - } -} diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index e5007cca9a48..cc19d8b5a1f1 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -26,6 +26,7 @@ use App\Models\InvoiceInvitation; use App\Events\Quote\QuoteWasViewed; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; use App\Events\Credit\CreditWasViewed; use App\Events\Contact\ContactLoggedIn; use App\Models\PurchaseOrderInvitation; @@ -195,7 +196,7 @@ class InvitationController extends Controller $file_name = $invitation->{$entity}->numberFormatter().'.pdf'; - $file = (new CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new CreateRawPdf($invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; @@ -212,6 +213,41 @@ class InvitationController extends Controller { } + + public function handlePasswordSet(Request $request) + { + $entity_obj = 'App\Models\\'.ucfirst(Str::camel($request->entity_type)).'Invitation'; + $key = $request->entity_type.'_id'; + + $invitation = $entity_obj::where('key', $request->invitation_key) + ->whereHas($request->entity_type, function ($query) { + $query->where('is_deleted', 0); + }) + ->with('contact.client') + ->firstOrFail(); + + $contact = $invitation->contact; + $contact->password = Hash::make($request->password); + $contact->save(); + + $request->session()->invalidate(); + auth()->guard('contact')->loginUsingId($contact->id, true); + + if (! $invitation->viewed_date) { + $invitation->markViewed(); + + if (! session()->get('is_silent')) { + event(new InvitationWasViewed($invitation->{$request->entity_type}, $invitation, $invitation->{$request->entity_type}->company, Ninja::eventVars())); + } + + if (! session()->get('is_silent')) { + $this->fireEntityViewedEvent($invitation, $request->entity_type); + } + } + + return redirect()->route('client.'.$request->entity_type.'.show', [$request->entity_type => $this->encodePrimaryKey($invitation->{$key})]); + } + public function paymentRouter(string $contact_key, string $payment_id) { /** @var \App\Models\ClientContact $contact **/ diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index bbed2ee5bbbf..cc882291af7d 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -107,7 +107,7 @@ class InvoiceController extends Controller return redirect('/'); } - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; return response()->make($file, 200, $headers); diff --git a/app/Http/Controllers/ClientPortal/QuoteController.php b/app/Http/Controllers/ClientPortal/QuoteController.php index 39d48aab2904..6e12701bb680 100644 --- a/app/Http/Controllers/ClientPortal/QuoteController.php +++ b/app/Http/Controllers/ClientPortal/QuoteController.php @@ -137,7 +137,7 @@ class QuoteController extends Controller if ($quote_invitations->count() == 1) { $invitation = $quote_invitations->first(); - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); return response()->streamDownload(function () use ($file) { echo $file; }, $invitation->quote->numberFormatter().".pdf", ['Content-Type' => 'application/pdf']); @@ -152,7 +152,7 @@ class QuoteController extends Controller $zipFile = new \PhpZip\ZipFile(); try { foreach ($quote_invitations as $invitation) { - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $zipFile->addFromString($invitation->quote->numberFormatter() . '.pdf', $file); } diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index b2be03691eb7..9ab4db36bdff 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -533,14 +533,14 @@ class CreditController extends BaseController } }); - ZipCredits::dispatch($credits->pluck('id')->toArray(), $credits->first()->company, $user); + ZipCredits::dispatch($credits->pluck('id')->toArray(), $user->company(), $user); return response()->json(['message' => ctrans('texts.sent_message')], 200); } if ($action == 'bulk_print' && $user->can('view', $credits->first())) { $paths = $credits->map(function ($credit) { - return (new \App\Jobs\Entity\CreateRawPdf($credit->invitations->first(), $credit->company->db))->handle(); + return (new \App\Jobs\Entity\CreateRawPdf($credit->invitations->first()))->handle(); }); $merge = (new PdfMerge($paths->toArray()))->run(); @@ -593,8 +593,8 @@ class CreditController extends BaseController $file = $credit->service()->getCreditPdf($credit->invitations->first()); return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), ['Content-Type' => 'application/pdf']); + echo $file; + }, $credit->numberFormatter().'.pdf', ['Content-Type' => 'application/pdf']); break; case 'archive': $this->credit_repository->archive($credit); @@ -710,8 +710,9 @@ class CreditController extends BaseController } return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), $headers); + echo $file; + }, $credit->numberFormatter().'.pdf', $headers); + } /** diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index e7df44100636..6322dfc9ee69 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -528,7 +528,7 @@ class InvoiceController extends BaseController if ($action == 'bulk_print' && $user->can('view', $invoices->first())) { $paths = $invoices->map(function ($invoice) { - return (new \App\Jobs\Entity\CreateRawPdf($invoice->invitations->first(), $invoice->company->db))->handle(); + return (new \App\Jobs\Entity\CreateRawPdf($invoice->invitations->first()))->handle(); }); $merge = (new PdfMerge($paths->toArray()))->run(); @@ -798,7 +798,7 @@ class InvoiceController extends BaseController $file_name = $invoice->numberFormatter().'.pdf'; - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index 4ed383f30870..fa469a9d6d6e 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -367,7 +367,6 @@ class PurchaseOrderController extends BaseController $purchase_order = $purchase_order->service() ->triggeredActions($request) - // ->touchPdf() ->save(); event(new PurchaseOrderWasUpdated($purchase_order, $purchase_order->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 45cfc2293fd8..915e325ed76f 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -562,7 +562,7 @@ class QuoteController extends BaseController if ($action == 'bulk_print' && $user->can('view', $quotes->first())) { $paths = $quotes->map(function ($quote) { - return (new \App\Jobs\Entity\CreateRawPdf($quote->invitations->first(), $quote->company->db))->handle(); + return (new \App\Jobs\Entity\CreateRawPdf($quote->invitations->first()))->handle(); }); $merge = (new PdfMerge($paths->toArray()))->run(); @@ -724,8 +724,8 @@ class QuoteController extends BaseController $file = $quote->service()->getQuotePdf(); return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), ['Content-Type' => 'application/pdf']); + echo $file; + }, $quote->numberFormatter().".pdf", ['Content-Type' => 'application/pdf']); case 'restore': $this->quote_repo->restore($quote); @@ -828,17 +828,18 @@ class QuoteController extends BaseController App::setLocale($invitation->contact->preferredLocale()); - $file = $quote->service()->getQuotePdf($contact); - $headers = ['Content-Type' => 'application/pdf']; if (request()->input('inline') == 'true') { $headers = array_merge($headers, ['Content-Disposition' => 'inline']); } + $file = $quote->service()->getQuotePdf($contact); + return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), $headers); + echo $file; + }, $quote->numberFormatter().".pdf", $headers); + } /** diff --git a/app/Http/Controllers/RecurringInvoiceController.php b/app/Http/Controllers/RecurringInvoiceController.php index 94c2192d178a..12c3f9dad0e1 100644 --- a/app/Http/Controllers/RecurringInvoiceController.php +++ b/app/Http/Controllers/RecurringInvoiceController.php @@ -580,7 +580,7 @@ class RecurringInvoiceController extends BaseController $file_name = $invoice->numberFormatter().'.pdf'; - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index c18556ba7b81..9638eafe2d02 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -98,7 +98,7 @@ class PdfSlot extends Component if($this->entity instanceof \App\Models\PurchaseOrder) $file = (new CreatePurchaseOrderPdf($this->invitation, $this->invitation->company->db))->rawPdf(); else - $file = (new \App\Jobs\Entity\CreateRawPdf($this->invitation, $this->invitation->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($this->invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; diff --git a/app/Jobs/Credit/ZipCredits.php b/app/Jobs/Credit/ZipCredits.php index 625e02494cb5..88a2d66d517d 100644 --- a/app/Jobs/Credit/ZipCredits.php +++ b/app/Jobs/Credit/ZipCredits.php @@ -55,7 +55,7 @@ class ZipCredits implements ShouldQueue try { foreach ($invitations as $invitation) { - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $this->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $zipFile->addFromString($invitation->credit->numberFormatter() . '.pdf', $file); } diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 4f1619587e9a..4118e448f1d8 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -44,9 +44,9 @@ use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; -class CreateRawPdf implements ShouldQueue +class CreateRawPdf { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; + use NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; public Invoice | Credit | Quote | RecurringInvoice $entity; @@ -59,13 +59,10 @@ class CreateRawPdf implements ShouldQueue public $entity_string = ''; /** - * Create a new job instance. - * * @param $invitation */ - public function __construct($invitation, $db) + public function __construct($invitation) { - MultiDB::setDb($db); $this->invitation = $invitation; @@ -99,8 +96,6 @@ class CreateRawPdf implements ShouldQueue $pdf = $ps->boot()->getPdf(); nlog("pdf timer = ". $ps->execution_time); - - /* Forget the singleton*/ App::forgetInstance('translator'); diff --git a/app/Jobs/Quote/ZipQuotes.php b/app/Jobs/Quote/ZipQuotes.php index b1675b7c0e27..352be947858a 100644 --- a/app/Jobs/Quote/ZipQuotes.php +++ b/app/Jobs/Quote/ZipQuotes.php @@ -60,7 +60,7 @@ class ZipQuotes implements ShouldQueue try { foreach ($invitations as $invitation) { - $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $this->company->db))->handle(); + $file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle(); $zipFile->addFromString($invitation->quote->numberFormatter() . '.pdf', $file); } diff --git a/app/Mail/Engine/CreditEmailEngine.php b/app/Mail/Engine/CreditEmailEngine.php index d6a7bda08b15..75b34299da67 100644 --- a/app/Mail/Engine/CreditEmailEngine.php +++ b/app/Mail/Engine/CreditEmailEngine.php @@ -115,7 +115,7 @@ class CreditEmailEngine extends BaseEmailEngine if ($this->client->getSetting('pdf_email_attachment') !== false && $this->credit->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - $pdf = ((new CreateRawPdf($this->invitation, $this->invitation->company->db))->handle()); + $pdf = ((new CreateRawPdf($this->invitation))->handle()); $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->credit->numberFormatter().'.pdf']]); } diff --git a/app/Mail/Engine/InvoiceEmailEngine.php b/app/Mail/Engine/InvoiceEmailEngine.php index 70ab7ee7060f..42ca22ac65f0 100644 --- a/app/Mail/Engine/InvoiceEmailEngine.php +++ b/app/Mail/Engine/InvoiceEmailEngine.php @@ -127,7 +127,7 @@ class InvoiceEmailEngine extends BaseEmailEngine ->setTextBody($text_body); if ($this->client->getSetting('pdf_email_attachment') !== false && $this->invoice->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - $pdf = ((new CreateRawPdf($this->invitation, $this->invitation->company->db))->handle()); + $pdf = ((new CreateRawPdf($this->invitation))->handle()); $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->invoice->numberFormatter().'.pdf']]); } diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index 0f15634fb012..a3f303f714d9 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -138,7 +138,7 @@ class PaymentEmailEngine extends BaseEmailEngine if(!$template_in_use) { - $pdf = ((new CreateRawPdf($invoice->invitations->first(), $invoice->company->db))->handle()); + $pdf = ((new CreateRawPdf($invoice->invitations->first()))->handle()); $file_name = $invoice->numberFormatter().'.pdf'; $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); } diff --git a/app/Mail/Engine/QuoteEmailEngine.php b/app/Mail/Engine/QuoteEmailEngine.php index 72f3a13db1d7..a4b3df35db97 100644 --- a/app/Mail/Engine/QuoteEmailEngine.php +++ b/app/Mail/Engine/QuoteEmailEngine.php @@ -113,7 +113,7 @@ class QuoteEmailEngine extends BaseEmailEngine ->setTextBody($text_body); if ($this->client->getSetting('pdf_email_attachment') !== false && $this->quote->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - $pdf = ((new CreateRawPdf($this->invitation, $this->invitation->company->db))->handle()); + $pdf = ((new CreateRawPdf($this->invitation))->handle()); $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->quote->numberFormatter().'.pdf']]); } diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 20f119b0c94f..c8e4eb6a0356 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -306,7 +306,7 @@ class BaseModel extends Model if($this instanceof \App\Models\PurchaseOrder) return "data:application/pdf;base64,".base64_encode((new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf()); - return "data:application/pdf;base64,".base64_encode((new CreateRawPdf($invitation, $invitation->company->db))->handle()); + return "data:application/pdf;base64,".base64_encode((new CreateRawPdf($invitation))->handle()); } } diff --git a/app/Models/Credit.php b/app/Models/Credit.php index d7d5e91d869f..1adcdb89a8ca 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -16,7 +16,7 @@ use Illuminate\Support\Carbon; use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesDates; use App\Helpers\Invoice\InvoiceSum; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\MakesReminders; use App\Services\Credit\CreditService; use App\Services\Ledger\LedgerService; @@ -26,8 +26,6 @@ use Laracasts\Presenter\PresentableTrait; use App\Models\Presenters\CreditPresenter; use App\Helpers\Invoice\InvoiceSumInclusive; use Illuminate\Database\Eloquent\SoftDeletes; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\MorphMany; /** * App\Models\Credit @@ -360,6 +358,7 @@ class Credit extends BaseModel $this->saveQuietly(); } + /** @deprecated 5.7 */ public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) { if (! $invitation) { @@ -380,7 +379,7 @@ class Credit extends BaseModel if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { return Storage::disk(config('filesystems.default'))->{$type}($file_path); } elseif (Ninja::isHosted() && $portal) { - $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); + // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); return Storage::disk(config('filesystems.default'))->{$type}($file_path); } @@ -402,7 +401,7 @@ class Credit extends BaseModel return Storage::disk('public')->{$type}($file_path); } - $file_path = (new CreateEntityPdf($invitation))->handle(); + // $file_path = (new CreateEntityPdf($invitation))->handle(); return Storage::disk('public')->{$type}($file_path); } diff --git a/app/Models/CreditInvitation.php b/app/Models/CreditInvitation.php index 2f8926700e40..f1473f4944ca 100644 --- a/app/Models/CreditInvitation.php +++ b/app/Models/CreditInvitation.php @@ -11,7 +11,7 @@ namespace App\Models; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -155,12 +155,13 @@ class CreditInvitation extends BaseModel $this->save(); } + /** @deprecated 5.7 */ public function pdf_file_path() { $storage_path = Storage::url($this->credit->client->quote_filepath($this).$this->credit->numberFormatter().'.pdf'); if (! Storage::exists($this->credit->client->credit_filepath($this).$this->credit->numberFormatter().'.pdf')) { - (new CreateEntityPdf($this))->handle(); + // (new CreateEntityPdf($this))->handle(); } return $storage_path; diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 22e9093f2d18..abec2ad21ac5 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -14,9 +14,8 @@ namespace App\Models; use App\Utils\Ninja; use Illuminate\Support\Carbon; use App\Utils\Traits\MakesDates; -use App\Jobs\Entity\CreateRawPdf; use App\Helpers\Invoice\InvoiceSum; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\MakesReminders; use App\Utils\Traits\NumberFormatter; use App\Services\Ledger\LedgerService; @@ -26,12 +25,10 @@ use App\Utils\Traits\MakesInvoiceValues; use App\Events\Invoice\InvoiceWasEmailed; use Laracasts\Presenter\PresentableTrait; use App\Models\Presenters\EntityPresenter; -use App\Models\Presenters\InvoicePresenter; use App\Helpers\Invoice\InvoiceSumInclusive; use App\Utils\Traits\Invoice\ActionsInvoice; use Illuminate\Database\Eloquent\SoftDeletes; use App\Events\Invoice\InvoiceReminderWasEmailed; -use Illuminate\Database\Eloquent\Relations\HasManyThrough; /** * App\Models\Invoice @@ -529,6 +526,7 @@ class Invoice extends BaseModel return $invoice_calc->build(); } + /** @deprecated 5.7 */ public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) { @@ -559,7 +557,7 @@ class Invoice extends BaseModel if (Ninja::isHosted() && $portal && $file_exists) { return Storage::disk(config('filesystems.default'))->{$type}($file_path); } elseif (Ninja::isHosted()) { - $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); + // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); return Storage::disk(config('filesystems.default'))->{$type}($file_path); } @@ -584,7 +582,7 @@ class Invoice extends BaseModel return Storage::disk('public')->{$type}($file_path); } - $file_path = (new CreateEntityPdf($invitation))->handle(); + // $file_path = (new CreateEntityPdf($invitation))->handle(); return Storage::disk('public')->{$type}($file_path); } diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index f8fb383db5dd..61578c427fd1 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -12,11 +12,10 @@ namespace App\Models; use App\Events\Invoice\InvoiceWasUpdated; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Ninja; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; @@ -158,13 +157,14 @@ class InvoiceInvitation extends BaseModel $this->save(); } + /** @deprecated 5.7 */ public function pdf_file_path(): string { $storage_path = Storage::url($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf'); if (! Storage::exists($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf')) { event(new InvoiceWasUpdated($this->invoice, $this->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); - (new CreateEntityPdf($this))->handle(); + // (new CreateEntityPdf($this))->handle(); } return $storage_path; diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 61f334b62c12..7752d919190f 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -281,6 +281,7 @@ class PurchaseOrder extends BaseModel }); } + /** @deprecated 5.7 */ public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) { if (! $invitation) { diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 3ab63980e771..a2c18c5aef84 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -13,7 +13,7 @@ namespace App\Models; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Models\Presenters\QuotePresenter; use App\Services\Quote\QuoteService; use App\Utils\Ninja; @@ -314,6 +314,7 @@ class Quote extends BaseModel return new QuoteService($this); } + /** @deprecated 5.7 */ public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) { if (! $invitation) { @@ -334,7 +335,7 @@ class Quote extends BaseModel if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { return Storage::disk(config('filesystems.default'))->{$type}($file_path); } elseif (Ninja::isHosted() && $portal) { - $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); + // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); return Storage::disk(config('filesystems.default'))->{$type}($file_path); } @@ -354,7 +355,7 @@ class Quote extends BaseModel return Storage::disk('public')->{$type}($file_path); } - $file_path = (new CreateEntityPdf($invitation))->handle(); + // $file_path = (new CreateEntityPdf($invitation))->handle(); return Storage::disk('public')->{$type}($file_path); } diff --git a/app/Models/QuoteInvitation.php b/app/Models/QuoteInvitation.php index abe0f5668ca6..878a74869098 100644 --- a/app/Models/QuoteInvitation.php +++ b/app/Models/QuoteInvitation.php @@ -11,10 +11,8 @@ namespace App\Models; -use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; @@ -141,12 +139,14 @@ class QuoteInvitation extends BaseModel $this->save(); } + /** @deprecated 5.7 */ + public function pdf_file_path() { $storage_path = Storage::url($this->quote->client->quote_filepath($this).$this->quote->numberFormatter().'.pdf'); if (! Storage::exists($this->quote->client->quote_filepath($this).$this->quote->numberFormatter().'.pdf')) { - (new CreateEntityPdf($this))->handle(); + // (new CreateEntityPdf($this))->handle(); } return $storage_path; diff --git a/app/Services/Credit/CreditService.php b/app/Services/Credit/CreditService.php index 7b00f0ead97d..6ed9a4df141b 100644 --- a/app/Services/Credit/CreditService.php +++ b/app/Services/Credit/CreditService.php @@ -15,10 +15,9 @@ use App\Utils\Ninja; use App\Models\Credit; use App\Models\Payment; use App\Models\PaymentType; -use App\Jobs\Util\UnlinkFile; use App\Factory\PaymentFactory; use App\Utils\Traits\MakesHash; -use App\Jobs\Entity\CreateEntityPdf; +// use App\Jobs\Entity\CreateEntityPdf; use App\Repositories\CreditRepository; use App\Repositories\PaymentRepository; use Illuminate\Support\Facades\Storage; @@ -180,32 +179,6 @@ class CreditService return $this; } - /** - * Sometimes we need to refresh the - * PDF when it is updated etc. - * @return self - */ - public function touchPdf($force = false) - { - try { - if ($force) { - $this->credit->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation))->handle(); - }); - - return $this; - } - - $this->credit->invitations->each(function ($invitation) { - CreateEntityPdf::dispatch($invitation); - }); - } catch (\Exception $e) { - nlog('failed creating invoices in Touch PDF'); - } - - return $this; - } - public function fillDefaults() { $settings = $this->credit->client->getMergedSettings(); diff --git a/app/Services/Credit/GetCreditPdf.php b/app/Services/Credit/GetCreditPdf.php index 0ad1d9aac220..e1f59b68236b 100644 --- a/app/Services/Credit/GetCreditPdf.php +++ b/app/Services/Credit/GetCreditPdf.php @@ -11,38 +11,20 @@ namespace App\Services\Credit; -use App\Jobs\Entity\CreateEntityPdf; +use App\Models\CreditInvitation; +use App\Jobs\Entity\CreateRawPdf; use App\Services\AbstractService; class GetCreditPdf extends AbstractService { - public $credit; - - public $contact; - - public $invitation; - - public function __construct($invitation) + public function __construct(public CreditInvitation $invitation) { - $this->invitation = $invitation; - $this->credit = $invitation->credit; - $this->contact = $invitation->contact; } public function run() { - if (! $this->contact) { - $this->contact = $this->credit->client->primary_contact()->first() ?: $this->credit->client->contacts()->first(); - } - $path = $this->credit->client->credit_filepath($this->invitation); + return (new CreateRawPdf($this->invitation))->handle(); - $file_path = $path.$this->credit->numberFormatter().'.pdf'; - - // $disk = 'public'; - $disk = config('filesystems.default'); - - $file_path = (new CreateEntityPdf($this->invitation))->handle(); - return $file_path; } } diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 1f78facaa1e5..bf02092819b3 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -24,7 +24,6 @@ use App\Utils\Traits\MakesHash; use App\Jobs\Entity\CreateRawPdf; use Illuminate\Support\Facades\App; use Illuminate\Mail\Mailables\Address; -use Illuminate\Support\Facades\Storage; use App\DataMapper\EmailTemplateDefaults; use League\CommonMark\CommonMarkConverter; use App\Jobs\Vendor\CreatePurchaseOrderPdf; @@ -308,7 +307,7 @@ class EmailDefaults ($this->email->email_object->entity instanceof Invoice || $this->email->email_object->entity instanceof Quote || $this->email->email_object->entity instanceof Credit)) { - $pdf = ((new CreateRawPdf($this->email->email_object->invitation, $this->email->company->db))->handle()); + $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/GetInvoicePdf.php b/app/Services/Invoice/GetInvoicePdf.php index 9211a15bb8fd..f2eeee32cbef 100644 --- a/app/Services/Invoice/GetInvoicePdf.php +++ b/app/Services/Invoice/GetInvoicePdf.php @@ -11,12 +11,10 @@ namespace App\Services\Invoice; -use App\Jobs\Entity\CreateEntityPdf; -use App\Jobs\Invoice\CreateEInvoice; -use App\Models\ClientContact; use App\Models\Invoice; +use App\Models\ClientContact; +use App\Jobs\Entity\CreateRawPdf; use App\Services\AbstractService; -use Illuminate\Support\Facades\Storage; class GetInvoicePdf extends AbstractService { @@ -36,19 +34,7 @@ class GetInvoicePdf extends AbstractService $invitation = $this->invoice->invitations->first(); } - $path = $this->invoice->client->invoice_filepath($invitation); + return (new CreateRawPdf($invitation))->handle(); - $file_path = $path.$this->invoice->numberFormatter().'.pdf'; - - // $disk = 'public'; - $disk = config('filesystems.default'); - - $file = Storage::disk($disk)->exists($file_path); - - if (! $file) { - $file_path = (new CreateEntityPdf($invitation))->handle(); - } - - return $file_path; } } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 4d248bc031f6..affba6b25536 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -12,7 +12,6 @@ namespace App\Services\Invoice; use App\Events\Invoice\InvoiceWasArchived; -use App\Jobs\Entity\CreateEntityPdf; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Inventory\AdjustProductInventory; use App\Jobs\Invoice\CreateEInvoice; @@ -20,7 +19,6 @@ use App\Libraries\Currency\Conversion\CurrencyApi; use App\Models\CompanyGateway; use App\Models\Expense; use App\Models\Invoice; -use App\Models\InvoiceInvitation; use App\Models\Payment; use App\Models\Task; use App\Utils\Ninja; @@ -192,7 +190,7 @@ class InvoiceService { $invitation = $contact ? $this->invoice->invitations()->where('contact_id', $contact->id)->first() : $this->invoice->invitations()->first(); - return (new CreateRawPdf($invitation, $invitation->company->db))->handle(); + return (new CreateRawPdf($invitation))->handle(); } public function getInvoiceDeliveryNote(Invoice $invoice, \App\Models\ClientContact $contact = null) @@ -486,39 +484,6 @@ class InvoiceService return $this; } - /** - * Sometimes we need to refresh the - * PDF when it is updated etc. - * @return InvoiceService - */ - public function touchPdf($force = false) - { - try { - if ($force) { - $this->invoice->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation))->handle(); - }); - - return $this; - } - - - $this->invoice->invitations->each(function ($invitation) { - CreateEntityPdf::dispatch($invitation); - - if ($invitation->invoice->client->getSetting('enable_e_invoice') && $invitation instanceof InvoiceInvitation) { - CreateEInvoice::dispatch($invitation->invoice); - } - - }); - - } catch (\Exception $e) { - nlog('failed creating invoices in Touch PDF'); - } - - return $this; - } - /*When a reminder is sent we want to touch the dates they were sent*/ public function touchReminder(string $reminder_template) { diff --git a/app/Services/PurchaseOrder/PurchaseOrderService.php b/app/Services/PurchaseOrder/PurchaseOrderService.php index 3445e261dd7d..6ee50bc5a466 100644 --- a/app/Services/PurchaseOrder/PurchaseOrderService.php +++ b/app/Services/PurchaseOrder/PurchaseOrderService.php @@ -98,27 +98,6 @@ class PurchaseOrderService return $this; } - public function touchPdf($force = false) - { - try { - if ($force) { - $this->purchase_order->invitations->each(function ($invitation) { - (new CreatePurchaseOrderPdf($invitation))->handle(); - }); - - return $this; - } - - $this->purchase_order->invitations->each(function ($invitation) { - CreatePurchaseOrderPdf::dispatch($invitation); - }); - } catch(\Exception $e) { - nlog("failed creating purchase orders in Touch PDF"); - } - - return $this; - } - public function add_to_inventory() { if ($this->purchase_order->status_id >= PurchaseOrder::STATUS_RECEIVED) { diff --git a/app/Services/Quote/GetQuotePdf.php b/app/Services/Quote/GetQuotePdf.php index 5ae880e33052..d58268cbe050 100644 --- a/app/Services/Quote/GetQuotePdf.php +++ b/app/Services/Quote/GetQuotePdf.php @@ -11,18 +11,15 @@ namespace App\Services\Quote; -use App\Jobs\Entity\CreateEntityPdf; -use App\Models\ClientContact; use App\Models\Quote; +use App\Models\ClientContact; +use App\Jobs\Entity\CreateRawPdf; use App\Services\AbstractService; class GetQuotePdf extends AbstractService { public function __construct(public Quote $quote, public ?ClientContact $contact = null) { - $this->quote = $quote; - - $this->contact = $contact; } public function run() @@ -37,16 +34,7 @@ class GetQuotePdf extends AbstractService $invitation = $this->quote->invitations->first(); } - $path = $this->quote->client->quote_filepath($invitation); + return (new CreateRawPdf($invitation))->handle(); - $file_path = $path . $this->quote->numberFormatter() . '.pdf'; - - // $disk = 'public'; - $disk = config('filesystems.default'); - - - $file_path = (new CreateEntityPdf($invitation))->handle(); - - return $file_path; } } diff --git a/app/Services/Quote/QuoteService.php b/app/Services/Quote/QuoteService.php index e12168af52e1..d6a09c08fbf1 100644 --- a/app/Services/Quote/QuoteService.php +++ b/app/Services/Quote/QuoteService.php @@ -16,7 +16,6 @@ use App\Models\Quote; use App\Models\Project; use App\Utils\Traits\MakesHash; use App\Exceptions\QuoteConversion; -use App\Jobs\Entity\CreateEntityPdf; use App\Repositories\QuoteRepository; use App\Events\Quote\QuoteWasApproved; use Illuminate\Support\Facades\Storage; @@ -133,32 +132,7 @@ class QuoteService return $this; } - /** - * Sometimes we need to refresh the - * PDF when it is updated etc. - * - * @return QuoteService - */ - public function touchPdf($force = false) - { - try { - if ($force) { - $this->quote->invitations->each(function ($invitation) { - (new CreateEntityPdf($invitation))->handle(); - }); - return $this; - } - - $this->quote->invitations->each(function ($invitation) { - CreateEntityPdf::dispatch($invitation); - }); - } catch (\Exception $e) { - nlog('failed creating invoices in Touch PDF'); - } - - return $this; - } public function approveWithNoCoversion($contact = null) :self { diff --git a/app/Services/Recurring/GetInvoicePdf.php b/app/Services/Recurring/GetInvoicePdf.php index 079bd55eea6e..ea66fff6a8b3 100644 --- a/app/Services/Recurring/GetInvoicePdf.php +++ b/app/Services/Recurring/GetInvoicePdf.php @@ -11,22 +11,15 @@ namespace App\Services\Recurring; -use App\Jobs\Entity\CreateEntityPdf; use App\Models\ClientContact; +use App\Jobs\Entity\CreateRawPdf; use App\Services\AbstractService; -use Illuminate\Support\Facades\Storage; class GetInvoicePdf extends AbstractService { - public $entity; - - public $contact; - public function __construct($entity, ClientContact $contact = null) + public function __construct(public $entity, public ClientContact $contact = null) { - $this->entity = $entity; - - $this->contact = $contact; } public function run() @@ -37,18 +30,11 @@ class GetInvoicePdf extends AbstractService $invitation = $this->entity->invitations->where('client_contact_id', $this->contact->id)->first(); - $path = $this->entity->client->recurring_invoice_filepath($invitation); - - $file_path = $path.$this->entity->hashed_id.'.pdf'; - - $disk = config('filesystems.default'); - - $file = Storage::disk($disk)->exists($file_path); - - if (! $file) { - $file_path = (new CreateEntityPdf($invitation))->handle(); + if (! $invitation) { + $invitation = $this->entity->invitations->first(); } - return $file_path; + return (new CreateRawPdf($invitation))->handle(); + } } diff --git a/resources/views/themes/ninja2020/view_entity/index.blade.php b/resources/views/themes/ninja2020/view_entity/index.blade.php deleted file mode 100644 index d5c1b1db89b7..000000000000 --- a/resources/views/themes/ninja2020/view_entity/index.blade.php +++ /dev/null @@ -1,58 +0,0 @@ -@extends('portal.ninja2020.layout.clean') - -@push('head') - - - -@endpush - -@section('body') -
-
-
- - -
-
- @if($entity instanceof App\Models\Invoice) - - @elseif($$entity instanceof App\Models\Quote) - - @endif - -
-
- -
- -
-
-
- -
- -
-
-@endsection - -@section('footer') - @vite('resources/js/clients/shared/pdf.js') -@endsection \ No newline at end of file diff --git a/routes/client.php b/routes/client.php index 56e872f232a0..7960f0e812f8 100644 --- a/routes/client.php +++ b/routes/client.php @@ -31,10 +31,7 @@ Route::post('client/password/email', [ContactForgotPasswordController::class, 's Route::get('client/password/reset/{token}', [ContactResetPasswordController::class, 'showResetForm'])->name('client.password.reset')->middleware(['domain_db', 'contact_account','locale', 'throttle:portal']); Route::post('client/password/reset', [ContactResetPasswordController::class, 'reset'])->name('client.password.update')->middleware(['domain_db', 'contact_account','locale', 'throttle:portal']); -Route::get('view/{entity_type}/{invitation_key}', [App\Http\Controllers\ClientPortal\EntityViewController::class, 'index'])->name('client.entity_view'); -Route::get('view/{entity_type}/{invitation_key}/password', [App\Http\Controllers\ClientPortal\EntityViewController::class ,'password'])->name('client.entity_view.password'); -Route::post('view/{entity_type}/{invitation_key}/password', [App\Http\Controllers\ClientPortal\EntityViewController::class, 'handlePassword']); -Route::post('set_password', [App\Http\Controllers\ClientPortal\EntityViewController::class, 'handlePasswordSet'])->name('client.set_password')->middleware('domain_db'); +Route::post('set_password', [App\Http\Controllers\ClientPortal\InvitationController::class, 'handlePasswordSet'])->name('client.set_password')->middleware('domain_db'); Route::get('tmp_pdf/{hash}', [App\Http\Controllers\ClientPortal\TempRouteController::class, 'index'])->name('tmp_pdf'); diff --git a/tests/Feature/PdfCreatorTest.php b/tests/Feature/PdfCreatorTest.php index 0eba272e660a..407d9833fbc1 100644 --- a/tests/Feature/PdfCreatorTest.php +++ b/tests/Feature/PdfCreatorTest.php @@ -11,10 +11,8 @@ namespace Tests\Feature; -use App\Jobs\Entity\CreateEntityPdf; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Support\Facades\Storage; use Tests\MockAccountData; use Tests\TestCase; @@ -41,24 +39,4 @@ class PdfCreatorTest extends TestCase } - // public function testCreditPdfCreated() - // { - // $credit_path = (new CreateEntityPdf($this->credit->invitations->first()))->handle(); - - // $this->assertTrue(Storage::exists($credit_path)); - // } - - public function testInvoicePdfCreated() - { - $invoice_path = (new CreateEntityPdf($this->invoice->invitations->first()))->handle(); - - $this->assertTrue(Storage::exists($invoice_path)); - } - - public function testQuotePdfCreated() - { - $quote_path = (new CreateEntityPdf($this->quote->invitations->first()))->handle(); - - $this->assertTrue(Storage::exists($quote_path)); - } } diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 39109ce8855b..6de576e7cf4b 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -21,9 +21,9 @@ use App\Models\Payment; 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\Jobs\Entity\CreateEntityPdf; use App\Services\Template\TemplateService; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; @@ -607,7 +607,7 @@ class TemplateTest extends TestCase $start = microtime(true); - $pdf = (new CreateEntityPdf($i))->handle(); + $pdf = (new CreateRawPdf($i))->handle(); $end = microtime(true); @@ -621,7 +621,7 @@ class TemplateTest extends TestCase { $start = microtime(true); - $pdf = (new CreateEntityPdf($this->invoice->invitations->first()))->handle(); + $pdf = (new CreateRawPdf($this->invoice->invitations->first()))->handle(); $end = microtime(true); diff --git a/tests/Integration/InvoiceUploadTest.php b/tests/Integration/InvoiceUploadTest.php index e0222290d355..36c3a198a584 100644 --- a/tests/Integration/InvoiceUploadTest.php +++ b/tests/Integration/InvoiceUploadTest.php @@ -11,7 +11,6 @@ namespace Tests\Integration; -use App\Jobs\Entity\CreateEntityPdf; use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\MockAccountData; use Tests\TestCase; @@ -34,8 +33,6 @@ class InvoiceUploadTest extends TestCase public function testInvoiceUploadWorks() { - CreateEntityPdf::dispatchSync($this->invoice->invitations->first()); - $this->assertNotNull($this->invoice->service()->getInvoicePdf($this->invoice->client->primary_contact()->first())); } } diff --git a/tests/Unit/EInvoiceTest.php b/tests/Unit/EInvoiceTest.php index 59c2024017a1..658bedba9828 100644 --- a/tests/Unit/EInvoiceTest.php +++ b/tests/Unit/EInvoiceTest.php @@ -11,9 +11,8 @@ use Tests\TestCase; use Tests\MockAccountData; -use App\Jobs\Entity\CreateEntityPdf; +use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Invoice\CreateEInvoice; -use Illuminate\Support\Facades\Storage; use horstoeko\zugferd\ZugferdDocumentReader; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -66,7 +65,7 @@ class EInvoiceTest extends TestCase */ public function checkEmbededPDFFile() { - $pdf = (new CreateEntityPdf($this->invoice->invitations()->first()))->handle(); + $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); From 60766a75105efb9d8e076555e640c4450c8f0203 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 13:37:03 +1100 Subject: [PATCH 085/109] Fixes for test seed data --- database/factories/PaymentFactory.php | 1 + tests/Feature/ClientApiTest.php | 18 ++++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/database/factories/PaymentFactory.php b/database/factories/PaymentFactory.php index a0b528a9c843..0dfa29a545d0 100644 --- a/database/factories/PaymentFactory.php +++ b/database/factories/PaymentFactory.php @@ -30,6 +30,7 @@ class PaymentFactory extends Factory 'transaction_reference' => $this->faker->text(10), 'type_id' => Payment::TYPE_CREDIT_CARD, 'status_id' => Payment::STATUS_COMPLETED, + 'currency_id' => 1, ]; } } diff --git a/tests/Feature/ClientApiTest.php b/tests/Feature/ClientApiTest.php index 75bed1b223eb..9cb18a2dc2e3 100644 --- a/tests/Feature/ClientApiTest.php +++ b/tests/Feature/ClientApiTest.php @@ -44,6 +44,8 @@ class ClientApiTest extends TestCase use MockAccountData; use ClientGroupSettingsSaver; + public $faker; + protected function setUp() :void { parent::setUp(); @@ -175,20 +177,16 @@ class ClientApiTest extends TestCase 'status' => 'paid', ]; + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/client_statement', $data); - try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/client_statement', $data); - } catch (ValidationException $e) { - $message = json_decode($e->validator->getMessageBag(), 1); - nlog($message); - } + $response->assertStatus(200); $this->assertTrue($response->headers->get('content-type') == 'application/pdf'); - $response->assertStatus(200); + } public function testClientStatementEmail() From e98a12a50a44c2d470b44e5a69773927ed494078 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 13:47:34 +1100 Subject: [PATCH 086/109] remove redundant code paths --- app/Models/CreditInvitation.php | 14 ----- app/Models/Invoice.php | 62 ------------------- app/Models/InvoiceInvitation.php | 13 ---- app/Models/PurchaseOrder.php | 33 ---------- app/Models/Quote.php | 47 -------------- app/Models/QuoteInvitation.php | 12 ---- app/Services/Credit/CreditService.php | 1 - app/Services/Credit/GetCreditPdf.php | 2 +- .../PurchaseOrder/TriggeredActions.php | 2 - 9 files changed, 1 insertion(+), 185 deletions(-) diff --git a/app/Models/CreditInvitation.php b/app/Models/CreditInvitation.php index f1473f4944ca..d5d449e388aa 100644 --- a/app/Models/CreditInvitation.php +++ b/app/Models/CreditInvitation.php @@ -11,13 +11,10 @@ namespace App\Models; -// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Storage; /** * App\Models\CreditInvitation @@ -155,15 +152,4 @@ class CreditInvitation extends BaseModel $this->save(); } - /** @deprecated 5.7 */ - public function pdf_file_path() - { - $storage_path = Storage::url($this->credit->client->quote_filepath($this).$this->credit->numberFormatter().'.pdf'); - - if (! Storage::exists($this->credit->client->credit_filepath($this).$this->credit->numberFormatter().'.pdf')) { - // (new CreateEntityPdf($this))->handle(); - } - - return $storage_path; - } } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index abec2ad21ac5..928b49525c58 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -15,7 +15,6 @@ use App\Utils\Ninja; use Illuminate\Support\Carbon; use App\Utils\Traits\MakesDates; use App\Helpers\Invoice\InvoiceSum; -// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\MakesReminders; use App\Utils\Traits\NumberFormatter; use App\Services\Ledger\LedgerService; @@ -526,67 +525,6 @@ class Invoice extends BaseModel return $invoice_calc->build(); } - /** @deprecated 5.7 */ - public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) - { - - if (! $invitation) { - if ($this->invitations()->exists()) { - $invitation = $this->invitations()->first(); - } else { - $this->service()->createInvitations(); - $invitation = $this->invitations()->first(); - } - } - - if (! $invitation) { - throw new \Exception('Hard fail, could not create an invitation - is there a valid contact?'); - } - - $file_path = $this->client->invoice_filepath($invitation).$this->numberFormatter().'.pdf'; - - $file_exists = false; - - /* Flysystem throws an exception if the path is "corrupted" so lets wrap it in a try catch and return a bool 06/01/2022*/ - try { - $file_exists = Storage::disk(config('filesystems.default'))->exists($file_path); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - if (Ninja::isHosted() && $portal && $file_exists) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } elseif (Ninja::isHosted()) { - // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); - - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - try { - $file_exists = Storage::disk(config('filesystems.default'))->exists($file_path); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - if ($file_exists) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - try { - $file_exists = Storage::disk('public')->exists($file_path); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - if ($file_exists) { - return Storage::disk('public')->{$type}($file_path); - } - - // $file_path = (new CreateEntityPdf($invitation))->handle(); - - return Storage::disk('public')->{$type}($file_path); - } - public function markInvitationsSent() { $this->invitations->each(function ($invitation) { diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index 61578c427fd1..eff3ab15915f 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -12,7 +12,6 @@ namespace App\Models; use App\Events\Invoice\InvoiceWasUpdated; -// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Ninja; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; @@ -157,16 +156,4 @@ class InvoiceInvitation extends BaseModel $this->save(); } - /** @deprecated 5.7 */ - public function pdf_file_path(): string - { - $storage_path = Storage::url($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf'); - - if (! Storage::exists($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf')) { - event(new InvoiceWasUpdated($this->invoice, $this->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); - // (new CreateEntityPdf($this))->handle(); - } - - return $storage_path; - } } diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 7752d919190f..6048d378f970 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -281,39 +281,6 @@ class PurchaseOrder extends BaseModel }); } - /** @deprecated 5.7 */ - public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) - { - if (! $invitation) { - if ($this->invitations()->exists()) { - $invitation = $this->invitations()->first(); - } else { - $this->service()->createInvitations(); - $invitation = $this->invitations()->first(); - } - } - - if (!$invitation) { - throw new \Exception('Hard fail, could not create an invitation - is there a valid contact?'); - } - - $file_path = $this->vendor->purchase_order_filepath($invitation).$this->numberFormatter().'.pdf'; - - if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } elseif (Ninja::isHosted() && $portal) { - $file_path = (new CreatePurchaseOrderPdf($invitation, config('filesystems.default')))->handle(); - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - if (Storage::disk('public')->exists($file_path)) { - return Storage::disk('public')->{$type}($file_path); - } - - $file_path = (new CreatePurchaseOrderPdf($invitation))->handle(); - return Storage::disk('public')->{$type}($file_path); - } - public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(PurchaseOrderInvitation::class); diff --git a/app/Models/Quote.php b/app/Models/Quote.php index a2c18c5aef84..054690249095 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -13,7 +13,6 @@ namespace App\Models; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; -// use App\Jobs\Entity\CreateEntityPdf; use App\Models\Presenters\QuotePresenter; use App\Services\Quote\QuoteService; use App\Utils\Ninja; @@ -314,52 +313,6 @@ class Quote extends BaseModel return new QuoteService($this); } - /** @deprecated 5.7 */ - public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) - { - if (! $invitation) { - if ($this->invitations()->exists()) { - $invitation = $this->invitations()->first(); - } else { - $this->service()->createInvitations(); - $invitation = $this->invitations()->first(); - } - } - - if (! $invitation) { - throw new \Exception('Hard fail, could not create an invitation - is there a valid contact?'); - } - - $file_path = $this->client->quote_filepath($invitation).$this->numberFormatter().'.pdf'; - - if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } elseif (Ninja::isHosted() && $portal) { - // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - $file_exists = false; - - try { - $file_exists = Storage::disk(config('filesystems.default'))->exists($file_path); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - if ($file_exists) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - if (Storage::disk('public')->exists($file_path)) { - return Storage::disk('public')->{$type}($file_path); - } - - // $file_path = (new CreateEntityPdf($invitation))->handle(); - - return Storage::disk('public')->{$type}($file_path); - } - /** * @param int $status * @return string diff --git a/app/Models/QuoteInvitation.php b/app/Models/QuoteInvitation.php index 878a74869098..34e01ea5cbbe 100644 --- a/app/Models/QuoteInvitation.php +++ b/app/Models/QuoteInvitation.php @@ -139,16 +139,4 @@ class QuoteInvitation extends BaseModel $this->save(); } - /** @deprecated 5.7 */ - - public function pdf_file_path() - { - $storage_path = Storage::url($this->quote->client->quote_filepath($this).$this->quote->numberFormatter().'.pdf'); - - if (! Storage::exists($this->quote->client->quote_filepath($this).$this->quote->numberFormatter().'.pdf')) { - // (new CreateEntityPdf($this))->handle(); - } - - return $storage_path; - } } diff --git a/app/Services/Credit/CreditService.php b/app/Services/Credit/CreditService.php index 6ed9a4df141b..365a9d1f2176 100644 --- a/app/Services/Credit/CreditService.php +++ b/app/Services/Credit/CreditService.php @@ -17,7 +17,6 @@ use App\Models\Payment; use App\Models\PaymentType; use App\Factory\PaymentFactory; use App\Utils\Traits\MakesHash; -// use App\Jobs\Entity\CreateEntityPdf; use App\Repositories\CreditRepository; use App\Repositories\PaymentRepository; use Illuminate\Support\Facades\Storage; diff --git a/app/Services/Credit/GetCreditPdf.php b/app/Services/Credit/GetCreditPdf.php index e1f59b68236b..d43bb335ae55 100644 --- a/app/Services/Credit/GetCreditPdf.php +++ b/app/Services/Credit/GetCreditPdf.php @@ -11,8 +11,8 @@ namespace App\Services\Credit; -use App\Models\CreditInvitation; use App\Jobs\Entity\CreateRawPdf; +use App\Models\CreditInvitation; use App\Services\AbstractService; class GetCreditPdf extends AbstractService diff --git a/app/Services/PurchaseOrder/TriggeredActions.php b/app/Services/PurchaseOrder/TriggeredActions.php index 624efc3ac4fd..9e4fb63ace5e 100644 --- a/app/Services/PurchaseOrder/TriggeredActions.php +++ b/app/Services/PurchaseOrder/TriggeredActions.php @@ -38,7 +38,6 @@ class TriggeredActions extends AbstractService $this->purchase_order ->service() ->markSent() - // ->touchPdf() ->save(); $this->sendEmail(); @@ -48,7 +47,6 @@ class TriggeredActions extends AbstractService $this->purchase_order = $this->purchase_order ->service() ->markSent() - // ->touchPdf() ->save(); } From 3b86d39e1d9ce0447eeb27624a360040b3c8490e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 13:47:46 +1100 Subject: [PATCH 087/109] remove redundant code paths --- app/Models/Credit.php | 49 ------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 1adcdb89a8ca..6ba2d7b18b53 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -16,7 +16,6 @@ use Illuminate\Support\Carbon; use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesDates; use App\Helpers\Invoice\InvoiceSum; -// use App\Jobs\Entity\CreateEntityPdf; use App\Utils\Traits\MakesReminders; use App\Services\Credit\CreditService; use App\Services\Ledger\LedgerService; @@ -358,54 +357,6 @@ class Credit extends BaseModel $this->saveQuietly(); } - /** @deprecated 5.7 */ - public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) - { - if (! $invitation) { - if ($this->invitations()->exists()) { - $invitation = $this->invitations()->first(); - } else { - $this->service()->createInvitations(); - $invitation = $this->invitations()->first(); - } - } - - if (! $invitation) { - throw new \Exception('Hard fail, could not create an invitation - is there a valid contact?'); - } - - $file_path = $this->client->credit_filepath($invitation).$this->numberFormatter().'.pdf'; - - if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } elseif (Ninja::isHosted() && $portal) { - // $file_path = (new CreateEntityPdf($invitation, config('filesystems.default')))->handle(); - - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - $file_exists = false; - - try { - $file_exists = Storage::disk(config('filesystems.default'))->exists($file_path); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - if ($file_exists) { - return Storage::disk(config('filesystems.default'))->{$type}($file_path); - } - - - if (Storage::disk('public')->exists($file_path)) { - return Storage::disk('public')->{$type}($file_path); - } - - // $file_path = (new CreateEntityPdf($invitation))->handle(); - - return Storage::disk('public')->{$type}($file_path); - } - public function markInvitationsSent() { $this->invitations->each(function ($invitation) { From 96c15c97163ef3a5fe4a1b4da02df3fc31c2408f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 13:53:20 +1100 Subject: [PATCH 088/109] Clean up for PDF code paths --- app/Jobs/Entity/CreateEntityPdf.php | 297 ------------------------ app/Jobs/Entity/CreateRawPdf.php | 6 - app/Services/Preview/StubBuilder.php | 323 --------------------------- 3 files changed, 626 deletions(-) delete mode 100644 app/Jobs/Entity/CreateEntityPdf.php delete mode 100644 app/Services/Preview/StubBuilder.php diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php deleted file mode 100644 index 5210cf236192..000000000000 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ /dev/null @@ -1,297 +0,0 @@ -invitation = $invitation; - - if ($invitation instanceof InvoiceInvitation) { - $this->entity = $invitation->invoice; - $this->entity_string = 'invoice'; - } elseif ($invitation instanceof QuoteInvitation) { - $this->entity = $invitation->quote; - $this->entity_string = 'quote'; - } elseif ($invitation instanceof CreditInvitation) { - $this->entity = $invitation->credit; - $this->entity_string = 'credit'; - } elseif ($invitation instanceof RecurringInvoiceInvitation) { - $this->entity = $invitation->recurring_invoice; - $this->entity_string = 'recurring_invoice'; - } - - $this->company = $invitation->company; - - $this->contact = $invitation->contact; - - $this->client = $invitation->contact->client; - $this->client->load('company'); - - $this->disk = $disk ?? config('filesystems.default'); - } - - public function handle() - { - MultiDB::setDb($this->company->db); - - /* Forget the singleton*/ - App::forgetInstance('translator'); - - /* Init a new copy of the translator*/ - $t = app('translator'); - /* Set the locale*/ - App::setLocale($this->client->locale()); - - /* Set customized translations _NOW_ */ - $t->replace(Ninja::transformTranslations($this->client->getMergedSettings())); - - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - return (new Phantom)->generate($this->invitation); - } - - $entity_design_id = ''; - $path = ''; - - if ($this->entity instanceof Invoice) { - $path = $this->client->invoice_filepath($this->invitation); - $entity_design_id = 'invoice_design_id'; - } elseif ($this->entity instanceof Quote) { - $path = $this->client->quote_filepath($this->invitation); - $entity_design_id = 'quote_design_id'; - } elseif ($this->entity instanceof Credit) { - $path = $this->client->credit_filepath($this->invitation); - $entity_design_id = 'credit_design_id'; - } elseif ($this->entity instanceof RecurringInvoice) { - $path = $this->client->recurring_invoice_filepath($this->invitation); - $entity_design_id = 'invoice_design_id'; - } - - $file_path = $path.$this->entity->numberFormatter().'.pdf'; - - $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->client->getSetting($entity_design_id)); - - /** @var \App\Models\Design $design */ - $design = Design::withTrashed()->find($entity_design_id); - - /* Catch all in case migration doesn't pass back a valid design */ - if (! $design) { - $design = Design::find(2); - } - - $html = new HtmlEngine($this->invitation); - - if ($design->is_custom) { - $options = [ - 'custom_partials' => json_decode(json_encode($design->design), true), - ]; - $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); - } else { - $template = new PdfMakerDesign(strtolower($design->name)); - } - - $variables = $html->generateLabelsAndValues(); - - $state = [ - 'template' => $template->elements([ - 'client' => $this->client, - 'entity' => $this->entity, - 'pdf_variables' => (array) $this->company->settings->pdf_variables, - '$product' => $design->design->product, - 'variables' => $variables, - ]), - 'variables' => $variables, - 'options' => [ - 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), - 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), - 'client' => $this->client, - 'entity' => $this->entity, - 'variables' => $variables, - ], - 'process_markdown' => $this->entity->client->company->markdown_enabled, - ]; - - $maker = new PdfMakerService($state); - - $maker - ->design($template) - ->build(); - - $pdf = null; - - try { - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - - $numbered_pdf = $this->pageNumbering($pdf, $this->company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - } else { - $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); - - $numbered_pdf = $this->pageNumbering($pdf, $this->company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - } - } catch (\Exception $e) { - nlog(print_r($e->getMessage(), 1)); - } - - if (config('ninja.log_pdf_html')) { - info($maker->getCompiledHTML()); - } - - if($this->entity_string == "invoice" && $this->client->getSetting('enable_e_invoice')) - { - $pdf = $this->checkEInvoice($pdf); - } - - if ($pdf) { - try { - Storage::disk($this->disk)->put($file_path, $pdf); - } catch (\Exception $e) { - throw new FilePermissionsFailure($e->getMessage()); - } - } - - $this->invitation = null; - // $this->entity = null; - $this->company = null; - $this->client = null; - $this->contact = null; - $maker = null; - $state = null; - - return $file_path; - } - - /** - * Switch to determine if we need to embed the xml into the PDF itself - * - * @param string $pdf - * @return string - */ - private function checkEInvoice(string $pdf): string - { - if(!$this->entity instanceof Invoice) - return $pdf; - - $e_invoice_type = $this->entity->client->getSetting('e_invoice_type'); - - switch ($e_invoice_type) { - case "EN16931": - case "XInvoice_2_2": - case "XInvoice_2_1": - case "XInvoice_2_0": - case "XInvoice_1_0": - case "XInvoice-Extended": - case "XInvoice-BasicWL": - case "XInvoice-Basic": - return $this->embedEInvoiceZuGFerD($pdf) ?? $pdf; - //case "Facturae_3.2": - //case "Facturae_3.2.1": - //case "Facturae_3.2.2": - // - default: - return $pdf; - } - - } - - /** - * Embed the .xml file into the PDF - * - * @param string $pdf - * @return string - */ - private function embedEInvoiceZuGFerD(string $pdf): string - { - try { - - $e_rechnung = (new CreateEInvoice($this->entity, true))->handle(); - $pdfBuilder = new ZugferdDocumentPdfBuilder($e_rechnung, $pdf); - $pdfBuilder->generateDocument(); - return $pdfBuilder->downloadString(basename($this->entity->getFileName())); - - } catch (\Exception $e) { - nlog("E_Invoice Merge failed - " . $e->getMessage()); - } - - return $pdf; - } - - - public function failed($e) - { - } -} diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 4118e448f1d8..04c624238706 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -17,8 +17,6 @@ use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; use App\Utils\HtmlEngine; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; use App\Models\QuoteInvitation; use App\Utils\Traits\MakesHash; use App\Models\CreditInvitation; @@ -32,13 +30,9 @@ use Illuminate\Support\Facades\App; use App\Jobs\Invoice\CreateEInvoice; use App\Utils\Traits\NumberFormatter; use App\Utils\Traits\MakesInvoiceHtml; -use Illuminate\Queue\SerializesModels; use App\Utils\Traits\Pdf\PageNumbering; -use Illuminate\Queue\InteractsWithQueue; use App\Exceptions\FilePermissionsFailure; use App\Models\RecurringInvoiceInvitation; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; use horstoeko\zugferd\ZugferdDocumentPdfBuilder; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; diff --git a/app/Services/Preview/StubBuilder.php b/app/Services/Preview/StubBuilder.php deleted file mode 100644 index 33568a6f57b1..000000000000 --- a/app/Services/Preview/StubBuilder.php +++ /dev/null @@ -1,323 +0,0 @@ -entity_type = $entity_type; - - return $this; - } - - public function build(): self - { - try { - DB::connection(config('database.default'))->transaction(function () { - $this->createRecipient() - ->initializeSettings() - ->createEntity() - ->linkRelations() - ->buildHtml(); - }); - } catch (\Throwable $throwable) { - nlog("DB ERROR " . $throwable->getMessage()); - - if (DB::connection(config('database.default'))->transactionLevel() > 0) { - DB::connection(config('database.default'))->rollBack(); - } - } catch(\Exception $e) { - nlog($e->getMessage()); - - if (DB::connection(config('database.default'))->transactionLevel() > 0) { - DB::connection(config('database.default'))->rollBack(); - } - } - - return $this; - } - - public function getPdf(): mixed - { - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - return (new Phantom)->convertHtmlToPdf($this->html); - } - - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($this->html); - - $numbered_pdf = $this->pageNumbering($pdf, $this->company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - - return $pdf; - } - - return (new PreviewPdf($this->html, $this->company))->handle(); - } - - private function initializeSettings(): self - { - $this->dynamic_settings_type = 'company'; - - match ($this->dynamic_settings_type) { - 'company' => $this->setCompanySettings(), - 'client' => $this->setClientSettings(), - 'group' => $this->setGroupSettings(), - }; - - - return $this; - } - - private function setCompanySettings(): self - { - $this->company->settings = $this->settings; - $this->company->save(); - - return $this; - } - - private function setClientSettings(): self - { - $this->recipient->settings = $this->settings; - $this->recipient->save(); - - return $this; - } - - private function setGroupSettings(): self - { - $g = GroupSettingFactory::create($this->company->id, $this->user->id); - $g->name = Str::random(10); - $g->settings = $this->settings; - $g->save(); - - $this->recipient->group_settings_id = $g->id; - $this->recipient->save(); - - return $this; - } - - public function setSettings($settings): self - { - $this->settings = $settings; - - return $this; - } - - public function setSettingsType($type): self - { - $this->dynamic_settings_type = $type; - - return $this; - } - - private function buildHtml(): self - { - $html = new HtmlEngine($this->invitation); - - $design_string = "{$this->entity_type}_design_id"; - - $design = DesignModel::query()->withTrashed()->find($this->decodePrimaryKey($html->settings->{$design_string})); - - $template = new PdfMakerDesign(strtolower($design->name)); - - $state = [ - 'template' => $template->elements([ - 'client' => $this->recipient, - 'entity' => $this->entity, - 'pdf_variables' => (array) $html->settings->pdf_variables, - '$product' => $design->design->product, - ]), - 'variables' => $html->generateLabelsAndValues(), - 'process_markdown' => $this->company->markdown_enabled, - 'options' => [ - 'client' => $this->recipient, - 'entity' => $this->entity, - ], - ]; - - $maker = new PdfMaker($state); - - $this->html = $maker->design($template) - ->build() - ->getCompiledHTML(); - - return $this; - } - - private function linkRelations(): self - { - $this->entity->setRelation('invitations', $this->invitation); - $this->entity->setRelation($this->recipient_string, $this->recipient); - $this->entity->setRelation('company', $this->company); - $this->entity->load("{$this->recipient_string}.company"); - - return $this; - } - - private function createRecipient(): self - { - match ($this->entity_type) { - 'invoice' => $this->createClient(), - 'quote' => $this->createClient(), - 'credit' => $this->createClient(), - 'purchase_order' => $this->createVendor(), - }; - - return $this; - } - - private function createClient(): self - { - /** @var \App\Models\Client $client */ - $client = Client::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, - ]); - - $this->recipient = $client; - - $this->contact = ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, - 'client_id' => $this->recipient->id, - ]); - - $this->recipient_string = 'client'; - - return $this; - } - - private function createVendor(): self - { - /** @var \App\Models\Vendor $vendor */ - $vendor = Vendor::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->user->company()->id, - ]); - - $this->recipient = $vendor; - - $this->contact = VendorContact::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, - 'vendor_id' => $this->recipient->id, - ]); - - $this->recipient_string = 'vendor'; - - return $this; - } - - - private function createEntity(): self - { - match ($this->entity_type) { - 'invoice' => $this->createInvoice(), - 'quote' => $this->createQuote(), - 'credit' => $this->createCredit(), - 'purchase_order' => $this->createPurchaseOrder(), - }; - - return $this; - } - - private function createInvoice() - { - /** @var \App\Models\Invoice $invoice */ - $invoice = Invoice::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, - 'client_id' => $this->recipient->id, - 'terms' => $this->company->settings->invoice_terms, - 'footer' => $this->company->settings->invoice_footer, - 'status_id' => Invoice::STATUS_PAID, - ]); - - $this->entity = $invoice; - - $this->invitation = InvoiceInvitation::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, - 'invoice_id' => $this->entity->id, - 'client_contact_id' => $this->contact->id, - ]); - } - - private function createQuote() - { - $this->entity->save(); - } - - private function createCredit() - { - $this->entity->save(); - } - - private function createPurchaseOrder() - { - $this->entity->save(); - } -} From 33585c65c4f1cb6008f492b260d3729b1df2ae74 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 13:57:44 +1100 Subject: [PATCH 089/109] php cs fixes --- app/Casts/EncryptedCast.php | 4 +- app/Console/Commands/BackupUpdate.php | 7 +- app/Console/Commands/CheckData.php | 64 ++- app/Console/Commands/CreateAccount.php | 1 - app/Console/Commands/CreateSingleAccount.php | 76 +-- app/Console/Commands/CreateTestData.php | 2 +- app/Console/Commands/ImportMigrations.php | 1 - app/Console/Commands/ReactBuilder.php | 3 +- app/Console/Commands/SendRemindersCron.php | 2 +- app/Console/Commands/SendTestEmails.php | 13 +- app/Console/Kernel.php | 34 +- app/DataMapper/CompanySettings.php | 6 +- app/DataMapper/DefaultSettings.php | 2 +- app/DataMapper/FreeCompanySettings.php | 2 +- app/DataMapper/Settings/SettingsData.php | 19 +- app/DataMapper/Tax/BaseRule.php | 37 +- app/DataMapper/Tax/DE/Rule.php | 35 +- app/DataMapper/Tax/RuleInterface.php | 2 +- app/DataMapper/Tax/TaxData.php | 2 +- app/DataMapper/Tax/TaxModel.php | 11 +- app/DataMapper/Tax/US/Rule.php | 9 +- app/DataMapper/Tax/ZipTax/Response.php | 3 +- app/DataProviders/USStates.php | 16 +- app/Events/Account/AccountCreated.php | 8 +- app/Events/Account/StripeConnectFailure.php | 6 +- app/Events/Client/ClientWasArchived.php | 7 +- .../Company/CompanyDocumentsDeleted.php | 9 +- app/Events/Contact/ContactLoggedIn.php | 7 +- app/Events/Design/DesignWasArchived.php | 7 +- app/Events/Design/DesignWasCreated.php | 10 +- app/Events/Design/DesignWasDeleted.php | 10 +- app/Events/Design/DesignWasRestored.php | 10 +- app/Events/Design/DesignWasUpdated.php | 10 +- app/Events/Document/DocumentWasArchived.php | 1 - app/Events/Payment/Methods/MethodDeleted.php | 7 +- app/Events/Payment/PaymentWasEmailed.php | 6 +- .../PurchaseOrder/PurchaseOrderWasViewed.php | 1 - app/Events/Quote/QuoteWasEmailed.php | 1 - .../Subscription/SubscriptionWasCreated.php | 7 +- app/Events/User/UserLoggedIn.php | 7 +- app/Events/User/UserWasArchived.php | 7 +- app/Events/User/UserWasCreated.php | 7 +- app/Events/User/UserWasDeleted.php | 7 +- app/Events/User/UserWasRestored.php | 7 +- app/Events/User/UserWasUpdated.php | 7 +- app/Events/Vendor/VendorContactLoggedIn.php | 4 +- app/Exceptions/Handler.php | 38 +- app/Exceptions/PaymentRefundFailed.php | 2 +- app/Exceptions/QuoteConversion.php | 2 +- app/Exceptions/YodleeApiException.php | 2 +- app/Export/CSV/ActivityExport.php | 76 +-- app/Export/CSV/BaseExport.php | 199 ++++--- app/Export/CSV/ClientExport.php | 27 +- app/Export/CSV/ContactExport.php | 6 +- app/Export/CSV/CreditExport.php | 28 +- app/Export/CSV/DocumentExport.php | 6 +- app/Export/CSV/ExpenseExport.php | 6 +- app/Export/CSV/InvoiceExport.php | 16 +- app/Export/CSV/InvoiceItemExport.php | 25 +- app/Export/CSV/ProductExport.php | 8 +- app/Export/CSV/PurchaseOrderExport.php | 15 +- app/Export/CSV/PurchaseOrderItemExport.php | 28 +- app/Export/CSV/QuoteItemExport.php | 37 +- app/Export/CSV/RecurringInvoiceExport.php | 6 +- app/Export/CSV/TaskExport.php | 9 +- app/Export/CSV/VendorExport.php | 8 +- app/Factory/CompanyFactory.php | 12 +- app/Factory/InvoiceItemFactory.php | 2 +- .../RecurringExpenseToExpenseFactory.php | 8 +- app/Factory/UserFactory.php | 2 +- app/Filters/BankTransactionFilters.php | 26 +- app/Filters/CreditFilters.php | 2 +- app/Filters/DesignFilters.php | 2 +- app/Filters/ExpenseFilters.php | 10 +- app/Filters/InvoiceFilters.php | 13 +- app/Filters/PaymentFilters.php | 53 +- app/Filters/PurchaseOrderFilters.php | 2 +- app/Filters/QuoteFilters.php | 10 +- app/Filters/RecurringInvoiceFilters.php | 28 +- app/Filters/TaskFilters.php | 18 +- .../Bank/Yodlee/DTO/AccountSummary.php | 55 +- .../Yodlee/Transformer/AccountTransformer.php | 18 +- .../Yodlee/Transformer/IncomeTransformer.php | 6 +- app/Helpers/Bank/Yodlee/Yodlee.php | 20 +- app/Helpers/Epc/EpcQrGenerator.php | 2 +- app/Helpers/Invoice/InvoiceItemSum.php | 21 +- .../Invoice/InvoiceItemSumInclusive.php | 13 +- app/Helpers/Invoice/InvoiceSum.php | 8 +- app/Helpers/Invoice/InvoiceSumInclusive.php | 7 +- app/Helpers/SwissQr/SwissQrGenerator.php | 6 +- app/Http/Controllers/AccountController.php | 18 +- app/Http/Controllers/ActivityController.php | 24 +- .../Auth/ForgotPasswordController.php | 10 +- .../Auth/PasswordTimeoutController.php | 1 - .../Auth/ResetPasswordController.php | 9 +- .../Controllers/Bank/YodleeController.php | 261 +++++----- .../Controllers/BankIntegrationController.php | 40 +- .../BankTransactionRuleController.php | 12 +- app/Http/Controllers/BaseController.php | 9 +- app/Http/Controllers/ClientController.php | 84 +-- .../ContactHashLoginController.php | 5 +- .../ClientPortal/InvitationController.php | 39 +- .../ClientPortal/InvoiceController.php | 40 +- .../ClientPortal/PaymentController.php | 1 - .../ClientPortal/QuoteController.php | 25 +- .../ClientPortal/StatementController.php | 2 +- .../ClientPortal/TempRouteController.php | 1 - .../Controllers/ClientStatementController.php | 2 +- app/Http/Controllers/CompanyController.php | 64 ++- .../Controllers/CompanyGatewayController.php | 3 +- .../Controllers/CompanyUserController.php | 16 +- app/Http/Controllers/CreditController.php | 46 +- app/Http/Controllers/DocumentController.php | 2 +- .../Controllers/EmailHistoryController.php | 4 +- .../Controllers/ExpenseCategoryController.php | 3 +- app/Http/Controllers/ExportController.php | 10 +- .../Controllers/GroupSettingController.php | 3 +- app/Http/Controllers/ImportController.php | 18 +- app/Http/Controllers/InvoiceController.php | 72 +-- app/Http/Controllers/LicenseController.php | 2 +- app/Http/Controllers/MigrationController.php | 12 +- .../Controllers/OneTimeTokenController.php | 15 +- .../Controllers/PaymentTermController.php | 14 +- app/Http/Controllers/PreviewController.php | 106 ++-- .../PreviewPurchaseOrderController.php | 26 +- app/Http/Controllers/ProductController.php | 2 +- .../ProtectedDownloadController.php | 4 +- .../Controllers/PurchaseOrderController.php | 39 +- app/Http/Controllers/QuoteController.php | 59 ++- .../RecurringInvoiceController.php | 28 +- .../Controllers/RecurringQuoteController.php | 4 +- .../Reports/ARDetailReportController.php | 6 +- .../Reports/ActivityReportController.php | 6 +- .../Reports/ClientBalanceReportController.php | 7 +- .../Reports/ClientContactReportController.php | 8 +- .../Reports/ClientReportController.php | 10 +- .../Reports/ClientSalesReportController.php | 7 +- .../Reports/DocumentReportController.php | 8 +- .../Reports/ExpenseReportController.php | 10 +- .../Reports/InvoiceItemReportController.php | 8 +- .../Reports/InvoiceReportController.php | 8 +- .../Reports/PaymentReportController.php | 10 +- .../Reports/ProductReportController.php | 10 +- .../PurchaseOrderItemReportController.php | 8 +- .../Reports/PurchaseOrderReportController.php | 6 +- .../Reports/QuoteItemReportController.php | 8 +- .../Reports/QuoteReportController.php | 8 +- .../RecurringInvoiceReportController.php | 9 +- .../Reports/ReportPreviewController.php | 9 +- .../Reports/TaskReportController.php | 8 +- .../Reports/TaxSummaryReportController.php | 7 +- .../Reports/UserSalesReportController.php | 7 +- .../Reports/VendorReportController.php | 6 +- app/Http/Controllers/SearchController.php | 50 +- app/Http/Controllers/SelfUpdateController.php | 30 +- app/Http/Controllers/SetupController.php | 3 +- .../Controllers/Shop/ProfileController.php | 2 +- .../Controllers/StripeConnectController.php | 5 +- app/Http/Controllers/TaskController.php | 6 +- .../Controllers/TaskSchedulerController.php | 1 - app/Http/Controllers/TaskStatusController.php | 21 +- .../Controllers/TemplatePreviewController.php | 3 +- .../Controllers/Traits/VerifiesUserEmail.php | 2 +- app/Http/Controllers/TwilioController.php | 6 +- app/Http/Controllers/TwoFactorController.php | 9 +- app/Http/Controllers/UserController.php | 40 +- .../VendorPortal/InvitationController.php | 18 +- .../VendorPortal/PurchaseOrderController.php | 28 +- app/Http/Kernel.php | 73 ++- app/Http/Livewire/BillingPortalPurchase.php | 1 - app/Http/Livewire/PdfSlot.php | 59 +-- app/Http/Livewire/TasksTable.php | 4 +- app/Http/Middleware/PasswordProtection.php | 8 +- app/Http/Middleware/QueryLogging.php | 3 +- app/Http/Middleware/TokenAuth.php | 2 +- app/Http/Middleware/ValidateSignature.php | 1 - app/Http/Middleware/VendorContactKeyLogin.php | 8 +- app/Http/Middleware/VerifyCsrfToken.php | 1 - .../Requests/Activity/ShowActivityRequest.php | 3 +- .../Invoices/ProcessInvoicesInBulkRequest.php | 2 +- .../Requests/Company/UpdateCompanyRequest.php | 3 +- .../Document/StoreDocumentRequest.php | 3 +- .../Document/UpdateDocumentRequest.php | 3 +- .../Email/ClientEmailHistoryRequest.php | 1 - .../Email/EntityEmailHistoryRequest.php | 2 +- app/Http/Requests/Email/SendEmailRequest.php | 3 +- .../GroupSetting/StoreGroupSettingRequest.php | 9 +- .../UpdateGroupSettingRequest.php | 2 +- .../Requests/Invoice/UpdateInvoiceRequest.php | 2 +- .../Requests/Invoice/UploadInvoiceRequest.php | 1 - .../Requests/Payment/RefundPaymentRequest.php | 2 +- .../Requests/Payment/UpdatePaymentRequest.php | 4 +- .../Preview/PreviewInvoiceRequest.php | 40 +- .../UploadPurchaseOrderRequest.php | 2 +- .../Requests/Quote/BulkActionQuoteRequest.php | 2 +- app/Http/Requests/Task/StoreTaskRequest.php | 3 +- app/Http/Requests/Task/UpdateTaskRequest.php | 4 +- app/Http/Requests/Task/UploadTaskRequest.php | 3 +- .../TaskScheduler/StoreSchedulerRequest.php | 3 +- .../TaskScheduler/UpdateSchedulerRequest.php | 1 - .../TaskStatus/UpdateTaskStatusRequest.php | 1 - app/Http/Requests/User/BulkUserRequest.php | 7 +- .../User/DisconnectUserMailerRequest.php | 2 +- .../Requests/Vendor/UploadVendorRequest.php | 3 +- .../Requests/Webhook/UpdateWebhookRequest.php | 2 +- .../Credit/ValidCreditsRules.php | 2 +- .../Payment/ValidRefundableRequest.php | 1 - .../PaymentAppliedValidAmount.php | 2 +- .../Project/ValidProjectForClient.php | 2 +- app/Http/ValidationRules/ValidAmount.php | 2 +- app/Import/Providers/BaseImport.php | 39 +- app/Import/Providers/Csv.php | 44 +- app/Import/Transformer/BaseTransformer.php | 37 +- .../Transformer/Csv/InvoiceTransformer.php | 2 +- .../Csv/RecurringInvoiceTransformer.php | 12 +- .../Invoice2Go/InvoiceTransformer.php | 3 +- .../Transformer/Zoho/ClientTransformer.php | 3 +- .../Transformer/Zoho/InvoiceTransformer.php | 1 - app/Jobs/Bank/MatchBankTransactions.php | 2 +- app/Jobs/Bank/ProcessBankTransactions.php | 17 +- app/Jobs/Client/CheckVat.php | 11 +- app/Jobs/Client/UpdateTaxData.php | 18 +- app/Jobs/Company/CompanyExport.php | 48 +- app/Jobs/Company/CompanyTaxRate.php | 31 +- app/Jobs/Company/CreateCompany.php | 37 +- app/Jobs/Cron/AutoBill.php | 13 +- app/Jobs/Cron/AutoBillCron.php | 4 +- app/Jobs/Cron/RecurringExpensesCron.php | 13 +- app/Jobs/Cron/RecurringInvoicesCron.php | 12 +- app/Jobs/Cron/SubscriptionCron.php | 4 +- app/Jobs/Cron/UpdateCalculatedFields.php | 41 +- app/Jobs/Entity/CreateRawPdf.php | 41 +- app/Jobs/Entity/EmailEntity.php | 1 - app/Jobs/Invoice/CheckGatewayFee.php | 6 +- app/Jobs/Invoice/CreateEInvoice.php | 16 +- app/Jobs/Invoice/InjectSignature.php | 15 +- app/Jobs/Invoice/InvoiceWorkflowSettings.php | 1 - app/Jobs/Mail/NinjaMailerJob.php | 2 +- app/Jobs/Ninja/CheckACHStatus.php | 12 +- app/Jobs/Ninja/CheckCompanyData.php | 1 - app/Jobs/Ninja/TaskScheduler.php | 8 +- app/Jobs/Payment/EmailPayment.php | 9 +- app/Jobs/Payment/EmailRefundPayment.php | 3 +- app/Jobs/PostMark/ProcessPostmarkWebhook.php | 233 +++++---- app/Jobs/PurchaseOrder/ZipPurchaseOrders.php | 1 - app/Jobs/Quote/ZipQuotes.php | 20 +- app/Jobs/RecurringInvoice/SendRecurring.php | 40 +- app/Jobs/Report/PreviewReport.php | 8 +- app/Jobs/Report/SendToAdmin.php | 2 +- .../Subscription/CleanStaleInvoiceOrder.php | 8 +- app/Jobs/Util/Import.php | 222 ++++---- app/Jobs/Util/ReminderJob.php | 23 +- app/Jobs/Util/StartMigration.php | 37 +- .../Account/StripeConnectFailureListener.php | 9 +- .../Activity/PaymentCreatedActivity.php | 5 +- .../Invoice/InvoiceReminderEmailActivity.php | 2 +- app/Listeners/Payment/PaymentNotification.php | 14 +- app/Listeners/User/UpdateUserLastLogin.php | 14 +- .../Vendor/UpdateVendorContactLastLogin.php | 3 +- app/Mail/Admin/AccountCreatedObject.php | 2 +- app/Mail/Admin/AutoBillingFailureObject.php | 1 + app/Mail/Engine/CreditEmailEngine.php | 4 +- app/Mail/Engine/InvoiceEmailEngine.php | 8 +- app/Mail/Engine/PaymentEmailEngine.php | 29 +- app/Mail/Ninja/StripeConnectFailed.php | 4 +- ...ClientContactRequestCancellationObject.php | 4 +- app/Mail/TestMailServer.php | 2 - app/Mail/VendorTemplateEmail.php | 6 +- app/Models/Account.php | 7 +- app/Models/Activity.php | 21 +- app/Models/BankTransaction.php | 3 +- app/Models/BaseModel.php | 25 +- app/Models/Client.php | 36 +- app/Models/Company.php | 25 +- app/Models/CompanyGateway.php | 2 +- app/Models/CompanyUser.php | 11 +- app/Models/Country.php | 8 +- app/Models/Credit.php | 18 +- app/Models/Expense.php | 13 +- app/Models/GatewayType.php | 1 - app/Models/GroupSetting.php | 3 +- app/Models/Invoice.php | 51 +- app/Models/InvoiceInvitation.php | 3 - app/Models/Payment.php | 3 +- app/Models/PaymentHash.php | 14 +- app/Models/Presenters/EntityPresenter.php | 2 +- app/Models/Presenters/InvoicePresenter.php | 2 +- app/Models/Presenters/UserPresenter.php | 2 +- app/Models/Project.php | 1 - app/Models/PurchaseOrder.php | 7 +- app/Models/PurchaseOrderInvitation.php | 3 +- app/Models/Quote.php | 4 +- app/Models/QuoteInvitation.php | 1 - app/Models/RecurringQuote.php | 4 +- app/Models/Scheduler.php | 3 - app/Models/Task.php | 6 +- app/Models/Traits/Excludable.php | 4 +- app/Models/User.php | 24 +- .../Admin/EntitySentNotification.php | 3 +- .../Admin/EntityViewedNotification.php | 3 +- .../Admin/NewPaymentNotification.php | 3 +- .../ClientContactRequestCancellation.php | 3 +- .../ClientContactResetPassword.php | 3 +- app/Notifications/NewAccountCreated.php | 3 +- .../Ninja/ClientAccountNotFound.php | 3 +- .../Ninja/DomainFailureNotification.php | 3 +- .../DomainRenewalFailureNotification.php | 3 +- .../Ninja/EmailBounceNotification.php | 3 +- .../Ninja/EmailQuotaNotification.php | 3 +- .../Ninja/EmailSpamNotification.php | 1 - .../Ninja/GenericNinjaAdminNotification.php | 2 +- .../Ninja/GmailCredentialNotification.php | 3 +- app/Notifications/Ninja/NewAccountCreated.php | 3 +- .../Ninja/NewAccountNotification.php | 3 +- .../Ninja/RenewalFailureNotification.php | 3 +- app/Notifications/Ninja/SpamNotification.php | 3 +- .../Ninja/UserQualityNotification.php | 3 +- .../Ninja/WePayFailureNotification.php | 3 +- .../ResetPasswordNotification.php | 5 +- app/Observers/ClientObserver.php | 60 +-- app/Observers/CompanyObserver.php | 3 +- .../Authorize/AuthorizeCreateCustomer.php | 46 +- .../Authorize/AuthorizeCreditCard.php | 19 +- .../Authorize/AuthorizeCustomer.php | 4 +- .../Authorize/AuthorizeTransaction.php | 17 +- .../Authorize/RefundTransaction.php | 10 +- app/PaymentDrivers/BaseDriver.php | 13 +- app/PaymentDrivers/Braintree/ACH.php | 3 +- .../CheckoutCom/CheckoutSetupWebhook.php | 28 +- .../CheckoutCom/CheckoutWebhook.php | 30 +- app/PaymentDrivers/CheckoutCom/CreditCard.php | 27 +- app/PaymentDrivers/CheckoutCom/Utilities.php | 11 +- app/PaymentDrivers/CheckoutCom/Webhook.php | 18 +- .../CheckoutComPaymentDriver.php | 2 +- app/PaymentDrivers/GoCardless/ACH.php | 2 +- app/PaymentDrivers/GoCardless/DirectDebit.php | 11 +- app/PaymentDrivers/GoCardless/SEPA.php | 2 +- .../GoCardlessPaymentDriver.php | 3 +- app/PaymentDrivers/Mollie/Bancontact.php | 2 +- app/PaymentDrivers/Mollie/BankTransfer.php | 2 +- app/PaymentDrivers/Mollie/IDEAL.php | 2 +- app/PaymentDrivers/Mollie/KBC.php | 2 +- .../PayPalExpressPaymentDriver.php | 3 +- .../PayPalRestPaymentDriver.php | 60 +-- app/PaymentDrivers/PaytracePaymentDriver.php | 16 +- app/PaymentDrivers/Razorpay/Hosted.php | 4 +- app/PaymentDrivers/Square/CreditCard.php | 34 +- app/PaymentDrivers/Square/SquareWebhook.php | 50 +- app/PaymentDrivers/SquarePaymentDriver.php | 64 +-- app/PaymentDrivers/Stripe/ACH.php | 6 +- .../Stripe/Jobs/ChargeRefunded.php | 23 +- app/PaymentDrivers/Stripe/SEPA.php | 14 +- .../Stripe/UpdatePaymentMethods.php | 32 +- app/PaymentDrivers/StripePaymentDriver.php | 7 +- app/PaymentDrivers/WePay/ACH.php | 2 +- app/PaymentDrivers/WePayPaymentDriver.php | 6 +- app/Providers/AppServiceProvider.php | 20 +- app/Providers/ClientPortalServiceProvider.php | 2 +- app/Providers/EventServiceProvider.php | 485 +++++++++--------- app/Providers/RouteServiceProvider.php | 18 +- app/Repositories/ActivityRepository.php | 22 +- .../BankIntegrationRepository.php | 24 +- .../BankTransactionRepository.php | 8 +- app/Repositories/BaseRepository.php | 25 +- app/Repositories/InvoiceRepository.php | 3 +- .../Migration/PaymentMigrationRepository.php | 4 +- app/Repositories/PaymentRepository.php | 16 +- app/Repositories/TaskRepository.php | 2 +- app/Repositories/TaskStatusRepository.php | 2 +- app/Services/Bank/ProcessBankRules.php | 2 +- app/Services/Chart/ChartService.php | 2 +- app/Services/Chart/ChartServiceLegacy.php | 1 - app/Services/Client/ClientService.php | 12 +- app/Services/Client/PaymentMethod.php | 3 +- app/Services/Client/Statement.php | 35 +- app/Services/ClientPortal/InstantPayment.php | 2 +- app/Services/Credit/CreditService.php | 6 +- app/Services/Credit/SendEmail.php | 6 +- app/Services/Email/AdminEmail.php | 5 - app/Services/Email/AdminEmailMailable.php | 2 - app/Services/Email/Email.php | 18 +- app/Services/Email/EmailDefaults.php | 27 +- app/Services/Email/EmailMailable.php | 2 +- app/Services/Invoice/ApplyPaymentAmount.php | 2 +- app/Services/Invoice/AutoBillInvoice.php | 17 +- .../Invoice/EInvoice/FacturaEInvoice.php | 66 ++- app/Services/Invoice/EInvoice/FatturaPA.php | 27 +- .../Invoice/EInvoice/ZugferdEInvoice.php | 40 +- app/Services/Invoice/GenerateDeliveryNote.php | 3 +- app/Services/Invoice/GetInvoicePdf.php | 4 +- app/Services/Invoice/HandleRestore.php | 5 +- app/Services/Invoice/InvoiceService.php | 12 +- app/Services/Invoice/MarkInvoiceDeleted.php | 4 +- app/Services/Invoice/SendEmail.php | 10 +- app/Services/Invoice/UpdateReminder.php | 12 +- app/Services/Payment/DeletePayment.php | 10 +- app/Services/Payment/RefundPayment.php | 20 +- app/Services/Pdf/PdfBuilder.php | 38 +- app/Services/Pdf/PdfMock.php | 5 +- app/Services/Pdf/PdfService.php | 2 +- app/Services/PdfMaker/Design.php | 6 +- app/Services/PdfMaker/PdfMaker.php | 2 +- .../PurchaseOrder/GetPurchaseOrderPdf.php | 2 +- .../PurchaseOrder/PurchaseOrderService.php | 4 +- app/Services/PurchaseOrder/SendEmail.php | 59 +-- app/Services/Quote/ConvertQuoteToProject.php | 29 +- app/Services/Quote/CreateInvitations.php | 2 +- app/Services/Quote/GetQuotePdf.php | 4 +- app/Services/Quote/MarkSent.php | 10 +- app/Services/Quote/QuoteService.php | 13 +- app/Services/Quote/SendEmail.php | 4 +- app/Services/Recurring/GetInvoicePdf.php | 2 +- app/Services/Recurring/RecurringService.php | 11 +- app/Services/Report/ARDetailReport.php | 16 +- app/Services/Report/ARSummaryReport.php | 6 +- app/Services/Report/ClientBalanceReport.php | 15 +- app/Services/Report/ClientSalesReport.php | 10 +- app/Services/Report/ProfitLoss.php | 14 +- app/Services/Report/TaxSummaryReport.php | 20 +- app/Services/Report/UserSalesReport.php | 15 +- app/Services/Scheduler/EmailRecord.php | 5 +- app/Services/Scheduler/EmailReport.php | 39 +- app/Services/Scheduler/SchedulerService.php | 3 +- .../Subscription/SubscriptionService.php | 9 +- app/Services/Subscription/ZeroCostProduct.php | 3 +- app/Services/Tax/Providers/TaxProvider.php | 16 +- app/Services/Tax/Providers/ZipTax.php | 13 +- app/Services/Tax/TaxService.php | 14 +- app/Services/Tax/VatNumberCheck.php | 2 +- app/Services/Template/TemplateAction.php | 67 ++- app/Services/Template/TemplateMock.php | 6 +- app/Services/Template/TemplateService.php | 44 +- app/Transformers/ActivityTransformer.php | 16 +- .../BankIntegrationTransformer.php | 3 +- .../BankTransactionRuleTransformer.php | 1 - .../BankTransactionTransformer.php | 4 +- app/Transformers/ClientTransformer.php | 4 +- .../CompanyGatewayTransformer.php | 4 +- app/Transformers/CompanyTransformer.php | 63 ++- app/Transformers/CreditTransformer.php | 4 +- app/Transformers/ExpenseTransformer.php | 9 +- app/Transformers/PaymentTransformer.php | 2 +- app/Transformers/ProductTransformer.php | 3 +- app/Transformers/PurchaseOrderTransformer.php | 8 +- app/Transformers/QuoteTransformer.php | 4 +- .../RecurringExpenseTransformer.php | 6 +- app/Transformers/TaskTransformer.php | 6 +- app/Transformers/UserTransformer.php | 2 +- app/Transformers/VendorTransformer.php | 1 - app/Utils/Helpers.php | 6 +- app/Utils/HtmlEngine.php | 30 +- app/Utils/Ninja.php | 3 +- app/Utils/TemplateEngine.php | 45 +- app/Utils/Traits/CleanLineItems.php | 8 +- app/Utils/Traits/ClientGroupSettingsSaver.php | 2 +- .../CompanyGatewayFeesAndLimitsSaver.php | 2 +- app/Utils/Traits/CompanySettingsSaver.php | 19 +- app/Utils/Traits/MakesDates.php | 11 +- app/Utils/Traits/MakesInvoiceValues.php | 2 +- app/Utils/Traits/MakesReminders.php | 2 +- app/Utils/Traits/SettingsSaver.php | 2 +- app/Utils/TranslationHelper.php | 2 +- app/Utils/VendorHtmlEngine.php | 66 +-- 463 files changed, 3532 insertions(+), 3726 deletions(-) diff --git a/app/Casts/EncryptedCast.php b/app/Casts/EncryptedCast.php index 7be926072c3a..a8c11f3ad397 100644 --- a/app/Casts/EncryptedCast.php +++ b/app/Casts/EncryptedCast.php @@ -16,12 +16,12 @@ use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class EncryptedCast implements CastsAttributes { public function get($model, string $key, $value, array $attributes) - { + { return is_string($value) && strlen($value) > 1 ? decrypt($value) : null; } public function set($model, string $key, $value, array $attributes) - { + { return [$key => ! is_null($value) ? encrypt($value) : null]; } } diff --git a/app/Console/Commands/BackupUpdate.php b/app/Console/Commands/BackupUpdate.php index 9a827b68d19a..b6f1cb4f5baf 100644 --- a/app/Console/Commands/BackupUpdate.php +++ b/app/Console/Commands/BackupUpdate.php @@ -11,13 +11,13 @@ namespace App\Console\Commands; -use App\Utils\Ninja; +use App\Libraries\MultiDB; use App\Models\Backup; use App\Models\Client; use App\Models\Company; use App\Models\Document; -use App\Libraries\MultiDB; use App\Models\GroupSetting; +use App\Utils\Ninja; use Illuminate\Console\Command; use Illuminate\Support\Facades\Storage; @@ -56,8 +56,9 @@ class BackupUpdate extends Command { //always return state to first DB - if(Ninja::isSelfHost()) + if(Ninja::isSelfHost()) { return; + } $current_db = config('database.default'); diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index 7c5a3f21bb42..89492f8fe2b8 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -12,38 +12,37 @@ namespace App\Console\Commands; use App; -use Exception; -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\Models\Account; -use App\Models\Company; -use App\Models\Contact; -use App\Models\Invoice; -use App\Models\Payment; -use App\Models\CompanyUser; -use Illuminate\Support\Str; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\Models\CompanyLedger; -use App\Models\PurchaseOrder; -use App\Models\VendorContact; -use App\Models\BankTransaction; -use App\Models\QuoteInvitation; -use Illuminate\Console\Command; -use App\Models\CreditInvitation; -use App\Models\RecurringInvoice; -use App\Models\InvoiceInvitation; use App\DataMapper\ClientSettings; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Mail; use App\Factory\ClientContactFactory; use App\Factory\VendorContactFactory; use App\Jobs\Company\CreateCompanyToken; +use App\Models\Account; +use App\Models\BankTransaction; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\CompanyLedger; +use App\Models\CompanyToken; +use App\Models\CompanyUser; +use App\Models\Contact; +use App\Models\Credit; +use App\Models\CreditInvitation; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; +use App\Models\Payment; +use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoice; use App\Models\RecurringInvoiceInvitation; +use App\Models\User; +use App\Models\Vendor; +use App\Models\VendorContact; +use App\Utils\Ninja; +use Illuminate\Console\Command; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Str; use Symfony\Component\Console\Input\InputOption; /* @@ -185,8 +184,7 @@ class CheckData extends Command if ($cu->company && $cu->user) { (new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle(); - } - else { + } else { // $cu->forceDelete(); } } @@ -445,7 +443,7 @@ class CheckData extends Command QuoteInvitation::where('deleted_at', "0000-00-00 00:00:00.000000")->withTrashed()->update(['deleted_at' => null]); CreditInvitation::where('deleted_at', "0000-00-00 00:00:00.000000")->withTrashed()->update(['deleted_at' => null]); - InvoiceInvitation::where('sent_date', '0000-00-00 00:00:00')->cursor()->each(function ($ii){ + InvoiceInvitation::where('sent_date', '0000-00-00 00:00:00')->cursor()->each(function ($ii) { $ii->sent_date = null; $ii->saveQuietly(); }); @@ -619,7 +617,7 @@ class CheckData extends Command } $this->logMessage("{$this->wrong_paid_to_dates} clients with incorrect paid to dates"); - } + } private function clientBalanceQuery() { @@ -1028,7 +1026,7 @@ class CheckData extends Command { $this->logMessage("checking bank transactions"); - BankTransaction::with('payment')->withTrashed()->where('invoice_ids', ',,,,,,,,')->cursor()->each(function ($bt){ + BankTransaction::with('payment')->withTrashed()->where('invoice_ids', ',,,,,,,,')->cursor()->each(function ($bt) { if($bt->payment->exists()) { @@ -1052,7 +1050,7 @@ class CheckData extends Command if ($this->option('fix') == 'true') { - $q->cursor()->each(function ($c){ + $q->cursor()->each(function ($c) { $c->send_email = false; $c->saveQuietly(); diff --git a/app/Console/Commands/CreateAccount.php b/app/Console/Commands/CreateAccount.php index d2ff960b2019..d56433d42b32 100644 --- a/app/Console/Commands/CreateAccount.php +++ b/app/Console/Commands/CreateAccount.php @@ -20,7 +20,6 @@ use App\Models\Account; use App\Models\Company; use App\Models\CompanyToken; use App\Models\User; -use App\Repositories\InvoiceRepository; use App\Utils\Traits\GeneratesCounter; use App\Utils\Traits\MakesHash; use Illuminate\Console\Command; diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index 481ce0ba647b..33196439f736 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -11,52 +11,52 @@ 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\Invoice; use App\Models\Product; use App\Models\Project; -use App\Models\TaxRate; -use App\Libraries\MultiDB; -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\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 { @@ -460,7 +460,7 @@ class CreateSingleAccount extends Command $settings = $client->settings; $settings->currency_id = "1"; -// $settings->use_credits_payment = "always"; + // $settings->use_credits_payment = "always"; $client->settings = $settings; diff --git a/app/Console/Commands/CreateTestData.php b/app/Console/Commands/CreateTestData.php index ca8417573ce7..b882c9af6d32 100644 --- a/app/Console/Commands/CreateTestData.php +++ b/app/Console/Commands/CreateTestData.php @@ -496,7 +496,7 @@ class CreateTestData extends Command $invoice = InvoiceFactory::create($client->company->id, $client->user->id); //stub the company and user_id $invoice->client_id = $client->id; -// $invoice->date = $faker->date(); + // $invoice->date = $faker->date(); $dateable = Carbon::now()->subDays(rand(0, 90)); $invoice->date = $dateable; diff --git a/app/Console/Commands/ImportMigrations.php b/app/Console/Commands/ImportMigrations.php index 9e227c72bd3c..57d25844cb83 100644 --- a/app/Console/Commands/ImportMigrations.php +++ b/app/Console/Commands/ImportMigrations.php @@ -18,7 +18,6 @@ use App\Exceptions\ProcessingMigrationArchiveFailed; use App\Exceptions\ResourceDependencyMissing; use App\Exceptions\ResourceNotAvailableForMigration; use App\Jobs\Util\Import; -use App\Jobs\Util\StartMigration; use App\Mail\MigrationFailed; use App\Models\Account; use App\Models\Company; diff --git a/app/Console/Commands/ReactBuilder.php b/app/Console/Commands/ReactBuilder.php index d56a4565529e..d40a2503236f 100644 --- a/app/Console/Commands/ReactBuilder.php +++ b/app/Console/Commands/ReactBuilder.php @@ -52,8 +52,7 @@ class ReactBuilder extends Command try { $directoryIterator = new \RecursiveDirectoryIterator(public_path('react/v'.config('ninja.app_version').'/'), \RecursiveDirectoryIterator::SKIP_DOTS); - } - catch (\Exception $e) { + } catch (\Exception $e) { $this->error('React files not found'); return; } diff --git a/app/Console/Commands/SendRemindersCron.php b/app/Console/Commands/SendRemindersCron.php index 8328611b836c..ab55404fec2c 100644 --- a/app/Console/Commands/SendRemindersCron.php +++ b/app/Console/Commands/SendRemindersCron.php @@ -174,7 +174,7 @@ class SendRemindersCron extends Command $invoice->calc()->getInvoice()->save(); $invoice->fresh(); // $invoice->service()->deletePdf()->save(); - if ($invoice->client->getSetting('enable_e_invoice')){ + if ($invoice->client->getSetting('enable_e_invoice')) { $invoice->service()->deleteEInvoice()->save(); } diff --git a/app/Console/Commands/SendTestEmails.php b/app/Console/Commands/SendTestEmails.php index 5a113e8f2f58..9895355ac962 100644 --- a/app/Console/Commands/SendTestEmails.php +++ b/app/Console/Commands/SendTestEmails.php @@ -11,17 +11,10 @@ namespace App\Console\Commands; -use Faker\Factory; -use App\Models\User; -use App\Models\Account; -use App\Models\Company; -use App\Mail\TestMailServer; -use Illuminate\Console\Command; -use App\Jobs\Mail\NinjaMailerJob; -use App\DataMapper\CompanySettings; -use App\DataMapper\DefaultSettings; use App\Jobs\Mail\NinjaMailerObject; -use App\Mail\Migration\MaxCompanies; +use App\Mail\TestMailServer; +use App\Models\User; +use Illuminate\Console\Command; use Illuminate\Support\Facades\Mail; class SendTestEmails extends Command diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index c66cdc40e5a9..f67dc4af685b 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -11,29 +11,29 @@ namespace App\Console; -use App\Utils\Ninja; -use App\Models\Account; -use App\Jobs\Ninja\QueueSize; -use App\Jobs\Util\DiskCleanup; -use App\Jobs\Util\ReminderJob; use App\Jobs\Cron\AutoBillCron; -use App\Jobs\Util\VersionCheck; -use App\Jobs\Ninja\TaskScheduler; -use App\Jobs\Util\SchedulerCheck; -use App\Jobs\Ninja\CheckACHStatus; -use App\Jobs\Cron\SubscriptionCron; -use App\Jobs\Ninja\AdjustEmailQuota; -use App\Jobs\Ninja\CompanySizeCheck; -use App\Jobs\Ninja\SystemMaintenance; -use App\Jobs\Quote\QuoteCheckExpired; -use App\Jobs\Util\UpdateExchangeRates; -use App\Jobs\Ninja\BankTransactionSync; use App\Jobs\Cron\RecurringExpensesCron; use App\Jobs\Cron\RecurringInvoicesCron; +use App\Jobs\Cron\SubscriptionCron; use App\Jobs\Cron\UpdateCalculatedFields; -use Illuminate\Console\Scheduling\Schedule; use App\Jobs\Invoice\InvoiceCheckLateWebhook; +use App\Jobs\Ninja\AdjustEmailQuota; +use App\Jobs\Ninja\BankTransactionSync; +use App\Jobs\Ninja\CheckACHStatus; +use App\Jobs\Ninja\CompanySizeCheck; +use App\Jobs\Ninja\QueueSize; +use App\Jobs\Ninja\SystemMaintenance; +use App\Jobs\Ninja\TaskScheduler; +use App\Jobs\Quote\QuoteCheckExpired; use App\Jobs\Subscription\CleanStaleInvoiceOrder; +use App\Jobs\Util\DiskCleanup; +use App\Jobs\Util\ReminderJob; +use App\Jobs\Util\SchedulerCheck; +use App\Jobs\Util\UpdateExchangeRates; +use App\Jobs\Util\VersionCheck; +use App\Models\Account; +use App\Utils\Ninja; +use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index f1cd82c56d4a..814dc4038382 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -497,11 +497,11 @@ class CompanySettings extends BaseSettings 'payment_receipt_design_id' => 'string', 'payment_refund_design_id' => 'string', 'classification' => 'string', - 'enable_e_invoice' => 'bool', + 'enable_e_invoice' => 'bool', 'classification' => 'string', 'default_expense_payment_type_id' => 'string', - 'e_invoice_type' => 'string', - 'mailgun_endpoint' => 'string', + 'e_invoice_type' => 'string', + 'mailgun_endpoint' => 'string', 'client_initiated_payments' => 'bool', 'client_initiated_payments_minimum' => 'float', 'sync_invoice_quote_columns' => 'bool', diff --git a/app/DataMapper/DefaultSettings.php b/app/DataMapper/DefaultSettings.php index 6451370cf620..e87fdf7993d4 100644 --- a/app/DataMapper/DefaultSettings.php +++ b/app/DataMapper/DefaultSettings.php @@ -34,4 +34,4 @@ class DefaultSettings extends BaseSettings ]; } -} \ No newline at end of file +} diff --git a/app/DataMapper/FreeCompanySettings.php b/app/DataMapper/FreeCompanySettings.php index 9866862a96e9..0ffe60f8658a 100644 --- a/app/DataMapper/FreeCompanySettings.php +++ b/app/DataMapper/FreeCompanySettings.php @@ -44,7 +44,7 @@ class FreeCompanySettings extends BaseSettings public $date_format_id = ''; -// public $enabled_item_tax_rates = 0; + // public $enabled_item_tax_rates = 0; public $expense_number_pattern = ''; public $expense_number_counter = 1; diff --git a/app/DataMapper/Settings/SettingsData.php b/app/DataMapper/Settings/SettingsData.php index 4d99cccff18b..2584a565403e 100644 --- a/app/DataMapper/Settings/SettingsData.php +++ b/app/DataMapper/Settings/SettingsData.php @@ -10,7 +10,7 @@ */ namespace App\DataMapper\Settings; -class SettingsData +class SettingsData { public bool $auto_archive_invoice = false; // @implemented @@ -469,27 +469,28 @@ class SettingsData public function cast(mixed $object) { - if(is_array($object)) + if(is_array($object)) { $object = (object)$object; + } if (is_object($object)) { foreach ($object as $key => $value) { - try{ + try { settype($object->{$key}, gettype($this->{$key})); - } - catch(\Exception | \Error | \Throwable $e){ + } catch(\Exception | \Error | \Throwable $e) { - if(property_exists($this, $key)) + if(property_exists($this, $key)) { $object->{$key} = $this->{$key}; - else + } else { unset($object->{$key}); + } } // if(!property_exists($this, $key)) { // unset($object->{$key}); - // } + // } // elseif(is_array($object->{$key}) && gettype($this->{$key} != 'array')){ // $object->{$key} = $this->{$key}; // } @@ -512,4 +513,4 @@ class SettingsData { return (array)$this->object; } -} \ No newline at end of file +} diff --git a/app/DataMapper/Tax/BaseRule.php b/app/DataMapper/Tax/BaseRule.php index ba8169734547..18886623261a 100644 --- a/app/DataMapper/Tax/BaseRule.php +++ b/app/DataMapper/Tax/BaseRule.php @@ -11,11 +11,11 @@ namespace App\DataMapper\Tax; +use App\DataMapper\Tax\ZipTax\Response; +use App\DataProviders\USStates; use App\Models\Client; use App\Models\Invoice; use App\Models\Product; -use App\DataProviders\USStates; -use App\DataMapper\Tax\ZipTax\Response; class BaseRule implements RuleInterface { @@ -66,7 +66,7 @@ class BaseRule implements RuleInterface 'SK', // Slovakia ]; - public array $region_codes = [ + public array $region_codes = [ 'AT' => 'EU', // Austria 'BE' => 'EU', // Belgium 'BG' => 'EU', // Bulgaria @@ -147,8 +147,9 @@ class BaseRule implements RuleInterface $this->resolveRegions(); - if(!$this->isTaxableRegion()) + if(!$this->isTaxableRegion()) { return $this; + } $this->configTaxData(); @@ -173,26 +174,26 @@ class BaseRule implements RuleInterface /** Harvest the client_region */ /** If the tax data is already set and the invoice is marked as sent, do not adjust the rates */ - if($this->invoice->tax_data && $this->invoice->status_id > 1) + if($this->invoice->tax_data && $this->invoice->status_id > 1) { return $this; + } /** * Origin - Company Tax Data * Destination - Client Tax Data - * + * */ $tax_data = false; - if($this->seller_region == 'US' && $this->client_region == 'US'){ + if($this->seller_region == 'US' && $this->client_region == 'US') { $company = $this->invoice->company; /** If no company tax data has been configured, lets do that now. */ /** We should never encounter this scenario */ - if(!$company->origin_tax_data) - { - $this->should_calc_tax = false; + if(!$company->origin_tax_data) { + $this->should_calc_tax = false; return $this; } @@ -201,8 +202,7 @@ class BaseRule implements RuleInterface $tax_data = $company->origin_tax_data; - } - elseif($this->client->tax_data){ + } elseif($this->client->tax_data) { $tax_data = $this->client->tax_data; @@ -215,8 +215,9 @@ class BaseRule implements RuleInterface $this->invoice->tax_data = $tax_data; - if(\DB::transactionLevel() == 0) + if(\DB::transactionLevel() == 0) { $this->invoice->saveQuietly(); + } } return $this; @@ -234,7 +235,7 @@ class BaseRule implements RuleInterface $this->client_region = $this->region_codes[$this->client->country->iso_3166_2]; - match($this->client_region){ + match($this->client_region) { 'US' => $this->client_subregion = isset($this->invoice?->client?->tax_data?->geoState) ? $this->invoice->client->tax_data->geoState : $this->getUSState(), 'EU' => $this->client_subregion = $this->client->country->iso_3166_2, 'AU' => $this->client_subregion = 'AU', @@ -251,8 +252,9 @@ class BaseRule implements RuleInterface $states = USStates::$states; - if(isset($states[$this->client->state])) + if(isset($states[$this->client->state])) { return $this->client->state; + } return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code); @@ -263,7 +265,7 @@ class BaseRule implements RuleInterface public function isTaxableRegion(): bool { - return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions || + return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions || (property_exists($this->client->company->tax_data->regions->{$this->client_region}->subregions, $this->client_subregion) && $this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax); } @@ -277,8 +279,7 @@ class BaseRule implements RuleInterface return $this; - } - elseif($this->client_region == 'AU'){ //these are defaults and are only stubbed out for now, for AU we can actually remove these + } elseif($this->client_region == 'AU') { //these are defaults and are only stubbed out for now, for AU we can actually remove these $this->tax_rate1 = $this->client->company->tax_data->regions->AU->subregions->AU->tax_rate; $this->tax_name1 = $this->client->company->tax_data->regions->AU->subregions->AU->tax_name; diff --git a/app/DataMapper/Tax/DE/Rule.php b/app/DataMapper/Tax/DE/Rule.php index 8214188c369f..5296674618ca 100644 --- a/app/DataMapper/Tax/DE/Rule.php +++ b/app/DataMapper/Tax/DE/Rule.php @@ -11,12 +11,12 @@ namespace App\DataMapper\Tax\DE; -use App\Models\Product; use App\DataMapper\Tax\BaseRule; use App\DataMapper\Tax\RuleInterface; +use App\Models\Product; class Rule extends BaseRule implements RuleInterface -{ +{ /** @var string $seller_region */ public string $seller_region = 'EU'; @@ -67,7 +67,7 @@ class Rule extends BaseRule implements RuleInterface return $this->taxExempt($item); } - match(intval($item->tax_id)){ + match(intval($item->tax_id)) { Product::PRODUCT_TYPE_EXEMPT => $this->taxExempt($item), Product::PRODUCT_TYPE_DIGITAL => $this->taxDigital($item), Product::PRODUCT_TYPE_SERVICE => $this->taxService($item), @@ -220,39 +220,28 @@ class Rule extends BaseRule implements RuleInterface // nlog("tax exempt"); $this->tax_rate = 0; $this->reduced_tax_rate = 0; - } - elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->vat_number && $this->eu_business_tax_exempt) - // elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->has_valid_vat_number && $this->eu_business_tax_exempt) - { + } elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->vat_number && $this->eu_business_tax_exempt) { + // elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->has_valid_vat_number && $this->eu_business_tax_exempt) // nlog("euro zone and tax exempt"); $this->tax_rate = 0; $this->reduced_tax_rate = 0; - } - elseif(!in_array($this->client_subregion, $this->eu_country_codes) && ($this->foreign_consumer_tax_exempt || $this->foreign_business_tax_exempt)) //foreign + tax exempt - { + } elseif(!in_array($this->client_subregion, $this->eu_country_codes) && ($this->foreign_consumer_tax_exempt || $this->foreign_business_tax_exempt)) { //foreign + tax exempt // nlog("foreign and tax exempt"); $this->tax_rate = 0; $this->reduced_tax_rate = 0; - } - elseif(!in_array($this->client_subregion, $this->eu_country_codes)) - { + } elseif(!in_array($this->client_subregion, $this->eu_country_codes)) { $this->defaultForeign(); - } - elseif(in_array($this->client_subregion, $this->eu_country_codes) && !$this->client->vat_number) //eu country / no valid vat - { - if(($this->client->company->tax_data->seller_subregion != $this->client_subregion) && $this->client->company->tax_data->regions->EU->has_sales_above_threshold) - { + } elseif(in_array($this->client_subregion, $this->eu_country_codes) && !$this->client->vat_number) { //eu country / no valid vat + if(($this->client->company->tax_data->seller_subregion != $this->client_subregion) && $this->client->company->tax_data->regions->EU->has_sales_above_threshold) { // nlog("eu zone with sales above threshold"); $this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->tax_rate; $this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->reduced_tax_rate; - } - else { + } else { // nlog("EU with intra-community supply ie DE to DE"); $this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate; $this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate; } - } - else { + } else { // nlog("default tax"); $this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate; $this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate; @@ -262,4 +251,4 @@ class Rule extends BaseRule implements RuleInterface } -} \ No newline at end of file +} diff --git a/app/DataMapper/Tax/RuleInterface.php b/app/DataMapper/Tax/RuleInterface.php index e4ff2c0e2da9..73994de7222b 100644 --- a/app/DataMapper/Tax/RuleInterface.php +++ b/app/DataMapper/Tax/RuleInterface.php @@ -36,4 +36,4 @@ interface RuleInterface public function override($item); public function calculateRates(); -} \ No newline at end of file +} diff --git a/app/DataMapper/Tax/TaxData.php b/app/DataMapper/Tax/TaxData.php index c1696ef2a43e..945a3d0a463f 100644 --- a/app/DataMapper/Tax/TaxData.php +++ b/app/DataMapper/Tax/TaxData.php @@ -15,7 +15,7 @@ use App\DataMapper\Tax\ZipTax\Response; /** * InvoiceTaxData - * + * * Definition for the invoice tax data structure */ class TaxData diff --git a/app/DataMapper/Tax/TaxModel.php b/app/DataMapper/Tax/TaxModel.php index 8fd686e88ff7..ca6d41a3f4a8 100644 --- a/app/DataMapper/Tax/TaxModel.php +++ b/app/DataMapper/Tax/TaxModel.php @@ -11,7 +11,7 @@ namespace App\DataMapper\Tax; -class TaxModel +class TaxModel { /** @var string $seller_subregion */ @@ -32,10 +32,11 @@ class TaxModel public function __construct(public ?TaxModel $model = null) { - if(!$this->model) + if(!$this->model) { $this->regions = $this->init(); - else + } else { $this->regions = $model; + } } @@ -79,7 +80,7 @@ class TaxModel * * @return self */ - private function auSubRegions(): self + private function auSubRegions(): self { $this->regions->AU->subregions = new \stdClass(); @@ -387,7 +388,7 @@ class TaxModel $this->regions->EU->subregions->EE = new \stdClass(); $this->regions->EU->subregions->EE->tax_rate = 20; - $this->regions->EU->subregions->EE->tax_name = 'KM'; + $this->regions->EU->subregions->EE->tax_name = 'KM'; $this->regions->EU->subregions->EE->reduced_tax_rate = 9; $this->regions->EU->subregions->EE->apply_tax = false; diff --git a/app/DataMapper/Tax/US/Rule.php b/app/DataMapper/Tax/US/Rule.php index e880027201ea..0a7179113b80 100644 --- a/app/DataMapper/Tax/US/Rule.php +++ b/app/DataMapper/Tax/US/Rule.php @@ -74,7 +74,7 @@ class Rule extends BaseRule implements RuleInterface Product::PRODUCT_TYPE_SHIPPING => $this->taxShipping($item), Product::PRODUCT_TYPE_PHYSICAL => $this->taxPhysical($item), Product::PRODUCT_TYPE_REDUCED_TAX => $this->taxReduced($item), - Product::PRODUCT_TYPE_OVERRIDE_TAX => $this->override($item), + Product::PRODUCT_TYPE_OVERRIDE_TAX => $this->override($item), Product::PRODUCT_TYPE_ZERO_RATED => $this->zeroRated($item), default => $this->default($item), }; @@ -117,10 +117,9 @@ class Rule extends BaseRule implements RuleInterface */ public function taxService($item): self { - if(in_array($this->tax_data?->txbService,['Y','L'])) { + if(in_array($this->tax_data?->txbService, ['Y','L'])) { $this->default($item); - } - else { + } else { $this->taxExempt($item); } @@ -224,4 +223,4 @@ class Rule extends BaseRule implements RuleInterface return $this; } -} \ No newline at end of file +} diff --git a/app/DataMapper/Tax/ZipTax/Response.php b/app/DataMapper/Tax/ZipTax/Response.php index 4a8e03634355..a64f27540264 100644 --- a/app/DataMapper/Tax/ZipTax/Response.php +++ b/app/DataMapper/Tax/ZipTax/Response.php @@ -53,7 +53,7 @@ class Response * "district5SalesTax" => 0, * "district5UseTax" => 0, * "originDestination" => "D", - * + * * ]; * */ @@ -114,4 +114,3 @@ class Response } } - diff --git a/app/DataProviders/USStates.php b/app/DataProviders/USStates.php index 4809df8439c1..75c205978626 100644 --- a/app/DataProviders/USStates.php +++ b/app/DataProviders/USStates.php @@ -33868,18 +33868,21 @@ class USStates public static function getState(?string $zip = '90210'): string { - if(isset(self::$zip_code_map[$zip])) + if(isset(self::$zip_code_map[$zip])) { return self::$zip_code_map[$zip]; + } $prefix_state = self::getStateFromThreeDigitPrefix($zip); - if($prefix_state) + if($prefix_state) { return $prefix_state; + } $zippo_response = self::getStateFromZippo($zip); - if($zippo_response) + if($zippo_response) { return $zippo_response; + } throw new \Exception('Zip code not found'); } @@ -33905,8 +33908,9 @@ class USStates $response = Http::get("https://api.zippopotam.us/us/{$zip}"); - if($response->failed()) + if($response->failed()) { return false; + } $data = $response->object(); @@ -33921,7 +33925,7 @@ class USStates public static function getStateFromThreeDigitPrefix($zip): mixed { - /* 000 to 999 */ + /* 000 to 999 */ $zip_by_state = [ '--', '--', '--', '--', '--', 'NY', 'PR', 'PR', 'VI', 'PR', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', 'MA', @@ -34004,7 +34008,7 @@ class USStates $prefix = substr($zip, 0, 3); $index = intval($prefix); - /* converts prefix to integer */ + /* converts prefix to integer */ return $zip_by_state[$index] == "--" ? false : $zip_by_state[$index]; } diff --git a/app/Events/Account/AccountCreated.php b/app/Events/Account/AccountCreated.php index 0761cdf4b9ed..4cd6d46ee0cf 100644 --- a/app/Events/Account/AccountCreated.php +++ b/app/Events/Account/AccountCreated.php @@ -49,9 +49,9 @@ class AccountCreated // * // * @return Channel|array // */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - // return new PrivateChannel('channel-name'); - } + // return new PrivateChannel('channel-name'); + } } diff --git a/app/Events/Account/StripeConnectFailure.php b/app/Events/Account/StripeConnectFailure.php index fd6f5a5d5738..ebe501512b17 100644 --- a/app/Events/Account/StripeConnectFailure.php +++ b/app/Events/Account/StripeConnectFailure.php @@ -12,11 +12,9 @@ namespace App\Events\Account; use App\Models\Company; -use Illuminate\Broadcasting\Channel; -use Illuminate\Queue\SerializesModels; -use Illuminate\Broadcasting\PrivateChannel; -use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; +use Illuminate\Foundation\Events\Dispatchable; +use Illuminate\Queue\SerializesModels; /** * Class StripeConnectFailure. diff --git a/app/Events/Client/ClientWasArchived.php b/app/Events/Client/ClientWasArchived.php index aca000b8e594..46aac9cba8f1 100644 --- a/app/Events/Client/ClientWasArchived.php +++ b/app/Events/Client/ClientWasArchived.php @@ -15,7 +15,6 @@ use App\Models\Client; use App\Models\Company; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -54,8 +53,8 @@ class ClientWasArchived // * // * @return Channel|array // */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Company/CompanyDocumentsDeleted.php b/app/Events/Company/CompanyDocumentsDeleted.php index 2c8f11c4f27f..831a4958d1af 100644 --- a/app/Events/Company/CompanyDocumentsDeleted.php +++ b/app/Events/Company/CompanyDocumentsDeleted.php @@ -14,7 +14,6 @@ namespace App\Events\Company; use App\Models\Company; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -42,8 +41,8 @@ class CompanyDocumentsDeleted * * @return Channel|array */ - public function broadcastOn() - { -return []; - } + public function broadcastOn() + { + return []; + } } diff --git a/app/Events/Contact/ContactLoggedIn.php b/app/Events/Contact/ContactLoggedIn.php index 0e98a54449c6..e2fa77103f64 100644 --- a/app/Events/Contact/ContactLoggedIn.php +++ b/app/Events/Contact/ContactLoggedIn.php @@ -14,7 +14,6 @@ namespace App\Events\Contact; use App\Models\ClientContact; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -50,8 +49,8 @@ class ContactLoggedIn * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Design/DesignWasArchived.php b/app/Events/Design/DesignWasArchived.php index 1dd9105c7c63..a3745552b245 100644 --- a/app/Events/Design/DesignWasArchived.php +++ b/app/Events/Design/DesignWasArchived.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\Design; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -35,8 +34,8 @@ class DesignWasArchived * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Design/DesignWasCreated.php b/app/Events/Design/DesignWasCreated.php index 213eb9882461..7cbf9aeec76e 100644 --- a/app/Events/Design/DesignWasCreated.php +++ b/app/Events/Design/DesignWasCreated.php @@ -11,10 +11,10 @@ namespace App\Events\Design; -use App\Models\Design; use App\Models\Company; -use Illuminate\Queue\SerializesModels; +use App\Models\Design; use Illuminate\Broadcasting\PrivateChannel; +use Illuminate\Queue\SerializesModels; /** * Class DesignWasCreated. @@ -32,8 +32,8 @@ class DesignWasCreated * * @return PrivateChannel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Design/DesignWasDeleted.php b/app/Events/Design/DesignWasDeleted.php index d9142724a074..fe21e1864604 100644 --- a/app/Events/Design/DesignWasDeleted.php +++ b/app/Events/Design/DesignWasDeleted.php @@ -11,10 +11,10 @@ namespace App\Events\Design; -use App\Models\Design; use App\Models\Company; -use Illuminate\Queue\SerializesModels; +use App\Models\Design; use Illuminate\Broadcasting\PrivateChannel; +use Illuminate\Queue\SerializesModels; /** * Class DesignWasDeleted. @@ -32,8 +32,8 @@ class DesignWasDeleted * * @return PrivateChannel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Design/DesignWasRestored.php b/app/Events/Design/DesignWasRestored.php index 6daa2c2545ba..c237d1f2c9c1 100644 --- a/app/Events/Design/DesignWasRestored.php +++ b/app/Events/Design/DesignWasRestored.php @@ -11,10 +11,10 @@ namespace App\Events\Design; -use App\Models\Design; use App\Models\Company; -use Illuminate\Queue\SerializesModels; +use App\Models\Design; use Illuminate\Broadcasting\PrivateChannel; +use Illuminate\Queue\SerializesModels; /** * Class DesignWasRestored. @@ -32,8 +32,8 @@ class DesignWasRestored * * @return PrivateChannel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Design/DesignWasUpdated.php b/app/Events/Design/DesignWasUpdated.php index 3b215fdff2bf..bf18bd88cf25 100644 --- a/app/Events/Design/DesignWasUpdated.php +++ b/app/Events/Design/DesignWasUpdated.php @@ -11,10 +11,10 @@ namespace App\Events\Design; -use App\Models\Design; use App\Models\Company; -use Illuminate\Queue\SerializesModels; +use App\Models\Design; use Illuminate\Broadcasting\PrivateChannel; +use Illuminate\Queue\SerializesModels; /** * Class DesignWasUpdated. @@ -32,8 +32,8 @@ class DesignWasUpdated * * @return PrivateChannel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Document/DocumentWasArchived.php b/app/Events/Document/DocumentWasArchived.php index 229e7d6c1673..edfa4bea8572 100644 --- a/app/Events/Document/DocumentWasArchived.php +++ b/app/Events/Document/DocumentWasArchived.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\Document; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; diff --git a/app/Events/Payment/Methods/MethodDeleted.php b/app/Events/Payment/Methods/MethodDeleted.php index 5e80e20f8aea..f205d872c8ac 100644 --- a/app/Events/Payment/Methods/MethodDeleted.php +++ b/app/Events/Payment/Methods/MethodDeleted.php @@ -15,7 +15,6 @@ use App\Models\ClientGatewayToken; use App\Models\Company; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -51,8 +50,8 @@ class MethodDeleted * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Payment/PaymentWasEmailed.php b/app/Events/Payment/PaymentWasEmailed.php index 284d52de4880..767918ab0388 100644 --- a/app/Events/Payment/PaymentWasEmailed.php +++ b/app/Events/Payment/PaymentWasEmailed.php @@ -11,12 +11,12 @@ namespace App\Events\Payment; +use App\Models\ClientContact; use App\Models\Company; use App\Models\Payment; -use App\Models\ClientContact; -use Illuminate\Queue\SerializesModels; -use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; +use Illuminate\Foundation\Events\Dispatchable; +use Illuminate\Queue\SerializesModels; /** * Class PaymentWasEmailed. diff --git a/app/Events/PurchaseOrder/PurchaseOrderWasViewed.php b/app/Events/PurchaseOrder/PurchaseOrderWasViewed.php index a144639a6872..c9555bd90cea 100644 --- a/app/Events/PurchaseOrder/PurchaseOrderWasViewed.php +++ b/app/Events/PurchaseOrder/PurchaseOrderWasViewed.php @@ -12,7 +12,6 @@ namespace App\Events\PurchaseOrder; use App\Models\Company; -use App\Models\PurchaseOrder; use App\Models\PurchaseOrderInvitation; use Illuminate\Queue\SerializesModels; diff --git a/app/Events/Quote/QuoteWasEmailed.php b/app/Events/Quote/QuoteWasEmailed.php index 5792167c42d9..ef8055edd465 100644 --- a/app/Events/Quote/QuoteWasEmailed.php +++ b/app/Events/Quote/QuoteWasEmailed.php @@ -12,7 +12,6 @@ namespace App\Events\Quote; use App\Models\Company; -use App\Models\Quote; use App\Models\QuoteInvitation; use Illuminate\Queue\SerializesModels; diff --git a/app/Events/Subscription/SubscriptionWasCreated.php b/app/Events/Subscription/SubscriptionWasCreated.php index 9d1616defb28..fff93b1507f0 100644 --- a/app/Events/Subscription/SubscriptionWasCreated.php +++ b/app/Events/Subscription/SubscriptionWasCreated.php @@ -5,7 +5,6 @@ namespace App\Events\Subscription; use App\Models\Company; use App\Models\Subscription; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -45,8 +44,8 @@ class SubscriptionWasCreated * * @return \Illuminate\Broadcasting\Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserLoggedIn.php b/app/Events/User/UserLoggedIn.php index f3b55c2a1c71..bddb7104ec2f 100644 --- a/app/Events/User/UserLoggedIn.php +++ b/app/Events/User/UserLoggedIn.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -35,8 +34,8 @@ class UserLoggedIn * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserWasArchived.php b/app/Events/User/UserWasArchived.php index 51657baffbfc..cb7077668f30 100644 --- a/app/Events/User/UserWasArchived.php +++ b/app/Events/User/UserWasArchived.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -35,8 +34,8 @@ class UserWasArchived * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserWasCreated.php b/app/Events/User/UserWasCreated.php index c4bba8784678..5d30fa5261eb 100644 --- a/app/Events/User/UserWasCreated.php +++ b/app/Events/User/UserWasCreated.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -35,8 +34,8 @@ class UserWasCreated * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserWasDeleted.php b/app/Events/User/UserWasDeleted.php index cae639e2088d..d7323d78d563 100644 --- a/app/Events/User/UserWasDeleted.php +++ b/app/Events/User/UserWasDeleted.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -54,8 +53,8 @@ class UserWasDeleted * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserWasRestored.php b/app/Events/User/UserWasRestored.php index 2d722fd189a0..196a73e4513c 100644 --- a/app/Events/User/UserWasRestored.php +++ b/app/Events/User/UserWasRestored.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -54,8 +53,8 @@ class UserWasRestored * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/User/UserWasUpdated.php b/app/Events/User/UserWasUpdated.php index a4eda9752c79..ef495814a736 100644 --- a/app/Events/User/UserWasUpdated.php +++ b/app/Events/User/UserWasUpdated.php @@ -15,7 +15,6 @@ use App\Models\Company; use App\Models\User; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; -use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -54,8 +53,8 @@ class UserWasUpdated * * @return Channel|array */ - public function broadcastOn() - { + public function broadcastOn() + { return []; - } + } } diff --git a/app/Events/Vendor/VendorContactLoggedIn.php b/app/Events/Vendor/VendorContactLoggedIn.php index 2422af1023a5..9a0ddad94821 100644 --- a/app/Events/Vendor/VendorContactLoggedIn.php +++ b/app/Events/Vendor/VendorContactLoggedIn.php @@ -14,9 +14,9 @@ namespace App\Events\Vendor; use App\Models\Company; use App\Models\VendorContact; use Illuminate\Broadcasting\Channel; -use Illuminate\Queue\SerializesModels; -use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; +use Illuminate\Foundation\Events\Dispatchable; +use Illuminate\Queue\SerializesModels; /** * Class VendorContactLoggedIn. diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 4e8f339a3916..e993581e5af2 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -11,31 +11,31 @@ namespace App\Exceptions; -use Throwable; -use PDOException; use App\Utils\Ninja; -use Sentry\State\Scope; -use Illuminate\Support\Arr; -use Illuminate\Http\Request; -use InvalidArgumentException; -use Sentry\Laravel\Integration; -use Illuminate\Support\Facades\Schema; use Aws\Exception\CredentialsException; use GuzzleHttp\Exception\ConnectException; -use Illuminate\Auth\AuthenticationException; -use League\Flysystem\UnableToCreateDirectory; -use Illuminate\Session\TokenMismatchException; -use Illuminate\Validation\ValidationException; use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Queue\MaxAttemptsExceededException; -use Illuminate\Http\Exceptions\ThrottleRequestsException; -use Symfony\Component\Process\Exception\RuntimeException; +use Illuminate\Auth\AuthenticationException; +use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; use Illuminate\Database\Eloquent\RelationNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Illuminate\Http\Exceptions\ThrottleRequestsException; +use Illuminate\Http\Request; +use Illuminate\Queue\MaxAttemptsExceededException; +use Illuminate\Session\TokenMismatchException; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Schema; +use Illuminate\Validation\ValidationException; +use InvalidArgumentException; +use League\Flysystem\UnableToCreateDirectory; +use PDOException; +use Sentry\Laravel\Integration; +use Sentry\State\Scope; use Symfony\Component\Console\Exception\CommandNotFoundException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; -use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\Process\Exception\RuntimeException; +use Throwable; class Handler extends ExceptionHandler { @@ -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/Exceptions/PaymentRefundFailed.php b/app/Exceptions/PaymentRefundFailed.php index 28e00858e867..9ba3a922fb30 100644 --- a/app/Exceptions/PaymentRefundFailed.php +++ b/app/Exceptions/PaymentRefundFailed.php @@ -13,8 +13,8 @@ namespace App\Exceptions; use Exception; -use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; class PaymentRefundFailed extends Exception { diff --git a/app/Exceptions/QuoteConversion.php b/app/Exceptions/QuoteConversion.php index ceafdf8b499a..a2e11e6374ef 100644 --- a/app/Exceptions/QuoteConversion.php +++ b/app/Exceptions/QuoteConversion.php @@ -13,8 +13,8 @@ namespace App\Exceptions; use Exception; -use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; class QuoteConversion extends Exception { diff --git a/app/Exceptions/YodleeApiException.php b/app/Exceptions/YodleeApiException.php index b56eedced3bd..c8150d18cbca 100644 --- a/app/Exceptions/YodleeApiException.php +++ b/app/Exceptions/YodleeApiException.php @@ -13,8 +13,8 @@ namespace App\Exceptions; use Exception; -use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; class YodleeApiException extends Exception { diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php index 3cd1c8963273..e738f6371a27 100644 --- a/app/Export/CSV/ActivityExport.php +++ b/app/Export/CSV/ActivityExport.php @@ -11,17 +11,17 @@ namespace App\Export\CSV; -use App\Models\Task; -use App\Utils\Ninja; -use League\Csv\Writer; -use App\Models\Company; -use App\Models\Activity; use App\Libraries\MultiDB; +use App\Models\Activity; +use App\Models\Company; use App\Models\DateFormat; +use App\Models\Task; +use App\Transformers\ActivityTransformer; +use App\Utils\Ninja; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; -use Illuminate\Database\Eloquent\Builder; -use App\Transformers\ActivityTransformer; +use League\Csv\Writer; class ActivityExport extends BaseExport { @@ -53,44 +53,44 @@ class ActivityExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); - $report = $query->cursor() - ->map(function ($resource) { - $row = $this->buildActivityRow($resource); - return $this->processMetaData($row, $resource); - })->toArray(); + $report = $query->cursor() + ->map(function ($resource) { + $row = $this->buildActivityRow($resource); + return $this->processMetaData($row, $resource); + })->toArray(); return array_merge(['columns' => $header], $report); } private function buildActivityRow(Activity $activity): array { - return [ - Carbon::parse($activity->created_at)->format($this->date_format), - ctrans("texts.activity_{$activity->activity_type_id}",[ - 'payment_amount' => $activity->payment ? $activity->payment->amount : '', - 'adjustment' => $activity->payment ? $activity->payment->refunded : '', - 'client' => $activity->client ? $activity->client->present()->name() : '', - 'contact' => $activity->contact ? $activity->contact->present()->name() : '', - 'quote' => $activity->quote ? $activity->quote->number : '', - 'user' => $activity->user ? $activity->user->present()->name() : 'System', - 'expense' => $activity->expense ? $activity->expense->number : '', - 'invoice' => $activity->invoice ? $activity->invoice->number : '', - 'recurring_invoice' => $activity->recurring_invoice ? $activity->recurring_invoice->number : '', - 'payment' => $activity->payment ? $activity->payment->number : '', - 'credit' => $activity->credit ? $activity->credit->number : '', - 'task' => $activity->task ? $activity->task->number : '', - 'vendor' => $activity->vendor ? $activity->vendor->present()->name() : '', - 'purchase_order' => $activity->purchase_order ? $activity->purchase_order->number : '', - 'subscription' => $activity->subscription ? $activity->subscription->name : '', - 'vendor_contact' => $activity->vendor_contact ? $activity->vendor_contact->present()->name() : '', - 'recurring_expense' => $activity->recurring_expense ? $activity->recurring_expense->number : '', - ]), - $activity->ip, + return [ + Carbon::parse($activity->created_at)->format($this->date_format), + ctrans("texts.activity_{$activity->activity_type_id}", [ + 'payment_amount' => $activity->payment ? $activity->payment->amount : '', + 'adjustment' => $activity->payment ? $activity->payment->refunded : '', + 'client' => $activity->client ? $activity->client->present()->name() : '', + 'contact' => $activity->contact ? $activity->contact->present()->name() : '', + 'quote' => $activity->quote ? $activity->quote->number : '', + 'user' => $activity->user ? $activity->user->present()->name() : 'System', + 'expense' => $activity->expense ? $activity->expense->number : '', + 'invoice' => $activity->invoice ? $activity->invoice->number : '', + 'recurring_invoice' => $activity->recurring_invoice ? $activity->recurring_invoice->number : '', + 'payment' => $activity->payment ? $activity->payment->number : '', + 'credit' => $activity->credit ? $activity->credit->number : '', + 'task' => $activity->task ? $activity->task->number : '', + 'vendor' => $activity->vendor ? $activity->vendor->present()->name() : '', + 'purchase_order' => $activity->purchase_order ? $activity->purchase_order->number : '', + 'subscription' => $activity->subscription ? $activity->subscription->name : '', + 'vendor_contact' => $activity->vendor_contact ? $activity->vendor_contact->present()->name() : '', + 'recurring_expense' => $activity->recurring_expense ? $activity->recurring_expense->number : '', + ]), + $activity->ip, ]; } @@ -169,6 +169,6 @@ class ActivityExport extends BaseExport } return $clean_row; - } + } } diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index fa6ab80ef33f..74474b98c789 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -11,30 +11,28 @@ namespace App\Export\CSV; -use App\Models\Activity; -use App\Models\Quote; -use App\Utils\Number; use App\Models\Client; -use App\Models\Credit; -use App\Utils\Helpers; +use App\Models\ClientContact; use App\Models\Company; +use App\Models\Credit; +use App\Models\Document; use App\Models\Expense; use App\Models\Invoice; use App\Models\Payment; -use App\Models\Document; -use League\Fractal\Manager; -use App\Models\ClientContact; -use App\Models\PurchaseOrder; -use App\Models\RecurringInvoice; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; -use App\Transformers\TaskTransformer; -use App\Transformers\PaymentTransformer; -use Illuminate\Database\Eloquent\Builder; -use League\Fractal\Serializer\ArraySerializer; use App\Models\Product; +use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Models\RecurringInvoice; use App\Models\Task; use App\Models\Vendor; +use App\Transformers\PaymentTransformer; +use App\Transformers\TaskTransformer; +use App\Utils\Helpers; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Carbon; +use League\Fractal\Manager; +use League\Fractal\Serializer\ArraySerializer; class BaseExport { @@ -172,7 +170,7 @@ class BaseExport 'recurring_invoice' => 'invoice.recurring_id', ]; - protected array $recurring_invoice_report_keys = [ + protected array $recurring_invoice_report_keys = [ "invoice_number" => "recurring_invoice.number", "amount" => "recurring_invoice.amount", "balance" => "recurring_invoice.balance", @@ -446,8 +444,7 @@ class BaseExport $client = Client::withTrashed()->find($this->input['client_id']); $this->client_description = $client->present()->name; return $query->where('client_id', $this->input['client_id']); - } - elseif(isset($this->input['clients']) && count($this->input['clients']) > 0) { + } elseif(isset($this->input['clients']) && count($this->input['clients']) > 0) { $this->client_description = 'Multiple Clients'; return $query->whereIn('client_id', $this->input['clients']); @@ -459,8 +456,9 @@ class BaseExport { $parts = explode(".", $key); - if(!is_array($parts) || count($parts) < 2) + if(!is_array($parts) || count($parts) < 2) { return ''; + } $value = ''; @@ -497,8 +495,9 @@ class BaseExport private function resolveVendorContactKey($column, $entity, $transformer) { - if(!$entity->vendor) + if(!$entity->vendor) { return ""; + } $primary_contact = $entity->vendor->primary_contact()->first() ?? $entity->vendor->contacts()->first(); @@ -510,18 +509,21 @@ class BaseExport private function resolveExpenseKey($column, $entity, $transformer) { - if($column == 'user' && $entity?->expense?->user) + if($column == 'user' && $entity?->expense?->user) { return $entity->expense->user->present()->name() ?? ' '; + } - if($column == 'assigned_user' && $entity?->expense?->assigned_user) + if($column == 'assigned_user' && $entity?->expense?->assigned_user) { return $entity->expense->assigned_user->present()->name() ?? ' '; + } if($column == 'category' && $entity->expense) { return $entity->expense->category?->name ?? ' '; } - if($entity instanceof Expense) + if($entity instanceof Expense) { return ''; + } $transformed_entity = $transformer->includeExpense($entity); @@ -529,11 +531,13 @@ class BaseExport $manager->setSerializer(new ArraySerializer()); $transformed_entity = $manager->createData($transformed_entity)->toArray(); - if(array_key_exists($column, $transformed_entity)) - return $transformed_entity[$column]; + if(array_key_exists($column, $transformed_entity)) { + return $transformed_entity[$column]; + } - if(property_exists($entity, $column)) + if(property_exists($entity, $column)) { return $entity?->{$column} ?? ''; + } nlog("export: Could not resolve expense key: {$column}"); @@ -560,8 +564,9 @@ class BaseExport private function resolveVendorKey($column, $entity, $transformer) { - if(!$entity->vendor) + if(!$entity->vendor) { return ''; + } $transformed_entity = $transformer->includeVendor($entity); @@ -569,24 +574,29 @@ class BaseExport $manager->setSerializer(new ArraySerializer()); $transformed_entity = $manager->createData($transformed_entity)->toArray(); - if($column == 'name') + if($column == 'name') { return $entity->vendor->present()->name() ?: ''; + } - if($column == 'user_id') + if($column == 'user_id') { return $entity->vendor->user->present()->name() ?: ''; + } - if($column == 'country_id') + if($column == 'country_id') { return $entity->vendor->country ? ctrans("texts.country_{$entity->vendor->country->name}") : ''; + } if ($column == 'currency_id') { return $entity->vendor->currency() ? $entity->vendor->currency()->code : $entity->company->currency()->code; } - if($column == 'status') + if($column == 'status') { return $entity->stringStatus($entity->status_id) ?: ''; + } - if(array_key_exists($column, $transformed_entity)) + if(array_key_exists($column, $transformed_entity)) { return $transformed_entity[$column]; + } // nlog("export: Could not resolve vendor key: {$column}"); @@ -598,8 +608,9 @@ class BaseExport private function resolveClientKey($column, $entity, $transformer) { - if(!$entity->client) + if(!$entity->client) { return ''; + } $transformed_client = $transformer->includeClient($entity); @@ -607,36 +618,46 @@ class BaseExport $manager->setSerializer(new ArraySerializer()); $transformed_client = $manager->createData($transformed_client)->toArray(); - if(in_array($column, ['client.name', 'name'])) + if(in_array($column, ['client.name', 'name'])) { return $transformed_client['display_name']; + } - if(in_array($column, ['client.user_id', 'user_id'])) + if(in_array($column, ['client.user_id', 'user_id'])) { return $entity->client->user->present()->name(); + } - if(in_array($column, ['client.assigned_user_id', 'assigned_user_id'])) + if(in_array($column, ['client.assigned_user_id', 'assigned_user_id'])) { return $entity->client->assigned_user->present()->name(); + } - if(in_array($column, ['client.country_id', 'country_id'])) + if(in_array($column, ['client.country_id', 'country_id'])) { return $entity->client->country ? ctrans("texts.country_{$entity->client->country->name}") : ''; + } - if(in_array($column, ['client.shipping_country_id', 'shipping_country_id'])) + if(in_array($column, ['client.shipping_country_id', 'shipping_country_id'])) { return $entity->client->shipping_country ? ctrans("texts.country_{$entity->client->shipping_country->name}") : ''; + } - if(in_array($column, ['client.size_id', 'size_id'])) + if(in_array($column, ['client.size_id', 'size_id'])) { return $entity->client->size?->name ?? ''; + } - if(in_array($column, ['client.industry_id', 'industry_id'])) + if(in_array($column, ['client.industry_id', 'industry_id'])) { return $entity->client->industry?->name ?? ''; + } - if (in_array($column, ['client.currency_id', 'currency_id'])) + if (in_array($column, ['client.currency_id', 'currency_id'])) { return $entity->client->currency() ? $entity->client->currency()->code : $entity->company->currency()->code; + } - if(in_array($column, ['payment_terms', 'client.payment_terms'])) + if(in_array($column, ['payment_terms', 'client.payment_terms'])) { return $entity->client->getSetting('payment_terms'); + } - if(array_key_exists($column, $transformed_client)) + if(array_key_exists($column, $transformed_client)) { return $transformed_client[$column]; + } // nlog("export: Could not resolve client key: {$column}"); @@ -650,8 +671,9 @@ class BaseExport $transformed_entity = $transformer->transform($entity); - if($column == 'status') + if($column == 'status') { return $entity->stringStatus($entity->status_id); + } return ''; } @@ -682,16 +704,19 @@ class BaseExport $manager->setSerializer(new ArraySerializer()); $transformed_invoices = $manager->createData($transformed_invoices)->toArray(); - if(!isset($transformed_invoices['App\\Models\\Invoice'])) + if(!isset($transformed_invoices['App\\Models\\Invoice'])) { return ''; + } $transformed_invoices = $transformed_invoices['App\\Models\\Invoice']; - if(count($transformed_invoices) == 1 && array_key_exists($column, $transformed_invoices[0])) + if(count($transformed_invoices) == 1 && array_key_exists($column, $transformed_invoices[0])) { return $transformed_invoices[0][$column]; + } - if(count($transformed_invoices) > 1 && array_key_exists($column, $transformed_invoices[0])) + if(count($transformed_invoices) > 1 && array_key_exists($column, $transformed_invoices[0])) { return implode(', ', array_column($transformed_invoices, $column)); + } return ""; @@ -700,8 +725,9 @@ class BaseExport if($transformer instanceof TaskTransformer && ($entity->invoice ?? false)) { $transformed_invoice = $transformer->includeInvoice($entity); - if(!$transformed_invoice) + if(!$transformed_invoice) { return ''; + } $manager = new Manager(); $manager->setSerializer(new ArraySerializer()); @@ -721,7 +747,7 @@ class BaseExport private function resolvePaymentKey($column, $entity, $transformer) { - if($entity instanceof Payment){ + if($entity instanceof Payment) { $transformed_payment = $transformer->transform($entity); @@ -737,8 +763,9 @@ class BaseExport } - if($column == 'amount') + if($column == 'amount') { return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.amount') : ctrans('texts.unpaid'); + } if($column == 'refunded') { return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.refunded') : ''; @@ -753,24 +780,28 @@ class BaseExport $payment = $entity->payments()->withoutTrashed()->first(); - if(!$payment) + if(!$payment) { return ''; + } - if($column == 'method') + if($column == 'method') { return $payment->translatedType(); + } - if($column == 'currency') + if($column == 'currency') { return $payment?->currency?->code ?? ''; + } $payment_transformer = new PaymentTransformer(); $transformed_payment = $payment_transformer->transform($payment); - if($column == 'status'){ + if($column == 'status') { return $payment->stringStatus($transformed_payment['status_id']); } - if(array_key_exists($column, $transformed_payment)) + if(array_key_exists($column, $transformed_payment)) { return $transformed_payment[$column]; + } return ''; @@ -782,8 +813,9 @@ class BaseExport $status_parameters = explode(',', $status); - if(in_array('all', $status_parameters)) + if(in_array('all', $status_parameters)) { return $query; + } $query->where(function ($nested) use ($status_parameters) { @@ -816,9 +848,9 @@ class BaseExport ->orWhere('partial_due_date', '<', Carbon::now()); } - if(in_array('viewed', $status_parameters)){ + if(in_array('viewed', $status_parameters)) { - $nested->whereHas('invitations', function ($q){ + $nested->whereHas('invitations', function ($q) { $q->whereNotNull('viewed_date')->whereNotNull('deleted_at'); }); @@ -884,8 +916,9 @@ class BaseExport $first_month_of_year = $this->company->getSetting('first_month_of_year') ?? 1; $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->subYearNoOverflow(); + } $this->start_date = $fin_year_start->format('Y-m-d'); $this->end_date = $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d'); @@ -896,8 +929,9 @@ class BaseExport $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); $fin_year_start->subYearNoOverflow(); - if(now()->subYear()->lt($fin_year_start)) + if(now()->subYear()->lt($fin_year_start)) { $fin_year_start->subYearNoOverflow(); + } $this->start_date = $fin_year_start->format('Y-m-d'); $this->end_date = $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d'); @@ -914,7 +948,7 @@ class BaseExport } /** - * Returns the merged array of + * Returns the merged array of * the entity with the matching * item report keys * @@ -979,8 +1013,9 @@ class BaseExport $prefix = ctrans('texts.expense')." "; $key = array_search($value, $this->expense_report_keys); - if(!$key && $value == 'expense.category') - $key = 'category'; + if(!$key && $value == 'expense.category') { + $key = 'category'; + } } if(!$key) { @@ -1024,42 +1059,36 @@ class BaseExport $key = str_replace('product.', '', $key); $key = str_replace('task.', '', $key); - if(stripos($value, 'custom_value') !== false) - { + if(stripos($value, 'custom_value') !== false) { $parts = explode(".", $value); - if(count($parts) == 2 && in_array($parts[0], ['credit','quote','invoice','purchase_order','recurring_invoice'])){ + if(count($parts) == 2 && in_array($parts[0], ['credit','quote','invoice','purchase_order','recurring_invoice'])) { $entity = "invoice".substr($parts[1], -1); $prefix = ctrans("texts.".$parts[0]); $fallback = "custom_value".substr($parts[1], -1); $custom_field_label = $helper->makeCustomField($this->company->custom_fields, $entity); - if(strlen($custom_field_label) > 1) + if(strlen($custom_field_label) > 1) { $header[] = $custom_field_label; - else { + } else { $header[] = $prefix . " ". ctrans("texts.{$fallback}"); } - } - elseif(count($parts) == 2 && (stripos($parts[0], 'vendor_contact') !== false || stripos($parts[0], 'contact') !== false)) { + } elseif(count($parts) == 2 && (stripos($parts[0], 'vendor_contact') !== false || stripos($parts[0], 'contact') !== false)) { $parts[0] = str_replace('vendor_contact', 'contact', $parts[0]); $entity = "contact".substr($parts[1], -1); $custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, $entity)) > 1 ? $helper->makeCustomField($this->company->custom_fields, $entity) : ctrans("texts.{$parts[1]}"); $header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string; - } - elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice','task'])){ - $custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1))) > 1 ? $helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1)) : ctrans("texts.{$parts[1]}"); + } elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice','task'])) { + $custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, "product".substr($original_key, -1))) > 1 ? $helper->makeCustomField($this->company->custom_fields, "product".substr($original_key, -1)) : ctrans("texts.{$parts[1]}"); $header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string; - } - else{ + } else { $header[] = "{$prefix}" . ctrans("texts.{$key}"); } - } - else - { + } else { $header[] = "{$prefix}" . ctrans("texts.{$key}"); } } @@ -1104,7 +1133,7 @@ class BaseExport $value = 'image'; } - if($value == 'tax_id') { + if($value == 'tax_id') { $column_key = 'tax_category'; $value = 'tax_category'; } @@ -1119,7 +1148,7 @@ class BaseExport } return $clean_row; - } + } public function processItemMetaData(array $row, $resource): array { @@ -1146,11 +1175,13 @@ class BaseExport $column_key = $value; - if($value == 'type_id' || $value == 'item.type_id') + if($value == 'type_id' || $value == 'item.type_id') { $column_key = 'type'; + } - if($value == 'tax_id' || $value == 'item.tax_id') + if($value == 'tax_id' || $value == 'item.tax_id') { $column_key = 'tax_category'; + } $clean_row[$key]['entity'] = $report_keys[0]; $clean_row[$key]['id'] = $report_keys[1] ?? $report_keys[0]; @@ -1162,6 +1193,6 @@ class BaseExport } return $clean_row; - } + } } diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index 16f9ca154d70..29178f5236e8 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -11,16 +11,16 @@ namespace App\Export\CSV; +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\Transformers\ClientTransformer; use Illuminate\Database\Eloquent\Builder; -use App\Transformers\ClientContactTransformer; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class ClientExport extends BaseExport { @@ -92,9 +92,9 @@ class ClientExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($client) { @@ -126,7 +126,7 @@ class ClientExport extends BaseExport $query = $this->addDateRange($query); - return $query; + return $query; } @@ -191,10 +191,11 @@ class ClientExport extends BaseExport $clean_row[$key]['value'] = $row[$column_key]; $clean_row[$key]['identifier'] = $value; - if(in_array($clean_row[$key]['id'], ['paid_to_date', 'balance', 'credit_balance','payment_balance'])) + if(in_array($clean_row[$key]['id'], ['paid_to_date', 'balance', 'credit_balance','payment_balance'])) { $clean_row[$key]['display_value'] = Number::formatMoney($row[$column_key], $resource); - else + } else { $clean_row[$key]['display_value'] = $row[$column_key]; + } } diff --git a/app/Export/CSV/ContactExport.php b/app/Export/CSV/ContactExport.php index e07cf64d328d..558c69331958 100644 --- a/app/Export/CSV/ContactExport.php +++ b/app/Export/CSV/ContactExport.php @@ -88,9 +88,9 @@ class ContactExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($contact) { diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index c5c05f3c23e2..d0a29ea3c780 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -11,15 +11,15 @@ namespace App\Export\CSV; +use App\Libraries\MultiDB; +use App\Models\Company; +use App\Models\Credit; +use App\Transformers\CreditTransformer; use App\Utils\Ninja; use App\Utils\Number; -use App\Models\Credit; -use League\Csv\Writer; -use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Support\Facades\App; -use App\Transformers\CreditTransformer; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class CreditExport extends BaseExport { @@ -43,9 +43,9 @@ class CreditExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($credit) { @@ -70,10 +70,11 @@ class CreditExport extends BaseExport $clean_row[$key]['value'] = $row[$column_key]; $clean_row[$key]['identifier'] = $value; - if(in_array($clean_row[$key]['id'], ['paid_to_date','total_taxes','amount', 'balance', 'partial', 'refunded', 'applied','unit_cost','cost','price'])) + if(in_array($clean_row[$key]['id'], ['paid_to_date','total_taxes','amount', 'balance', 'partial', 'refunded', 'applied','unit_cost','cost','price'])) { $clean_row[$key]['display_value'] = Number::formatMoney($row[$column_key], $resource->client); - else + } else { $clean_row[$key]['display_value'] = $row[$column_key]; + } } @@ -139,10 +140,9 @@ class CreditExport extends BaseExport $entity[$keyval] = $transformed_credit[$credit_key]; } elseif (isset($transformed_credit[$keyval])) { $entity[$keyval] = $transformed_credit[$keyval]; - } elseif(isset($transformed_credit[$searched_credit_key])){ + } elseif(isset($transformed_credit[$searched_credit_key])) { $entity[$keyval] = $transformed_credit[$searched_credit_key]; - } - else { + } else { $entity[$keyval] = $this->resolveKey($keyval, $credit, $this->credit_transformer); } diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index cc4482c063d3..a5518da707bc 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -49,9 +49,9 @@ class DocumentExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($document) { diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 7b51401629b7..ee8d5bf0c729 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -43,9 +43,9 @@ class ExpenseExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 4dc4ee3d8b94..4773ec3aa2de 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -11,16 +11,14 @@ namespace App\Export\CSV; -use App\Utils\Ninja; -use App\Utils\Number; -use League\Csv\Writer; +use App\Libraries\MultiDB; use App\Models\Company; use App\Models\Invoice; -use App\Libraries\MultiDB; -use App\Export\CSV\BaseExport; -use Illuminate\Support\Facades\App; use App\Transformers\InvoiceTransformer; +use App\Utils\Ninja; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class InvoiceExport extends BaseExport { @@ -74,9 +72,9 @@ class InvoiceExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index ba2dc00da4f5..8ccc8a39ff55 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -82,9 +82,9 @@ class InvoiceItemExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $query->cursor() @@ -131,7 +131,7 @@ class InvoiceItemExport extends BaseExport $transformed_items = []; foreach ($invoice->line_items as $item) { - $item_array = []; + $item_array = []; foreach (array_values(array_intersect($this->input['report_keys'], $this->item_report_keys)) as $key) { //items iterator produces item array @@ -139,16 +139,17 @@ class InvoiceItemExport extends BaseExport $tmp_key = str_replace("item.", "", $key); - if($tmp_key == 'type_id') + if($tmp_key == 'type_id') { $tmp_key = 'type'; + } - if($tmp_key == 'tax_id') + if($tmp_key == 'tax_id') { $tmp_key = 'tax_category'; + } if (property_exists($item, $tmp_key)) { $item_array[$key] = $item->{$tmp_key}; - } - else { + } else { $item_array[$key] = ''; } } @@ -174,15 +175,15 @@ class InvoiceItemExport extends BaseExport $parts = explode('.', $key); - if(is_array($parts) && $parts[0] == 'item') + if(is_array($parts) && $parts[0] == 'item') { continue; + } if (is_array($parts) && $parts[0] == 'invoice' && array_key_exists($parts[1], $transformed_invoice)) { $entity[$key] = $transformed_invoice[$parts[1]]; - }else if (array_key_exists($key, $transformed_invoice)) { + } elseif (array_key_exists($key, $transformed_invoice)) { $entity[$key] = $transformed_invoice[$key]; - } - else { + } else { $entity[$key] = $this->resolveKey($key, $invoice, $this->invoice_transformer); } } diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index d36c31b54e60..7963cb76be6c 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -41,14 +41,14 @@ class ProductExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { $row = $this->buildRow($resource); - return $this->processMetaData($row, $resource); + return $this->processMetaData($row, $resource); })->toArray(); return array_merge(['columns' => $header], $report); diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index 45e8a6adb1b7..5f2ba4fbc1e2 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -11,15 +11,14 @@ namespace App\Export\CSV; -use App\Utils\Ninja; -use App\Utils\Number; -use League\Csv\Writer; -use App\Models\Company; use App\Libraries\MultiDB; +use App\Models\Company; use App\Models\PurchaseOrder; -use Illuminate\Support\Facades\App; use App\Transformers\PurchaseOrderTransformer; +use App\Utils\Ninja; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class PurchaseOrderExport extends BaseExport { @@ -116,9 +115,9 @@ class PurchaseOrderExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index 3738ec5b6dd0..1351be356296 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -11,14 +11,14 @@ namespace App\Export\CSV; -use App\Utils\Ninja; -use League\Csv\Writer; -use App\Models\Company; use App\Libraries\MultiDB; +use App\Models\Company; use App\Models\PurchaseOrder; -use Illuminate\Support\Facades\App; -use Illuminate\Database\Eloquent\Builder; use App\Transformers\PurchaseOrderTransformer; +use App\Utils\Ninja; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class PurchaseOrderItemExport extends BaseExport { @@ -74,21 +74,21 @@ class PurchaseOrderItemExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $query->cursor() ->each(function ($resource) { - $this->iterateItems($resource); + $this->iterateItems($resource); - foreach($this->storage_array as $row) { - $this->storage_item_array[] = $this->processItemMetaData($row, $resource); - } + foreach($this->storage_array as $row) { + $this->storage_item_array[] = $this->processItemMetaData($row, $resource); + } - $this->storage_array = []; + $this->storage_array = []; - }); + }); return array_merge(['columns' => $header], $this->storage_item_array); } diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index 0db08629c664..fe8cbb593a71 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -76,23 +76,23 @@ class QuoteItemExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); - $query->cursor() - ->each(function ($resource) { - $this->iterateItems($resource); + $query->cursor() + ->each(function ($resource) { + $this->iterateItems($resource); - foreach($this->storage_array as $row) { - $this->storage_item_array[] = $this->processItemMetaData($row, $resource); - } + foreach($this->storage_array as $row) { + $this->storage_item_array[] = $this->processItemMetaData($row, $resource); + } - $this->storage_array = []; + $this->storage_array = []; - }); + }); - return array_merge(['columns' => $header], $this->storage_item_array); + return array_merge(['columns' => $header], $this->storage_item_array); } @@ -103,7 +103,7 @@ class QuoteItemExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); - $query = $this->init(); + $query = $this->init(); //insert the header $this->csv->insertOne($this->buildHeader()); @@ -127,7 +127,7 @@ class QuoteItemExport extends BaseExport $transformed_items = []; foreach ($quote->line_items as $item) { - $item_array = []; + $item_array = []; foreach (array_values(array_intersect($this->input['report_keys'], $this->item_report_keys)) as $key) { //items iterator produces item array @@ -135,16 +135,17 @@ class QuoteItemExport extends BaseExport $tmp_key = str_replace("item.", "", $key); - if($tmp_key == 'type_id') + if($tmp_key == 'type_id') { $tmp_key = 'type'; + } - if($tmp_key == 'tax_id') + if($tmp_key == 'tax_id') { $tmp_key = 'tax_category'; + } if (property_exists($item, $tmp_key)) { $item_array[$key] = $item->{$tmp_key}; - } - else { + } else { $item_array[$key] = ''; } } diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index 3234b0674337..b88601ba997b 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -88,9 +88,9 @@ class RecurringInvoiceExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index b2eb6425c527..7d8271d86003 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -101,17 +101,16 @@ class TaskExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $query->cursor() ->each(function ($resource) { $this->buildRow($resource); - foreach($this->storage_array as $row) - { + foreach($this->storage_array as $row) { $this->storage_item_array[] = $this->processMetaData($row, $resource); } diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index 062c09187d30..259f53c59c72 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -12,8 +12,8 @@ namespace App\Export\CSV; use App\Libraries\MultiDB; -use App\Models\Vendor; use App\Models\Company; +use App\Models\Vendor; use App\Transformers\VendorContactTransformer; use App\Transformers\VendorTransformer; use App\Utils\Ninja; @@ -73,9 +73,9 @@ class VendorExport extends BaseExport $headerdisplay = $this->buildHeader(); - $header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){ - return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; - })->toArray(); + $header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) { + return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; + })->toArray(); $report = $query->cursor() ->map(function ($resource) { diff --git a/app/Factory/CompanyFactory.php b/app/Factory/CompanyFactory.php index 52324d698a5a..b48904b6d3b2 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/Factory/InvoiceItemFactory.php b/app/Factory/InvoiceItemFactory.php index 153c5baf2527..f81872dc8cdb 100644 --- a/app/Factory/InvoiceItemFactory.php +++ b/app/Factory/InvoiceItemFactory.php @@ -63,7 +63,7 @@ class InvoiceItemFactory $item->line_total = $item->quantity * $item->cost; $item->is_amount_discount = true; $item->discount = $faker->numberBetween(1, 10); - $item->notes = str_replace(['"',"'"],['',""], $faker->realText(20)); + $item->notes = str_replace(['"',"'"], ['',""], $faker->realText(20)); $item->product_key = $faker->word(); // $item->custom_value1 = $faker->realText(10); // $item->custom_value2 = $faker->realText(10); diff --git a/app/Factory/RecurringExpenseToExpenseFactory.php b/app/Factory/RecurringExpenseToExpenseFactory.php index 921130ac9118..4d6bff4c4cc1 100644 --- a/app/Factory/RecurringExpenseToExpenseFactory.php +++ b/app/Factory/RecurringExpenseToExpenseFactory.php @@ -248,10 +248,10 @@ class RecurringExpenseToExpenseFactory $final_date = now()->addMonths($output-now()->month); $output = \sprintf( - '%s %s', - $final_date->translatedFormat('F'), - $final_date->year, - ); + '%s %s', + $final_date->translatedFormat('F'), + $final_date->year, + ); } $value = preg_replace( diff --git a/app/Factory/UserFactory.php b/app/Factory/UserFactory.php index 9b15037f625c..c8fbc4f4d3d4 100644 --- a/app/Factory/UserFactory.php +++ b/app/Factory/UserFactory.php @@ -27,7 +27,7 @@ class UserFactory $user->last_login = now(); $user->failed_logins = 0; $user->signature = ''; - $user->theme_id = 0; + $user->theme_id = 0; $user->user_logged_in_notification = true; return $user; diff --git a/app/Filters/BankTransactionFilters.php b/app/Filters/BankTransactionFilters.php index 15c02a7b9768..11d27df79025 100644 --- a/app/Filters/BankTransactionFilters.php +++ b/app/Filters/BankTransactionFilters.php @@ -53,19 +53,19 @@ class BankTransactionFilters extends QueryFilters } -/** - * Filter based on client status. - * - * Statuses we need to handle - * - all - * - unmatched - * - matched - * - converted - * - deposits - * - withdrawals - * - * @return Builder - */ + /** + * Filter based on client status. + * + * Statuses we need to handle + * - all + * - unmatched + * - matched + * - converted + * - deposits + * - withdrawals + * + * @return Builder + */ public function client_status(string $value = ''): Builder { if (strlen($value) == 0) { diff --git a/app/Filters/CreditFilters.php b/app/Filters/CreditFilters.php index bd17e34819a5..a69daa60ddd4 100644 --- a/app/Filters/CreditFilters.php +++ b/app/Filters/CreditFilters.php @@ -144,7 +144,7 @@ class CreditFilters extends QueryFilters return $this->builder->company(); } -// return $this->builder->whereCompanyId(auth()->user()->company()->id); + // return $this->builder->whereCompanyId(auth()->user()->company()->id); } /** diff --git a/app/Filters/DesignFilters.php b/app/Filters/DesignFilters.php index e1abed8c9a1b..bd489b05c41f 100644 --- a/app/Filters/DesignFilters.php +++ b/app/Filters/DesignFilters.php @@ -77,7 +77,7 @@ class DesignFilters extends QueryFilters /** @var \App\Models\User $user */ $user = auth()->user(); - return $this->builder->where(function ($query) use($user){ + return $this->builder->where(function ($query) use ($user) { $query->where('company_id', $user->company()->id)->orWhere('company_id', null)->orderBy('id', 'asc'); }); } diff --git a/app/Filters/ExpenseFilters.php b/app/Filters/ExpenseFilters.php index a2ddc98e3cd0..264be55d037e 100644 --- a/app/Filters/ExpenseFilters.php +++ b/app/Filters/ExpenseFilters.php @@ -40,8 +40,8 @@ class ExpenseFilters extends QueryFilters ->orWhere('custom_value3', 'like', '%'.$filter.'%') ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('category', function ($q) use ($filter) { - $q->where('name', 'like', '%'.$filter.'%'); - }); + $q->where('name', 'like', '%'.$filter.'%'); + }); }); } @@ -125,9 +125,9 @@ class ExpenseFilters extends QueryFilters $search_key = $split[0] == 'client' ? 'client_id' : 'project_id'; - return $this->builder->whereHas('invoice', function ($query) use ($search_key, $split){ - $query->where($search_key, $this->decodePrimaryKey($split[1])) - ->whereIn('status_id', [\App\Models\Invoice::STATUS_DRAFT, \App\Models\Invoice::STATUS_SENT, \App\Models\Invoice::STATUS_PARTIAL]); + return $this->builder->whereHas('invoice', function ($query) use ($search_key, $split) { + $query->where($search_key, $this->decodePrimaryKey($split[1])) + ->whereIn('status_id', [\App\Models\Invoice::STATUS_DRAFT, \App\Models\Invoice::STATUS_SENT, \App\Models\Invoice::STATUS_PARTIAL]); }); } diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index 91e426192fde..58af558b99b8 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -11,14 +11,13 @@ namespace App\Filters; -use RuntimeException; use App\Models\Client; use App\Models\Invoice; -use App\Filters\QueryFilters; -use InvalidArgumentException; -use Illuminate\Support\Carbon; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Carbon; +use InvalidArgumentException; +use RuntimeException; /** * InvoiceFilters. @@ -241,15 +240,13 @@ class InvoiceFilters extends QueryFilters return $this->builder; } - try{ + try { $start_date = Carbon::parse($parts[1]); $end_date = Carbon::parse($parts[2]); return $this->builder->whereBetween($parts[0], [$start_date, $end_date]); - } - - catch(\Exception $e){ + } catch(\Exception $e) { return $this->builder; } diff --git a/app/Filters/PaymentFilters.php b/app/Filters/PaymentFilters.php index bc16744d4be8..dbdb839bde88 100644 --- a/app/Filters/PaymentFilters.php +++ b/app/Filters/PaymentFilters.php @@ -12,9 +12,8 @@ namespace App\Filters; use App\Models\Payment; -use Illuminate\Support\Carbon; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Contracts\Database\Eloquent\Builder as EloquentBuilder; +use Illuminate\Support\Carbon; /** * PaymentFilters. @@ -37,39 +36,39 @@ class PaymentFilters extends QueryFilters return $this->builder->where(function ($query) use ($filter) { $query->where('amount', 'like', '%'.$filter.'%') ->orWhere('date', 'like', '%'.$filter.'%') - ->orWhere('number','like', '%'.$filter.'%') + ->orWhere('number', 'like', '%'.$filter.'%') ->orWhere('transaction_reference', 'like', '%'.$filter.'%') ->orWhere('custom_value1', 'like', '%'.$filter.'%') ->orWhere('custom_value2', 'like', '%'.$filter.'%') ->orWhere('custom_value3', 'like', '%'.$filter.'%') ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { - $q->where('name', 'like', '%'.$filter.'%'); - }) + $q->where('name', 'like', '%'.$filter.'%'); + }) ->orWhereHas('client.contacts', function ($q) use ($filter) { - $q->where('first_name', 'like', '%'.$filter.'%') - ->orWhere('last_name', 'like', '%'.$filter.'%') - ->orWhere('email', 'like', '%'.$filter.'%'); - }); + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } - /** - * Filter based on client status. - * - * Statuses we need to handle - * - all - * - pending - * - cancelled - * - failed - * - completed - * - partially refunded - * - refunded - * - * @param string $value The payment status as seen by the client - * @return Builder - */ + /** + * Filter based on client status. + * + * Statuses we need to handle + * - all + * - pending + * - cancelled + * - failed + * - completed + * - partially refunded + * - refunded + * + * @param string $value The payment status as seen by the client + * @return Builder + */ public function client_status(string $value = ''): Builder { if (strlen($value) == 0) { @@ -190,15 +189,13 @@ class PaymentFilters extends QueryFilters return $this->builder; } - try{ + try { $start_date = Carbon::parse($parts[1]); $end_date = Carbon::parse($parts[2]); return $this->builder->whereBetween($parts[0], [$start_date, $end_date]); - } - - catch(\Exception $e){ + } catch(\Exception $e) { return $this->builder; } diff --git a/app/Filters/PurchaseOrderFilters.php b/app/Filters/PurchaseOrderFilters.php index 8948a619f451..0d5c1244987a 100644 --- a/app/Filters/PurchaseOrderFilters.php +++ b/app/Filters/PurchaseOrderFilters.php @@ -145,7 +145,7 @@ class PurchaseOrderFilters extends QueryFilters return $this->builder->company(); } -// return $this->builder->whereCompanyId(auth()->user()->company()->id); + // return $this->builder->whereCompanyId(auth()->user()->company()->id); } /** diff --git a/app/Filters/QuoteFilters.php b/app/Filters/QuoteFilters.php index 220960a219d8..c28d0450cbfd 100644 --- a/app/Filters/QuoteFilters.php +++ b/app/Filters/QuoteFilters.php @@ -42,10 +42,10 @@ class QuoteFilters extends QueryFilters $q->where('name', 'like', '%'.$filter.'%'); }) ->orWhereHas('client.contacts', function ($q) use ($filter) { - $q->where('first_name', 'like', '%'.$filter.'%') - ->orWhere('last_name', 'like', '%'.$filter.'%') - ->orWhere('email', 'like', '%'.$filter.'%'); - }); + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } @@ -146,7 +146,7 @@ class QuoteFilters extends QueryFilters return $this->builder; } - if($sort_col[0] == 'client_id'){ + if($sort_col[0] == 'client_id') { return $this->builder->orderBy(\App\Models\Client::select('name') ->whereColumn('clients.id', 'quotes.client_id'), $sort_col[1]); diff --git a/app/Filters/RecurringInvoiceFilters.php b/app/Filters/RecurringInvoiceFilters.php index 71fcca9d101f..81060eed6123 100644 --- a/app/Filters/RecurringInvoiceFilters.php +++ b/app/Filters/RecurringInvoiceFilters.php @@ -34,20 +34,20 @@ class RecurringInvoiceFilters extends QueryFilters } return $this->builder->where(function ($query) use ($filter) { - $query->where('date', 'like', '%'.$filter.'%') - ->orWhere('amount', 'like', '%'.$filter.'%') - ->orWhere('custom_value1', 'like', '%'.$filter.'%') - ->orWhere('custom_value2', 'like', '%'.$filter.'%') - ->orWhere('custom_value3', 'like', '%'.$filter.'%') - ->orWhere('custom_value4', 'like', '%'.$filter.'%') - ->orWhereHas('client', function ($q) use ($filter) { - $q->where('name', 'like', '%'.$filter.'%'); - }) - ->orWhereHas('client.contacts', function ($q) use ($filter) { - $q->where('first_name', 'like', '%'.$filter.'%') - ->orWhere('last_name', 'like', '%'.$filter.'%') - ->orWhere('email', 'like', '%'.$filter.'%'); - }); + $query->where('date', 'like', '%'.$filter.'%') + ->orWhere('amount', 'like', '%'.$filter.'%') + ->orWhere('custom_value1', 'like', '%'.$filter.'%') + ->orWhere('custom_value2', 'like', '%'.$filter.'%') + ->orWhere('custom_value3', 'like', '%'.$filter.'%') + ->orWhere('custom_value4', 'like', '%'.$filter.'%') + ->orWhereHas('client', function ($q) use ($filter) { + $q->where('name', 'like', '%'.$filter.'%'); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } diff --git a/app/Filters/TaskFilters.php b/app/Filters/TaskFilters.php index 481fb4429902..eb3ca35c414b 100644 --- a/app/Filters/TaskFilters.php +++ b/app/Filters/TaskFilters.php @@ -41,16 +41,16 @@ class TaskFilters extends QueryFilters ->orWhere('custom_value3', 'like', '%'.$filter.'%') ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('project', function ($q) use ($filter) { - $q->where('name', 'like', '%'.$filter.'%'); - }) + $q->where('name', 'like', '%'.$filter.'%'); + }) ->orWhereHas('client', function ($q) use ($filter) { - $q->where('name', 'like', '%'.$filter.'%'); - }) + $q->where('name', 'like', '%'.$filter.'%'); + }) ->orWhereHas('client.contacts', function ($q) use ($filter) { - $q->where('first_name', 'like', '%'.$filter.'%') - ->orWhere('last_name', 'like', '%'.$filter.'%') - ->orWhere('email', 'like', '%'.$filter.'%'); - }); + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } @@ -136,7 +136,7 @@ class TaskFilters extends QueryFilters $status_parameters = explode(',', $value); - if(count($status_parameters) >= 1){ + if(count($status_parameters) >= 1) { $this->builder->where(function ($query) use ($status_parameters) { $query->whereIn('status_id', $this->transformKeys($status_parameters))->whereNull('invoice_id'); diff --git a/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php b/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php index 346496411f4a..d7357c9fe3e1 100644 --- a/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php +++ b/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php @@ -11,10 +11,9 @@ namespace App\Helpers\Bank\Yodlee\DTO; -use Spatie\LaravelData\Data; -use Spatie\LaravelData\Attributes\MapInputName; -use Spatie\LaravelData\Attributes\MapOutputName; use Illuminate\Support\Collection; +use Spatie\LaravelData\Attributes\MapInputName; +use Spatie\LaravelData\Data; /** * [ @@ -72,40 +71,40 @@ use Illuminate\Support\Collection; */ class AccountSummary extends Data { - public ?int $id; + public ?int $id; - #[MapInputName('CONTAINER')] - public ?string $account_type = ''; + #[MapInputName('CONTAINER')] + public ?string $account_type = ''; - #[MapInputName('accountName')] - public ?string $account_name = ''; + #[MapInputName('accountName')] + public ?string $account_name = ''; - #[MapInputName('accountStatus')] - public ?string $account_status = ''; + #[MapInputName('accountStatus')] + public ?string $account_status = ''; - #[MapInputName('accountNumber')] - public ?string $account_number = ''; + #[MapInputName('accountNumber')] + public ?string $account_number = ''; - #[MapInputName('providerAccountId')] - public int $provider_account_id; + #[MapInputName('providerAccountId')] + public int $provider_account_id; - #[MapInputName('providerId')] - public ?string $provider_id = ''; + #[MapInputName('providerId')] + public ?string $provider_id = ''; - #[MapInputName('providerName')] - public ?string $provider_name = ''; + #[MapInputName('providerName')] + public ?string $provider_name = ''; - public ?string $nickname = ''; + public ?string $nickname = ''; - public ?float $current_balance = 0; - public ?string $account_currency = ''; + public ?float $current_balance = 0; + public ?string $account_currency = ''; - public static function prepareForPipeline(Collection $properties) : Collection - { + public static function prepareForPipeline(Collection $properties) : Collection + { - $properties->put('current_balance', $properties['currentBalance']['amount'] ?? 0); - $properties->put('account_currency', $properties['currentBalance']['currency'] ?? 0); + $properties->put('current_balance', $properties['currentBalance']['amount'] ?? 0); + $properties->put('account_currency', $properties['currentBalance']['currency'] ?? 0); - return $properties; - } -} \ No newline at end of file + return $properties; + } +} diff --git a/app/Helpers/Bank/Yodlee/Transformer/AccountTransformer.php b/app/Helpers/Bank/Yodlee/Transformer/AccountTransformer.php index ceb1417c7530..9c44c3784b99 100644 --- a/app/Helpers/Bank/Yodlee/Transformer/AccountTransformer.php +++ b/app/Helpers/Bank/Yodlee/Transformer/AccountTransformer.php @@ -88,20 +88,19 @@ class AccountTransformer implements AccountTransformerInterface if(property_exists($account, 'currentBalance')) { $current_balance = $account->currentBalance->amount ?? 0; $account_currency = $account->currentBalance->currency ?? ''; - } - elseif(property_exists($account, 'balance')){ + } elseif(property_exists($account, 'balance')) { $current_balance = $account->balance->amount ?? 0; $account_currency = $account->balance->currency ?? ''; } $account_status = $account->accountStatus; - if(property_exists($account, 'dataset')){ + if(property_exists($account, 'dataset')) { $dataset = $account->dataset[0]; $status = false; $update = false; - match($dataset->additionalStatus ?? ''){ + match($dataset->additionalStatus ?? '') { 'LOGIN_IN_PROGRESS' => $status = 'Data retrieval in progress.', 'USER_INPUT_REQUIRED' => $status = 'Please reconnect your account, authentication required.', 'LOGIN_SUCCESS' => $status = 'Data retrieval in progress', @@ -113,24 +112,23 @@ class AccountTransformer implements AccountTransformerInterface 'PARTIAL_DATA_RETRIEVED' => $status = 'Partial data update failed.', 'PARTIAL_DATA_RETRIEVED_REM_SCHED' => $status = 'Partial data update failed.', 'SUCCESS' => $status = 'All accounts added or updated successfully.', - default => $status = false + default => $status = false }; - if($status){ + if($status) { $account_status = $status; } - match($dataset->updateEligibility ?? ''){ + match($dataset->updateEligibility ?? '') { 'ALLOW_UPDATE' => $update = 'Account connection stable.', 'ALLOW_UPDATE_WITH_CREDENTIALS' => $update = 'Please reconnect your account with updated credentials.', 'DISALLOW_UPDATE' => $update = 'Update not available due to technical issues.', default => $update = false, }; - if($status && $update){ + if($status && $update) { $account_status = $status . ' - ' . $update; - } - elseif($update){ + } elseif($update) { $account_status = $update; } diff --git a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php index 48966aa20382..73f9e7fe31d0 100644 --- a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php +++ b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php @@ -127,12 +127,14 @@ class IncomeTransformer implements BankRevenueInterface foreach ($transaction->transaction as $transaction) { //do not store duplicate / pending transactions - if (property_exists($transaction, 'status') && $transaction->status == 'PENDING') + if (property_exists($transaction, 'status') && $transaction->status == 'PENDING') { continue; + } //some object do no store amounts ignore these - if(!property_exists($transaction, 'amount')) + if(!property_exists($transaction, 'amount')) { continue; + } $data[] = $this->transformTransaction($transaction); } diff --git a/app/Helpers/Bank/Yodlee/Yodlee.php b/app/Helpers/Bank/Yodlee/Yodlee.php index f8294becd97e..6b15e1b2d56f 100644 --- a/app/Helpers/Bank/Yodlee/Yodlee.php +++ b/app/Helpers/Bank/Yodlee/Yodlee.php @@ -300,7 +300,7 @@ class Yodlee /** * updateEligibility - * + * * ALLOW_UPDATE * ALLOW_UPDATE_WITH_CREDENTIALS * DISALLOW_UPDATE @@ -308,7 +308,7 @@ class Yodlee /** * additionalStatus - * + * * LOGIN_IN_PROGRESS * DATA_RETRIEVAL_IN_PROGRESS * ACCT_SUMMARY_RECEIVED @@ -339,7 +339,7 @@ class Yodlee * CONSENT_REVOKED * INCORRECT_OAUTH_TOKEN * MIGRATION_IN_PROGRESS - */ + */ /** * IN_PROGRESS LOGIN_IN_PROGRESS Provider login is in progress. @@ -356,12 +356,12 @@ class Yodlee * SUCCESS All accounts under the provider was added or updated successfully. */ - /** - * updateEligibility - * - * ALLOW_UPDATE The status indicates that the account is eligible for the next update and applies to both MFA and non-MFA accounts. For MFA-based accounts, the user may have to provide the MFA details during account refresh. - * ALLOW_UPDATE_WITH_CREDENTIALS The status indicates updating or refreshing the account by directing the user to edit the provided credentials. - * DISALLOW_UPDATE The status indicates the account is not eligible for the update or refresh process due to a site issue or a technical error. - */ + /** + * updateEligibility + * + * ALLOW_UPDATE The status indicates that the account is eligible for the next update and applies to both MFA and non-MFA accounts. For MFA-based accounts, the user may have to provide the MFA details during account refresh. + * ALLOW_UPDATE_WITH_CREDENTIALS The status indicates updating or refreshing the account by directing the user to edit the provided credentials. + * DISALLOW_UPDATE The status indicates the account is not eligible for the update or refresh process due to a site issue or a technical error. + */ } diff --git a/app/Helpers/Epc/EpcQrGenerator.php b/app/Helpers/Epc/EpcQrGenerator.php index 965e2dad1f13..a8f4f1518e97 100644 --- a/app/Helpers/Epc/EpcQrGenerator.php +++ b/app/Helpers/Epc/EpcQrGenerator.php @@ -64,7 +64,7 @@ class EpcQrGenerator } catch(\Exception $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; - } catch( InvalidArgumentException $e) { + } catch(InvalidArgumentException $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; } diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index b1f7fa9e6471..c7d444b9c522 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -11,16 +11,16 @@ namespace App\Helpers\Invoice; -use App\Models\Quote; +use App\DataMapper\BaseSettings; +use App\DataMapper\InvoiceItem; +use App\DataMapper\Tax\RuleInterface; use App\Models\Client; use App\Models\Credit; use App\Models\Invoice; use App\Models\PurchaseOrder; -use App\Models\RecurringQuote; -use App\DataMapper\InvoiceItem; -use App\DataMapper\BaseSettings; +use App\Models\Quote; use App\Models\RecurringInvoice; -use App\DataMapper\Tax\RuleInterface; +use App\Models\RecurringQuote; use App\Utils\Traits\NumberFormatter; class InvoiceItemSum @@ -125,7 +125,7 @@ class InvoiceItemSum private RuleInterface $rule; - public function __construct( RecurringInvoice | Invoice | Quote | Credit | PurchaseOrder | RecurringQuote $invoice) + public function __construct(RecurringInvoice | Invoice | Quote | Credit | PurchaseOrder | RecurringQuote $invoice) { $this->tax_collection = collect([]); @@ -175,14 +175,15 @@ class InvoiceItemSum return $this; } - if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions) ) { //only calculate for supported tax jurisdictions + if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions $class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule"; $this->rule = new $class(); - if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) - return $this; + if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) { + return $this; + } $this->rule ->setEntity($this->invoice) @@ -399,7 +400,7 @@ class InvoiceItemSum $item_tax = 0; //$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)); - $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ( $this->item->line_total / $this->sub_total)) : 0; + $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)) : 0; $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount); diff --git a/app/Helpers/Invoice/InvoiceItemSumInclusive.php b/app/Helpers/Invoice/InvoiceItemSumInclusive.php index 7198abbfe8d1..7ca6fb5e2717 100644 --- a/app/Helpers/Invoice/InvoiceItemSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceItemSumInclusive.php @@ -11,14 +11,14 @@ namespace App\Helpers\Invoice; -use App\Models\Quote; +use App\DataMapper\Tax\RuleInterface; use App\Models\Client; use App\Models\Credit; use App\Models\Invoice; use App\Models\PurchaseOrder; -use App\Models\RecurringQuote; +use App\Models\Quote; use App\Models\RecurringInvoice; -use App\DataMapper\Tax\RuleInterface; +use App\Models\RecurringQuote; use App\Utils\Traits\NumberFormatter; class InvoiceItemSumInclusive @@ -404,14 +404,15 @@ class InvoiceItemSumInclusive return $this; } - if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions) ) { //only calculate for supported tax jurisdictions + if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions $class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule"; $this->rule = new $class(); - if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) - return $this; + if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) { + return $this; + } $this->rule ->setEntity($this->invoice) diff --git a/app/Helpers/Invoice/InvoiceSum.php b/app/Helpers/Invoice/InvoiceSum.php index 3f32ed486f78..3767de76c451 100644 --- a/app/Helpers/Invoice/InvoiceSum.php +++ b/app/Helpers/Invoice/InvoiceSum.php @@ -11,15 +11,15 @@ namespace App\Helpers\Invoice; -use App\Models\Quote; -use App\Utils\Number; use App\Models\Credit; use App\Models\Invoice; use App\Models\PurchaseOrder; -use App\Models\RecurringQuote; +use App\Models\Quote; use App\Models\RecurringInvoice; -use Illuminate\Support\Collection; +use App\Models\RecurringQuote; +use App\Utils\Number; use App\Utils\Traits\NumberFormatter; +use Illuminate\Support\Collection; class InvoiceSum { diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index 69410f54db9e..3043607fdfd9 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -11,15 +11,14 @@ namespace App\Helpers\Invoice; -use App\Models\Quote; use App\Models\Credit; use App\Models\Invoice; use App\Models\PurchaseOrder; -use App\Models\RecurringQuote; +use App\Models\Quote; use App\Models\RecurringInvoice; -use Illuminate\Support\Collection; +use App\Models\RecurringQuote; use App\Utils\Traits\NumberFormatter; -use App\Helpers\Invoice\InvoiceItemSumInclusive; +use Illuminate\Support\Collection; class InvoiceSumInclusive { diff --git a/app/Helpers/SwissQr/SwissQrGenerator.php b/app/Helpers/SwissQr/SwissQrGenerator.php index d8c1ad77304c..fa02a550bef4 100644 --- a/app/Helpers/SwissQr/SwissQrGenerator.php +++ b/app/Helpers/SwissQr/SwissQrGenerator.php @@ -57,7 +57,7 @@ class SwissQrGenerator // - with specified amount // - with human-readable additional information // - using your QR-IBAN - // + // // Likely the most common use-case in the business world. // Create a new instance of QrBill, containing default headers with fixed values @@ -83,7 +83,7 @@ class SwissQrGenerator // Add debtor information // Who has to pay the invoice? This part is optional. - // + // // Notice how you can use two different styles of addresses: CombinedAddress or StructuredAddress // They are interchangeable for creditor as well as debtor. $qrBill->setUltimateDebtor( @@ -121,7 +121,7 @@ class SwissQrGenerator $array = str_split($tempInvoiceNumber); foreach ($array as $char) { if (is_numeric($char)) { - // + // } else { if ($char) { $char = strtolower($char); diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 591041c31c66..52a2d8532962 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -11,17 +11,17 @@ namespace App\Http\Controllers; -use App\Models\Account; -use App\Libraries\MultiDB; -use App\Utils\TruthSource; -use App\Models\CompanyUser; -use Illuminate\Http\Response; -use App\Jobs\Account\CreateAccount; -use App\Transformers\AccountTransformer; -use App\Transformers\CompanyUserTransformer; -use Illuminate\Foundation\Bus\DispatchesJobs; use App\Http\Requests\Account\CreateAccountRequest; use App\Http\Requests\Account\UpdateAccountRequest; +use App\Jobs\Account\CreateAccount; +use App\Libraries\MultiDB; +use App\Models\Account; +use App\Models\CompanyUser; +use App\Transformers\AccountTransformer; +use App\Transformers\CompanyUserTransformer; +use App\Utils\TruthSource; +use Illuminate\Foundation\Bus\DispatchesJobs; +use Illuminate\Http\Response; class AccountController extends BaseController { diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 2b377c7f5ef6..5e7e6068d60f 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -11,19 +11,19 @@ namespace App\Http\Controllers; -use stdClass; -use App\Utils\Ninja; -use App\Models\Activity; -use Illuminate\Http\Request; -use App\Utils\Traits\MakesHash; -use App\Utils\PhantomJS\Phantom; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\Traits\Pdf\PdfMaker; -use App\Utils\Traits\Pdf\PageNumbering; -use Illuminate\Support\Facades\Storage; -use App\Transformers\ActivityTransformer; -use App\Http\Requests\Activity\ShowActivityRequest; use App\Http\Requests\Activity\DownloadHistoricalEntityRequest; +use App\Http\Requests\Activity\ShowActivityRequest; +use App\Models\Activity; +use App\Transformers\ActivityTransformer; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Ninja; +use App\Utils\PhantomJS\Phantom; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Utils\Traits\Pdf\PdfMaker; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Storage; +use stdClass; class ActivityController extends BaseController { diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index 4d2ad56329ad..afd98dcafb3b 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Auth; +use App\Http\Controllers\Controller; +use App\Libraries\MultiDB; use App\Models\Account; use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Http\Request; -use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Password; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Password; class ForgotPasswordController extends Controller { @@ -90,7 +90,7 @@ class ForgotPasswordController extends Controller $account = Account::find($account_id); } - $is_react = request()->has('react') ? true : false; + $is_react = request()->has('react') ? true : false; return $this->render('auth.passwords.request', ['root' => 'themes', 'account' => $account, 'is_react' => $is_react]); } diff --git a/app/Http/Controllers/Auth/PasswordTimeoutController.php b/app/Http/Controllers/Auth/PasswordTimeoutController.php index 4ce83fa46b1c..614a48487ee5 100644 --- a/app/Http/Controllers/Auth/PasswordTimeoutController.php +++ b/app/Http/Controllers/Auth/PasswordTimeoutController.php @@ -25,4 +25,3 @@ class PasswordTimeoutController extends Controller return $cached ? response()->json(['message' => 'Password is valid'], 200) : response()->json(['message' => 'Invalid Password'], 412); } } - diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 0cf124ebd900..27039fcb9060 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -111,8 +111,9 @@ class ResetPasswordController extends Controller { auth()->logout(); - if(request()->has('react') || request()->hasHeader('X-React')) + if(request()->has('react') || request()->hasHeader('X-React')) { return redirect(config('ninja.react_url').'/#/login'); + } return redirect('/'); } @@ -130,11 +131,11 @@ class ResetPasswordController extends Controller return new JsonResponse(['message' => trans($response)], 200); } - if($request->hasHeader('X-REACT') || $request->has('react')){ + if($request->hasHeader('X-REACT') || $request->has('react')) { return redirect(config('ninja.react_url').'/#/login'); + } else { + return redirect('/#/login'); } - else - return redirect('/#/login'); return redirect($this->redirectPath()) ->with('status', trans($response)); diff --git a/app/Http/Controllers/Bank/YodleeController.php b/app/Http/Controllers/Bank/YodleeController.php index bf4f1fc368cf..30e322a74891 100644 --- a/app/Http/Controllers/Bank/YodleeController.php +++ b/app/Http/Controllers/Bank/YodleeController.php @@ -12,13 +12,13 @@ namespace App\Http\Controllers\Bank; use App\Helpers\Bank\Yodlee\DTO\AccountSummary; -use Illuminate\Http\Request; -use App\Models\BankIntegration; use App\Helpers\Bank\Yodlee\Yodlee; use App\Http\Controllers\BaseController; -use App\Jobs\Bank\ProcessBankTransactions; -use App\Http\Requests\Yodlee\YodleeAuthRequest; use App\Http\Requests\Yodlee\YodleeAdminRequest; +use App\Http\Requests\Yodlee\YodleeAuthRequest; +use App\Jobs\Bank\ProcessBankTransactions; +use App\Models\BankIntegration; +use Illuminate\Http\Request; class YodleeController extends BaseController { @@ -100,69 +100,69 @@ class YodleeController extends BaseController } - /** - * Process Yodlee Refresh Webhook. - * - * - * @OA\Post( - * path="/api/v1/yodlee/refresh", - * operationId="yodleeRefreshWebhook", - * tags={"yodlee"}, - * summary="Processing webhooks from Yodlee", - * description="Notifies the system when a data point can be refreshed", - * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), - * @OA\Parameter(ref="#/components/parameters/X-Requested-With"), - * @OA\Parameter(ref="#/components/parameters/include"), - * @OA\Response( - * response=200, - * description="", - * @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"), - * @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"), - * @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"), - * @OA\JsonContent(ref="#/components/schemas/Credit"), - * ), - * @OA\Response( - * response=422, - * description="Validation error", - * @OA\JsonContent(ref="#/components/schemas/ValidationError"), - * - * ), - * @OA\Response( - * response="default", - * description="Unexpected Error", - * @OA\JsonContent(ref="#/components/schemas/Error"), - * ), - * ) - */ + /** + * Process Yodlee Refresh Webhook. + * + * + * @OA\Post( + * path="/api/v1/yodlee/refresh", + * operationId="yodleeRefreshWebhook", + * tags={"yodlee"}, + * summary="Processing webhooks from Yodlee", + * description="Notifies the system when a data point can be refreshed", + * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), + * @OA\Parameter(ref="#/components/parameters/X-Requested-With"), + * @OA\Parameter(ref="#/components/parameters/include"), + * @OA\Response( + * response=200, + * description="", + * @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"), + * @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"), + * @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"), + * @OA\JsonContent(ref="#/components/schemas/Credit"), + * ), + * @OA\Response( + * response=422, + * description="Validation error", + * @OA\JsonContent(ref="#/components/schemas/ValidationError"), + * + * ), + * @OA\Response( + * response="default", + * description="Unexpected Error", + * @OA\JsonContent(ref="#/components/schemas/Error"), + * ), + * ) + */ - /* - { - "event":{ - "info":"REFRESH.PROCESS_COMPLETED", - "loginName":"fri21", - "data":{ - "providerAccount":[ - { - "id":10995860, - "providerId":16441, - "isManual":false, - "createdDate":"2017-12-22T05:47:35Z", - "aggregationSource":"USER", - "status":"SUCCESS", - "requestId":"NSyMGo+R4dktywIu3hBIkc3PgWA=", - "dataset":[ - { - "name":"BASIC_AGG_DATA", - "additionalStatus":"AVAILABLE_DATA_RETRIEVED", - "updateEligibility":"ALLOW_UPDATE", - "lastUpdated":"2017-12-22T05:48:16Z", - "lastUpdateAttempt":"2017-12-22T05:48:16Z" - } - ] - } - ] + /* + { + "event":{ + "info":"REFRESH.PROCESS_COMPLETED", + "loginName":"fri21", + "data":{ + "providerAccount":[ + { + "id":10995860, + "providerId":16441, + "isManual":false, + "createdDate":"2017-12-22T05:47:35Z", + "aggregationSource":"USER", + "status":"SUCCESS", + "requestId":"NSyMGo+R4dktywIu3hBIkc3PgWA=", + "dataset":[ + { + "name":"BASIC_AGG_DATA", + "additionalStatus":"AVAILABLE_DATA_RETRIEVED", + "updateEligibility":"ALLOW_UPDATE", + "lastUpdated":"2017-12-22T05:48:16Z", + "lastUpdateAttempt":"2017-12-22T05:48:16Z" + } + ] + } + ] + } } - } }*/ public function refreshWebhook(Request $request) { @@ -177,28 +177,28 @@ class YodleeController extends BaseController // return response()->json(['message' => 'Unauthorized'], 403); } -/* -{ - "event":{ - "notificationId":"63c73475-4db5-49ef-8553-8303337ca7c3", - "info":"LATEST_BALANCE_UPDATES", - "loginName":"user1", - "data":{ - "providerAccountId":658552, - "latestBalanceEvent":[ - { - "accountId":12345, - "status":"SUCCESS" - }, - { - "accountId":12346, - "status":"FAILED" - } - ] - } - } -} -*/ + /* + { + "event":{ + "notificationId":"63c73475-4db5-49ef-8553-8303337ca7c3", + "info":"LATEST_BALANCE_UPDATES", + "loginName":"user1", + "data":{ + "providerAccountId":658552, + "latestBalanceEvent":[ + { + "accountId":12345, + "status":"SUCCESS" + }, + { + "accountId":12346, + "status":"FAILED" + } + ] + } + } + } + */ public function balanceWebhook(Request $request) { nlog("yodlee refresh"); @@ -211,29 +211,29 @@ class YodleeController extends BaseController // return response()->json(['message' => 'Unauthorized'], 403); } -/* -{ - "event":{ - "data":[ - { - "autoRefresh":{ - "additionalStatus":"SCHEDULED", - "status":"ENABLED" - }, - "accountIds":[ - 1112645899, - 1112645898 - ], - "loginName":"YSL1555332811628", - "providerAccountId":11381459 - } - ], - "notificationTime":"2019-06-14T04:49:39Z", - "notificationId":"4e672150-156048777", - "info":"AUTO_REFRESH_UPDATES" - } -} -*/ + /* + { + "event":{ + "data":[ + { + "autoRefresh":{ + "additionalStatus":"SCHEDULED", + "status":"ENABLED" + }, + "accountIds":[ + 1112645899, + 1112645898 + ], + "loginName":"YSL1555332811628", + "providerAccountId":11381459 + } + ], + "notificationTime":"2019-06-14T04:49:39Z", + "notificationId":"4e672150-156048777", + "info":"AUTO_REFRESH_UPDATES" + } + } + */ public function refreshUpdatesWebhook(Request $request) { //notifies a user if there are problems with yodlee accessing the data @@ -248,27 +248,27 @@ class YodleeController extends BaseController } -/* -"event": { - "notificationId": "64b7ed1a-1530523285", - "info": "DATA_UPDATES.USER_DATA", - "data": { - "userCount": 1, - "fromDate": "2017-11-10T10:18:44Z", - "toDate": "2017-11-10T11:18:43Z", - "userData": [{ - "user": { - "loginName": "YSL1484052178554" - }, - "links": [{ - "methodType": "GET", - "rel": "getUserData", - "href": "dataExtracts/userData?fromDate=2017-11-10T10:18:44Z&toDate=2017-11-10T11:18:43Z&loginName=YSL1484052178554" + /* + "event": { + "notificationId": "64b7ed1a-1530523285", + "info": "DATA_UPDATES.USER_DATA", + "data": { + "userCount": 1, + "fromDate": "2017-11-10T10:18:44Z", + "toDate": "2017-11-10T11:18:43Z", + "userData": [{ + "user": { + "loginName": "YSL1484052178554" + }, + "links": [{ + "methodType": "GET", + "rel": "getUserData", + "href": "dataExtracts/userData?fromDate=2017-11-10T10:18:44Z&toDate=2017-11-10T11:18:43Z&loginName=YSL1484052178554" + }] }] - }] + } } -} -*/ + */ public function dataUpdatesWebhook(Request $request) { //this is the main hook we use for notifications @@ -292,8 +292,9 @@ class YodleeController extends BaseController ->where('account_id', $account_number) ->exists(); - if(!$bank_integration) + if(!$bank_integration) { return response()->json(['message' => 'Account does not exist.'], 400); + } $yodlee = new Yodlee($user->account->bank_integration_account_id); diff --git a/app/Http/Controllers/BankIntegrationController.php b/app/Http/Controllers/BankIntegrationController.php index 3e404ff73f6b..b2d3a33a9ae8 100644 --- a/app/Http/Controllers/BankIntegrationController.php +++ b/app/Http/Controllers/BankIntegrationController.php @@ -11,26 +11,25 @@ namespace App\Http\Controllers; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use App\Models\BankIntegration; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\JsonResponse; -use App\Helpers\Bank\Yodlee\Yodlee; -use Illuminate\Support\Facades\Cache; use App\Factory\BankIntegrationFactory; use App\Filters\BankIntegrationFilters; -use App\Jobs\Bank\ProcessBankTransactions; -use App\Repositories\BankIntegrationRepository; -use App\Transformers\BankIntegrationTransformer; +use App\Helpers\Bank\Yodlee\Yodlee; +use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest; use App\Http\Requests\BankIntegration\BulkBankIntegrationRequest; +use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest; +use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest; use App\Http\Requests\BankIntegration\EditBankIntegrationRequest; use App\Http\Requests\BankIntegration\ShowBankIntegrationRequest; -use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest; use App\Http\Requests\BankIntegration\StoreBankIntegrationRequest; -use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest; use App\Http\Requests\BankIntegration\UpdateBankIntegrationRequest; -use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest; +use App\Jobs\Bank\ProcessBankTransactions; +use App\Models\BankIntegration; +use App\Repositories\BankIntegrationRepository; +use App\Transformers\BankIntegrationTransformer; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Cache; class BankIntegrationController extends BaseController { @@ -109,7 +108,7 @@ class BankIntegrationController extends BaseController * @param CreateBankIntegrationRequest $request * @return Response * - * + * */ public function create(CreateBankIntegrationRequest $request) { @@ -210,12 +209,11 @@ class BankIntegrationController extends BaseController $accounts = $yodlee->getAccounts(); foreach ($accounts as $account) { - if ($bi = BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', $user->company()->id)->first()){ - $bi->balance = $account['current_balance']; - $bi->currency = $account['account_currency']; - $bi->save(); - } - else { + if ($bi = BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', $user->company()->id)->first()) { + $bi->balance = $account['current_balance']; + $bi->currency = $account['account_currency']; + $bi->save(); + } else { $bank_integration = new BankIntegration(); $bank_integration->company_id = $user->company()->id; $bank_integration->account_id = $user->account_id; @@ -293,7 +291,7 @@ class BankIntegrationController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); - $user->account->bank_integrations->each(function ($bank_integration) use ($user){ + $user->account->bank_integrations->each(function ($bank_integration) use ($user) { (new ProcessBankTransactions($user->account->bank_integration_account_id, $bank_integration))->handle(); }); diff --git a/app/Http/Controllers/BankTransactionRuleController.php b/app/Http/Controllers/BankTransactionRuleController.php index a17cf4cfe76c..b34043e48f28 100644 --- a/app/Http/Controllers/BankTransactionRuleController.php +++ b/app/Http/Controllers/BankTransactionRuleController.php @@ -11,20 +11,20 @@ namespace App\Http\Controllers; -use App\Utils\Traits\MakesHash; -use App\Models\BankTransactionRule; use App\Factory\BankTransactionRuleFactory; use App\Filters\BankTransactionRuleFilters; -use App\Repositories\BankTransactionRuleRepository; -use App\Transformers\BankTransactionRuleTransformer; use App\Http\Requests\BankTransactionRule\BulkBankTransactionRuleRequest; +use App\Http\Requests\BankTransactionRule\CreateBankTransactionRuleRequest; +use App\Http\Requests\BankTransactionRule\DestroyBankTransactionRuleRequest; use App\Http\Requests\BankTransactionRule\EditBankTransactionRuleRequest; use App\Http\Requests\BankTransactionRule\ShowBankTransactionRuleRequest; use App\Http\Requests\BankTransactionRule\StoreBankTransactionRuleRequest; -use App\Http\Requests\BankTransactionRule\CreateBankTransactionRuleRequest; use App\Http\Requests\BankTransactionRule\UpdateBankTransactionRuleRequest; -use App\Http\Requests\BankTransactionRule\DestroyBankTransactionRuleRequest; +use App\Models\BankTransactionRule; +use App\Repositories\BankTransactionRuleRepository; use App\Services\Bank\BankMatchingService; +use App\Transformers\BankTransactionRuleTransformer; +use App\Utils\Traits\MakesHash; class BankTransactionRuleController extends BaseController { diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index a8f43eae85a3..2d5d41c24e3a 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -531,7 +531,7 @@ class BaseController extends Controller $paginator = $query->paginate($limit); /** @phpstan-ignore-next-line **/ - $query = $paginator->getCollection(); + $query = $paginator->getCollection(); $resource = new Collection($query, $transformer, $this->entity_type); @@ -889,7 +889,7 @@ class BaseController extends Controller $resource = new Collection($query, $transformer, $this->entity_type); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - } + } // else { // $resource = new Collection($query, $transformer, $this->entity_type); @@ -924,10 +924,9 @@ class BaseController extends Controller if ($this->entity_type == BankIntegration::class && !$user->isSuperUser() && $user->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) { $query->exclude(["balance"]); } //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'])){ + 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 { + } 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/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index 1dfff875d34d..158688ba5544 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -11,36 +11,36 @@ 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\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\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. @@ -74,10 +74,10 @@ class ClientController extends BaseController } /** - * + * * @param ClientFilters $filters * @return Response - * + * */ public function index(ClientFilters $filters) { @@ -275,15 +275,15 @@ class ClientController extends BaseController //todo add an event here using the client name as reference for purge event } -/** - * Update the specified resource in storage. - * - * @param PurgeClientRequest $request - * @param Client $client - * @param string $mergeable_client - * @return \Illuminate\Http\JsonResponse - * - */ + /** + * Update the specified resource in storage. + * + * @param PurgeClientRequest $request + * @param Client $client + * @param string $mergeable_client + * @return \Illuminate\Http\JsonResponse + * + */ public function merge(PurgeClientRequest $request, Client $client, string $mergeable_client) { @@ -313,8 +313,9 @@ class ClientController extends BaseController */ public function updateTaxData(PurgeClientRequest $request, Client $client) { - if($client->company->account->isPaid()) + if($client->company->account->isPaid()) { (new UpdateTaxData($client, $client->company))->handle(); + } return $this->itemResponse($client->fresh()); } @@ -331,8 +332,8 @@ class ClientController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); - if(stripos($bounce_id, '-') !== false){ - $log = + if(stripos($bounce_id, '-') !== false) { + $log = SystemLog::query() ->where('company_id', $user->company()->id) ->where('type_id', SystemLog::TYPE_WEBHOOK_RESPONSE) @@ -343,16 +344,16 @@ class ClientController extends BaseController $resolved_bounce_id = false; - if($log && ($log?->log['ID'] ?? false)){ + if($log && ($log?->log['ID'] ?? false)) { $resolved_bounce_id = $log->log['ID'] ?? false; } - if(!$resolved_bounce_id){ + if(!$resolved_bounce_id) { $ppwebhook = new ProcessPostmarkWebhook([]); $resolved_bounce_id = $ppwebhook->getBounceId($bounce_id); } - if(!$resolved_bounce_id){ + if(!$resolved_bounce_id) { return response()->json(['message' => 'Bounce ID not found'], 400); } @@ -367,8 +368,7 @@ class ClientController extends BaseController return response()->json(['message' => 'Success'], 200); - } - catch(\Exception $e){ + } catch(\Exception $e) { return response()->json(['message' => $e->getMessage(), 400]); diff --git a/app/Http/Controllers/ClientPortal/ContactHashLoginController.php b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php index 8501131833a6..abcef260ffc0 100644 --- a/app/Http/Controllers/ClientPortal/ContactHashLoginController.php +++ b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php @@ -11,11 +11,10 @@ namespace App\Http\Controllers\ClientPortal; -use Auth; -use App\Models\RecurringInvoice; use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Redirect; use App\Http\ViewComposers\PortalComposer; +use App\Models\RecurringInvoice; +use Illuminate\Support\Facades\Redirect; class ContactHashLoginController extends Controller { diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index cc19d8b5a1f1..8f62169b0e4f 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -11,28 +11,27 @@ namespace App\Http\Controllers\ClientPortal; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Payment; -use Illuminate\Support\Str; -use Illuminate\Http\Request; -use App\Models\ClientContact; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; -use App\Utils\Traits\MakesDates; -use App\Jobs\Entity\CreateRawPdf; -use App\Models\InvoiceInvitation; -use App\Events\Quote\QuoteWasViewed; -use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Hash; -use App\Events\Credit\CreditWasViewed; use App\Events\Contact\ContactLoggedIn; -use App\Models\PurchaseOrderInvitation; +use App\Events\Credit\CreditWasViewed; use App\Events\Invoice\InvoiceWasViewed; use App\Events\Misc\InvitationWasViewed; +use App\Events\Quote\QuoteWasViewed; +use App\Http\Controllers\Controller; +use App\Jobs\Entity\CreateRawPdf; +use App\Models\ClientContact; +use App\Models\CreditInvitation; +use App\Models\InvoiceInvitation; +use App\Models\Payment; +use App\Models\PurchaseOrderInvitation; +use App\Models\QuoteInvitation; use App\Services\ClientPortal\InstantPayment; +use App\Utils\Ninja; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Str; /** * Class InvitationController. @@ -101,7 +100,7 @@ class InvitationController extends Controller if (empty($client_contact->email)) { $client_contact->email = Str::random(15) . "@example.com"; $client_contact->save(); - } + } if (request()->has('client_hash') && request()->input('client_hash') == $invitation->contact->client->client_hash) { request()->session()->invalidate(); @@ -214,7 +213,7 @@ class InvitationController extends Controller } - public function handlePasswordSet(Request $request) + public function handlePasswordSet(Request $request) { $entity_obj = 'App\Models\\'.ucfirst(Str::camel($request->entity_type)).'Invitation'; $key = $request->entity_type.'_id'; diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index cc882291af7d..e293eacbbd11 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -11,29 +11,27 @@ namespace App\Http\Controllers\ClientPortal; -use App\Utils\Ninja; -use App\Utils\Number; -use App\Models\Invoice; -use Illuminate\View\View; -use Illuminate\Http\Request; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; -use App\Utils\Traits\MakesDates; -use App\Models\InvoiceInvitation; -use App\Http\Controllers\Controller; -use Illuminate\Http\RedirectResponse; -use Illuminate\Support\Facades\Cache; -use Illuminate\Contracts\View\Factory; -use App\Models\PurchaseOrderInvitation; -use Illuminate\Support\Facades\Storage; use App\Events\Invoice\InvoiceWasViewed; use App\Events\Misc\InvitationWasViewed; -use App\Models\RecurringInvoiceInvitation; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Http\Controllers\Controller; +use App\Http\Requests\ClientPortal\Invoices\ProcessInvoicesInBulkRequest; use App\Http\Requests\ClientPortal\Invoices\ShowInvoiceRequest; use App\Http\Requests\ClientPortal\Invoices\ShowInvoicesRequest; -use App\Http\Requests\ClientPortal\Invoices\ProcessInvoicesInBulkRequest; +use App\Models\CreditInvitation; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoiceInvitation; +use App\Utils\Ninja; +use App\Utils\Number; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; +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 { @@ -88,14 +86,14 @@ class InvoiceController extends Controller { $data = Cache::get($hash); - if(!$data){ + if(!$data) { usleep(200000); $data = Cache::get($hash); } $invitation = false; - match($data['entity_type'] ?? false){ + match($data['entity_type'] ?? false) { 'invoice' => $invitation = InvoiceInvitation::withTrashed()->find($data['invitation_id']), 'quote' => $invitation = QuoteInvitation::withTrashed()->find($data['invitation_id']), 'credit' => $invitation = CreditInvitation::withTrashed()->find($data['invitation_id']), diff --git a/app/Http/Controllers/ClientPortal/PaymentController.php b/app/Http/Controllers/ClientPortal/PaymentController.php index 841a61a105aa..81b560ab19df 100644 --- a/app/Http/Controllers/ClientPortal/PaymentController.php +++ b/app/Http/Controllers/ClientPortal/PaymentController.php @@ -27,7 +27,6 @@ use App\Services\Subscription\SubscriptionService; use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesHash; use Illuminate\Contracts\View\Factory; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; diff --git a/app/Http/Controllers/ClientPortal/QuoteController.php b/app/Http/Controllers/ClientPortal/QuoteController.php index 6e12701bb680..98cb3cd871d3 100644 --- a/app/Http/Controllers/ClientPortal/QuoteController.php +++ b/app/Http/Controllers/ClientPortal/QuoteController.php @@ -12,22 +12,21 @@ namespace App\Http\Controllers\ClientPortal; -use App\Utils\Ninja; -use App\Models\Quote; -use Illuminate\View\View; -use Illuminate\Http\Request; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; +use App\Events\Misc\InvitationWasViewed; use App\Events\Quote\QuoteWasViewed; use App\Http\Controllers\Controller; -use App\Jobs\Invoice\InjectSignature; -use Illuminate\Contracts\View\Factory; -use Illuminate\Support\Facades\Storage; -use App\Events\Misc\InvitationWasViewed; -use Symfony\Component\HttpFoundation\BinaryFileResponse; +use App\Http\Requests\ClientPortal\Quotes\ProcessQuotesInBulkRequest; use App\Http\Requests\ClientPortal\Quotes\ShowQuoteRequest; use App\Http\Requests\ClientPortal\Quotes\ShowQuotesRequest; -use App\Http\Requests\ClientPortal\Quotes\ProcessQuotesInBulkRequest; +use App\Jobs\Invoice\InjectSignature; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use Illuminate\Contracts\View\Factory; +use Illuminate\Http\Request; +use Illuminate\View\View; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class QuoteController extends Controller { @@ -123,7 +122,7 @@ class QuoteController extends Controller $client_contact = auth()->user(); $quote_invitations = QuoteInvitation::query() - ->with('quote','company') + ->with('quote', 'company') ->whereIn('quote_id', $ids) ->where('client_contact_id', $client_contact->id) ->withTrashed() diff --git a/app/Http/Controllers/ClientPortal/StatementController.php b/app/Http/Controllers/ClientPortal/StatementController.php index 7ed81d48fed3..d5bbafb024be 100644 --- a/app/Http/Controllers/ClientPortal/StatementController.php +++ b/app/Http/Controllers/ClientPortal/StatementController.php @@ -23,7 +23,7 @@ class StatementController extends Controller /** * Show the statement in the client portal. * - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function index(): View { diff --git a/app/Http/Controllers/ClientPortal/TempRouteController.php b/app/Http/Controllers/ClientPortal/TempRouteController.php index b1f71a837063..4efe5b9b637f 100644 --- a/app/Http/Controllers/ClientPortal/TempRouteController.php +++ b/app/Http/Controllers/ClientPortal/TempRouteController.php @@ -11,7 +11,6 @@ namespace App\Http\Controllers\ClientPortal; -use Auth; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Redirect; diff --git a/app/Http/Controllers/ClientStatementController.php b/app/Http/Controllers/ClientStatementController.php index 375234c6d016..fe10335b815b 100644 --- a/app/Http/Controllers/ClientStatementController.php +++ b/app/Http/Controllers/ClientStatementController.php @@ -11,10 +11,10 @@ namespace App\Http\Controllers; +use App\Http\Requests\Statements\CreateStatementRequest; use App\Utils\Traits\MakesHash; use App\Utils\Traits\Pdf\PdfMaker; use Illuminate\Support\Facades\Response; -use App\Http\Requests\Statements\CreateStatementRequest; class ClientStatementController extends BaseController { diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index ede5c1b92d21..6c476ab979c6 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -11,39 +11,38 @@ namespace App\Http\Controllers; -use Str; -use App\Utils\Ninja; -use App\Models\Account; -use App\Models\Company; -use App\Models\CompanyUser; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\Uploadable; -use App\Jobs\Mail\NinjaMailerJob; -use App\DataMapper\CompanySettings; -use App\Jobs\Company\CreateCompany; -use App\Jobs\Company\CompanyTaxRate; -use App\Jobs\Mail\NinjaMailerObject; -use App\Mail\Company\CompanyDeleted; -use App\Utils\Traits\SavesDocuments; -use Turbo124\Beacon\Facades\LightLogs; -use App\Repositories\CompanyRepository; -use Illuminate\Support\Facades\Storage; -use App\Jobs\Company\CreateCompanyToken; -use App\Transformers\CompanyTransformer; use App\DataMapper\Analytics\AccountDeleted; -use App\Transformers\CompanyUserTransformer; -use Illuminate\Foundation\Bus\DispatchesJobs; -use App\Jobs\Company\CreateCompanyPaymentTerms; -use App\Jobs\Company\CreateCompanyTaskStatuses; +use App\DataMapper\CompanySettings; +use App\Http\Requests\Company\CreateCompanyRequest; +use App\Http\Requests\Company\DefaultCompanyRequest; +use App\Http\Requests\Company\DestroyCompanyRequest; use App\Http\Requests\Company\EditCompanyRequest; use App\Http\Requests\Company\ShowCompanyRequest; use App\Http\Requests\Company\StoreCompanyRequest; -use App\Http\Requests\Company\CreateCompanyRequest; use App\Http\Requests\Company\UpdateCompanyRequest; use App\Http\Requests\Company\UploadCompanyRequest; -use App\Http\Requests\Company\DefaultCompanyRequest; -use App\Http\Requests\Company\DestroyCompanyRequest; +use App\Jobs\Company\CompanyTaxRate; +use App\Jobs\Company\CreateCompany; +use App\Jobs\Company\CreateCompanyPaymentTerms; +use App\Jobs\Company\CreateCompanyTaskStatuses; +use App\Jobs\Company\CreateCompanyToken; +use App\Jobs\Mail\NinjaMailerJob; +use App\Jobs\Mail\NinjaMailerObject; +use App\Mail\Company\CompanyDeleted; +use App\Models\Account; +use App\Models\Company; +use App\Models\CompanyUser; +use App\Repositories\CompanyRepository; +use App\Transformers\CompanyTransformer; +use App\Transformers\CompanyUserTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use App\Utils\Traits\Uploadable; +use Illuminate\Foundation\Bus\DispatchesJobs; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Storage; +use Turbo124\Beacon\Facades\LightLogs; /** * Class CompanyController. @@ -427,7 +426,7 @@ class CompanyController extends BaseController $this->saveDocuments($request->input('documents'), $company, $request->input('is_public', true)); } - if($request->has('e_invoice_certificate') && !is_null($request->file("e_invoice_certificate"))){ + if($request->has('e_invoice_certificate') && !is_null($request->file("e_invoice_certificate"))) { $company->e_invoice_certificate = base64_encode($request->file("e_invoice_certificate")->get()); @@ -684,16 +683,15 @@ class CompanyController extends BaseController public function updateOriginTaxData(DefaultCompanyRequest $request, Company $company) { - if($company->settings->country_id == "840" && !$company?->account->isFreeHostedClient()) - { + if($company->settings->country_id == "840" && !$company?->account->isFreeHostedClient()) { try { (new CompanyTaxRate($company))->handle(); } catch(\Exception $e) { return response()->json(['message' => 'There was a problem updating the tax rates. Please try again.'], 400); } - } - else + } else { return response()->json(['message' => 'Tax configuration not available due to settings / plan restriction.'], 400); + } return $this->itemResponse($company->fresh()); } @@ -707,7 +705,7 @@ class CompanyController extends BaseController $logo = strlen($company->settings->company_logo) > 5 ? $company->settings->company_logo : 'https://pdf.invoicing.co/favicon-v2.png'; $headers = ['Content-Disposition' => 'inline']; - return response()->streamDownload(function () use ($logo){ + return response()->streamDownload(function () use ($logo) { echo @file_get_contents($logo); }, 'logo.png', $headers); diff --git a/app/Http/Controllers/CompanyGatewayController.php b/app/Http/Controllers/CompanyGatewayController.php index 5e9fed6bfd81..9914327f526c 100644 --- a/app/Http/Controllers/CompanyGatewayController.php +++ b/app/Http/Controllers/CompanyGatewayController.php @@ -213,8 +213,7 @@ class CompanyGatewayController extends BaseController if (in_array($company_gateway->gateway_key, $this->stripe_keys)) { StripeWebhook::dispatch($company_gateway->company->company_key, $company_gateway->id); - } - elseif($company_gateway->gateway_key == $this->checkout_key) { + } elseif($company_gateway->gateway_key == $this->checkout_key) { CheckoutSetupWebhook::dispatch($company_gateway->company->company_key, $company_gateway->id); } diff --git a/app/Http/Controllers/CompanyUserController.php b/app/Http/Controllers/CompanyUserController.php index 69de122d5f4b..e020807da7e5 100644 --- a/app/Http/Controllers/CompanyUserController.php +++ b/app/Http/Controllers/CompanyUserController.php @@ -11,14 +11,14 @@ namespace App\Http\Controllers; -use App\Models\User; -use App\Models\CompanyUser; -use Illuminate\Http\Response; -use App\Transformers\UserTransformer; -use App\Transformers\CompanyUserTransformer; -use Illuminate\Database\Eloquent\ModelNotFoundException; -use App\Http\Requests\CompanyUser\UpdateCompanyUserRequest; use App\Http\Requests\CompanyUser\UpdateCompanyUserPreferencesRequest; +use App\Http\Requests\CompanyUser\UpdateCompanyUserRequest; +use App\Models\CompanyUser; +use App\Models\User; +use App\Transformers\CompanyUserTransformer; +use App\Transformers\UserTransformer; +use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Http\Response; class CompanyUserController extends BaseController { @@ -115,7 +115,7 @@ class CompanyUserController extends BaseController $auth_user = auth()->user(); $company = $auth_user->company(); - $company_user = CompanyUser::query()->where('user_id', $user->id)->where('company_id',$company->id)->first(); + $company_user = CompanyUser::query()->where('user_id', $user->id)->where('company_id', $company->id)->first(); if (! $company_user) { throw new ModelNotFoundException(ctrans('texts.company_user_not_found')); diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 9ab4db36bdff..24db27876e92 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -11,35 +11,35 @@ 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\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\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. @@ -386,7 +386,7 @@ class CreditController extends BaseController $credit->service() ->triggeredActions($request); - // ->deletePdf(); + // ->deletePdf(); /** @var \App\Models\User $user**/ $user = auth()->user(); @@ -527,7 +527,7 @@ class CreditController extends BaseController */ if ($action == 'bulk_download' && $credits->count() > 1) { - $credits->each(function ($credit) use($user){ + $credits->each(function ($credit) use ($user) { if ($user->cannot('view', $credit)) { return response()->json(['message' => ctrans('text.access_denied')]); } diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index 70d4b1e8a1b4..9d822aee1310 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -145,7 +145,7 @@ class DocumentController extends BaseController * @return Response */ public function update(UpdateDocumentRequest $request, Document $document) - { + { $document->fill($request->all()); $document->save(); diff --git a/app/Http/Controllers/EmailHistoryController.php b/app/Http/Controllers/EmailHistoryController.php index f29f1a79bd9d..493becc50d83 100644 --- a/app/Http/Controllers/EmailHistoryController.php +++ b/app/Http/Controllers/EmailHistoryController.php @@ -33,7 +33,7 @@ class EmailHistoryController extends BaseController ->cursor() ->filter(function ($system_log) { return (isset($system_log->log['history']) && isset($system_log->log['history']['events']) && count($system_log->log['history']['events']) >=1) !== false; - })->map(function ($system_log) { + })->map(function ($system_log) { return $system_log->log['history']; })->values()->all(); @@ -59,7 +59,7 @@ class EmailHistoryController extends BaseController ->cursor() ->filter(function ($system_log) { return ($system_log->log['history'] && isset($system_log->log['history']['events']) && count($system_log->log['history']['events']) >=1) !== false; - })->map(function ($system_log) { + })->map(function ($system_log) { return $system_log->log['history']; })->values()->all(); diff --git a/app/Http/Controllers/ExpenseCategoryController.php b/app/Http/Controllers/ExpenseCategoryController.php index 36c47b9ba13f..0c43f649aad8 100644 --- a/app/Http/Controllers/ExpenseCategoryController.php +++ b/app/Http/Controllers/ExpenseCategoryController.php @@ -24,7 +24,6 @@ use App\Models\ExpenseCategory; use App\Repositories\BaseRepository; use App\Transformers\ExpenseCategoryTransformer; use App\Utils\Traits\MakesHash; -use Illuminate\Http\Request; use Illuminate\Http\Response; /** @@ -138,7 +137,7 @@ class ExpenseCategoryController extends BaseController /** * Store a newly created resource in storage. * - * @param StoreExpenseCategoryRequest $request + * @param StoreExpenseCategoryRequest $request * @return Response * * diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index f459a2733386..55038c989527 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers; -use Illuminate\Support\Str; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Company\CompanyExport; -use Illuminate\Support\Facades\Cache; use App\Http\Requests\Export\StoreExportRequest; +use App\Jobs\Company\CompanyExport; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; class ExportController extends BaseController { diff --git a/app/Http/Controllers/GroupSettingController.php b/app/Http/Controllers/GroupSettingController.php index ff22b55242c3..cdd3d94c5004 100644 --- a/app/Http/Controllers/GroupSettingController.php +++ b/app/Http/Controllers/GroupSettingController.php @@ -140,8 +140,9 @@ class GroupSettingController extends BaseController public function update(UpdateGroupSettingRequest $request, GroupSetting $group_setting) { /** Need this to prevent settings from being overwritten */ - if(!$request->file('company_logo')) + if(!$request->file('company_logo')) { $group_setting = $this->group_setting_repo->save($request->all(), $group_setting); + } $this->uploadLogo($request->file('company_logo'), $group_setting->company, $group_setting); diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 2871bc41e7b5..e8b82a48593c 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -108,7 +108,7 @@ class ImportController extends Controller { $hints = []; - $translated_keys = collect($available_keys)->map(function ($value,$key){ + $translated_keys = collect($available_keys)->map(function ($value, $key) { $parts = explode(".", $value); $index = $parts[0]; @@ -121,16 +121,14 @@ class ImportController extends Controller foreach($headers as $key => $value) { - foreach($translated_keys as $tkey => $tvalue) - { + foreach($translated_keys as $tkey => $tvalue) { if($this->testMatch($value, $tvalue['label'])) { $hit = $tvalue['key']; $hints[$key] = $hit; unset($translated_keys[$tkey]); break; - } - else { + } else { $hints[$key] = null; } @@ -140,14 +138,12 @@ class ImportController extends Controller } //second pass using the index of the translation here - foreach($headers as $key => $value) - { + foreach($headers as $key => $value) { if(isset($hints[$key])) { continue; } - foreach($translated_keys as $tkey => $tvalue) - { + foreach($translated_keys as $tkey => $tvalue) { if($this->testMatch($value, $tvalue['index'])) { $hit = $tvalue['key']; $hints[$key] = $hit; @@ -164,7 +160,7 @@ class ImportController extends Controller } private function testMatch($haystack, $needle): bool - { + { return stripos($haystack, $needle) !== false; } @@ -256,7 +252,7 @@ class ImportController extends Controller if (substr_count(strstr($csvfile, "\n", true), $delimiter) >= $count) { $count = substr_count(strstr($csvfile, "\n", true), $delimiter); - $bestDelimiter = $delimiter; + $bestDelimiter = $delimiter; } } diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 6322dfc9ee69..22a1fdcb373c 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -12,40 +12,40 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Account; -use App\Models\Invoice; -use App\Jobs\Cron\AutoBill; -use Illuminate\Http\Response; -use App\Factory\InvoiceFactory; -use App\Filters\InvoiceFilters; -use App\Utils\Traits\MakesHash; -use App\Jobs\Invoice\ZipInvoices; -use App\Services\PdfMaker\PdfMerge; -use Illuminate\Support\Facades\App; -use App\Factory\CloneInvoiceFactory; -use App\Jobs\Invoice\BulkInvoiceJob; -use App\Utils\Traits\SavesDocuments; -use App\Jobs\Invoice\UpdateReminders; -use App\Transformers\QuoteTransformer; -use App\Repositories\InvoiceRepository; -use Illuminate\Support\Facades\Storage; -use App\Transformers\InvoiceTransformer; use App\Events\Invoice\InvoiceWasCreated; use App\Events\Invoice\InvoiceWasUpdated; -use App\Services\Template\TemplateAction; +use App\Factory\CloneInvoiceFactory; use App\Factory\CloneInvoiceToQuoteFactory; +use App\Factory\InvoiceFactory; +use App\Filters\InvoiceFilters; +use App\Http\Requests\Invoice\ActionInvoiceRequest; use App\Http\Requests\Invoice\BulkInvoiceRequest; +use App\Http\Requests\Invoice\CreateInvoiceRequest; +use App\Http\Requests\Invoice\DestroyInvoiceRequest; use App\Http\Requests\Invoice\EditInvoiceRequest; use App\Http\Requests\Invoice\ShowInvoiceRequest; use App\Http\Requests\Invoice\StoreInvoiceRequest; -use App\Http\Requests\Invoice\ActionInvoiceRequest; -use App\Http\Requests\Invoice\CreateInvoiceRequest; use App\Http\Requests\Invoice\UpdateInvoiceRequest; -use App\Http\Requests\Invoice\UploadInvoiceRequest; -use App\Http\Requests\Invoice\DestroyInvoiceRequest; use App\Http\Requests\Invoice\UpdateReminderRequest; +use App\Http\Requests\Invoice\UploadInvoiceRequest; +use App\Jobs\Cron\AutoBill; +use App\Jobs\Invoice\BulkInvoiceJob; +use App\Jobs\Invoice\UpdateReminders; +use App\Jobs\Invoice\ZipInvoices; +use App\Models\Account; +use App\Models\Invoice; +use App\Models\Quote; +use App\Repositories\InvoiceRepository; +use App\Services\PdfMaker\PdfMerge; +use App\Services\Template\TemplateAction; +use App\Transformers\InvoiceTransformer; +use App\Transformers\QuoteTransformer; +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 InvoiceController. @@ -505,7 +505,7 @@ class InvoiceController extends BaseController */ if ($action == 'bulk_download' && $invoices->count() > 1) { - $invoices->each(function ($invoice) use($user) { + $invoices->each(function ($invoice) use ($user) { if ($user->cannot('view', $invoice)) { nlog('access denied'); @@ -538,18 +538,20 @@ class InvoiceController extends BaseController }, 'print.pdf', ['Content-Type' => 'application/pdf']); } - if($action == 'template' && $user->can('view', $invoices->first())){ + if($action == 'template' && $user->can('view', $invoices->first())) { $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); - TemplateAction::dispatch($ids, - $request->template_id, - Invoice::class, - $user->id, - $user->company(), - $user->company()->db, - $hash_or_response, - $request->boolean('send_email')); + TemplateAction::dispatch( + $ids, + $request->template_id, + Invoice::class, + $user->id, + $user->company(), + $user->company()->db, + $hash_or_response, + $request->boolean('send_email') + ); return response()->json(['message' => $hash_or_response], 200); } diff --git a/app/Http/Controllers/LicenseController.php b/app/Http/Controllers/LicenseController.php index ec130115ba96..659aa77d9ab5 100644 --- a/app/Http/Controllers/LicenseController.php +++ b/app/Http/Controllers/LicenseController.php @@ -90,7 +90,7 @@ class LicenseController extends BaseController if(substr($license_key, 0, 3) == 'v5_') { return $this->v5ClaimLicense($license_key, $product_id); - } + } $url = config('ninja.license_url')."/claim_license?license_key={$license_key}&product_id={$product_id}&get_date=true"; $data = trim(CurlUtils::get($url)); diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index 217d29ed5e64..c0bce2fe34ed 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -261,8 +261,9 @@ class MigrationController extends BaseController { nlog('Starting Migration'); - if($request->has('silent_migration')) + if($request->has('silent_migration')) { $this->silent_migration = true; + } if ($request->companies) { //handle Laravel 5.5 UniHTTP @@ -318,8 +319,9 @@ class MigrationController extends BaseController $nmo->settings = $user->account->companies()->first()->settings; $nmo->to_user = $user; - if(!$this->silent_migration) + if(!$this->silent_migration) { NinjaMailerJob::dispatch($nmo, true); + } return; } elseif ($existing_company && $company_count > 10) { @@ -329,8 +331,9 @@ class MigrationController extends BaseController $nmo->settings = $user->account->companies()->first()->settings; $nmo->to_user = $user; - if(!$this->silent_migration) + if(!$this->silent_migration) { NinjaMailerJob::dispatch($nmo, true); + } return; } @@ -350,8 +353,9 @@ class MigrationController extends BaseController $nmo->settings = $user->account->companies()->first(); $nmo->to_user = $user; - if(!$this->silent_migration) + if(!$this->silent_migration) { NinjaMailerJob::dispatch($nmo, true); + } return response()->json([ '_id' => Str::uuid(), diff --git a/app/Http/Controllers/OneTimeTokenController.php b/app/Http/Controllers/OneTimeTokenController.php index 70d32d42cd17..6c37479b7e4b 100644 --- a/app/Http/Controllers/OneTimeTokenController.php +++ b/app/Http/Controllers/OneTimeTokenController.php @@ -11,15 +11,14 @@ namespace App\Http\Controllers; -use App\Models\User; -use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Support\Str; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Cache; -use App\Http\Requests\OneTimeToken\OneTimeTokenRequest; use App\Http\Requests\OneTimeToken\OneTimeRouterRequest; +use App\Http\Requests\OneTimeToken\OneTimeTokenRequest; +use App\Libraries\MultiDB; +use App\Models\Company; +use App\Models\User; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; class OneTimeTokenController extends BaseController { diff --git a/app/Http/Controllers/PaymentTermController.php b/app/Http/Controllers/PaymentTermController.php index a4992ca040d3..5c8b5ad90ad0 100644 --- a/app/Http/Controllers/PaymentTermController.php +++ b/app/Http/Controllers/PaymentTermController.php @@ -11,19 +11,19 @@ namespace App\Http\Controllers; -use App\Models\PaymentTerm; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; use App\Factory\PaymentTermFactory; use App\Filters\PaymentTermFilters; -use App\Repositories\PaymentTermRepository; -use App\Transformers\PaymentTermTransformer; +use App\Http\Requests\PaymentTerm\CreatePaymentTermRequest; +use App\Http\Requests\PaymentTerm\DestroyPaymentTermRequest; use App\Http\Requests\PaymentTerm\EditPaymentTermRequest; use App\Http\Requests\PaymentTerm\ShowPaymentTermRequest; use App\Http\Requests\PaymentTerm\StorePaymentTermRequest; -use App\Http\Requests\PaymentTerm\CreatePaymentTermRequest; use App\Http\Requests\PaymentTerm\UpdatePaymentTermRequest; -use App\Http\Requests\PaymentTerm\DestroyPaymentTermRequest; +use App\Models\PaymentTerm; +use App\Repositories\PaymentTermRepository; +use App\Transformers\PaymentTermTransformer; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class PaymentTermController extends BaseController { diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index cd64d5da4f0e..5bef76e3063d 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -11,45 +11,33 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Invoice; -use App\Utils\HtmlEngine; -use App\Libraries\MultiDB; -use Twig\Error\SyntaxError; -use App\Factory\QuoteFactory; -use App\Jobs\Util\PreviewPdf; -use App\Models\ClientContact; -use App\Services\Pdf\PdfMock; -use App\Factory\CreditFactory; -use App\Factory\InvoiceFactory; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -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\Repositories\QuoteRepository; -use Illuminate\Support\Facades\Cache; -use App\Repositories\CreditRepository; -use App\Utils\Traits\MakesInvoiceHtml; -use Turbo124\Beacon\Facades\LightLogs; -use App\Repositories\InvoiceRepository; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Factory\RecurringInvoiceFactory; -use Illuminate\Support\Facades\Response; use App\DataMapper\Analytics\LivePreview; -use App\Services\Template\TemplateService; -use App\Repositories\RecurringInvoiceRepository; use App\Http\Requests\Preview\DesignPreviewRequest; +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\PdfMaker\Design; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -use App\Http\Requests\Preview\PreviewInvoiceRequest; +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\Cache; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Response; +use Turbo124\Beacon\Facades\LightLogs; +use Twig\Error\SyntaxError; class PreviewController extends BaseController { @@ -59,24 +47,24 @@ class PreviewController extends BaseController public function __construct() { - parent::__construct(); + parent::__construct(); } private function purgeCache() - { + { Cache::pull("preview_".auth()->user()->id); } /** * Refactor - 2023-10-19 - * + * * New method does not require Transactions. * * @param PreviewInvoiceRequest $request * @return mixed */ public function live(PreviewInvoiceRequest $request): mixed - { + { if (Ninja::isHosted() && !in_array($request->getHost(), ['preview.invoicing.co','staging.invoicing.co'])) { return response()->json(['message' => 'This server cannot handle this request.'], 400); @@ -108,8 +96,9 @@ class PreviewController extends BaseController $invitation->{$request->entity} = $entity_obj; } - if(empty($entity_obj->design_id)) + if(empty($entity_obj->design_id)) { $entity_obj->design_id = intval($this->decodePrimaryKey($settings->{$entity_prop."_design_id"})); + } /** Generate variables */ $html = new HtmlEngine($invitation); @@ -152,8 +141,9 @@ class PreviewController extends BaseController /** Generate HTML */ $html = $maker->getCompiledHTML(true); - if (request()->query('html') == 'true') + if (request()->query('html') == 'true') { return $html; + } //if phantom js...... inject here.. if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { @@ -169,8 +159,9 @@ class PreviewController extends BaseController $pdf = (new NinjaPdf())->build($html); $numbered_pdf = $this->pageNumbering($pdf, $company); - if ($numbered_pdf) + if ($numbered_pdf) { $pdf = $numbered_pdf; + } return $pdf; } @@ -187,9 +178,9 @@ class PreviewController extends BaseController return response()->streamDownload(function () use ($pdf) { echo $pdf; }, 'preview.pdf', [ - 'Content-Disposition' => 'inline', - 'Content-Type' => 'application/pdf', - 'Cache-Control:' => 'no-cache', + 'Content-Disposition' => 'inline', + 'Content-Type' => 'application/pdf', + 'Cache-Control:' => 'no-cache', 'Server-Timing' => microtime(true)-$start ]); @@ -200,7 +191,7 @@ class PreviewController extends BaseController * Returns the mocked PDF for the invoice design preview. * * Only used in Settings > Invoice Design as a general overview - * + * * @param DesignPreviewRequest $request * @return mixed */ @@ -225,14 +216,15 @@ class PreviewController extends BaseController /** * Returns a template filled with entity variables. - * + * * Used in the Custom Designer to preview design changes * @return mixed */ public function show() { - if(request()->has('template')) + if(request()->has('template')) { return $this->template(); + } if (request()->has('entity') && request()->has('entity_id') && @@ -308,8 +300,9 @@ class PreviewController extends BaseController $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); $numbered_pdf = $this->pageNumbering($pdf, $company); - if ($numbered_pdf) + if ($numbered_pdf) { $pdf = $numbered_pdf; + } return $pdf; @@ -340,16 +333,14 @@ class PreviewController extends BaseController /** @var \App\Models\Company $company */ $company = $user->company(); - $design_object = json_decode(json_encode(request()->input('design')),1); + $design_object = json_decode(json_encode(request()->input('design')), 1); $ts = (new TemplateService()); try { - $ts->setCompany($company) - ->setTemplate($design_object) - ->mock(); - } - catch(SyntaxError $e) - { + $ts->setCompany($company) + ->setTemplate($design_object) + ->mock(); + } catch(SyntaxError $e) { // return response()->json(['message' => 'Twig syntax is invalid.', 'errors' => new \stdClass], 422); @@ -558,8 +549,7 @@ class PreviewController extends BaseController ->build(); DB::connection($company->db)->rollBack(); - } - catch(\Exception $e){ + } catch(\Exception $e) { DB::connection($company->db)->rollBack(); return response()->json(['message' => $e->getMessage()], 400); } diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 660ea5f6e9e6..de086a030af3 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -260,24 +260,24 @@ class PreviewPurchaseOrderController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); - //if phantom js...... inject here.. - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); - } + //if phantom js...... inject here.. + if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { + return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); + } - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, $user->company()); + $numbered_pdf = $this->pageNumbering($pdf, $user->company()); - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - - return $pdf; + if ($numbered_pdf) { + $pdf = $numbered_pdf; } - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $company))->handle(); + return $pdf; + } + + $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $company))->handle(); if (Ninja::isHosted()) { diff --git a/app/Http/Controllers/ProductController.php b/app/Http/Controllers/ProductController.php index cc2784f5c0bb..c6bf1acc3619 100644 --- a/app/Http/Controllers/ProductController.php +++ b/app/Http/Controllers/ProductController.php @@ -467,7 +467,7 @@ class ProductController extends BaseController $products = Product::withTrashed()->whereIn('id', $ids); - if($action == 'set_tax_id'){ + if($action == 'set_tax_id') { $tax_id = $request->input('tax_id'); diff --git a/app/Http/Controllers/ProtectedDownloadController.php b/app/Http/Controllers/ProtectedDownloadController.php index 014527bace14..51c90774197f 100644 --- a/app/Http/Controllers/ProtectedDownloadController.php +++ b/app/Http/Controllers/ProtectedDownloadController.php @@ -11,10 +11,8 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use Illuminate\Http\Request; -use App\Jobs\Util\UnlinkFile; use App\Exceptions\SystemError; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Storage; diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index fa469a9d6d6e..51f0d744b404 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -11,33 +11,32 @@ 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\Services\PdfMaker\PdfMerge; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\SavesDocuments; -use App\Factory\PurchaseOrderFactory; -use App\Filters\PurchaseOrderFilters; -use Illuminate\Support\Facades\Storage; -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\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\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 { @@ -501,7 +500,7 @@ class PurchaseOrderController extends BaseController * Download Purchase Order/s */ if ($action == 'bulk_download' && $purchase_orders->count() >= 1) { - $purchase_orders->each(function ($purchase_order) use ($user){ + $purchase_orders->each(function ($purchase_order) use ($user) { if ($user->cannot('view', $purchase_order)) { return response()->json(['message' => ctrans('text.access_denied')]); } diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 915e325ed76f..94f3218d73f8 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -11,41 +11,40 @@ 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\Factory\CloneQuoteFactory; use App\Factory\CloneQuoteToInvoiceFactory; -use App\Factory\CloneQuoteToProjectFactory; +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\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. @@ -398,7 +397,7 @@ class QuoteController extends BaseController $quote->service() ->triggeredActions($request); - // ->deletePdf(); + // ->deletePdf(); event(new QuoteWasUpdated($quote, $quote->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); @@ -536,7 +535,7 @@ class QuoteController extends BaseController * Download Quote/s */ if ($action == 'bulk_download' && $quotes->count() >= 1) { - $quotes->each(function ($quote) use($user){ + $quotes->each(function ($quote) use ($user) { if ($user->cannot('view', $quote)) { return response()->json(['message'=> ctrans('texts.access_denied')]); } @@ -687,7 +686,7 @@ class QuoteController extends BaseController return $this->itemResponse($quote->service()->convertToProject()); - case 'convert': + case 'convert': case 'convert_to_invoice': $this->entity_type = Invoice::class; diff --git a/app/Http/Controllers/RecurringInvoiceController.php b/app/Http/Controllers/RecurringInvoiceController.php index 12c3f9dad0e1..aae571d71dcb 100644 --- a/app/Http/Controllers/RecurringInvoiceController.php +++ b/app/Http/Controllers/RecurringInvoiceController.php @@ -11,28 +11,28 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Account; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -use App\Utils\Traits\SavesDocuments; -use App\Factory\RecurringInvoiceFactory; -use App\Filters\RecurringInvoiceFilters; -use App\Jobs\RecurringInvoice\UpdateRecurring; -use App\Repositories\RecurringInvoiceRepository; -use App\Transformers\RecurringInvoiceTransformer; use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; +use App\Factory\RecurringInvoiceFactory; +use App\Filters\RecurringInvoiceFilters; +use App\Http\Requests\RecurringInvoice\ActionRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\BulkRecurringInvoiceRequest; +use App\Http\Requests\RecurringInvoice\CreateRecurringInvoiceRequest; +use App\Http\Requests\RecurringInvoice\DestroyRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\EditRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\ShowRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\StoreRecurringInvoiceRequest; -use App\Http\Requests\RecurringInvoice\ActionRecurringInvoiceRequest; -use App\Http\Requests\RecurringInvoice\CreateRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\UpdateRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\UploadRecurringInvoiceRequest; -use App\Http\Requests\RecurringInvoice\DestroyRecurringInvoiceRequest; +use App\Jobs\RecurringInvoice\UpdateRecurring; +use App\Models\Account; +use App\Models\RecurringInvoice; +use App\Repositories\RecurringInvoiceRepository; +use App\Transformers\RecurringInvoiceTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Response; /** * Class RecurringInvoiceController. diff --git a/app/Http/Controllers/RecurringQuoteController.php b/app/Http/Controllers/RecurringQuoteController.php index 348440c234a1..725980110a34 100644 --- a/app/Http/Controllers/RecurringQuoteController.php +++ b/app/Http/Controllers/RecurringQuoteController.php @@ -578,8 +578,8 @@ class RecurringQuoteController extends BaseController { switch ($action) { case 'clone_to_recurring_quote': - // $recurring_invoice = CloneRecurringQuoteFactory::create($recurring_invoice, auth()->user()->id); - // return $this->itemResponse($recurring_invoice); + // $recurring_invoice = CloneRecurringQuoteFactory::create($recurring_invoice, auth()->user()->id); + // return $this->itemResponse($recurring_invoice); break; case 'clone_to_quote': // $quote = CloneRecurringQuoteToQuoteFactory::create($recurring_invoice, auth()->user()->id); diff --git a/app/Http/Controllers/Reports/ARDetailReportController.php b/app/Http/Controllers/Reports/ARDetailReportController.php index 4f6c460e7a31..1d3784822299 100644 --- a/app/Http/Controllers/Reports/ARDetailReportController.php +++ b/app/Http/Controllers/Reports/ARDetailReportController.php @@ -11,11 +11,11 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\ARDetailReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +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/ActivityReportController.php b/app/Http/Controllers/Reports/ActivityReportController.php index ed241a9e38f2..1a10c131865e 100644 --- a/app/Http/Controllers/Reports/ActivityReportController.php +++ b/app/Http/Controllers/Reports/ActivityReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Export\CSV\ActivityExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; class ActivityReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ClientBalanceReportController.php b/app/Http/Controllers/Reports/ClientBalanceReportController.php index 0202af3d2f68..c29b0a213a10 100644 --- a/app/Http/Controllers/Reports/ClientBalanceReportController.php +++ b/app/Http/Controllers/Reports/ClientBalanceReportController.php @@ -11,12 +11,11 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Http\Controllers\BaseController; -use App\Services\Report\ARSummaryReport; -use App\Services\Report\ClientBalanceReport; use App\Http\Requests\Report\GenericReportRequest; +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/ClientContactReportController.php b/app/Http/Controllers/Reports/ClientContactReportController.php index e29eefe195f2..002573c0eea8 100644 --- a/app/Http/Controllers/Reports/ClientContactReportController.php +++ b/app/Http/Controllers/Reports/ClientContactReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Export\CSV\ContactExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ClientContactReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ClientReportController.php b/app/Http/Controllers/Reports/ClientReportController.php index bcbc2c02d98d..a0421f5288d0 100644 --- a/app/Http/Controllers/Reports/ClientReportController.php +++ b/app/Http/Controllers/Reports/ClientReportController.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\Export\CSV\ClientExport; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ClientReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ClientSalesReportController.php b/app/Http/Controllers/Reports/ClientSalesReportController.php index 056b157775b3..63c0ac69fe3c 100644 --- a/app/Http/Controllers/Reports/ClientSalesReportController.php +++ b/app/Http/Controllers/Reports/ClientSalesReportController.php @@ -11,12 +11,11 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Http\Controllers\BaseController; -use App\Services\Report\ClientSalesReport; -use App\Services\Report\ClientBalanceReport; use App\Http\Requests\Report\GenericReportRequest; +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/DocumentReportController.php b/app/Http/Controllers/Reports/DocumentReportController.php index d0cd939c86a7..e7db3f74186c 100644 --- a/app/Http/Controllers/Reports/DocumentReportController.php +++ b/app/Http/Controllers/Reports/DocumentReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Export\CSV\DocumentExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class DocumentReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ExpenseReportController.php b/app/Http/Controllers/Reports/ExpenseReportController.php index f1276cdaffdd..2cd849891f1f 100644 --- a/app/Http/Controllers/Reports/ExpenseReportController.php +++ b/app/Http/Controllers/Reports/ExpenseReportController.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\Export\CSV\ExpenseExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ExpenseReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/InvoiceItemReportController.php b/app/Http/Controllers/Reports/InvoiceItemReportController.php index a124171cc66e..3bb534b7f0e8 100644 --- a/app/Http/Controllers/Reports/InvoiceItemReportController.php +++ b/app/Http/Controllers/Reports/InvoiceItemReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Export\CSV\InvoiceItemExport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class InvoiceItemReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/InvoiceReportController.php b/app/Http/Controllers/Reports/InvoiceReportController.php index c00687fb6885..fea397431be5 100644 --- a/app/Http/Controllers/Reports/InvoiceReportController.php +++ b/app/Http/Controllers/Reports/InvoiceReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Export\CSV\InvoiceExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class InvoiceReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/PaymentReportController.php b/app/Http/Controllers/Reports/PaymentReportController.php index cca6925ef98a..92611439bcfd 100644 --- a/app/Http/Controllers/Reports/PaymentReportController.php +++ b/app/Http/Controllers/Reports/PaymentReportController.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\Export\CSV\PaymentExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class PaymentReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ProductReportController.php b/app/Http/Controllers/Reports/ProductReportController.php index 664bd51a698f..5eda138752ed 100644 --- a/app/Http/Controllers/Reports/ProductReportController.php +++ b/app/Http/Controllers/Reports/ProductReportController.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\Export\CSV\ProductExport; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ProductReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php b/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php index 71509576f582..2ad7ff67a5ec 100644 --- a/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php +++ b/app/Http/Controllers/Reports/PurchaseOrderItemReportController.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\Export\CSV\PurchaseOrderItemExport; +use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; class PurchaseOrderItemReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/PurchaseOrderReportController.php b/app/Http/Controllers/Reports/PurchaseOrderReportController.php index 5899b20cfcef..06aeba50a7f0 100644 --- a/app/Http/Controllers/Reports/PurchaseOrderReportController.php +++ b/app/Http/Controllers/Reports/PurchaseOrderReportController.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\Export\CSV\PurchaseOrderExport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; class PurchaseOrderReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/QuoteItemReportController.php b/app/Http/Controllers/Reports/QuoteItemReportController.php index 78295f1ddc7c..926107744c70 100644 --- a/app/Http/Controllers/Reports/QuoteItemReportController.php +++ b/app/Http/Controllers/Reports/QuoteItemReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Export\CSV\QuoteItemExport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class QuoteItemReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/QuoteReportController.php b/app/Http/Controllers/Reports/QuoteReportController.php index 9034b1a939c4..d7030f1f9d3a 100644 --- a/app/Http/Controllers/Reports/QuoteReportController.php +++ b/app/Http/Controllers/Reports/QuoteReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; use App\Export\CSV\QuoteExport; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class QuoteReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/RecurringInvoiceReportController.php b/app/Http/Controllers/Reports/RecurringInvoiceReportController.php index 26eb279106f2..811f72ecb4b9 100644 --- a/app/Http/Controllers/Reports/RecurringInvoiceReportController.php +++ b/app/Http/Controllers/Reports/RecurringInvoiceReportController.php @@ -11,13 +11,12 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; -use App\Http\Controllers\BaseController; use App\Export\CSV\RecurringInvoiceExport; +use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; class RecurringInvoiceReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ReportPreviewController.php b/app/Http/Controllers/Reports/ReportPreviewController.php index 82f55bc2f4df..1bb559552c0c 100644 --- a/app/Http/Controllers/Reports/ReportPreviewController.php +++ b/app/Http/Controllers/Reports/ReportPreviewController.php @@ -11,10 +11,10 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Cache; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\ReportPreviewRequest; +use App\Utils\Traits\MakesHash; +use Illuminate\Support\Facades\Cache; class ReportPreviewController extends BaseController { @@ -30,10 +30,11 @@ class ReportPreviewController extends BaseController $report = Cache::get($hash); - if(!$report) + if(!$report) { return response()->json(['message' => 'Still working.....'], 409); + } - if($report){ + if($report) { Cache::forget($hash); diff --git a/app/Http/Controllers/Reports/TaskReportController.php b/app/Http/Controllers/Reports/TaskReportController.php index 8339a909bcb0..970a5e7699ec 100644 --- a/app/Http/Controllers/Reports/TaskReportController.php +++ b/app/Http/Controllers/Reports/TaskReportController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers\Reports; -use Illuminate\Http\Response; use App\Export\CSV\TaskExport; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class TaskReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/TaxSummaryReportController.php b/app/Http/Controllers/Reports/TaxSummaryReportController.php index 776fa988d694..b199eadcc1f2 100644 --- a/app/Http/Controllers/Reports/TaxSummaryReportController.php +++ b/app/Http/Controllers/Reports/TaxSummaryReportController.php @@ -11,12 +11,11 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Http\Controllers\BaseController; -use App\Services\Report\TaxSummaryReport; -use App\Services\Report\ClientSalesReport; use App\Http\Requests\Report\GenericReportRequest; +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 582eb4e71727..2d80995791aa 100644 --- a/app/Http/Controllers/Reports/UserSalesReportController.php +++ b/app/Http/Controllers/Reports/UserSalesReportController.php @@ -11,12 +11,11 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; use App\Http\Controllers\BaseController; -use App\Services\Report\UserSalesReport; -use App\Services\Report\TaxSummaryReport; use App\Http\Requests\Report\GenericReportRequest; +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/Reports/VendorReportController.php b/app/Http/Controllers/Reports/VendorReportController.php index bfd0f3b2298e..50dbf6380650 100644 --- a/app/Http/Controllers/Reports/VendorReportController.php +++ b/app/Http/Controllers/Reports/VendorReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; use App\Export\CSV\VendorExport; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Utils\Traits\MakesHash; class VendorReportController extends BaseController { diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index cd985b44c721..7699e8c3d60a 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -54,25 +54,25 @@ class SearchController extends Controller ->take(1000) ->get(); - foreach($clients as $client) { - $this->clients[] = [ - 'name' => $client->present()->name(), - 'type' => '/client', - 'id' => $client->hashed_id, - 'path' => "/clients/{$client->hashed_id}/edit" - ]; + foreach($clients as $client) { + $this->clients[] = [ + 'name' => $client->present()->name(), + 'type' => '/client', + 'id' => $client->hashed_id, + 'path' => "/clients/{$client->hashed_id}/edit" + ]; - $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}" - ]; + $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}" + ]; - }); - } + }); + } } @@ -92,16 +92,16 @@ class SearchController extends Controller }) ->orderBy('id', 'desc') ->take(3000) - ->get(); + ->get(); - foreach($invoices as $invoice) { - $this->invoices[] = [ - 'name' => $invoice->client->present()->name() . ' - ' . $invoice->number, - 'type' => '/invoice', - 'id' => $invoice->hashed_id, - 'path' => "/invoices/{$invoice->hashed_id}/edit" - ]; - } + foreach($invoices as $invoice) { + $this->invoices[] = [ + 'name' => $invoice->client->present()->name() . ' - ' . $invoice->number, + 'type' => '/invoice', + 'id' => $invoice->hashed_id, + 'path' => "/invoices/{$invoice->hashed_id}/edit" + ]; + } } diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 75d2442fcdae..651d884ac30a 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -11,14 +11,14 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; +use App\Exceptions\FilePermissionsFailure; use App\Models\Company; +use App\Utils\Ninja; use App\Utils\Traits\AppSetup; +use App\Utils\Traits\ClientGroupSettingsSaver; +use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Storage; -use App\Exceptions\FilePermissionsFailure; -use Illuminate\Foundation\Bus\DispatchesJobs; -use App\Utils\Traits\ClientGroupSettingsSaver; class SelfUpdateController extends BaseController { @@ -72,8 +72,7 @@ class SelfUpdateController extends BaseController if (copy($this->getDownloadUrl(), storage_path("app/{$this->filename}"))) { nlog('Copied file from URL'); } - } - catch(\Exception $e) { + } catch(\Exception $e) { nlog($e->getMessage()); return response()->json(['message' => 'File exists on the server, however there was a problem downloading and copying to the local filesystem'], 500); } @@ -121,18 +120,19 @@ class SelfUpdateController extends BaseController { Company::query() ->cursor() - ->each(function ($company){ + ->each(function ($company) { - $settings = $company->settings; + $settings = $company->settings; - if(property_exists($settings->pdf_variables, 'purchase_order_details')) - return; + if(property_exists($settings->pdf_variables, 'purchase_order_details')) { + return; + } - $pdf_variables = $settings->pdf_variables; - $pdf_variables->purchase_order_details = []; - $settings->pdf_variables = $pdf_variables; - $company->settings = $settings; - $company->save(); + $pdf_variables = $settings->pdf_variables; + $pdf_variables->purchase_order_details = []; + $settings->pdf_variables = $pdf_variables; + $company->settings = $settings; + $company->save(); }); } diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php index c849e7348092..e7ac3a610799 100644 --- a/app/Http/Controllers/SetupController.php +++ b/app/Http/Controllers/SetupController.php @@ -121,8 +121,7 @@ class SetupController extends Controller unset($env_values['DB_DATABASE']); unset($env_values['DB_USERNAME']); unset($env_values['DB_PASSWORD']); - } - else { + } else { config(['database.connections.mysql.host' => $request->input('db_host')]); config(['database.connections.mysql.port' => $request->input('db_port')]); diff --git a/app/Http/Controllers/Shop/ProfileController.php b/app/Http/Controllers/Shop/ProfileController.php index 975ca5cf34af..4239baeaa217 100644 --- a/app/Http/Controllers/Shop/ProfileController.php +++ b/app/Http/Controllers/Shop/ProfileController.php @@ -28,7 +28,7 @@ class ProfileController extends BaseController public function show(Request $request) { - /** @var \App\Models\Company $company */ + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { diff --git a/app/Http/Controllers/StripeConnectController.php b/app/Http/Controllers/StripeConnectController.php index edb97e486d14..3a5f9ddd8e0f 100644 --- a/app/Http/Controllers/StripeConnectController.php +++ b/app/Http/Controllers/StripeConnectController.php @@ -123,7 +123,7 @@ class StripeConnectController extends BaseController $company_gateway->setConfig($payload); $company_gateway->save(); - try{ + try { $stripe = $company_gateway->driver()->init(); $a = \Stripe\Account::retrieve($response->stripe_user_id, $stripe->stripe_connect_auth); @@ -131,8 +131,7 @@ class StripeConnectController extends BaseController $company_gateway->label = substr("Stripe - {$a->business_name}", 0, 250); $company_gateway->save(); } - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog("could not harvest stripe company name"); } diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 1d722b86a2f6..a66c64424f6c 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -327,7 +327,7 @@ class TaskController extends BaseController * ) */ public function create(CreateTaskRequest $request) - { + { /** @var \App\Models\User $user */ $user = auth()->user(); @@ -506,7 +506,7 @@ class TaskController extends BaseController $tasks->each(function ($task, $key) use ($action) { /** @var \App\Models\User $user */ - $user = auth()->user(); + $user = auth()->user(); if ($user->can('edit', $task)) { $this->task_repo->{$action}($task); } @@ -633,7 +633,7 @@ class TaskController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); - collect($task_statuses)->each(function ($task_status_hashed_id, $key) use($user){ + collect($task_statuses)->each(function ($task_status_hashed_id, $key) use ($user) { $task_status = TaskStatus::query()->where('id', $this->decodePrimaryKey($task_status_hashed_id)) ->where('company_id', $user->company()->id) ->withTrashed() diff --git a/app/Http/Controllers/TaskSchedulerController.php b/app/Http/Controllers/TaskSchedulerController.php index 24e19e955991..e206ca8e4e2c 100644 --- a/app/Http/Controllers/TaskSchedulerController.php +++ b/app/Http/Controllers/TaskSchedulerController.php @@ -22,7 +22,6 @@ use App\Models\Scheduler; use App\Repositories\SchedulerRepository; use App\Transformers\SchedulerTransformer; use App\Utils\Traits\MakesHash; -use Symfony\Component\HttpFoundation\Request; class TaskSchedulerController extends BaseController { diff --git a/app/Http/Controllers/TaskStatusController.php b/app/Http/Controllers/TaskStatusController.php index 836dc9f88a30..db3d79f40645 100644 --- a/app/Http/Controllers/TaskStatusController.php +++ b/app/Http/Controllers/TaskStatusController.php @@ -11,20 +11,20 @@ namespace App\Http\Controllers; -use App\Models\TaskStatus; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; use App\Factory\TaskStatusFactory; use App\Filters\TaskStatusFilters; -use App\Repositories\TaskStatusRepository; -use App\Transformers\TaskStatusTransformer; +use App\Http\Requests\TaskStatus\ActionTaskStatusRequest; +use App\Http\Requests\TaskStatus\CreateTaskStatusRequest; +use App\Http\Requests\TaskStatus\DestroyTaskStatusRequest; use App\Http\Requests\TaskStatus\EditTaskStatusRequest; use App\Http\Requests\TaskStatus\ShowTaskStatusRequest; use App\Http\Requests\TaskStatus\StoreTaskStatusRequest; -use App\Http\Requests\TaskStatus\ActionTaskStatusRequest; -use App\Http\Requests\TaskStatus\CreateTaskStatusRequest; use App\Http\Requests\TaskStatus\UpdateTaskStatusRequest; -use App\Http\Requests\TaskStatus\DestroyTaskStatusRequest; +use App\Models\TaskStatus; +use App\Repositories\TaskStatusRepository; +use App\Transformers\TaskStatusTransformer; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class TaskStatusController extends BaseController { @@ -135,8 +135,9 @@ class TaskStatusController extends BaseController $reorder = $task_status->isDirty('status_order'); $task_status->save(); - if ($reorder) + if ($reorder) { $this->task_status_repo->reorder($task_status); + } return $this->itemResponse($task_status->fresh()); @@ -148,7 +149,7 @@ class TaskStatusController extends BaseController * @param DestroyTaskStatusRequest $request * @param TaskStatus $task_status * @return Response - * + * * @throws \Exception */ public function destroy(DestroyTaskStatusRequest $request, TaskStatus $task_status) diff --git a/app/Http/Controllers/TemplatePreviewController.php b/app/Http/Controllers/TemplatePreviewController.php index 76a15ab42cc6..2cfd05ed8ab9 100644 --- a/app/Http/Controllers/TemplatePreviewController.php +++ b/app/Http/Controllers/TemplatePreviewController.php @@ -11,11 +11,10 @@ namespace App\Http\Controllers; +use App\Http\Requests\Report\ReportPreviewRequest; use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Storage; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\ReportPreviewRequest; class TemplatePreviewController extends BaseController { diff --git a/app/Http/Controllers/Traits/VerifiesUserEmail.php b/app/Http/Controllers/Traits/VerifiesUserEmail.php index 7b26c9de3962..f5796c51e9ed 100644 --- a/app/Http/Controllers/Traits/VerifiesUserEmail.php +++ b/app/Http/Controllers/Traits/VerifiesUserEmail.php @@ -36,7 +36,7 @@ trait VerifiesUserEmail if (! $user) { return $this->render('auth.confirmed', [ - 'root' => 'themes', + 'root' => 'themes', 'message' => ctrans('texts.wrong_confirmation'), 'redirect_url' => request()->has('react') ? config('ninja.react_url')."/#/" : url('/')]); } diff --git a/app/Http/Controllers/TwilioController.php b/app/Http/Controllers/TwilioController.php index d6bf7488d931..39b7f726372c 100644 --- a/app/Http/Controllers/TwilioController.php +++ b/app/Http/Controllers/TwilioController.php @@ -11,13 +11,13 @@ namespace App\Http\Controllers; -use App\Models\User; -use Twilio\Rest\Client; -use App\Libraries\MultiDB; use App\Http\Requests\Twilio\Confirm2faRequest; use App\Http\Requests\Twilio\ConfirmSmsRequest; use App\Http\Requests\Twilio\Generate2faRequest; use App\Http\Requests\Twilio\GenerateSmsRequest; +use App\Libraries\MultiDB; +use App\Models\User; +use Twilio\Rest\Client; class TwilioController extends BaseController { diff --git a/app/Http/Controllers/TwoFactorController.php b/app/Http/Controllers/TwoFactorController.php index 9ba490a6f1b2..2d86469f9dd8 100644 --- a/app/Http/Controllers/TwoFactorController.php +++ b/app/Http/Controllers/TwoFactorController.php @@ -11,11 +11,11 @@ namespace App\Http\Controllers; +use App\Http\Requests\TwoFactor\EnableTwoFactorRequest; use App\Models\User; +use App\Transformers\UserTransformer; use App\Utils\Ninja; use PragmaRX\Google2FA\Google2FA; -use App\Transformers\UserTransformer; -use App\Http\Requests\TwoFactor\EnableTwoFactorRequest; class TwoFactorController extends BaseController { @@ -30,10 +30,9 @@ class TwoFactorController extends BaseController if ($user->google_2fa_secret) { return response()->json(['message' => '2FA already enabled'], 400); - } elseif(Ninja::isSelfHost()){ + } elseif(Ninja::isSelfHost()) { - } - elseif (! $user->phone) { + } elseif (! $user->phone) { return response()->json(['message' => ctrans('texts.set_phone_for_two_factor')], 400); } elseif (! $user->isVerified()) { return response()->json(['message' => 'Please confirm your account first'], 400); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 2c785dbc849e..03f9f0584d8a 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -11,31 +11,31 @@ namespace App\Http\Controllers; -use App\Models\User; -use App\Utils\Ninja; -use App\Models\CompanyUser; -use App\Factory\UserFactory; -use App\Filters\UserFilters; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; use App\Events\User\UserWasCreated; use App\Events\User\UserWasDeleted; use App\Events\User\UserWasUpdated; -use App\Jobs\User\UserEmailChanged; -use App\Repositories\UserRepository; -use App\Transformers\UserTransformer; -use App\Jobs\Company\CreateCompanyToken; -use App\Http\Requests\User\BulkUserRequest; -use App\Http\Requests\User\EditUserRequest; -use App\Http\Requests\User\ShowUserRequest; -use App\Http\Requests\User\StoreUserRequest; -use App\Http\Requests\User\CreateUserRequest; -use App\Http\Requests\User\UpdateUserRequest; -use App\Http\Requests\User\DestroyUserRequest; -use App\Http\Requests\User\ReconfirmUserRequest; +use App\Factory\UserFactory; +use App\Filters\UserFilters; use App\Http\Controllers\Traits\VerifiesUserEmail; +use App\Http\Requests\User\BulkUserRequest; +use App\Http\Requests\User\CreateUserRequest; +use App\Http\Requests\User\DestroyUserRequest; use App\Http\Requests\User\DetachCompanyUserRequest; use App\Http\Requests\User\DisconnectUserMailerRequest; +use App\Http\Requests\User\EditUserRequest; +use App\Http\Requests\User\ReconfirmUserRequest; +use App\Http\Requests\User\ShowUserRequest; +use App\Http\Requests\User\StoreUserRequest; +use App\Http\Requests\User\UpdateUserRequest; +use App\Jobs\Company\CreateCompanyToken; +use App\Jobs\User\UserEmailChanged; +use App\Models\CompanyUser; +use App\Models\User; +use App\Repositories\UserRepository; +use App\Transformers\UserTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; /** * Class UserController. @@ -235,7 +235,7 @@ class UserController extends BaseController $return_user_collection = collect(); /** @var \App\Models\User $logged_in_user */ - $logged_in_user = auth()->user(); + $logged_in_user = auth()->user(); $users->each(function ($user, $key) use ($logged_in_user, $action, $return_user_collection) { if ($logged_in_user->can('edit', $user)) { diff --git a/app/Http/Controllers/VendorPortal/InvitationController.php b/app/Http/Controllers/VendorPortal/InvitationController.php index 7ce6ae394d01..e0666ecfe109 100644 --- a/app/Http/Controllers/VendorPortal/InvitationController.php +++ b/app/Http/Controllers/VendorPortal/InvitationController.php @@ -11,17 +11,17 @@ namespace App\Http\Controllers\VendorPortal; -use App\Utils\Ninja; -use Illuminate\Support\Str; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesDates; -use Illuminate\Support\Facades\App; -use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Auth; -use App\Models\PurchaseOrderInvitation; use App\Events\Misc\InvitationWasViewed; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +use App\Http\Controllers\Controller; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Models\PurchaseOrderInvitation; +use App\Utils\Ninja; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Str; /** * Class InvitationController. diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index 74d66f0542fd..9fe4e285b269 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\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\Jobs\Vendor\CreatePurchaseOrderPdf; -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\Invoice\InjectSignature; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; +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 { @@ -184,7 +184,7 @@ class PurchaseOrderController extends Controller } event(new PurchaseOrderWasAccepted($purchase_order, auth()->guard('vendor')->user(), $purchase_order->company, Ninja::eventVars())); - }); + }); if ($purchase_count_query->count() == 1) { $purchase_order = $purchase_count_query->first(); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 171626827189..6a53796f3bd0 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -11,53 +11,52 @@ namespace App\Http; -use App\Utils\Ninja; -use App\Http\Middleware\Cors; -use App\Http\Middleware\SetDb; -use App\Http\Middleware\Locale; -use App\Http\Middleware\SetWebDb; -use App\Http\Middleware\UrlSetDb; -use App\Http\Middleware\TokenAuth; -use App\Http\Middleware\SetEmailDb; -use App\Http\Middleware\VerifyHash; -use App\Http\Middleware\SetInviteDb; -use App\Http\Middleware\TrimStrings; -use App\Http\Middleware\Authenticate; -use App\Http\Middleware\ContactSetDb; -use App\Http\Middleware\QueryLogging; -use App\Http\Middleware\TrustProxies; -use App\Http\Middleware\UserVerified; -use App\Http\Middleware\VendorLocale; -use App\Http\Middleware\PhantomSecret; -use App\Http\Middleware\SetDocumentDb; use App\Http\Middleware\ApiSecretCheck; +use App\Http\Middleware\Authenticate; +use App\Http\Middleware\CheckClientExistence; +use App\Http\Middleware\CheckForMaintenanceMode; +use App\Http\Middleware\ClientPortalEnabled; use App\Http\Middleware\ContactAccount; -use App\Http\Middleware\EncryptCookies; -use App\Http\Middleware\SessionDomains; use App\Http\Middleware\ContactKeyLogin; use App\Http\Middleware\ContactRegister; -use App\Http\Middleware\SetDomainNameDb; -use App\Http\Middleware\VerifyCsrfToken; +use App\Http\Middleware\ContactSetDb; use App\Http\Middleware\ContactTokenAuth; -use Illuminate\Auth\Middleware\Authorize; -use App\Http\Middleware\SetDbByCompanyKey; -use App\Http\Middleware\ValidateSignature; +use App\Http\Middleware\Cors; +use App\Http\Middleware\EncryptCookies; +use App\Http\Middleware\Locale; use App\Http\Middleware\PasswordProtection; -use App\Http\Middleware\ClientPortalEnabled; -use App\Http\Middleware\CheckClientExistence; -use App\Http\Middleware\VendorContactKeyLogin; -use Illuminate\Http\Middleware\SetCacheHeaders; -use Illuminate\Session\Middleware\StartSession; -use App\Http\Middleware\CheckForMaintenanceMode; +use App\Http\Middleware\PhantomSecret; +use App\Http\Middleware\QueryLogging; use App\Http\Middleware\RedirectIfAuthenticated; -use Illuminate\Foundation\Http\Kernel as HttpKernel; -use Illuminate\Auth\Middleware\EnsureEmailIsVerified; -use Illuminate\Routing\Middleware\SubstituteBindings; -use Illuminate\View\Middleware\ShareErrorsFromSession; +use App\Http\Middleware\SessionDomains; +use App\Http\Middleware\SetDb; +use App\Http\Middleware\SetDbByCompanyKey; +use App\Http\Middleware\SetDocumentDb; +use App\Http\Middleware\SetDomainNameDb; +use App\Http\Middleware\SetEmailDb; +use App\Http\Middleware\SetInviteDb; +use App\Http\Middleware\SetWebDb; +use App\Http\Middleware\TokenAuth; +use App\Http\Middleware\TrimStrings; +use App\Http\Middleware\TrustProxies; +use App\Http\Middleware\UrlSetDb; +use App\Http\Middleware\UserVerified; +use App\Http\Middleware\ValidateSignature; +use App\Http\Middleware\VendorContactKeyLogin; +use App\Http\Middleware\VendorLocale; +use App\Http\Middleware\VerifyCsrfToken; +use App\Http\Middleware\VerifyHash; use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth; -use Illuminate\Foundation\Http\Middleware\ValidatePostSize; +use Illuminate\Auth\Middleware\Authorize; +use Illuminate\Auth\Middleware\EnsureEmailIsVerified; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; +use Illuminate\Foundation\Http\Kernel as HttpKernel; use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull; +use Illuminate\Foundation\Http\Middleware\ValidatePostSize; +use Illuminate\Http\Middleware\SetCacheHeaders; +use Illuminate\Routing\Middleware\SubstituteBindings; +use Illuminate\Session\Middleware\StartSession; +use Illuminate\View\Middleware\ShareErrorsFromSession; class Kernel extends HttpKernel { diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index f8e625e03cf8..caa9b4b19571 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -23,7 +23,6 @@ use App\Models\Invoice; use App\Models\Subscription; use App\Repositories\ClientContactRepository; use App\Repositories\ClientRepository; -use App\Services\Subscription\SubscriptionService; use App\Utils\Ninja; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index 9638eafe2d02..f785f5f67cda 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -12,21 +12,21 @@ namespace App\Http\Livewire; -use App\Utils\Number; -use Livewire\Component; -use App\Utils\HtmlEngine; +use App\Jobs\Invoice\CreateEInvoice; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Libraries\MultiDB; -use Illuminate\Support\Str; -use App\Models\QuoteInvitation; -use App\Utils\VendorHtmlEngine; use App\Models\CreditInvitation; use App\Models\InvoiceInvitation; -use App\Jobs\Invoice\CreateEInvoice; -use Illuminate\Support\Facades\Cache; use App\Models\PurchaseOrderInvitation; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoiceInvitation; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; +use App\Utils\HtmlEngine; +use App\Utils\Number; +use App\Utils\VendorHtmlEngine; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; +use Livewire\Component; class PdfSlot extends Component { @@ -70,7 +70,7 @@ class PdfSlot extends Component public function getPdf() { - if(!$this->invitation){ + if(!$this->invitation) { $this->entity->service()->createInvitations(); $this->invitation = $this->entity->invitations()->first(); } @@ -95,10 +95,11 @@ class PdfSlot extends Component $file_name = $this->entity->numberFormatter().'.pdf'; - if($this->entity instanceof \App\Models\PurchaseOrder) + if($this->entity instanceof \App\Models\PurchaseOrder) { $file = (new CreatePurchaseOrderPdf($this->invitation, $this->invitation->company->db))->rawPdf(); - else + } else { $file = (new \App\Jobs\Entity\CreateRawPdf($this->invitation))->handle(); + } $headers = ['Content-Type' => 'application/pdf']; @@ -133,7 +134,7 @@ class PdfSlot extends Component $this->show_line_total = in_array('$product.line_total', $this->settings->pdf_variables->product_columns); $this->show_quantity = in_array('$product.quantity', $this->settings->pdf_variables->product_columns); - if($this->entity_type == 'quote' && !$this->settings->sync_invoice_quote_columns ){ + if($this->entity_type == 'quote' && !$this->settings->sync_invoice_quote_columns) { $this->show_cost = in_array('$product.unit_cost', $this->settings->pdf_variables->product_quote_columns); $this->show_quantity = in_array('$product.quantity', $this->settings->pdf_variables->product_quote_columns); $this->show_line_total = in_array('$product.line_total', $this->settings->pdf_variables->product_quote_columns); @@ -200,21 +201,22 @@ class PdfSlot extends Component $entity_details = ""; if($this->entity_type == 'invoice' || $this->entity_type == 'recurring_invoice') { - foreach($this->settings->pdf_variables->invoice_details as $variable) + foreach($this->settings->pdf_variables->invoice_details as $variable) { $entity_details .= "

{$variable}_label

{$variable}

"; + } - } - elseif($this->entity_type == 'quote'){ - foreach($this->settings->pdf_variables->quote_details ?? [] as $variable) + } elseif($this->entity_type == 'quote') { + foreach($this->settings->pdf_variables->quote_details ?? [] as $variable) { $entity_details .= "

{$variable}_label

{$variable}

"; - } - elseif($this->entity_type == 'credit') { - foreach($this->settings->pdf_variables->credit_details ?? [] as $variable) + } + } elseif($this->entity_type == 'credit') { + foreach($this->settings->pdf_variables->credit_details ?? [] as $variable) { $entity_details .= "

{$variable}_label

{$variable}

"; - } - elseif($this->entity_type == 'purchase_order'){ - foreach($this->settings->pdf_variables->purchase_order_details ?? [] as $variable) + } + } elseif($this->entity_type == 'purchase_order') { + foreach($this->settings->pdf_variables->purchase_order_details ?? [] as $variable) { $entity_details .= "

{$variable}_label

{$variable}

"; + } } return $this->convertVariables($entity_details); @@ -242,12 +244,11 @@ class PdfSlot extends Component $user_details = ""; if($this->entity_type == 'purchase_order') { - foreach(array_slice($this->settings->pdf_variables->vendor_details,1) as $variable) { + foreach(array_slice($this->settings->pdf_variables->vendor_details, 1) as $variable) { $user_details .= "

{$variable}

"; } - } - else{ - foreach(array_slice($this->settings->pdf_variables->client_details,1) as $variable) { + } else { + foreach(array_slice($this->settings->pdf_variables->client_details, 1) as $variable) { $user_details .= "

{$variable}

"; } } @@ -260,7 +261,7 @@ class PdfSlot extends Component $product_items = collect($this->entity->line_items)->filter(function ($item) { return $item->type_id == 1 || $item->type_id == 6 || $item->type_id == 5; - })->map(function ($item){ + })->map(function ($item) { $notes = strlen($item->notes) > 4 ? $item->notes : $item->product_key; @@ -279,7 +280,7 @@ class PdfSlot extends Component { $task_items = collect($this->entity->line_items)->filter(function ($item) { return $item->type_id == 2; - })->map(function ($item){ + })->map(function ($item) { return [ 'quantity' => $item->quantity, 'cost' => Number::formatMoney($item->cost, $this->entity->client ?: $this->entity->vendor), diff --git a/app/Http/Livewire/TasksTable.php b/app/Http/Livewire/TasksTable.php index f229db889f46..fa3f45df6ee2 100644 --- a/app/Http/Livewire/TasksTable.php +++ b/app/Http/Livewire/TasksTable.php @@ -39,11 +39,11 @@ class TasksTable extends Component ->where('is_deleted', false) ->where('client_id', auth()->guard('contact')->user()->client_id); - if ( auth()->guard('contact')->user()->client->getSetting('show_all_tasks_client_portal') === 'invoiced') { + if (auth()->guard('contact')->user()->client->getSetting('show_all_tasks_client_portal') === 'invoiced') { $query = $query->whereNotNull('invoice_id'); } - if ( auth()->guard('contact')->user()->client->getSetting('show_all_tasks_client_portal') === 'uninvoiced') { + if (auth()->guard('contact')->user()->client->getSetting('show_all_tasks_client_portal') === 'uninvoiced') { $query = $query->whereNull('invoice_id'); } diff --git a/app/Http/Middleware/PasswordProtection.php b/app/Http/Middleware/PasswordProtection.php index 4450ec321079..d34c817f2a74 100644 --- a/app/Http/Middleware/PasswordProtection.php +++ b/app/Http/Middleware/PasswordProtection.php @@ -38,7 +38,7 @@ class PasswordProtection ]; /** @var \App\Models\User auth()->user() */ - $user = auth()->user(); + $user = auth()->user(); $timeout = $user->company()->default_password_timeout; if ($timeout == 0) { @@ -59,11 +59,9 @@ class PasswordProtection Cache::put(auth()->user()->hashed_id.'_'.auth()->user()->account_id.'_logged_in', Str::random(64), $timeout); return $next($request); - } - elseif(strlen(auth()->user()->oauth_provider_id) > 2 && !auth()->user()->company()->oauth_password_required){ + } elseif(strlen(auth()->user()->oauth_provider_id) > 2 && !auth()->user()->company()->oauth_password_required) { return $next($request); - } - elseif ($request->header('X-API-OAUTH-PASSWORD') && strlen($request->header('X-API-OAUTH-PASSWORD')) >=1) { + } elseif ($request->header('X-API-OAUTH-PASSWORD') && strlen($request->header('X-API-OAUTH-PASSWORD')) >=1) { //user is attempting to reauth with OAuth - check the token value //todo expand this to include all OAuth providers if (auth()->user()->oauth_provider_id == 'google') { diff --git a/app/Http/Middleware/QueryLogging.php b/app/Http/Middleware/QueryLogging.php index e6aa71a7b863..39fac1a5a650 100644 --- a/app/Http/Middleware/QueryLogging.php +++ b/app/Http/Middleware/QueryLogging.php @@ -47,8 +47,9 @@ class QueryLogging public function terminate($request, $response) { - if (! Ninja::isHosted() || ! config('beacon.enabled')) + if (! Ninja::isHosted() || ! config('beacon.enabled')) { return; + } // hide requests made by debugbar if (strstr($request->url(), '_debugbar') === false) { diff --git a/app/Http/Middleware/TokenAuth.php b/app/Http/Middleware/TokenAuth.php index e73ccb00fcab..227d47a3804a 100644 --- a/app/Http/Middleware/TokenAuth.php +++ b/app/Http/Middleware/TokenAuth.php @@ -31,7 +31,7 @@ class TokenAuth public function handle($request, Closure $next) { if ($request->header('X-API-TOKEN') && ($company_token = CompanyToken::with([ - 'user' => [ + 'user' => [ 'account', ], 'company'])->where('token', $request->header('X-API-TOKEN'))->first())) { $user = $company_token->user; diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php index 6308b308624b..deb5f45679ca 100644 --- a/app/Http/Middleware/ValidateSignature.php +++ b/app/Http/Middleware/ValidateSignature.php @@ -11,7 +11,6 @@ namespace App\Http\Middleware; - use Closure; use Illuminate\Routing\Exceptions\InvalidSignatureException; diff --git a/app/Http/Middleware/VendorContactKeyLogin.php b/app/Http/Middleware/VendorContactKeyLogin.php index e73a32554662..407665e59f8d 100644 --- a/app/Http/Middleware/VendorContactKeyLogin.php +++ b/app/Http/Middleware/VendorContactKeyLogin.php @@ -11,14 +11,14 @@ namespace App\Http\Middleware; +use App\Libraries\MultiDB; +use App\Models\Vendor; +use App\Models\VendorContact; use Auth; use Closure; -use App\Models\Vendor; -use App\Libraries\MultiDB; -use Illuminate\Support\Str; use Illuminate\Http\Request; -use App\Models\VendorContact; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; class VendorContactKeyLogin { diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 115de351c796..cbbd75224b6a 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -12,7 +12,6 @@ namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; -use Illuminate\Session\TokenMismatchException; class VerifyCsrfToken extends Middleware { diff --git a/app/Http/Requests/Activity/ShowActivityRequest.php b/app/Http/Requests/Activity/ShowActivityRequest.php index 219844f35dbe..a2a13eae6f47 100644 --- a/app/Http/Requests/Activity/ShowActivityRequest.php +++ b/app/Http/Requests/Activity/ShowActivityRequest.php @@ -40,8 +40,9 @@ class ShowActivityRequest extends Request { $input = $this->all(); - if(isset($input['entity_id'])) + if(isset($input['entity_id'])) { $input['entity_id'] = $this->decodePrimaryKey($input['entity_id']); + } $this->replace($input); diff --git a/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php b/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php index 73724da000c3..7f855ef8de94 100644 --- a/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php +++ b/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php @@ -33,7 +33,7 @@ class ProcessInvoicesInBulkRequest extends FormRequest { $input = $this->all(); - if(isset($input['invoices'])){ + if(isset($input['invoices'])) { $input['invoices'] = array_unique($input['invoices']); } diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index 9f64e4a284db..4ffa0e33093d 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -63,8 +63,9 @@ class UpdateCompanyRequest extends Request $rules['portal_domain'] = 'sometimes|url'; } - if (Ninja::isHosted()) + if (Ninja::isHosted()) { $rules['subdomain'] = ['nullable', 'regex:/^[a-zA-Z0-9.-]+[a-zA-Z0-9]$/', new ValidSubdomain()]; + } return $rules; } diff --git a/app/Http/Requests/Document/StoreDocumentRequest.php b/app/Http/Requests/Document/StoreDocumentRequest.php index f31504615dfe..7c3d4356f60f 100644 --- a/app/Http/Requests/Document/StoreDocumentRequest.php +++ b/app/Http/Requests/Document/StoreDocumentRequest.php @@ -40,8 +40,9 @@ class StoreDocumentRequest extends Request { $input = $this->all(); - if(isset($input['is_public'])) + if(isset($input['is_public'])) { $input['is_public'] = $this->toBoolean($input['is_public']); + } $this->replace($input); } diff --git a/app/Http/Requests/Document/UpdateDocumentRequest.php b/app/Http/Requests/Document/UpdateDocumentRequest.php index bfa876eca2bc..3dcf677a6ac8 100644 --- a/app/Http/Requests/Document/UpdateDocumentRequest.php +++ b/app/Http/Requests/Document/UpdateDocumentRequest.php @@ -44,8 +44,9 @@ class UpdateDocumentRequest extends Request { $input = $this->all(); - if(isset($input['is_public'])) + if(isset($input['is_public'])) { $input['is_public'] = $this->toBoolean($input['is_public']); + } $this->replace($input); } diff --git a/app/Http/Requests/Email/ClientEmailHistoryRequest.php b/app/Http/Requests/Email/ClientEmailHistoryRequest.php index 45d60b458b99..24d96a6e0b21 100644 --- a/app/Http/Requests/Email/ClientEmailHistoryRequest.php +++ b/app/Http/Requests/Email/ClientEmailHistoryRequest.php @@ -13,7 +13,6 @@ namespace App\Http\Requests\Email; use App\Http\Requests\Request; use App\Utils\Traits\MakesHash; -use Illuminate\Support\Str; class ClientEmailHistoryRequest extends Request { diff --git a/app/Http/Requests/Email/EntityEmailHistoryRequest.php b/app/Http/Requests/Email/EntityEmailHistoryRequest.php index 2c506e653dd6..61bdf9403353 100644 --- a/app/Http/Requests/Email/EntityEmailHistoryRequest.php +++ b/app/Http/Requests/Email/EntityEmailHistoryRequest.php @@ -11,9 +11,9 @@ namespace App\Http\Requests\Email; -use Illuminate\Support\Str; use App\Http\Requests\Request; use App\Utils\Traits\MakesHash; +use Illuminate\Support\Str; use Illuminate\Validation\Rule; class EntityEmailHistoryRequest extends Request diff --git a/app/Http/Requests/Email/SendEmailRequest.php b/app/Http/Requests/Email/SendEmailRequest.php index d917742dfac3..53a48cc52891 100644 --- a/app/Http/Requests/Email/SendEmailRequest.php +++ b/app/Http/Requests/Email/SendEmailRequest.php @@ -108,8 +108,7 @@ class SendEmailRequest extends Request if ($entity_obj && ($company->id == $entity_obj->company_id) && $user->can('edit', $entity_obj)) { return true; } - } - else { + } else { $this->error_message = "Invalid entity or entity_id"; } diff --git a/app/Http/Requests/GroupSetting/StoreGroupSettingRequest.php b/app/Http/Requests/GroupSetting/StoreGroupSettingRequest.php index d35e7ac2bc78..b39f11533add 100644 --- a/app/Http/Requests/GroupSetting/StoreGroupSettingRequest.php +++ b/app/Http/Requests/GroupSetting/StoreGroupSettingRequest.php @@ -11,13 +11,13 @@ namespace App\Http\Requests\GroupSetting; -use App\Models\Account; -use App\Models\GroupSetting; -use App\Http\Requests\Request; use App\DataMapper\ClientSettings; use App\DataMapper\CompanySettings; use App\DataMapper\Settings\SettingsData; +use App\Http\Requests\Request; use App\Http\ValidationRules\ValidClientGroupSettingsRule; +use App\Models\Account; +use App\Models\GroupSetting; class StoreGroupSettingRequest extends Request { @@ -52,8 +52,7 @@ class StoreGroupSettingRequest extends Request if (array_key_exists('settings', $input)) { $input['settings'] = $this->filterSaveableSettings($input['settings']); - } - else { + } else { $input['settings'] = (array)ClientSettings::defaults(); } diff --git a/app/Http/Requests/GroupSetting/UpdateGroupSettingRequest.php b/app/Http/Requests/GroupSetting/UpdateGroupSettingRequest.php index a264d74c018d..ebb6f550fb3d 100644 --- a/app/Http/Requests/GroupSetting/UpdateGroupSettingRequest.php +++ b/app/Http/Requests/GroupSetting/UpdateGroupSettingRequest.php @@ -11,9 +11,9 @@ namespace App\Http\Requests\GroupSetting; -use App\Http\Requests\Request; use App\DataMapper\CompanySettings; use App\DataMapper\Settings\SettingsData; +use App\Http\Requests\Request; use App\Http\ValidationRules\ValidClientGroupSettingsRule; class UpdateGroupSettingRequest extends Request diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index a21c98a988ea..25c7c2fb2fb4 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -31,7 +31,7 @@ class UpdateInvoiceRequest extends Request * @return bool */ public function authorize() : bool - { + { /** @var \App\Models\User $user */ $user = auth()->user(); diff --git a/app/Http/Requests/Invoice/UploadInvoiceRequest.php b/app/Http/Requests/Invoice/UploadInvoiceRequest.php index 45d97b079900..1da7f3e829ca 100644 --- a/app/Http/Requests/Invoice/UploadInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UploadInvoiceRequest.php @@ -12,7 +12,6 @@ namespace App\Http\Requests\Invoice; use App\Http\Requests\Request; -use Illuminate\Http\UploadedFile; class UploadInvoiceRequest extends Request { diff --git a/app/Http/Requests/Payment/RefundPaymentRequest.php b/app/Http/Requests/Payment/RefundPaymentRequest.php index 5f0a8381d5fa..5a6f71d4cb99 100644 --- a/app/Http/Requests/Payment/RefundPaymentRequest.php +++ b/app/Http/Requests/Payment/RefundPaymentRequest.php @@ -58,7 +58,7 @@ class RefundPaymentRequest extends Request if (isset($input['credits'])) { unset($input['credits']); // foreach($input['credits'] as $key => $credit) - // $input['credits'][$key]['credit_id'] = $this->decodePrimaryKey($credit['credit_id']); + // $input['credits'][$key]['credit_id'] = $this->decodePrimaryKey($credit['credit_id']); } $this->replace($input); diff --git a/app/Http/Requests/Payment/UpdatePaymentRequest.php b/app/Http/Requests/Payment/UpdatePaymentRequest.php index 02b465638efe..113bf9493236 100644 --- a/app/Http/Requests/Payment/UpdatePaymentRequest.php +++ b/app/Http/Requests/Payment/UpdatePaymentRequest.php @@ -82,8 +82,8 @@ class UpdatePaymentRequest extends Request if (isset($input['invoices']) && is_array($input['invoices']) !== false) { foreach ($input['invoices'] as $key => $value) { - if(isset($input['invoices'][$key]['invoice_id'])){ - // if (array_key_exists('invoice_id', $input['invoices'][$key])) { + if(isset($input['invoices'][$key]['invoice_id'])) { + // if (array_key_exists('invoice_id', $input['invoices'][$key])) { $input['invoices'][$key]['invoice_id'] = $this->decodePrimaryKey($value['invoice_id']); } } diff --git a/app/Http/Requests/Preview/PreviewInvoiceRequest.php b/app/Http/Requests/Preview/PreviewInvoiceRequest.php index 57bd0cf22ef0..d69d231c05b5 100644 --- a/app/Http/Requests/Preview/PreviewInvoiceRequest.php +++ b/app/Http/Requests/Preview/PreviewInvoiceRequest.php @@ -11,19 +11,19 @@ namespace App\Http\Requests\Preview; -use App\Models\Quote; +use App\Http\Requests\Request; use App\Models\Client; use App\Models\Credit; +use App\Models\CreditInvitation; use App\Models\Invoice; -use App\Http\Requests\Request; +use App\Models\InvoiceInvitation; +use App\Models\Quote; use App\Models\QuoteInvitation; +use App\Models\RecurringInvoice; +use App\Models\RecurringInvoiceInvitation; +use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; use Illuminate\Validation\Rule; -use App\Models\CreditInvitation; -use App\Models\RecurringInvoice; -use App\Models\InvoiceInvitation; -use App\Utils\Traits\CleanLineItems; -use App\Models\RecurringInvoiceInvitation; class PreviewInvoiceRequest extends Request { @@ -55,7 +55,7 @@ class PreviewInvoiceRequest extends Request return [ 'number' => 'nullable', 'entity' => 'bail|sometimes|in:invoice,quote,credit,recurring_invoice', - 'entity_id' => ['bail','sometimes','integer',Rule::exists($this->entity_plural, 'id')->where('is_deleted',0)->where('company_id', $user->company()->id)], + 'entity_id' => ['bail','sometimes','integer',Rule::exists($this->entity_plural, 'id')->where('is_deleted', 0)->where('company_id', $user->company()->id)], 'client_id' => ['required', Rule::exists(Client::class, 'id')->where('is_deleted', 0)->where('company_id', $user->company()->id)], ]; @@ -76,8 +76,9 @@ class PreviewInvoiceRequest extends Request $input['balance'] = 0; $input['number'] = isset($input['number']) ? $input['number'] : ctrans('texts.live_preview').' #'.rand(0, 1000); - if($input['entity_id'] ?? false) + if($input['entity_id'] ?? false) { $input['entity_id'] = $this->decodePrimaryKey($input['entity_id'], true); + } $this->convertEntityPlural($input['entity'] ?? 'invoice'); @@ -88,26 +89,29 @@ class PreviewInvoiceRequest extends Request { $invitation = false; - if(! $this->entity_id ?? false) + if(! $this->entity_id ?? false) { return $this->stubInvitation(); + } - match($this->entity){ - 'invoice' => $invitation = InvoiceInvitation::withTrashed()->where('invoice_id', $this->entity_id)->first(), - 'quote' => $invitation = QuoteInvitation::withTrashed()->where('quote_id', $this->entity_id)->first(), - 'credit' => $invitation = CreditInvitation::withTrashed()->where('credit_id', $this->entity_id)->first(), - 'recurring_invoice' => $invitation = RecurringInvoiceInvitation::withTrashed()->where('recurring_invoice_id', $this->entity_id)->first(), + match($this->entity) { + 'invoice' => $invitation = InvoiceInvitation::withTrashed()->where('invoice_id', $this->entity_id)->first(), + 'quote' => $invitation = QuoteInvitation::withTrashed()->where('quote_id', $this->entity_id)->first(), + 'credit' => $invitation = CreditInvitation::withTrashed()->where('credit_id', $this->entity_id)->first(), + 'recurring_invoice' => $invitation = RecurringInvoiceInvitation::withTrashed()->where('recurring_invoice_id', $this->entity_id)->first(), }; - if($invitation) + if($invitation) { return $invitation; + } $invitation = $this->stubInvitation(); } public function getClient(): ?Client { - if(!$this->client) + if(!$this->client) { $this->client = Client::query()->with('contacts', 'company', 'user')->withTrashed()->find($this->client_id); + } return $this->client; } @@ -147,7 +151,7 @@ class PreviewInvoiceRequest extends Request { $entity = false; - match($this->entity){ + match($this->entity) { 'invoice' => $entity = Invoice::factory()->make(['client_id' => $client->id,'user_id' => $client->user_id, 'company_id' => $client->company_id]), 'quote' => $entity = Quote::factory()->make(['client_id' => $client->id,'user_id' => $client->user_id, 'company_id' => $client->company_id]), 'credit' => $entity = Credit::factory()->make(['client_id' => $client->id,'user_id' => $client->user_id, 'company_id' => $client->company_id]), diff --git a/app/Http/Requests/PurchaseOrder/UploadPurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/UploadPurchaseOrderRequest.php index 746e17abf11e..8d290a696a89 100644 --- a/app/Http/Requests/PurchaseOrder/UploadPurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/UploadPurchaseOrderRequest.php @@ -44,7 +44,7 @@ class UploadPurchaseOrderRequest extends Request $rules['file'] = $this->file_validation; } - $rules['is_public'] = 'sometimes|boolean'; + $rules['is_public'] = 'sometimes|boolean'; return $rules; } diff --git a/app/Http/Requests/Quote/BulkActionQuoteRequest.php b/app/Http/Requests/Quote/BulkActionQuoteRequest.php index c9f41313a568..cb77becc069a 100644 --- a/app/Http/Requests/Quote/BulkActionQuoteRequest.php +++ b/app/Http/Requests/Quote/BulkActionQuoteRequest.php @@ -34,7 +34,7 @@ class BulkActionQuoteRequest extends Request 'action' => 'sometimes|in:convert_to_invoice,convert_to_project,email,bulk_download,bulk_print,clone_to_invoice,approve,download,restore,archive,delete,send_email,mark_sent', ]; - if (in_array($input['action'], ['convert,convert_to_invoice']) ) { + if (in_array($input['action'], ['convert,convert_to_invoice'])) { $rules['action'] = [new ConvertableQuoteRule()]; } diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 8f97f3ab5e90..5ae5e13dd481 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, 1); + } if(!is_array($values)) { return $fail('The '.$attribute.' is invalid. Must be an array.'); diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index d0ab48a2980d..7779dc0340df 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -120,10 +120,10 @@ class UpdateTaskRequest extends Request $input['color'] = ''; } - if(isset($input['project_id']) && isset($input['client_id'])){ + if(isset($input['project_id']) && isset($input['client_id'])) { $search_project_with_client = Project::withTrashed()->where('id', $input['project_id'])->where('client_id', $input['client_id'])->company()->doesntExist(); - if($search_project_with_client){ + if($search_project_with_client) { unset($input['project_id']); } diff --git a/app/Http/Requests/Task/UploadTaskRequest.php b/app/Http/Requests/Task/UploadTaskRequest.php index 6b7d96ef048b..088ec573c344 100644 --- a/app/Http/Requests/Task/UploadTaskRequest.php +++ b/app/Http/Requests/Task/UploadTaskRequest.php @@ -53,8 +53,9 @@ class UploadTaskRequest extends Request { $input = $this->all(); - if(isset($input['is_public'])) + if(isset($input['is_public'])) { $input['is_public'] = $this->toBoolean($input['is_public']); + } $this->replace($input); } diff --git a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php index c0fc0c9d6061..312e073099fe 100644 --- a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php @@ -14,7 +14,6 @@ namespace App\Http\Requests\TaskScheduler; use App\Http\Requests\Request; use App\Http\ValidationRules\Scheduler\ValidClientIds; use App\Utils\Traits\MakesHash; -use Illuminate\Validation\Rule; class StoreSchedulerRequest extends Request { @@ -60,7 +59,7 @@ class StoreSchedulerRequest extends Request $input['next_run_client'] = $input['next_run']; } - if($input['template'] == 'email_record'){ + if($input['template'] == 'email_record') { $input['frequency_id'] = 0; } diff --git a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php index 24dea23f0ac9..6a7750320f41 100644 --- a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php @@ -12,7 +12,6 @@ namespace App\Http\Requests\TaskScheduler; use App\Http\Requests\Request; use App\Http\ValidationRules\Scheduler\ValidClientIds; -use Illuminate\Validation\Rule; class UpdateSchedulerRequest extends Request { diff --git a/app/Http/Requests/TaskStatus/UpdateTaskStatusRequest.php b/app/Http/Requests/TaskStatus/UpdateTaskStatusRequest.php index e7a0b757c9ef..c1f2bb31aefe 100644 --- a/app/Http/Requests/TaskStatus/UpdateTaskStatusRequest.php +++ b/app/Http/Requests/TaskStatus/UpdateTaskStatusRequest.php @@ -13,7 +13,6 @@ namespace App\Http\Requests\TaskStatus; use App\Http\Requests\Request; use App\Utils\Traits\MakesHash; -use Illuminate\Validation\Rule; class UpdateTaskStatusRequest extends Request { diff --git a/app/Http/Requests/User/BulkUserRequest.php b/app/Http/Requests/User/BulkUserRequest.php index c07032f4f2e6..f0893654e5f4 100644 --- a/app/Http/Requests/User/BulkUserRequest.php +++ b/app/Http/Requests/User/BulkUserRequest.php @@ -11,10 +11,10 @@ namespace App\Http\Requests\User; -use App\Utils\Ninja; use App\Http\Requests\Request; -use Illuminate\Auth\Access\AuthorizationException; use App\Http\ValidationRules\Ninja\CanRestoreUserRule; +use App\Utils\Ninja; +use Illuminate\Auth\Access\AuthorizationException; class BulkUserRequest extends Request { @@ -25,8 +25,9 @@ class BulkUserRequest extends Request */ public function authorize() : bool { - if($this->action == 'delete' && in_array(auth()->user()->hashed_id, $this->ids)) + if($this->action == 'delete' && in_array(auth()->user()->hashed_id, $this->ids)) { return false; + } return auth()->user()->isAdmin(); } diff --git a/app/Http/Requests/User/DisconnectUserMailerRequest.php b/app/Http/Requests/User/DisconnectUserMailerRequest.php index 881276e4dca3..ffe07871e84a 100644 --- a/app/Http/Requests/User/DisconnectUserMailerRequest.php +++ b/app/Http/Requests/User/DisconnectUserMailerRequest.php @@ -23,7 +23,7 @@ class DisconnectUserMailerRequest extends Request * @return bool */ public function authorize() : bool - { + { return auth()->user()->id == $this->user->id || auth()->user()->isAdmin(); } diff --git a/app/Http/Requests/Vendor/UploadVendorRequest.php b/app/Http/Requests/Vendor/UploadVendorRequest.php index a9263fb979be..f1219bd6d640 100644 --- a/app/Http/Requests/Vendor/UploadVendorRequest.php +++ b/app/Http/Requests/Vendor/UploadVendorRequest.php @@ -50,8 +50,9 @@ class UploadVendorRequest extends Request { $input = $this->all(); - if(isset($input['is_public'])) + if(isset($input['is_public'])) { $input['is_public'] = $this->toBoolean($input['is_public']); + } $this->replace($input); } diff --git a/app/Http/Requests/Webhook/UpdateWebhookRequest.php b/app/Http/Requests/Webhook/UpdateWebhookRequest.php index d8fd2ed783cd..a02890d55d44 100644 --- a/app/Http/Requests/Webhook/UpdateWebhookRequest.php +++ b/app/Http/Requests/Webhook/UpdateWebhookRequest.php @@ -49,7 +49,7 @@ class UpdateWebhookRequest extends Request } // if(isset($input['headers']) && count($input['headers']) == 0) - // $input['headers'] = null; + // $input['headers'] = null; $this->replace($input); } diff --git a/app/Http/ValidationRules/Credit/ValidCreditsRules.php b/app/Http/ValidationRules/Credit/ValidCreditsRules.php index d02097df2159..8c43fed21685 100644 --- a/app/Http/ValidationRules/Credit/ValidCreditsRules.php +++ b/app/Http/ValidationRules/Credit/ValidCreditsRules.php @@ -76,7 +76,7 @@ class ValidCreditsRules implements Rule return false; } - if($cred->status_id == Credit::STATUS_DRAFT){ + if($cred->status_id == Credit::STATUS_DRAFT) { $cred->service()->markSent()->save(); $cred = $cred->fresh(); } diff --git a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php index 6de59ca0b9ca..49530bca72a1 100644 --- a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php +++ b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php @@ -11,7 +11,6 @@ namespace App\Http\ValidationRules\Payment; -use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; use App\Utils\Traits\MakesHash; diff --git a/app/Http/ValidationRules/PaymentAppliedValidAmount.php b/app/Http/ValidationRules/PaymentAppliedValidAmount.php index 2958f04229cf..f64f72d2b1fa 100644 --- a/app/Http/ValidationRules/PaymentAppliedValidAmount.php +++ b/app/Http/ValidationRules/PaymentAppliedValidAmount.php @@ -91,7 +91,7 @@ class PaymentAppliedValidAmount implements Rule } } - if(count($this->input['invoices']) >=1 && $payment->status_id == Payment::STATUS_PENDING){ + if(count($this->input['invoices']) >=1 && $payment->status_id == Payment::STATUS_PENDING) { $this->message = 'Cannot apply a payment until the status is completed.'; return false; } diff --git a/app/Http/ValidationRules/Project/ValidProjectForClient.php b/app/Http/ValidationRules/Project/ValidProjectForClient.php index 46f3b1a8c881..188d94c93931 100644 --- a/app/Http/ValidationRules/Project/ValidProjectForClient.php +++ b/app/Http/ValidationRules/Project/ValidProjectForClient.php @@ -53,7 +53,7 @@ class ValidProjectForClient implements Rule return; } - if(!isset($this->input['client_id'])){ + if(!isset($this->input['client_id'])) { $this->message = 'No Client ID provided.'; return false; } diff --git a/app/Http/ValidationRules/ValidAmount.php b/app/Http/ValidationRules/ValidAmount.php index 4438b935ad9b..2f219f17b86f 100644 --- a/app/Http/ValidationRules/ValidAmount.php +++ b/app/Http/ValidationRules/ValidAmount.php @@ -27,7 +27,7 @@ class ValidAmount implements Rule { return is_numeric((string) $value); //return filter_var((string)$value, FILTER_VALIDATE_FLOAT); -// return preg_match('^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$^', (string)$value); + // return preg_match('^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$^', (string)$value); // return trim($value, '-1234567890.,') === ''; } diff --git a/app/Import/Providers/BaseImport.php b/app/Import/Providers/BaseImport.php index e401e85aa058..f5396e7efd6b 100644 --- a/app/Import/Providers/BaseImport.php +++ b/app/Import/Providers/BaseImport.php @@ -11,31 +11,31 @@ namespace App\Import\Providers; -use App\Models\User; -use App\Models\Quote; -use League\Csv\Reader; -use App\Models\Company; -use App\Models\Invoice; -use League\Csv\Statement; -use App\Factory\QuoteFactory; use App\Factory\ClientFactory; -use Illuminate\Support\Carbon; use App\Factory\InvoiceFactory; use App\Factory\PaymentFactory; +use App\Factory\QuoteFactory; +use App\Factory\RecurringInvoiceFactory; +use App\Http\Requests\Quote\StoreQuoteRequest; use App\Import\ImportException; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use App\Utils\Traits\CleanLineItems; -use App\Repositories\QuoteRepository; -use Illuminate\Support\Facades\Cache; -use App\Repositories\ClientRepository; use App\Mail\Import\CsvImportCompleted; +use App\Models\Company; +use App\Models\Invoice; +use App\Models\Quote; +use App\Models\User; +use App\Repositories\ClientRepository; use App\Repositories\InvoiceRepository; use App\Repositories\PaymentRepository; -use App\Factory\RecurringInvoiceFactory; -use Illuminate\Support\Facades\Validator; -use App\Http\Requests\Quote\StoreQuoteRequest; +use App\Repositories\QuoteRepository; use App\Repositories\RecurringInvoiceRepository; +use App\Utils\Traits\CleanLineItems; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Validator; +use League\Csv\Reader; +use League\Csv\Statement; class BaseImport { @@ -482,8 +482,9 @@ class BaseImport nlog($invoice_data); $saveable_invoice_data = $invoice_data; - if(array_key_exists('payments', $saveable_invoice_data)) + if(array_key_exists('payments', $saveable_invoice_data)) { unset($saveable_invoice_data['payments']); + } $invoice_repository->save($saveable_invoice_data, $invoice); @@ -524,8 +525,7 @@ class BaseImport $payment_date = Carbon::parse($payment->date); - if(!$payment_date->isToday()) - { + if(!$payment_date->isToday()) { $payment->paymentables()->update(['created_at' => $payment_date]); @@ -743,8 +743,9 @@ class BaseImport } - if($user) + if($user) { return $user->id; + } $user = User::whereRaw("account_id = ? AND CONCAT_WS(' ', first_name, last_name) like ?", [$this->company->account_id, '%'.$user_hash.'%']) ->first(); diff --git a/app/Import/Providers/Csv.php b/app/Import/Providers/Csv.php index 8615328203a3..9e29d5af9f41 100644 --- a/app/Import/Providers/Csv.php +++ b/app/Import/Providers/Csv.php @@ -11,44 +11,44 @@ namespace App\Import\Providers; -use App\Factory\QuoteFactory; +use App\Factory\BankTransactionFactory; use App\Factory\ClientFactory; -use App\Factory\VendorFactory; use App\Factory\ExpenseFactory; use App\Factory\InvoiceFactory; use App\Factory\PaymentFactory; use App\Factory\ProductFactory; -use App\Utils\Traits\MakesHash; -use App\Repositories\QuoteRepository; -use App\Repositories\ClientRepository; -use App\Repositories\VendorRepository; -use App\Factory\BankTransactionFactory; -use App\Repositories\ExpenseRepository; -use App\Repositories\InvoiceRepository; -use App\Repositories\PaymentRepository; -use App\Repositories\ProductRepository; +use App\Factory\QuoteFactory; use App\Factory\RecurringInvoiceFactory; -use App\Services\Bank\BankMatchingService; -use App\Http\Requests\Quote\StoreQuoteRequest; -use App\Repositories\BankTransactionRepository; +use App\Factory\VendorFactory; +use App\Http\Requests\BankTransaction\StoreBankTransactionRequest; use App\Http\Requests\Client\StoreClientRequest; -use App\Http\Requests\Vendor\StoreVendorRequest; -use App\Import\Transformer\Bank\BankTransformer; -use App\Import\Transformer\Csv\QuoteTransformer; -use App\Repositories\RecurringInvoiceRepository; -use App\Import\Transformer\Csv\ClientTransformer; -use App\Import\Transformer\Csv\VendorTransformer; use App\Http\Requests\Expense\StoreExpenseRequest; use App\Http\Requests\Invoice\StoreInvoiceRequest; use App\Http\Requests\Payment\StorePaymentRequest; use App\Http\Requests\Product\StoreProductRequest; +use App\Http\Requests\Quote\StoreQuoteRequest; +use App\Http\Requests\RecurringInvoice\StoreRecurringInvoiceRequest; +use App\Http\Requests\Vendor\StoreVendorRequest; +use App\Import\Transformer\Bank\BankTransformer; +use App\Import\Transformer\Csv\ClientTransformer; use App\Import\Transformer\Csv\ExpenseTransformer; use App\Import\Transformer\Csv\InvoiceTransformer; use App\Import\Transformer\Csv\PaymentTransformer; use App\Import\Transformer\Csv\ProductTransformer; +use App\Import\Transformer\Csv\QuoteTransformer; use App\Import\Transformer\Csv\RecurringInvoiceTransformer; -use App\Http\Requests\BankTransaction\StoreBankTransactionRequest; -use App\Http\Requests\RecurringInvoice\StoreRecurringInvoiceRequest; +use App\Import\Transformer\Csv\VendorTransformer; +use App\Repositories\BankTransactionRepository; +use App\Repositories\ClientRepository; +use App\Repositories\ExpenseRepository; +use App\Repositories\InvoiceRepository; +use App\Repositories\PaymentRepository; +use App\Repositories\ProductRepository; +use App\Repositories\QuoteRepository; +use App\Repositories\RecurringInvoiceRepository; +use App\Repositories\VendorRepository; +use App\Services\Bank\BankMatchingService; +use App\Utils\Traits\MakesHash; class Csv extends BaseImport implements ImportInterface { diff --git a/app/Import/Transformer/BaseTransformer.php b/app/Import/Transformer/BaseTransformer.php index f651e164aafe..31c05ceb16a5 100644 --- a/app/Import/Transformer/BaseTransformer.php +++ b/app/Import/Transformer/BaseTransformer.php @@ -11,27 +11,27 @@ namespace App\Import\Transformer; -use App\Models\Quote; -use App\Utils\Number; +use App\Factory\ClientFactory; +use App\Factory\ExpenseCategoryFactory; +use App\Factory\ProjectFactory; +use App\Factory\VendorFactory; use App\Models\Client; -use App\Models\Vendor; +use App\Models\ClientContact; use App\Models\Country; use App\Models\Expense; +use App\Models\ExpenseCategory; use App\Models\Invoice; +use App\Models\PaymentType; use App\Models\Product; use App\Models\Project; -use App\Models\TaxRate; -use App\Models\PaymentType; -use App\Models\ClientContact; -use App\Factory\ClientFactory; -use App\Factory\VendorFactory; -use Illuminate\Support\Carbon; -use App\Factory\ProjectFactory; -use App\Models\ExpenseCategory; +use App\Models\Quote; use App\Models\RecurringInvoice; -use Illuminate\Support\Facades\Cache; +use App\Models\TaxRate; +use App\Models\Vendor; use App\Repositories\ClientRepository; -use App\Factory\ExpenseCategoryFactory; +use App\Utils\Number; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Cache; /** * Class BaseTransformer. @@ -47,8 +47,9 @@ class BaseTransformer public function parseDate($date) { - if(stripos($date,"/") !== false && $this->company->settings->country_id != 840) + if(stripos($date, "/") !== false && $this->company->settings->country_id != 840) { $date = str_replace('/', '-', $date); + } try { $parsed_date = Carbon::parse($date); @@ -331,10 +332,11 @@ class BaseTransformer */ public function getFloatOrOne($data, $field) { - if (array_key_exists($field, $data)) + if (array_key_exists($field, $data)) { return Number::parseStringFloat($data[$field]) > 0 ? Number::parseStringFloat($data[$field]) : 1; + } - return 1; + return 1; } @@ -637,8 +639,9 @@ class BaseTransformer ]) ->first(); - if($ec) + if($ec) { return $ec->id; + } $ec = \App\Factory\ExpenseCategoryFactory::create($this->company->id, $this->company->owner()->id); $ec->name = $name; diff --git a/app/Import/Transformer/Csv/InvoiceTransformer.php b/app/Import/Transformer/Csv/InvoiceTransformer.php index 1399990a2a9e..38980311eae1 100644 --- a/app/Import/Transformer/Csv/InvoiceTransformer.php +++ b/app/Import/Transformer/Csv/InvoiceTransformer.php @@ -167,7 +167,7 @@ class InvoiceTransformer extends BaseTransformer ), ], ]; - } + } // elseif ( // isset($transformed['amount']) && // isset($transformed['balance']) && diff --git a/app/Import/Transformer/Csv/RecurringInvoiceTransformer.php b/app/Import/Transformer/Csv/RecurringInvoiceTransformer.php index d4c2a17bdffd..2f924da831d6 100644 --- a/app/Import/Transformer/Csv/RecurringInvoiceTransformer.php +++ b/app/Import/Transformer/Csv/RecurringInvoiceTransformer.php @@ -11,10 +11,10 @@ namespace App\Import\Transformer\Csv; -use App\Models\Invoice; use App\Import\ImportException; -use App\Models\RecurringInvoice; use App\Import\Transformer\BaseTransformer; +use App\Models\Invoice; +use App\Models\RecurringInvoice; /** * Class RecurringInvoiceTransformer. @@ -134,10 +134,12 @@ class RecurringInvoiceTransformer extends BaseTransformer // ] ?? Invoice::STATUS_SENT, 'auto_bill' => $this->getAutoBillFlag( $this->getString($invoice_data, 'invoice.auto_bill') - ), - 'frequency_id' => $this->getFrequency(isset($invoice_data['invoice.frequency_id']) ? $invoice_data['invoice.frequency_id'] : 'monthly' ), - 'remaining_cycles' => $this->getRemainingCycles(isset($invoice_data['invoice.remaining_cycles']) ? $invoice_data['invoice.remaining_cycles'] : -1 + 'frequency_id' => $this->getFrequency( + isset($invoice_data['invoice.frequency_id']) ? $invoice_data['invoice.frequency_id'] : 'monthly' + ), + 'remaining_cycles' => $this->getRemainingCycles( + isset($invoice_data['invoice.remaining_cycles']) ? $invoice_data['invoice.remaining_cycles'] : -1 ), // 'archived' => $status === 'archived', ]; diff --git a/app/Import/Transformer/Invoice2Go/InvoiceTransformer.php b/app/Import/Transformer/Invoice2Go/InvoiceTransformer.php index ce790aa25497..e6ad42416a80 100644 --- a/app/Import/Transformer/Invoice2Go/InvoiceTransformer.php +++ b/app/Import/Transformer/Invoice2Go/InvoiceTransformer.php @@ -63,8 +63,7 @@ class InvoiceTransformer extends BaseTransformer $client_id = null; - if($this->hasClient($this->getString($invoice_data, 'Name') || $this->getContact($this->getString($invoice_data, 'EmailRecipient')))) - { + if($this->hasClient($this->getString($invoice_data, 'Name') || $this->getContact($this->getString($invoice_data, 'EmailRecipient')))) { $client_id = $this->getClient($this->getString($invoice_data, 'Name'), $this->getString($invoice_data, 'EmailRecipient')); diff --git a/app/Import/Transformer/Zoho/ClientTransformer.php b/app/Import/Transformer/Zoho/ClientTransformer.php index 084964149873..b63891b5b37e 100644 --- a/app/Import/Transformer/Zoho/ClientTransformer.php +++ b/app/Import/Transformer/Zoho/ClientTransformer.php @@ -31,8 +31,7 @@ class ClientTransformer extends BaseTransformer if(isset($data[$client_id_proxy]) && $this->hasClientIdNumber($data[$client_id_proxy])) { throw new ImportException('Client ID already exists => '. $data[$client_id_proxy]); - } - elseif (isset($data['Company Name']) && $this->hasClient($data['Company Name'])) { + } elseif (isset($data['Company Name']) && $this->hasClient($data['Company Name'])) { throw new ImportException('Client already exists => '. $data['Company Name']); } diff --git a/app/Import/Transformer/Zoho/InvoiceTransformer.php b/app/Import/Transformer/Zoho/InvoiceTransformer.php index faae4fffa2ae..704c82008e56 100644 --- a/app/Import/Transformer/Zoho/InvoiceTransformer.php +++ b/app/Import/Transformer/Zoho/InvoiceTransformer.php @@ -141,7 +141,6 @@ class InvoiceTransformer extends BaseTransformer 'postal_code' => $this->getString($invoice_data, 'Billing Code'), 'country_id' => $this->getCountryId($this->getString($invoice_data, 'Billing Country')), ], - \App\Factory\ClientFactory::create( $this->company->id, $this->company->owner()->id diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index 518926734c99..b0453fb4c7c8 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -182,7 +182,7 @@ class MatchBankTransactions implements ShouldQueue return $this; } - private function coalesceExpenses($expense): string + private function coalesceExpenses($expense): string { if (!$this->bt->expense_id || strlen($this->bt->expense_id) < 1) { diff --git a/app/Jobs/Bank/ProcessBankTransactions.php b/app/Jobs/Bank/ProcessBankTransactions.php index d6b6d8582ab7..2d621799dea9 100644 --- a/app/Jobs/Bank/ProcessBankTransactions.php +++ b/app/Jobs/Bank/ProcessBankTransactions.php @@ -11,20 +11,20 @@ namespace App\Jobs\Bank; -use App\Models\Company; +use App\Helpers\Bank\Yodlee\Transformer\AccountTransformer; +use App\Helpers\Bank\Yodlee\Yodlee; use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; use App\Models\BankIntegration; use App\Models\BankTransaction; -use App\Helpers\Bank\Yodlee\Yodlee; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\Company; +use App\Notifications\Ninja\GenericNinjaAdminNotification; use App\Services\Bank\BankMatchingService; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Events\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Middleware\WithoutOverlapping; -use App\Notifications\Ninja\GenericNinjaAdminNotification; -use App\Helpers\Bank\Yodlee\Transformer\AccountTransformer; +use Illuminate\Queue\SerializesModels; class ProcessBankTransactions implements ShouldQueue { @@ -116,8 +116,7 @@ class ProcessBankTransactions implements ShouldQueue } } - } - catch(\Exception $e) { + } catch(\Exception $e) { nlog("YODLEE: unable to update account summary for {$this->bank_integration->bank_account_id} => ". $e->getMessage()); } diff --git a/app/Jobs/Client/CheckVat.php b/app/Jobs/Client/CheckVat.php index 49d5f17d2a37..a51a6ce1c0f0 100644 --- a/app/Jobs/Client/CheckVat.php +++ b/app/Jobs/Client/CheckVat.php @@ -11,18 +11,17 @@ namespace App\Jobs\Client; +use App\Libraries\MultiDB; use App\Models\Client; use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; -use App\DataProviders\USStates; -use App\Utils\Traits\MakesHash; use App\Services\Tax\TaxService; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use App\Utils\Traits\MakesHash; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; class CheckVat implements ShouldQueue { diff --git a/app/Jobs/Client/UpdateTaxData.php b/app/Jobs/Client/UpdateTaxData.php index 89a25bdd865c..c27733c06683 100644 --- a/app/Jobs/Client/UpdateTaxData.php +++ b/app/Jobs/Client/UpdateTaxData.php @@ -11,18 +11,17 @@ namespace App\Jobs\Client; -use App\DataMapper\Tax\ZipTax\Response; +use App\DataProviders\USStates; +use App\Libraries\MultiDB; use App\Models\Client; use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; -use App\DataProviders\USStates; use App\Utils\Traits\MakesHash; -use Illuminate\Queue\SerializesModels; -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\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; class UpdateTaxData implements ShouldQueue { @@ -52,8 +51,9 @@ class UpdateTaxData implements ShouldQueue { MultiDB::setDb($this->company->db); - if($this->company->account->isFreeHostedClient() || $this->client->country_id != 840) + if($this->company->account->isFreeHostedClient() || $this->client->country_id != 840) { return; + } $tax_provider = new \App\Services\Tax\Providers\TaxProvider($this->company, $this->client); @@ -69,7 +69,7 @@ class UpdateTaxData implements ShouldQueue } - }catch(\Exception $e){ + } catch(\Exception $e) { nlog("problem getting tax data => ".$e->getMessage()); } @@ -87,4 +87,4 @@ class UpdateTaxData implements ShouldQueue } -} \ No newline at end of file +} diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 1a3bfc43b22b..b58e20f26a50 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -11,30 +11,29 @@ namespace App\Jobs\Company; -use App\Models\User; -use App\Utils\Ninja; -use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Support\Str; -use App\Mail\DownloadBackup; -use App\Jobs\Util\UnlinkFile; -use App\Models\VendorContact; -use Illuminate\Bus\Queueable; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; use App\Jobs\Mail\NinjaMailerJob; -use App\Models\InvoiceInvitation; -use Illuminate\Support\Facades\App; use App\Jobs\Mail\NinjaMailerObject; -use Illuminate\Support\Facades\Cache; -use Illuminate\Queue\SerializesModels; +use App\Jobs\Util\UnlinkFile; +use App\Libraries\MultiDB; +use App\Mail\DownloadBackup; +use App\Models\Company; +use App\Models\CreditInvitation; +use App\Models\InvoiceInvitation; use App\Models\PurchaseOrderInvitation; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoiceInvitation; +use App\Models\User; +use App\Models\VendorContact; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +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\Cache; +use Illuminate\Support\Facades\Storage; class CompanyExport implements ShouldQueue { @@ -461,13 +460,15 @@ class CompanyExport implements ShouldQueue Storage::disk(config('filesystems.default'))->put('backups/'.$file_name, file_get_contents($zip_path)); - if(file_exists($zip_path)) - unlink($zip_path); + if(file_exists($zip_path)) { + unlink($zip_path); + } - if(Ninja::isSelfHost()) + if(Ninja::isSelfHost()) { $storage_path = 'backups/'.$file_name; - else + } else { $storage_path = Storage::disk(config('filesystems.default'))->path('backups/'.$file_name); + } $url = Cache::get($this->hash); @@ -492,8 +493,9 @@ class CompanyExport implements ShouldQueue if (Ninja::isHosted()) { sleep(3); - if(file_exists($zip_path)) + if(file_exists($zip_path)) { unlink($zip_path); + } } } } diff --git a/app/Jobs/Company/CompanyTaxRate.php b/app/Jobs/Company/CompanyTaxRate.php index 886704fa358e..9bb1eb470be4 100644 --- a/app/Jobs/Company/CompanyTaxRate.php +++ b/app/Jobs/Company/CompanyTaxRate.php @@ -11,17 +11,17 @@ namespace App\Jobs\Company; -use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; -use App\DataProviders\USStates; -use Illuminate\Queue\SerializesModels; use App\DataMapper\Tax\ZipTax\Response; -use Illuminate\Queue\InteractsWithQueue; +use App\DataProviders\USStates; +use App\Libraries\MultiDB; +use App\Models\Company; use App\Services\Tax\Providers\TaxProvider; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; class CompanyTaxRate implements ShouldQueue { @@ -53,21 +53,21 @@ class CompanyTaxRate implements ShouldQueue /** State must be calculated else default to the company state for taxes */ if(array_key_exists($this->company->settings->state, USStates::get())) { $calculated_state = $this->company->settings->state; - } - else { + } else { - try{ + try { $calculated_state = USStates::getState($this->company->settings->postal_code); - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog("could not calculate state from postal code => {$this->company->settings->postal_code} or from state {$this->company->settings->state}"); } - if(!$calculated_state && $this->company->tax_data?->seller_subregion) + if(!$calculated_state && $this->company->tax_data?->seller_subregion) { $calculated_state = $this->company->tax_data?->seller_subregion; + } - if(!$calculated_state) + if(!$calculated_state) { return; + } } @@ -93,7 +93,8 @@ class CompanyTaxRate implements ShouldQueue return [new WithoutOverlapping($this->company->id)]; } - public function failed($e){ + public function failed($e) + { nlog($e->getMessage()); } -} \ No newline at end of file +} diff --git a/app/Jobs/Company/CreateCompany.php b/app/Jobs/Company/CreateCompany.php index 90bddda49244..a9377fa47817 100644 --- a/app/Jobs/Company/CreateCompany.php +++ b/app/Jobs/Company/CreateCompany.php @@ -11,16 +11,16 @@ namespace App\Jobs\Company; -use App\Utils\Ninja; +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; -use App\Libraries\MultiDB; +use App\Utils\Ninja; use App\Utils\Traits\MakesHash; -use App\DataMapper\Tax\TaxModel; -use App\DataMapper\CompanySettings; use Illuminate\Foundation\Bus\Dispatchable; -use App\DataMapper\ClientRegistrationFields; -use App\Factory\TaxRateFactory; class CreateCompany { @@ -55,7 +55,7 @@ class CreateCompany $settings->name = isset($this->request['name']) ? $this->request['name'] : ''; - if($country_id = $this->resolveCountry()){ + if($country_id = $this->resolveCountry()) { $settings->country_id = $country_id; } @@ -95,33 +95,34 @@ class CreateCompany * * @return string */ - private function resolveCountry(): string + private function resolveCountry(): string { - try{ + try { $ip = request()->ip(); - if(request()->hasHeader('cf-ipcountry')){ + if(request()->hasHeader('cf-ipcountry')) { $c = Country::where('iso_3166_2', request()->header('cf-ipcountry'))->first(); - if($c) + if($c) { return (string)$c->id; + } } $details = json_decode(file_get_contents("http://ip-api.com/json/{$ip}")); - if($details && property_exists($details, 'countryCode')){ + if($details && property_exists($details, 'countryCode')) { $c = Country::where('iso_3166_2', $details->countryCode)->first(); - if($c) + if($c) { return (string)$c->id; + } } - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog("Could not resolve country => {$e->getMessage()}"); } @@ -163,8 +164,7 @@ class CreateCompany return $company; - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog("SETUP: could not complete setup for Spanish Locale"); } @@ -206,8 +206,7 @@ class CreateCompany return $company; - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); nlog("SETUP: could not complete setup for Australian Locale"); } diff --git a/app/Jobs/Cron/AutoBill.php b/app/Jobs/Cron/AutoBill.php index 5376571d7ced..cc48b9142341 100644 --- a/app/Jobs/Cron/AutoBill.php +++ b/app/Jobs/Cron/AutoBill.php @@ -11,14 +11,14 @@ namespace App\Jobs\Cron; -use App\Models\Invoice; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; use App\Jobs\Entity\EmailEntity; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use App\Libraries\MultiDB; +use App\Models\Invoice; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; class AutoBill implements ShouldQueue { @@ -60,8 +60,7 @@ class AutoBill implements ShouldQueue } catch (\Exception $e) { nlog("Failed to capture payment for {$this->invoice_id} ->".$e->getMessage()); - if($this->send_email_on_failure && $invoice) - { + if($this->send_email_on_failure && $invoice) { $invoice->invitations->each(function ($invitation) use ($invoice) { if ($invitation->contact && ! $invitation->contact->trashed() && strlen($invitation->contact->email) >= 1 && $invoice->client->getSetting('auto_email_invoice')) { diff --git a/app/Jobs/Cron/AutoBillCron.php b/app/Jobs/Cron/AutoBillCron.php index cf2c5f987f5b..ff3c2c295591 100644 --- a/app/Jobs/Cron/AutoBillCron.php +++ b/app/Jobs/Cron/AutoBillCron.php @@ -11,11 +11,11 @@ namespace App\Jobs\Cron; -use App\Models\Invoice; use App\Libraries\MultiDB; +use App\Models\Invoice; +use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Auth; -use Illuminate\Foundation\Bus\Dispatchable; class AutoBillCron { diff --git a/app/Jobs/Cron/RecurringExpensesCron.php b/app/Jobs/Cron/RecurringExpensesCron.php index 55eee07e5bb5..3b38aafb0c9c 100644 --- a/app/Jobs/Cron/RecurringExpensesCron.php +++ b/app/Jobs/Cron/RecurringExpensesCron.php @@ -11,16 +11,16 @@ namespace App\Jobs\Cron; -use App\Utils\Ninja; +use App\Events\Expense\ExpenseWasCreated; +use App\Factory\RecurringExpenseToExpenseFactory; use App\Libraries\MultiDB; -use Illuminate\Support\Carbon; use App\Models\RecurringExpense; use App\Models\RecurringInvoice; -use Illuminate\Support\Facades\Auth; +use App\Utils\Ninja; use App\Utils\Traits\GeneratesCounter; -use App\Events\Expense\ExpenseWasCreated; use Illuminate\Foundation\Bus\Dispatchable; -use App\Factory\RecurringExpenseToExpenseFactory; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Auth; class RecurringExpensesCron { @@ -105,8 +105,9 @@ class RecurringExpensesCron $expense = RecurringExpenseToExpenseFactory::create($recurring_expense); $expense->saveQuietly(); - if($expense->company->mark_expenses_paid) + if($expense->company->mark_expenses_paid) { $expense->payment_date = now()->format('Y-m-d'); + } $expense->number = $this->getNextExpenseNumber($expense); $expense->saveQuietly(); diff --git a/app/Jobs/Cron/RecurringInvoicesCron.php b/app/Jobs/Cron/RecurringInvoicesCron.php index edd57acf265d..895a172a79c6 100644 --- a/app/Jobs/Cron/RecurringInvoicesCron.php +++ b/app/Jobs/Cron/RecurringInvoicesCron.php @@ -11,13 +11,13 @@ namespace App\Jobs\Cron; -use App\Models\Invoice; -use App\Libraries\MultiDB; -use Illuminate\Support\Carbon; -use App\Models\RecurringInvoice; -use Illuminate\Support\Facades\Auth; -use Illuminate\Foundation\Bus\Dispatchable; use App\Jobs\RecurringInvoice\SendRecurring; +use App\Libraries\MultiDB; +use App\Models\Invoice; +use App\Models\RecurringInvoice; +use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Auth; class RecurringInvoicesCron { diff --git a/app/Jobs/Cron/SubscriptionCron.php b/app/Jobs/Cron/SubscriptionCron.php index c77a62769521..efa1da9c24e3 100644 --- a/app/Jobs/Cron/SubscriptionCron.php +++ b/app/Jobs/Cron/SubscriptionCron.php @@ -11,11 +11,11 @@ namespace App\Jobs\Cron; -use App\Models\Invoice; use App\Libraries\MultiDB; -use Illuminate\Support\Facades\Auth; +use App\Models\Invoice; use App\Utils\Traits\SubscriptionHooker; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Support\Facades\Auth; class SubscriptionCron { diff --git a/app/Jobs/Cron/UpdateCalculatedFields.php b/app/Jobs/Cron/UpdateCalculatedFields.php index 865d3ed1238b..a5337255ecb8 100644 --- a/app/Jobs/Cron/UpdateCalculatedFields.php +++ b/app/Jobs/Cron/UpdateCalculatedFields.php @@ -11,11 +11,10 @@ namespace App\Jobs\Cron; -use App\Models\Payment; -use App\Models\Project; use App\Libraries\MultiDB; -use Illuminate\Support\Facades\Auth; +use App\Models\Project; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Support\Facades\Auth; class UpdateCalculatedFields { @@ -43,15 +42,15 @@ class UpdateCalculatedFields if (! config('ninja.db.multi_db_enabled')) { - Project::query()->with('tasks')->whereHas('tasks', function ($query){ - $query->where('updated_at', '>', now()->subHours(2)); + Project::query()->with('tasks')->whereHas('tasks', function ($query) { + $query->where('updated_at', '>', now()->subHours(2)); }) ->cursor() ->each(function ($project) { $project->current_hours = $this->calculateDuration($project); $project->save(); - }); + }); @@ -61,14 +60,14 @@ class UpdateCalculatedFields MultiDB::setDB($db); - Project::query()->with('tasks')->whereHas('tasks', function ($query){ + Project::query()->with('tasks')->whereHas('tasks', function ($query) { $query->where('updated_at', '>', now()->subHours(2)); - }) - ->cursor() - ->each(function ($project) { - $project->current_hours = $this->calculateDuration($project); - $project->save(); - }); + }) + ->cursor() + ->each(function ($project) { + $project->current_hours = $this->calculateDuration($project); + $project->save(); + }); } } @@ -80,16 +79,16 @@ class UpdateCalculatedFields $project->tasks->each(function ($task) use (&$duration) { - if(is_iterable($task->time_log)) { - foreach(json_decode($task->time_log) as $log) { + if(is_iterable($task->time_log)) { + foreach(json_decode($task->time_log) as $log) { - $start_time = $log[0]; - $end_time = $log[1] == 0 ? time() : $log[1]; + $start_time = $log[0]; + $end_time = $log[1] == 0 ? time() : $log[1]; - $duration += $end_time - $start_time; + $duration += $end_time - $start_time; + } } - } }); @@ -97,7 +96,3 @@ class UpdateCalculatedFields } } - - - - diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 04c624238706..6f6592ac03c4 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -11,34 +11,34 @@ namespace App\Jobs\Entity; -use App\Utils\Ninja; -use App\Models\Quote; +use App\Exceptions\FilePermissionsFailure; +use App\Jobs\Invoice\CreateEInvoice; use App\Models\Credit; +use App\Models\CreditInvitation; use App\Models\Design; use App\Models\Invoice; -use App\Utils\HtmlEngine; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; -use App\Models\RecurringInvoice; -use App\Services\Pdf\PdfService; -use App\Utils\PhantomJS\Phantom; use App\Models\InvoiceInvitation; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\Traits\Pdf\PdfMaker; -use Illuminate\Support\Facades\App; -use App\Jobs\Invoice\CreateEInvoice; -use App\Utils\Traits\NumberFormatter; -use App\Utils\Traits\MakesInvoiceHtml; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Exceptions\FilePermissionsFailure; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoice; use App\Models\RecurringInvoiceInvitation; -use horstoeko\zugferd\ZugferdDocumentPdfBuilder; +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\HtmlEngine; +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 horstoeko\zugferd\ZugferdDocumentPdfBuilder; +use Illuminate\Support\Facades\App; -class CreateRawPdf +class CreateRawPdf { use NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; @@ -224,8 +224,9 @@ class CreateRawPdf */ private function checkEInvoice(string $pdf): string { - if(!$this->entity instanceof Invoice || !$this->company->getSetting('enable_e_invoice')) + if(!$this->entity instanceof Invoice || !$this->company->getSetting('enable_e_invoice')) { return $pdf; + } $e_invoice_type = $this->entity->client->getSetting('e_invoice_type'); diff --git a/app/Jobs/Entity/EmailEntity.php b/app/Jobs/Entity/EmailEntity.php index 41473f1b8fd1..f25d101e1658 100644 --- a/app/Jobs/Entity/EmailEntity.php +++ b/app/Jobs/Entity/EmailEntity.php @@ -11,7 +11,6 @@ namespace App\Jobs\Entity; -use App\Events\Invoice\InvoiceWasEmailedAndFailed; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; use App\Libraries\MultiDB; diff --git a/app/Jobs/Invoice/CheckGatewayFee.php b/app/Jobs/Invoice/CheckGatewayFee.php index e7a978427045..3f79e41bcfa5 100644 --- a/app/Jobs/Invoice/CheckGatewayFee.php +++ b/app/Jobs/Invoice/CheckGatewayFee.php @@ -11,14 +11,14 @@ namespace App\Jobs\Invoice; -use App\Models\Invoice; use App\Libraries\MultiDB; +use App\Models\Invoice; 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; class CheckGatewayFee implements ShouldQueue { diff --git a/app/Jobs/Invoice/CreateEInvoice.php b/app/Jobs/Invoice/CreateEInvoice.php index c68662c4b108..b3f64776ea38 100644 --- a/app/Jobs/Invoice/CreateEInvoice.php +++ b/app/Jobs/Invoice/CreateEInvoice.php @@ -12,17 +12,17 @@ namespace App\Jobs\Invoice; -use App\Utils\Ninja; use App\Models\Invoice; -use horstoeko\zugferd\ZugferdDocumentBuilder; -use Illuminate\Bus\Queueable; -use Illuminate\Support\Facades\App; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; use App\Services\Invoice\EInvoice\FacturaEInvoice; use App\Services\Invoice\EInvoice\ZugferdEInvoice; +use App\Utils\Ninja; +use horstoeko\zugferd\ZugferdDocumentBuilder; +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; class CreateEInvoice implements ShouldQueue { diff --git a/app/Jobs/Invoice/InjectSignature.php b/app/Jobs/Invoice/InjectSignature.php index b296b43e6f6c..7f161b653140 100644 --- a/app/Jobs/Invoice/InjectSignature.php +++ b/app/Jobs/Invoice/InjectSignature.php @@ -4,10 +4,10 @@ namespace App\Jobs\Invoice; use App\Models\PurchaseOrder; 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\SerializesModels; class InjectSignature implements ShouldQueue { @@ -34,19 +34,20 @@ class InjectSignature implements ShouldQueue { $invitation = false; - if($this->entity instanceof PurchaseOrder){ + if($this->entity instanceof PurchaseOrder) { $invitation = $this->entity->invitations()->where('vendor_contact_id', $this->contact_id)->first(); - if(!$invitation) + if(!$invitation) { $invitation = $this->entity->invitations->first(); + } - } - else { + } else { $invitation = $this->entity->invitations()->where('client_contact_id', $this->contact_id)->first(); - if(!$invitation) + if(!$invitation) { $invitation = $this->entity->invitations->first(); + } } if (! $invitation) { diff --git a/app/Jobs/Invoice/InvoiceWorkflowSettings.php b/app/Jobs/Invoice/InvoiceWorkflowSettings.php index 615b43ad925f..999497108994 100644 --- a/app/Jobs/Invoice/InvoiceWorkflowSettings.php +++ b/app/Jobs/Invoice/InvoiceWorkflowSettings.php @@ -12,7 +12,6 @@ namespace App\Jobs\Invoice; -use App\Models\Client; use App\Models\Invoice; use App\Repositories\BaseRepository; use Illuminate\Bus\Queueable; diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index eed243b27d91..9fc9acf1363d 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -492,7 +492,7 @@ class NinjaMailerJob implements ShouldQueue */ private function preFlightChecksFail(): bool { - /* Always send regardless */ + /* Always send regardless */ if($this->override) { return false; } diff --git a/app/Jobs/Ninja/CheckACHStatus.php b/app/Jobs/Ninja/CheckACHStatus.php index 371681cf7336..32cf8bd78921 100644 --- a/app/Jobs/Ninja/CheckACHStatus.php +++ b/app/Jobs/Ninja/CheckACHStatus.php @@ -11,14 +11,14 @@ namespace App\Jobs\Ninja; -use App\Models\Payment; use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; use App\Models\ClientGatewayToken; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\Payment; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; class CheckACHStatus implements ShouldQueue { @@ -77,7 +77,7 @@ class CheckACHStatus implements ShouldQueue }); Payment::where('status_id', 1) - ->whereHas('company_gateway', function ($q){ + ->whereHas('company_gateway', function ($q) { $q->whereIn('gateway_key', ['d14dd26a47cecc30fdd65700bfb67b34', 'd14dd26a37cecc30fdd65700bfb55b23']); }) ->cursor() @@ -124,4 +124,4 @@ class CheckACHStatus implements ShouldQueue } } -} \ No newline at end of file +} diff --git a/app/Jobs/Ninja/CheckCompanyData.php b/app/Jobs/Ninja/CheckCompanyData.php index 9899bdff7746..c26827ad9947 100644 --- a/app/Jobs/Ninja/CheckCompanyData.php +++ b/app/Jobs/Ninja/CheckCompanyData.php @@ -11,7 +11,6 @@ namespace App\Jobs\Ninja; -use App\Models\ClientContact; use App\Models\Company; use App\Models\CompanyLedger; use App\Models\Credit; diff --git a/app/Jobs/Ninja/TaskScheduler.php b/app/Jobs/Ninja/TaskScheduler.php index 307ffb07bf18..dfb76169939e 100644 --- a/app/Jobs/Ninja/TaskScheduler.php +++ b/app/Jobs/Ninja/TaskScheduler.php @@ -11,14 +11,14 @@ namespace App\Jobs\Ninja; -use App\Models\Scheduler; use App\Libraries\MultiDB; +use App\Models\Scheduler; use Illuminate\Bus\Queueable; -use Illuminate\Support\Facades\Auth; -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\SerializesModels; +use Illuminate\Support\Facades\Auth; //@rebuild it class TaskScheduler implements ShouldQueue diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index 3222c889043a..f8729f707eab 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -78,14 +78,15 @@ class EmailPayment implements ShouldQueue if ($this->payment->invoices && $this->payment->invoices->count() >= 1) { - if($this->contact){ + if($this->contact) { $invitation = $this->payment->invoices->first()->invitations()->where('client_contact_id', $this->contact->id)->first(); - } - else + } else { $invitation = $this->payment->invoices->first()->invitations()->first(); + } - if($invitation) + if($invitation) { $nmo->invitation = $invitation; + } } diff --git a/app/Jobs/Payment/EmailRefundPayment.php b/app/Jobs/Payment/EmailRefundPayment.php index 05d726ba3074..1ec374ab1b44 100644 --- a/app/Jobs/Payment/EmailRefundPayment.php +++ b/app/Jobs/Payment/EmailRefundPayment.php @@ -91,8 +91,9 @@ class EmailRefundPayment implements ShouldQueue $invitation = $this->payment->invoices->first()->invitations()->first(); } - if($invitation) + if($invitation) { $nmo->invitation = $invitation; + } } diff --git a/app/Jobs/PostMark/ProcessPostmarkWebhook.php b/app/Jobs/PostMark/ProcessPostmarkWebhook.php index 25f2d57c8cda..e2eae3bb8aed 100644 --- a/app/Jobs/PostMark/ProcessPostmarkWebhook.php +++ b/app/Jobs/PostMark/ProcessPostmarkWebhook.php @@ -11,24 +11,24 @@ namespace App\Jobs\PostMark; -use App\Models\SystemLog; -use App\Libraries\MultiDB; -use Postmark\PostmarkClient; -use Illuminate\Bus\Queueable; +use App\DataMapper\Analytics\Mail\EmailBounce; +use App\DataMapper\Analytics\Mail\EmailSpam; use App\Jobs\Util\SystemLogger; -use App\Models\QuoteInvitation; +use App\Libraries\MultiDB; use App\Models\CreditInvitation; use App\Models\InvoiceInvitation; -use Illuminate\Queue\SerializesModels; -use Turbo124\Beacon\Facades\LightLogs; use App\Models\PurchaseOrderInvitation; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoiceInvitation; +use App\Models\SystemLog; +use App\Notifications\Ninja\EmailSpamNotification; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; -use App\DataMapper\Analytics\Mail\EmailSpam; -use App\DataMapper\Analytics\Mail\EmailBounce; -use App\Notifications\Ninja\EmailSpamNotification; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use Postmark\PostmarkClient; +use Turbo124\Beacon\Facades\LightLogs; class ProcessPostmarkWebhook implements ShouldQueue { @@ -62,7 +62,7 @@ class ProcessPostmarkWebhook implements ShouldQueue ->where('company_id', $this->invitation->company_id) ->where('type_id', SystemLog::TYPE_WEBHOOK_RESPONSE) ->whereJsonContains('log', ['MessageID' => $message_id]) - ->orderBy('id','desc') + ->orderBy('id', 'desc') ->first(); } @@ -108,42 +108,42 @@ class ProcessPostmarkWebhook implements ShouldQueue } } -// { -// "Metadata": { -// "example": "value", -// "example_2": "value" -// }, -// "RecordType": "Open", -// "FirstOpen": true, -// "Client": { -// "Name": "Chrome 35.0.1916.153", -// "Company": "Google", -// "Family": "Chrome" -// }, -// "OS": { -// "Name": "OS X 10.7 Lion", -// "Company": "Apple Computer, Inc.", -// "Family": "OS X 10" -// }, -// "Platform": "WebMail", -// "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", -// "ReadSeconds": 5, -// "Geo": { -// "CountryISOCode": "RS", -// "Country": "Serbia", -// "RegionISOCode": "VO", -// "Region": "Autonomna Pokrajina Vojvodina", -// "City": "Novi Sad", -// "Zip": "21000", -// "Coords": "45.2517,19.8369", -// "IP": "188.2.95.4" -// }, -// "MessageID": "00000000-0000-0000-0000-000000000000", -// "MessageStream": "outbound", -// "ReceivedAt": "2022-02-06T06:37:48Z", -// "Tag": "welcome-email", -// "Recipient": "john@example.com" -// } + // { + // "Metadata": { + // "example": "value", + // "example_2": "value" + // }, + // "RecordType": "Open", + // "FirstOpen": true, + // "Client": { + // "Name": "Chrome 35.0.1916.153", + // "Company": "Google", + // "Family": "Chrome" + // }, + // "OS": { + // "Name": "OS X 10.7 Lion", + // "Company": "Apple Computer, Inc.", + // "Family": "OS X 10" + // }, + // "Platform": "WebMail", + // "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", + // "ReadSeconds": 5, + // "Geo": { + // "CountryISOCode": "RS", + // "Country": "Serbia", + // "RegionISOCode": "VO", + // "Region": "Autonomna Pokrajina Vojvodina", + // "City": "Novi Sad", + // "Zip": "21000", + // "Coords": "45.2517,19.8369", + // "IP": "188.2.95.4" + // }, + // "MessageID": "00000000-0000-0000-0000-000000000000", + // "MessageStream": "outbound", + // "ReceivedAt": "2022-02-06T06:37:48Z", + // "Tag": "welcome-email", + // "Recipient": "john@example.com" + // } private function processOpen() { @@ -154,7 +154,7 @@ class ProcessPostmarkWebhook implements ShouldQueue $sl = $this->getSystemLog($this->request['MessageID']); - if($sl){ + if($sl) { $this->updateSystemLog($sl, $data); return; } @@ -169,20 +169,20 @@ class ProcessPostmarkWebhook implements ShouldQueue ))->handle(); } -// { -// "RecordType": "Delivery", -// "ServerID": 23, -// "MessageStream": "outbound", -// "MessageID": "00000000-0000-0000-0000-000000000000", -// "Recipient": "john@example.com", -// "Tag": "welcome-email", -// "DeliveredAt": "2021-02-21T16:34:52Z", -// "Details": "Test delivery webhook details", -// "Metadata": { -// "example": "value", -// "example_2": "value" -// } -// } + // { + // "RecordType": "Delivery", + // "ServerID": 23, + // "MessageStream": "outbound", + // "MessageID": "00000000-0000-0000-0000-000000000000", + // "Recipient": "john@example.com", + // "Tag": "welcome-email", + // "DeliveredAt": "2021-02-21T16:34:52Z", + // "Details": "Test delivery webhook details", + // "Metadata": { + // "example": "value", + // "example_2": "value" + // } + // } private function processDelivery() { $this->invitation->email_status = 'delivered'; @@ -207,31 +207,31 @@ class ProcessPostmarkWebhook implements ShouldQueue ))->handle(); } -// { -// "Metadata": { -// "example": "value", -// "example_2": "value" -// }, -// "RecordType": "Bounce", -// "ID": 42, -// "Type": "HardBounce", -// "TypeCode": 1, -// "Name": "Hard bounce", -// "Tag": "Test", -// "MessageID": "00000000-0000-0000-0000-000000000000", -// "ServerID": 1234, -// "MessageStream": "outbound", -// "Description": "The server was unable to deliver your message (ex: unknown user, mailbox not found).", -// "Details": "Test bounce details", -// "Email": "john@example.com", -// "From": "sender@example.com", -// "BouncedAt": "2021-02-21T16:34:52Z", -// "DumpAvailable": true, -// "Inactive": true, -// "CanActivate": true, -// "Subject": "Test subject", -// "Content": "Test content" -// } + // { + // "Metadata": { + // "example": "value", + // "example_2": "value" + // }, + // "RecordType": "Bounce", + // "ID": 42, + // "Type": "HardBounce", + // "TypeCode": 1, + // "Name": "Hard bounce", + // "Tag": "Test", + // "MessageID": "00000000-0000-0000-0000-000000000000", + // "ServerID": 1234, + // "MessageStream": "outbound", + // "Description": "The server was unable to deliver your message (ex: unknown user, mailbox not found).", + // "Details": "Test bounce details", + // "Email": "john@example.com", + // "From": "sender@example.com", + // "BouncedAt": "2021-02-21T16:34:52Z", + // "DumpAvailable": true, + // "Inactive": true, + // "CanActivate": true, + // "Subject": "Test subject", + // "Content": "Test content" + // } private function processBounce() { @@ -261,31 +261,31 @@ class ProcessPostmarkWebhook implements ShouldQueue // $this->invitation->company->notification(new EmailBounceNotification($this->invitation->company->account))->ninja(); } -// { -// "Metadata": { -// "example": "value", -// "example_2": "value" -// }, -// "RecordType": "SpamComplaint", -// "ID": 42, -// "Type": "SpamComplaint", -// "TypeCode": 100001, -// "Name": "Spam complaint", -// "Tag": "Test", -// "MessageID": "00000000-0000-0000-0000-000000000000", -// "ServerID": 1234, -// "MessageStream": "outbound", -// "Description": "The subscriber explicitly marked this message as spam.", -// "Details": "Test spam complaint details", -// "Email": "john@example.com", -// "From": "sender@example.com", -// "BouncedAt": "2021-02-21T16:34:52Z", -// "DumpAvailable": true, -// "Inactive": true, -// "CanActivate": false, -// "Subject": "Test subject", -// "Content": "Test content" -// } + // { + // "Metadata": { + // "example": "value", + // "example_2": "value" + // }, + // "RecordType": "SpamComplaint", + // "ID": 42, + // "Type": "SpamComplaint", + // "TypeCode": 100001, + // "Name": "Spam complaint", + // "Tag": "Test", + // "MessageID": "00000000-0000-0000-0000-000000000000", + // "ServerID": 1234, + // "MessageStream": "outbound", + // "Description": "The subscriber explicitly marked this message as spam.", + // "Details": "Test spam complaint details", + // "Email": "john@example.com", + // "From": "sender@example.com", + // "BouncedAt": "2021-02-21T16:34:52Z", + // "DumpAvailable": true, + // "Inactive": true, + // "CanActivate": false, + // "Subject": "Test subject", + // "Content": "Test content" + // } private function processSpamComplaint() { $this->invitation->email_status = 'spam'; @@ -367,9 +367,9 @@ class ProcessPostmarkWebhook implements ShouldQueue private function fetchMessage(): array { - if(strlen($this->request['MessageID']) < 1){ + if(strlen($this->request['MessageID']) < 1) { return $this->default_response; - } + } try { @@ -401,8 +401,7 @@ class ProcessPostmarkWebhook implements ShouldQueue 'events' => $events, ]; - } - catch (\Exception $e) { + } catch (\Exception $e) { return $this->default_response; diff --git a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php index 00ee4aa39a27..8c1f85ccd15b 100644 --- a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php +++ b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php @@ -14,7 +14,6 @@ namespace App\Jobs\PurchaseOrder; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; use App\Jobs\Util\UnlinkFile; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Libraries\MultiDB; use App\Mail\DownloadPurchaseOrders; use App\Models\Company; diff --git a/app/Jobs/Quote/ZipQuotes.php b/app/Jobs/Quote/ZipQuotes.php index 352be947858a..c4ce22fa6698 100644 --- a/app/Jobs/Quote/ZipQuotes.php +++ b/app/Jobs/Quote/ZipQuotes.php @@ -11,20 +11,20 @@ namespace App\Jobs\Quote; -use App\Models\User; -use App\Models\Company; -use App\Libraries\MultiDB; -use App\Mail\DownloadQuotes; -use App\Jobs\Util\UnlinkFile; -use Illuminate\Bus\Queueable; -use App\Models\QuoteInvitation; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; +use App\Jobs\Util\UnlinkFile; +use App\Libraries\MultiDB; +use App\Mail\DownloadQuotes; +use App\Models\Company; +use App\Models\QuoteInvitation; +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 ZipQuotes implements ShouldQueue { diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index 3c98c00a4387..b2247a93f747 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -11,24 +11,24 @@ namespace App\Jobs\RecurringInvoice; -use Carbon\Carbon; -use App\Utils\Ninja; -use App\Models\Invoice; -use App\Jobs\Cron\AutoBill; -use Illuminate\Bus\Queueable; -use App\Utils\Traits\MakesHash; -use App\Jobs\Entity\EmailEntity; -use App\Models\RecurringInvoice; -use App\Utils\Traits\GeneratesCounter; -use Illuminate\Queue\SerializesModels; -use Turbo124\Beacon\Facades\LightLogs; -use Illuminate\Queue\InteractsWithQueue; +use App\DataMapper\Analytics\SendRecurringFailure; use App\Events\Invoice\InvoiceWasCreated; use App\Factory\InvoiceInvitationFactory; +use App\Factory\RecurringInvoiceToInvoiceFactory; +use App\Jobs\Cron\AutoBill; +use App\Jobs\Entity\EmailEntity; +use App\Models\Invoice; +use App\Models\RecurringInvoice; +use App\Utils\Ninja; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesHash; +use Carbon\Carbon; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; -use App\Factory\RecurringInvoiceToInvoiceFactory; -use App\DataMapper\Analytics\SendRecurringFailure; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use Turbo124\Beacon\Facades\LightLogs; class SendRecurring implements ShouldQueue { @@ -115,11 +115,10 @@ class SendRecurring implements ShouldQueue AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); //04-08-2023 edge case to support where online payment notifications are not enabled - if(!$invoice->client->getSetting('client_online_payment_notification')){ + if(!$invoice->client->getSetting('client_online_payment_notification')) { $this->sendRecurringEmails($invoice); } - } - elseif ($invoice->auto_bill_enabled && $invoice->client->getSetting('auto_bill_date') == 'on_due_date' && $invoice->client->getSetting('auto_email_invoice') && ($invoice->due_date && Carbon::parse($invoice->due_date)->startOfDay()->lte(now()->startOfDay()))) { + } elseif ($invoice->auto_bill_enabled && $invoice->client->getSetting('auto_bill_date') == 'on_due_date' && $invoice->client->getSetting('auto_email_invoice') && ($invoice->due_date && Carbon::parse($invoice->due_date)->startOfDay()->lte(now()->startOfDay()))) { nlog("attempting to autobill {$invoice->number}"); AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); @@ -128,8 +127,7 @@ class SendRecurring implements ShouldQueue $this->sendRecurringEmails($invoice); } - } - elseif ($invoice->client->getSetting('auto_email_invoice')) { + } elseif ($invoice->client->getSetting('auto_email_invoice')) { $this->sendRecurringEmails($invoice); } @@ -138,7 +136,7 @@ class SendRecurring implements ShouldQueue /** * Sends the recurring invoice emails to * the designated contacts - * + * * @param Invoice $invoice * @return void */ @@ -199,4 +197,4 @@ class SendRecurring implements ShouldQueue nlog(print_r($exception->getMessage(), 1)); } -} \ No newline at end of file +} diff --git a/app/Jobs/Report/PreviewReport.php b/app/Jobs/Report/PreviewReport.php index 9651b64de603..959e110ea608 100644 --- a/app/Jobs/Report/PreviewReport.php +++ b/app/Jobs/Report/PreviewReport.php @@ -11,15 +11,15 @@ namespace App\Jobs\Report; -use App\Models\Company; use App\Libraries\MultiDB; +use App\Models\Company; use Illuminate\Bus\Queueable; -use Illuminate\Support\Facades\Cache; -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; +use Illuminate\Support\Facades\Cache; class PreviewReport implements ShouldQueue { diff --git a/app/Jobs/Report/SendToAdmin.php b/app/Jobs/Report/SendToAdmin.php index ca7e5c881299..e2cba7525da6 100644 --- a/app/Jobs/Report/SendToAdmin.php +++ b/app/Jobs/Report/SendToAdmin.php @@ -20,8 +20,8 @@ use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; class SendToAdmin implements ShouldQueue { diff --git a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php index b182a8831c1f..43ff28a56b3d 100644 --- a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php +++ b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php @@ -59,11 +59,11 @@ class CleanStaleInvoiceOrder implements ShouldQueue ->whereBetween('created_at', [now()->subHours(1), now()->subMinutes(10)]) ->where('balance', '>', 0) ->cursor() - ->each(function ($invoice){ + ->each(function ($invoice) { - if (collect($invoice->line_items)->contains('type_id', 3)) { - $invoice->service()->removeUnpaidGatewayFees(); - } + if (collect($invoice->line_items)->contains('type_id', 3)) { + $invoice->service()->removeUnpaidGatewayFees(); + } }); diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index bfb09f42abec..db4f2fe38bfd 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -11,89 +11,85 @@ namespace App\Jobs\Util; -use Exception; -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\Models\Company; -use App\Models\Expense; -use App\Models\Invoice; -use App\Models\Payment; -use App\Models\Product; -use App\Models\Project; -use App\Models\TaxRate; -use App\Models\Activity; -use App\Models\Document; -use App\Libraries\MultiDB; -use App\Models\TaskStatus; -use App\Models\PaymentTerm; -use Illuminate\Support\Str; -use App\Factory\UserFactory; -use App\Factory\QuoteFactory; -use App\Models\ClientContact; -use Illuminate\Bus\Queueable; +use App\DataMapper\Analytics\MigrationFailure; +use App\DataMapper\CompanySettings; +use App\Exceptions\ClientHostedMigrationException; +use App\Exceptions\MigrationValidatorFailed; +use App\Exceptions\ResourceDependencyMissing; use App\Factory\ClientFactory; +use App\Factory\CompanyLedgerFactory; use App\Factory\CreditFactory; -use App\Factory\VendorFactory; -use App\Models\CompanyGateway; -use Illuminate\Support\Carbon; use App\Factory\InvoiceFactory; use App\Factory\PaymentFactory; use App\Factory\ProductFactory; +use App\Factory\QuoteFactory; +use App\Factory\RecurringInvoiceFactory; use App\Factory\TaxRateFactory; -use App\Jobs\Util\VersionCheck; -use App\Models\ExpenseCategory; -use App\Utils\Traits\MakesHash; -use App\Mail\MigrationCompleted; -use App\Models\RecurringExpense; -use App\Models\RecurringInvoice; -use App\Utils\Traits\Uploadable; +use App\Factory\UserFactory; +use App\Factory\VendorFactory; +use App\Http\Requests\Company\UpdateCompanyRequest; +use App\Http\ValidationRules\ValidCompanyGatewayFeesAndLimitsRule; +use App\Http\ValidationRules\ValidUserForCompany; +use App\Jobs\Company\CreateCompanyToken; use App\Jobs\Mail\NinjaMailerJob; -use Illuminate\Http\UploadedFile; -use App\Models\ClientGatewayToken; -use Illuminate\Support\Facades\DB; -use App\DataMapper\CompanySettings; -use Illuminate\Support\Facades\App; use App\Jobs\Mail\NinjaMailerObject; use App\Jobs\Ninja\CheckCompanyData; -use App\Repositories\UserRepository; -use App\Utils\Traits\CleanLineItems; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Support\Facades\Mail; -use App\Factory\CompanyLedgerFactory; -use App\Repositories\ClientRepository; -use App\Repositories\CreditRepository; -use App\Repositories\VendorRepository; -use Illuminate\Queue\SerializesModels; -use Turbo124\Beacon\Facades\LightLogs; -use App\Repositories\CompanyRepository; -use App\Repositories\ProductRepository; -use App\Factory\RecurringInvoiceFactory; -use App\Jobs\Company\CreateCompanyToken; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Support\Facades\Validator; -use Modules\Admin\Jobs\Account\NinjaUser; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use App\DataMapper\ClientRegistrationFields; -use App\Exceptions\MigrationValidatorFailed; -use App\Exceptions\ResourceDependencyMissing; -use App\Repositories\ClientContactRepository; -use App\Repositories\VendorContactRepository; -use App\DataMapper\Analytics\MigrationFailure; +use App\Libraries\MultiDB; use App\Mail\Migration\StripeConnectMigration; -use App\Http\ValidationRules\ValidUserForCompany; -use App\Exceptions\ClientHostedMigrationException; -use App\Http\Requests\Company\UpdateCompanyRequest; -use Illuminate\Queue\Middleware\WithoutOverlapping; -use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver; +use App\Mail\MigrationCompleted; +use App\Models\Activity; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\ClientGatewayToken; +use App\Models\Company; +use App\Models\CompanyGateway; +use App\Models\Credit; +use App\Models\Document; +use App\Models\Expense; +use App\Models\ExpenseCategory; +use App\Models\Invoice; +use App\Models\Payment; +use App\Models\PaymentTerm; +use App\Models\Product; +use App\Models\Project; +use App\Models\Quote; +use App\Models\RecurringExpense; +use App\Models\RecurringInvoice; +use App\Models\Task; +use App\Models\TaskStatus; +use App\Models\TaxRate; +use App\Models\User; +use App\Models\Vendor; +use App\Repositories\ClientContactRepository; +use App\Repositories\ClientRepository; +use App\Repositories\CompanyRepository; +use App\Repositories\CreditRepository; use App\Repositories\Migration\InvoiceMigrationRepository; use App\Repositories\Migration\PaymentMigrationRepository; -use App\Http\ValidationRules\ValidCompanyGatewayFeesAndLimitsRule; +use App\Repositories\ProductRepository; +use App\Repositories\UserRepository; +use App\Repositories\VendorContactRepository; +use App\Repositories\VendorRepository; +use App\Utils\Ninja; +use App\Utils\Traits\CleanLineItems; +use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use App\Utils\Traits\Uploadable; +use Exception; +use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Http\UploadedFile; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Str; +use Turbo124\Beacon\Facades\LightLogs; class Import implements ShouldQueue { @@ -266,8 +262,9 @@ class Import implements ShouldQueue $t = app('translator'); $t->replace(Ninja::transformTranslations($this->company->settings)); - if(!$this->silent_migration) + if(!$this->silent_migration) { Mail::to($this->user->email, $this->user->name())->send(new MigrationCompleted($this->company->id, $this->company->db, implode("
", $check_data))); + } } catch(\Exception $e) { nlog($e->getMessage()); @@ -399,7 +396,7 @@ class Import implements ShouldQueue if (Ninja::isHosted()) { - $data['subdomain'] = str_replace("_","",$data['subdomain']); + $data['subdomain'] = str_replace("_", "", $data['subdomain']); if (!MultiDB::checkDomainAvailable($data['subdomain'])) { $data['subdomain'] = MultiDB::randomSubdomainGenerator(); @@ -1186,8 +1183,7 @@ class Import implements ShouldQueue CreditFactory::create($this->company->id, $modified['user_id']) ); - if($credit->status_id == 4) - { + if($credit->status_id == 4) { $client = $credit->client; $client->balance -= $credit->balance; @@ -1616,8 +1612,9 @@ class Import implements ShouldQueue $nmo->settings = $this->company->settings; $nmo->to_user = $this->user; - if(!$this->silent_migration) + if(!$this->silent_migration) { NinjaMailerJob::dispatch($nmo, true); + } $modified['gateway_key'] = 'd14dd26a47cecc30fdd65700bfb67b34'; } @@ -1824,7 +1821,7 @@ class Import implements ShouldQueue private function processActivities(array $data): void { - Activity::query()->where('company_id', $this->company->id)->cursor()->each(function ($a){ + Activity::query()->where('company_id', $this->company->id)->cursor()->each(function ($a) { $a->forceDelete(); nlog("deleting {$a->id}"); }); @@ -1837,55 +1834,54 @@ class Import implements ShouldQueue $modified['company_id'] = $this->company->id; $modified['user_id'] = $this->processUserId($resource); -try { - if (isset($modified['client_id'])) { - $modified['client_id'] = $this->transformId('clients', $resource['client_id']); - } + try { + if (isset($modified['client_id'])) { + $modified['client_id'] = $this->transformId('clients', $resource['client_id']); + } - if (isset($modified['invoice_id'])) { - $modified['invoice_id'] = $this->transformId('invoices', $resource['invoice_id']); - } + if (isset($modified['invoice_id'])) { + $modified['invoice_id'] = $this->transformId('invoices', $resource['invoice_id']); + } - if (isset($modified['quote_id'])) { - $modified['quote_id'] = $this->transformId('quotes', $resource['quote_id']); - } + if (isset($modified['quote_id'])) { + $modified['quote_id'] = $this->transformId('quotes', $resource['quote_id']); + } - if (isset($modified['recurring_invoice_id'])) { - $modified['recurring_invoice_id'] = $this->transformId('recurring_invoices', $resource['recurring_invoice_id']); - } + if (isset($modified['recurring_invoice_id'])) { + $modified['recurring_invoice_id'] = $this->transformId('recurring_invoices', $resource['recurring_invoice_id']); + } - if (isset($modified['payment_id'])) { - $modified['payment_id'] = $this->transformId('payments', $resource['payment_id']); - } + if (isset($modified['payment_id'])) { + $modified['payment_id'] = $this->transformId('payments', $resource['payment_id']); + } - if (isset($modified['credit_id'])) { - $modified['credit_id'] = $this->transformId('credits', $resource['credit_id']); - } + if (isset($modified['credit_id'])) { + $modified['credit_id'] = $this->transformId('credits', $resource['credit_id']); + } - if (isset($modified['expense_id'])) { - $modified['expense_id'] = $this->transformId('expenses', $resource['expense_id']); - } + if (isset($modified['expense_id'])) { + $modified['expense_id'] = $this->transformId('expenses', $resource['expense_id']); + } - if (isset($modified['task_id'])) { - $modified['task_id'] = $this->transformId('tasks', $resource['task_id']); - } + if (isset($modified['task_id'])) { + $modified['task_id'] = $this->transformId('tasks', $resource['task_id']); + } - if (isset($modified['client_contact_id'])) { - $modified['client_contact_id'] = $this->transformId('client_contacts', $resource['client_contact_id']); - } + if (isset($modified['client_contact_id'])) { + $modified['client_contact_id'] = $this->transformId('client_contacts', $resource['client_contact_id']); + } - $modified['updated_at'] = $modified['created_at']; + $modified['updated_at'] = $modified['created_at']; - /** @var \App\Models\Activity $act **/ - $act = Activity::make($modified); + /** @var \App\Models\Activity $act **/ + $act = Activity::make($modified); - $act->save(['timestamps' => false]); -} -catch (\Exception $e) { + $act->save(['timestamps' => false]); + } catch (\Exception $e) { -nlog("could not import activity: {$e->getMessage()}"); + nlog("could not import activity: {$e->getMessage()}"); -} + } } diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index 6c0521bfe361..6974e5825910 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -11,22 +11,22 @@ namespace App\Jobs\Util; -use App\Utils\Ninja; -use App\Models\Invoice; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; -use Illuminate\Support\Carbon; use App\DataMapper\InvoiceItem; use App\Factory\InvoiceFactory; use App\Jobs\Entity\EmailEntity; +use App\Libraries\MultiDB; +use App\Models\Invoice; +use App\Utils\Ninja; use App\Utils\Traits\MakesDates; -use Illuminate\Support\Facades\App; use App\Utils\Traits\MakesReminders; -use Illuminate\Support\Facades\Auth; -use Illuminate\Queue\SerializesModels; -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; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Auth; class ReminderJob implements ShouldQueue { @@ -129,8 +129,9 @@ class ReminderJob implements ShouldQueue $invoice->service()->touchReminder($reminder_template)->save(); $fees = $this->calcLateFee($invoice, $reminder_template); - if($invoice->isLocked()) + if($invoice->isLocked()) { return $this->addFeeToNewInvoice($invoice, $reminder_template, $fees); + } $invoice = $this->setLateFee($invoice, $fees[0], $fees[1]); @@ -312,4 +313,4 @@ class ReminderJob implements ShouldQueue return $invoice; } -} \ No newline at end of file +} diff --git a/app/Jobs/Util/StartMigration.php b/app/Jobs/Util/StartMigration.php index 432b1c1b8be4..06d30fbf1877 100644 --- a/app/Jobs/Util/StartMigration.php +++ b/app/Jobs/Util/StartMigration.php @@ -11,27 +11,27 @@ namespace App\Jobs\Util; -use ZipArchive; -use App\Models\User; -use App\Utils\Ninja; -use App\Models\Company; -use App\Libraries\MultiDB; -use App\Mail\MigrationFailed; -use Illuminate\Bus\Queueable; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Mail; -use Illuminate\Support\Facades\Cache; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; +use App\Exceptions\ClientHostedMigrationException; use App\Exceptions\MigrationValidatorFailed; use App\Exceptions\NonExistingMigrationFile; -use App\Exceptions\ResourceDependencyMissing; -use App\Exceptions\ClientHostedMigrationException; use App\Exceptions\ProcessingMigrationArchiveFailed; +use App\Exceptions\ResourceDependencyMissing; use App\Exceptions\ResourceNotAvailableForMigration; +use App\Libraries\MultiDB; +use App\Mail\MigrationFailed; +use App\Models\Company; +use App\Models\User; +use App\Utils\Ninja; +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\Cache; +use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Storage; +use ZipArchive; class StartMigration implements ShouldQueue { @@ -141,8 +141,9 @@ class StartMigration implements ShouldQueue app('sentry')->captureException($e); } - if(!$this->silent_migration) + if(!$this->silent_migration) { Mail::to($this->user->email, $this->user->name())->send(new MigrationFailed($e, $this->company, $e->getMessage())); + } if (Ninja::isHosted()) { $migration_failed = new MigrationFailed($e, $this->company, $e->getMessage()); diff --git a/app/Listeners/Account/StripeConnectFailureListener.php b/app/Listeners/Account/StripeConnectFailureListener.php index 12ff3f94b412..3002acdd9d52 100644 --- a/app/Listeners/Account/StripeConnectFailureListener.php +++ b/app/Listeners/Account/StripeConnectFailureListener.php @@ -11,13 +11,13 @@ namespace App\Listeners\Account; -use App\Utils\Ninja; -use App\Libraries\MultiDB; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use Illuminate\Support\Facades\Cache; +use App\Libraries\MultiDB; use App\Mail\Ninja\StripeConnectFailed; +use App\Utils\Ninja; use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Support\Facades\Cache; class StripeConnectFailureListener implements ShouldQueue { @@ -39,8 +39,7 @@ class StripeConnectFailureListener implements ShouldQueue { MultiDB::setDb($event->db); - if (Ninja::isHosted() && is_null(Cache::get("stripe_connect_notification:{$event->company->company_key}"))) - { + if (Ninja::isHosted() && is_null(Cache::get("stripe_connect_notification:{$event->company->company_key}"))) { $nmo = new NinjaMailerObject(); $nmo->mailable = new StripeConnectFailed($event->company->owner(), $event->company); diff --git a/app/Listeners/Activity/PaymentCreatedActivity.php b/app/Listeners/Activity/PaymentCreatedActivity.php index 12ed24c288b4..be114e0a094a 100644 --- a/app/Listeners/Activity/PaymentCreatedActivity.php +++ b/app/Listeners/Activity/PaymentCreatedActivity.php @@ -39,15 +39,16 @@ class PaymentCreatedActivity implements ShouldQueue * @return void */ public function handle($event) - { + { MultiDB::setDb($event->company->db); $payment = $event->payment; $invoice_id = null; - if($payment->invoices()->exists()) + if($payment->invoices()->exists()) { $invoice_id = $payment->invoices()->first()->id; + } $user_id = array_key_exists('user_id', $event->event_vars) ? $event->event_vars['user_id'] : $event->payment->user_id; diff --git a/app/Listeners/Invoice/InvoiceReminderEmailActivity.php b/app/Listeners/Invoice/InvoiceReminderEmailActivity.php index 9b41a3b096b6..9fce655b838b 100644 --- a/app/Listeners/Invoice/InvoiceReminderEmailActivity.php +++ b/app/Listeners/Invoice/InvoiceReminderEmailActivity.php @@ -46,7 +46,7 @@ class InvoiceReminderEmailActivity implements ShouldQueue $user_id = array_key_exists('user_id', $event->event_vars) ? $event->event_vars['user_id'] : $event->invitation->invoice->user_id; - $reminder = match($event->template){ + $reminder = match($event->template) { 'reminder1' => 63, 'reminder2' => 64, 'reminder3' => 65, diff --git a/app/Listeners/Payment/PaymentNotification.php b/app/Listeners/Payment/PaymentNotification.php index f46c228b836e..f9a33e0b3712 100644 --- a/app/Listeners/Payment/PaymentNotification.php +++ b/app/Listeners/Payment/PaymentNotification.php @@ -11,16 +11,16 @@ namespace App\Listeners\Payment; -use App\Utils\Ninja; -use App\Libraries\MultiDB; +use App\DataMapper\Analytics\RevenueTrack; use App\Jobs\Mail\NinjaMailer; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; +use App\Libraries\MultiDB; use App\Mail\Admin\EntityPaidObject; -use Turbo124\Beacon\Facades\LightLogs; -use App\DataMapper\Analytics\RevenueTrack; -use Illuminate\Contracts\Queue\ShouldQueue; +use App\Utils\Ninja; use App\Utils\Traits\Notifications\UserNotifies; +use Illuminate\Contracts\Queue\ShouldQueue; +use Turbo124\Beacon\Facades\LightLogs; class PaymentNotification implements ShouldQueue { @@ -59,7 +59,7 @@ class PaymentNotification implements ShouldQueue } /* Manual Payment Notifications */ - if($payment->is_manual){ + if($payment->is_manual) { foreach ($payment->company->company_users as $company_user) { $user = $company_user->user; @@ -175,7 +175,7 @@ class PaymentNotification implements ShouldQueue * @param string $url */ private function sendAnalytics($url) - { + { $data = mb_convert_encoding($url, 'UTF-8'); // $data = utf8_encode($data); $curl = curl_init(); diff --git a/app/Listeners/User/UpdateUserLastLogin.php b/app/Listeners/User/UpdateUserLastLogin.php index 94e20512eefc..c1eec95de915 100644 --- a/app/Listeners/User/UpdateUserLastLogin.php +++ b/app/Listeners/User/UpdateUserLastLogin.php @@ -11,17 +11,17 @@ namespace App\Listeners\User; -use App\Models\SystemLog; -use App\Libraries\MultiDB; -use App\Jobs\Util\SystemLogger; -use App\Mail\User\UserLoggedIn; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use Illuminate\Support\Facades\Cache; -use Illuminate\Queue\SerializesModels; +use App\Jobs\Util\SystemLogger; +use App\Libraries\MultiDB; +use App\Mail\User\UserLoggedIn; +use App\Models\SystemLog; +use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Events\Dispatchable; -use Illuminate\Broadcasting\InteractsWithSockets; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Cache; class UpdateUserLastLogin implements ShouldQueue { diff --git a/app/Listeners/Vendor/UpdateVendorContactLastLogin.php b/app/Listeners/Vendor/UpdateVendorContactLastLogin.php index 272b7144b1f7..d583a2fb8c31 100644 --- a/app/Listeners/Vendor/UpdateVendorContactLastLogin.php +++ b/app/Listeners/Vendor/UpdateVendorContactLastLogin.php @@ -12,9 +12,8 @@ namespace App\Listeners\Vendor; use App\Libraries\MultiDB; -use Illuminate\Contracts\Queue\ShouldQueue; -class UpdateVendorContactLastLogin +class UpdateVendorContactLastLogin { /** * Create the event listener. diff --git a/app/Mail/Admin/AccountCreatedObject.php b/app/Mail/Admin/AccountCreatedObject.php index 2b18adf01644..9ce319658075 100644 --- a/app/Mail/Admin/AccountCreatedObject.php +++ b/app/Mail/Admin/AccountCreatedObject.php @@ -11,9 +11,9 @@ namespace App\Mail\Admin; +use App\Models\Company; use App\Models\User; use App\Utils\Ninja; -use App\Models\Company; use Illuminate\Support\Facades\App; class AccountCreatedObject diff --git a/app/Mail/Admin/AutoBillingFailureObject.php b/app/Mail/Admin/AutoBillingFailureObject.php index a937aecf25b9..01a1f2823bd0 100644 --- a/app/Mail/Admin/AutoBillingFailureObject.php +++ b/app/Mail/Admin/AutoBillingFailureObject.php @@ -17,6 +17,7 @@ use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\App; use stdClass; + //@deprecated class AutoBillingFailureObject { diff --git a/app/Mail/Engine/CreditEmailEngine.php b/app/Mail/Engine/CreditEmailEngine.php index 75b34299da67..e927fe287ecf 100644 --- a/app/Mail/Engine/CreditEmailEngine.php +++ b/app/Mail/Engine/CreditEmailEngine.php @@ -123,7 +123,7 @@ class CreditEmailEngine extends BaseEmailEngine //attach third party documents if ($this->client->getSetting('document_email_attachment') !== false && $this->credit->company->account->hasFeature(Account::FEATURE_DOCUMENTS)) { // Storage::url - $this->credit->documents()->where('is_public',true)->cursor()->each(function($document) { + $this->credit->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { @@ -131,7 +131,7 @@ class CreditEmailEngine extends BaseEmailEngine } }); - $this->credit->company->documents()->where('is_public',true)->cursor()->each(function($document) { + $this->credit->company->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { diff --git a/app/Mail/Engine/InvoiceEmailEngine.php b/app/Mail/Engine/InvoiceEmailEngine.php index 42ca22ac65f0..ac7cad34263f 100644 --- a/app/Mail/Engine/InvoiceEmailEngine.php +++ b/app/Mail/Engine/InvoiceEmailEngine.php @@ -135,7 +135,7 @@ class InvoiceEmailEngine extends BaseEmailEngine //attach third party documents if ($this->client->getSetting('document_email_attachment') !== false && $this->invoice->company->account->hasFeature(Account::FEATURE_DOCUMENTS)) { if ($this->invoice->recurring_invoice()->exists()) { - $this->invoice->recurring_invoice->documents()->where('is_public',true)->cursor()->each(function ($document) { + $this->invoice->recurring_invoice->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { @@ -145,7 +145,7 @@ class InvoiceEmailEngine extends BaseEmailEngine } // Storage::url - $this->invoice->documents()->where('is_public',true)->cursor()->each(function ($document) { + $this->invoice->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { @@ -153,7 +153,7 @@ class InvoiceEmailEngine extends BaseEmailEngine } }); - $this->invoice->company->documents()->where('is_public',true)->cursor()->each(function ($document) { + $this->invoice->company->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { @@ -175,7 +175,7 @@ class InvoiceEmailEngine extends BaseEmailEngine ->where('invoice_documents', 1) ->cursor() ->each(function ($expense) { - $expense->documents()->where('is_public',true)->cursor()->each(function ($document) { + $expense->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index a3f303f714d9..39f3fe9afc72 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -11,18 +11,17 @@ namespace App\Mail\Engine; -use App\Utils\Ninja; -use App\Utils\Number; -use App\Utils\Helpers; +use App\DataMapper\EmailTemplateDefaults; +use App\Jobs\Entity\CreateRawPdf; use App\Models\Account; use App\Models\Payment; +use App\Services\Template\TemplateAction; +use App\Utils\Helpers; +use App\Utils\Ninja; +use App\Utils\Number; use App\Utils\Traits\MakesDates; -use App\Jobs\Entity\CreateRawPdf; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; -use Illuminate\Support\Facades\Storage; -use App\DataMapper\EmailTemplateDefaults; -use App\Services\Template\TemplateAction; class PaymentEmailEngine extends BaseEmailEngine { @@ -134,10 +133,9 @@ class PaymentEmailEngine extends BaseEmailEngine } - $this->payment->invoices->each(function ($invoice) use($template_in_use){ + $this->payment->invoices->each(function ($invoice) use ($template_in_use) { - if(!$template_in_use) - { + if(!$template_in_use) { $pdf = ((new CreateRawPdf($invoice->invitations->first()))->handle()); $file_name = $invoice->numberFormatter().'.pdf'; $this->setAttachments([['file' => base64_encode($pdf), 'name' => $file_name]]); @@ -145,7 +143,7 @@ class PaymentEmailEngine extends BaseEmailEngine //attach invoice documents also to payments if ($this->client->getSetting('document_email_attachment') !== false) { - $invoice->documents()->where('is_public', true)->cursor()->each(function ($document){ + $invoice->documents()->where('is_public', true)->cursor()->each(function ($document) { if ($document->size > $this->max_attachment_size) { $this->setAttachmentLinks([" $document->hash]) ."'>". $document->name .""]); } else { @@ -398,7 +396,7 @@ class PaymentEmailEngine extends BaseEmailEngine private function formatInvoiceReferencesSubject() { - $invoice_list = ''; + $invoice_list = ''; foreach ($this->payment->invoices as $invoice) { if (strlen($invoice->po_number) > 1) { @@ -409,8 +407,8 @@ class PaymentEmailEngine extends BaseEmailEngine } - if(strlen($invoice_list) < 4){ - $invoice_list = Number::formatMoney($this->payment->amount, $this->client) ?: ' '; + if(strlen($invoice_list) < 4) { + $invoice_list = Number::formatMoney($this->payment->amount, $this->client) ?: ' '; } @@ -418,7 +416,8 @@ class PaymentEmailEngine extends BaseEmailEngine } - private function formatInvoiceNumbersRaw(){ + private function formatInvoiceNumbersRaw() + { return collect($this->payment->invoices->pluck('number')->toArray())->implode(', '); diff --git a/app/Mail/Ninja/StripeConnectFailed.php b/app/Mail/Ninja/StripeConnectFailed.php index 4c935cdf291f..1e11c0430606 100644 --- a/app/Mail/Ninja/StripeConnectFailed.php +++ b/app/Mail/Ninja/StripeConnectFailed.php @@ -11,12 +11,12 @@ namespace App\Mail\Ninja; -use App\Models\User; use App\Models\Company; +use App\Models\User; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; -use Illuminate\Mail\Mailables\Headers; use Illuminate\Mail\Mailables\Envelope; +use Illuminate\Mail\Mailables\Headers; class StripeConnectFailed extends Mailable { diff --git a/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php b/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php index ab1011b08b9f..debd00b9d611 100644 --- a/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php +++ b/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php @@ -11,10 +11,10 @@ namespace App\Mail\RecurringInvoice; -use App\Utils\Ninja; -use App\Models\Company; use App\Models\ClientContact; +use App\Models\Company; use App\Models\RecurringInvoice; +use App\Utils\Ninja; use Illuminate\Support\Facades\App; class ClientContactRequestCancellationObject diff --git a/app/Mail/TestMailServer.php b/app/Mail/TestMailServer.php index 917a1fa9f039..1dd8ff783f5e 100644 --- a/app/Mail/TestMailServer.php +++ b/app/Mail/TestMailServer.php @@ -11,9 +11,7 @@ namespace App\Mail; -use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; -use Illuminate\Queue\SerializesModels; class TestMailServer extends Mailable { diff --git a/app/Mail/VendorTemplateEmail.php b/app/Mail/VendorTemplateEmail.php index bdfb818b0091..f51ea3f74c88 100644 --- a/app/Mail/VendorTemplateEmail.php +++ b/app/Mail/VendorTemplateEmail.php @@ -11,11 +11,11 @@ namespace App\Mail; -use App\Utils\Ninja; use App\Models\VendorContact; -use Illuminate\Mail\Mailable; -use App\Utils\VendorHtmlEngine; use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; +use App\Utils\Ninja; +use App\Utils\VendorHtmlEngine; +use Illuminate\Mail\Mailable; class VendorTemplateEmail extends Mailable { diff --git a/app/Models/Account.php b/app/Models/Account.php index d0f7feaefd41..8bc8039a0ea0 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -86,7 +86,7 @@ use Laracasts\Presenter\PresentableTrait; * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() * @method static \Illuminate\Database\Eloquent\Builder|Account first() * @method static \Illuminate\Database\Eloquent\Builder|Account with() - * @method static \Illuminate\Database\Eloquent\Builder|Account count() + * @method static \Illuminate\Database\Eloquent\Builder|Account count() * @method static \Illuminate\Database\Eloquent\Builder|Account where($query) * @property-read \Illuminate\Database\Eloquent\Collection $bank_integrations * @property-read \Illuminate\Database\Eloquent\Collection $companies @@ -270,7 +270,7 @@ class Account extends BaseModel case self::FEATURE_REMOVE_CREATED_BY: return ! empty($plan_details); // A plan is required even for self-hosted users - // Enterprise; No Trial allowed; grandfathered for old pro users + // Enterprise; No Trial allowed; grandfathered for old pro users case self::FEATURE_USERS:// Grandfathered for old Pro users if ($plan_details && $plan_details['trial']) { // Do they have a non-trial plan? @@ -584,8 +584,9 @@ class Account extends BaseModel if ($plan_expires->gt(now())) { $diff = $plan_expires->diffInDays(); - if ($diff > 14) + if ($diff > 14) { return 0; + } return $diff; } diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 1b9d89ce59d7..772c234e695a 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -13,7 +13,6 @@ namespace App\Models; use App\Utils\Number; use App\Utils\Traits\MakesHash; -use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * App\Models\Activity @@ -399,25 +398,29 @@ class Activity extends StaticModel ':balance', ':number', ':payment_amount', - ':gateway', - ':adjustment' + ':gateway', + ':adjustment' ]; - $found_variables = array_intersect(explode(" ",trans("texts.activity_{$this->activity_type_id}")), $intersect); + $found_variables = array_intersect(explode(" ", trans("texts.activity_{$this->activity_type_id}")), $intersect); $replacements = []; - foreach($found_variables as $var) + foreach($found_variables as $var) { $replacements = array_merge($replacements, $this->matchVar($var)); + } - if($this->client) + if($this->client) { $replacements['client'] = ['label' => $this?->client?->present()->name() ?? '', 'hashed_id' => $this->client->hashed_id ?? '']; + } - if($this->vendor) + if($this->vendor) { $replacements['vendor'] = ['label' => $this?->vendor?->present()->name() ?? '', 'hashed_id' => $this->vendor->hashed_id ?? '']; + } - if($this->activity_type_id == 4 && $this->recurring_invoice) + if($this->activity_type_id == 4 && $this->recurring_invoice) { $replacements['recurring_invoice'] = ['label' => $this?->recurring_invoice?->number ?? '', 'hashed_id' => $this->recurring_invoice->hashed_id ?? '']; + } $replacements['activity_type_id'] = $this->activity_type_id; $replacements['id'] = $this->id; @@ -449,7 +452,7 @@ class Activity extends StaticModel ':recurring_invoice' => $translation = [substr($variable, 1) =>[ 'label' => $this?->recurring_invoice?->number ??'', 'hashed_id' => $this->recurring_invoice->hashed_id ?? '']], ':recurring_expense' => $translation = [substr($variable, 1) => [ 'label' => $this?->recurring_expense?->number ??'', 'hashed_id' => $this->recurring_expense->hashed_id ?? '']], ':payment_amount' => $translation = [substr($variable, 1) =>[ 'label' => Number::formatMoney($this?->payment?->amount, $this?->payment?->client) ?? '', 'hashed_id' => '']], - ':adjustment' => $translation = [substr($variable, 1) =>[ 'label' => Number::formatMoney($this?->payment?->refunded, $this?->payment?->client) ?? '', 'hashed_id' => '']], + ':adjustment' => $translation = [substr($variable, 1) =>[ 'label' => Number::formatMoney($this?->payment?->refunded, $this?->payment?->client) ?? '', 'hashed_id' => '']], ':ip' => $translation = [ 'ip' => $this->ip ?? ''], ':contact' => $translation = $this->resolveContact(), default => $translation = [], diff --git a/app/Models/BankTransaction.php b/app/Models/BankTransaction.php index 3139ae436d4a..c3a7321e5c50 100644 --- a/app/Models/BankTransaction.php +++ b/app/Models/BankTransaction.php @@ -11,9 +11,8 @@ namespace App\Models; -use App\Models\Expense; -use App\Utils\Traits\MakesHash; use App\Services\Bank\BankService; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\SoftDeletes; /** diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index c8e4eb6a0356..976584842f14 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -11,17 +11,17 @@ namespace App\Models; -use Illuminate\Support\Str; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Util\WebhookHandler; -use App\Models\Traits\Excludable; -use Illuminate\Database\Eloquent\Model; use App\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Models\Traits\Excludable; +use App\Utils\Traits\MakesHash; use App\Utils\Traits\UserSessionAttributes; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; +use Illuminate\Support\Carbon; +use Illuminate\Support\Str; /** * Class BaseModel @@ -37,7 +37,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property int $assigned_user_id * @method BaseModel service() * @property \App\Models\Company $company - * @method static BaseModel find($value) + * @method static BaseModel find($value) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\BelongsTo|\Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo|\App\Models\Company company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\HasMany|BaseModel orderBy() @@ -68,7 +68,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|\Illuminate\Database\Query\Builder withoutTrashed() * @mixin \Eloquent * @mixin \Illuminate\Database\Eloquent\Builder - * + * * @property \Illuminate\Support\Collection $tax_map * @property array $total_tax_map */ @@ -237,10 +237,10 @@ class BaseModel extends Model return $this->numberFormatter().'.'.$extension; } - /** - * @param string $extension - * @return string - */ + /** + * @param string $extension + * @return string + */ public function getEFileName($extension = 'pdf') { return ctrans("texts.e_invoice"). "_" . $this->numberFormatter().'.'.$extension; @@ -303,8 +303,9 @@ class BaseModel extends Model throw new \Exception('Hard fail, could not create an invitation.'); } - if($this instanceof \App\Models\PurchaseOrder) + if($this instanceof \App\Models\PurchaseOrder) { return "data:application/pdf;base64,".base64_encode((new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf()); + } return "data:application/pdf;base64,".base64_encode((new CreateRawPdf($invitation))->handle()); diff --git a/app/Models/Client.php b/app/Models/Client.php index a056a103493f..689578df8385 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -11,26 +11,24 @@ namespace App\Models; -use App\Models\GatewayType; -use App\Utils\Traits\AppSetup; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesDates; -use App\DataMapper\FeesAndLimits; -use App\Models\Traits\Excludable; use App\DataMapper\ClientSettings; use App\DataMapper\CompanySettings; -use Illuminate\Support\Facades\Cache; -use App\Services\Client\ClientService; -use App\Utils\Traits\GeneratesCounter; -use Laracasts\Presenter\PresentableTrait; -use App\Models\Presenters\ClientPresenter; -use Illuminate\Database\Eloquent\SoftDeletes; -use App\Utils\Traits\ClientGroupSettingsSaver; +use App\DataMapper\FeesAndLimits; use App\Libraries\Currency\Conversion\CurrencyApi; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\MorphMany; +use App\Models\Presenters\ClientPresenter; +use App\Models\Traits\Excludable; +use App\Services\Client\ClientService; +use App\Utils\Traits\AppSetup; +use App\Utils\Traits\ClientGroupSettingsSaver; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; use Illuminate\Contracts\Translation\HasLocalePreference; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Cache; +use Laracasts\Presenter\PresentableTrait; /** * App\Models\Client @@ -474,9 +472,9 @@ class Client extends BaseModel implements HasLocalePreference return $this->settings->{$setting}; } elseif (is_bool($this->settings->{$setting})) { return $this->settings->{$setting}; - } elseif (is_int($this->settings->{$setting})) { + } elseif (is_int($this->settings->{$setting})) { return $this->settings->{$setting}; - } elseif(is_float($this->settings->{$setting})) { + } elseif(is_float($this->settings->{$setting})) { return $this->settings->{$setting}; } } @@ -768,7 +766,7 @@ class Client extends BaseModel implements HasLocalePreference return $defaults; } - public function timezone_offset() :int + public function timezone_offset() :int { $offset = 0; diff --git a/app/Models/Company.php b/app/Models/Company.php index 8d097d3b8baa..1815c6dd1e0c 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -11,20 +11,20 @@ namespace App\Models; -use App\Utils\Ninja; use App\Casts\EncryptedCast; -use App\Utils\Traits\AppSetup; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; +use App\Models\Presenters\CompanyPresenter; +use App\Services\Notification\NotificationService; +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; -use App\Utils\Traits\CompanySettingsSaver; -use Illuminate\Notifications\Notification; -use App\Models\Presenters\CompanyPresenter; -use App\Services\Notification\NotificationService; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * App\Models\Company @@ -621,7 +621,7 @@ class Company extends BaseModel return $item->id == $this->getSetting('country_id'); })->first(); -// return $this->belongsTo(Country::class); + // return $this->belongsTo(Country::class); // return Country::find($this->settings->country_id); } @@ -838,7 +838,7 @@ class Company extends BaseModel ->firstOrFail(); } - public function domain(): string + public function domain(): string { if (Ninja::isHosted()) { if ($this->portal_mode == 'domain' && strlen($this->portal_domain) > 3) { @@ -945,8 +945,9 @@ class Company extends BaseModel public function getInvoiceCert() { - if($this->e_invoice_certificate) + if($this->e_invoice_certificate) { return base64_decode($this->e_invoice_certificate); + } return false; } diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index 8525a88eb80e..ccb25724ef9f 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -62,7 +62,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $client_gateway_tokens - * @method static CompanyGateway find($value) + * @method static CompanyGateway find($value) * @mixin \Eloquent */ class CompanyGateway extends BaseModel diff --git a/app/Models/CompanyUser.php b/app/Models/CompanyUser.php index 347365a63ddb..dd022aad5930 100644 --- a/app/Models/CompanyUser.php +++ b/app/Models/CompanyUser.php @@ -11,10 +11,9 @@ namespace App\Models; -use Illuminate\Database\Eloquent\SoftDeletes; -use Illuminate\Database\Eloquent\Relations\Pivot; -use Awobaz\Compoships\Exceptions\InvalidUsageException; use Awobaz\Compoships\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\Pivot; +use Illuminate\Database\Eloquent\SoftDeletes; /** * App\Models\CompanyUser @@ -149,7 +148,7 @@ class CompanyUser extends Pivot /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function user() + public function user() { return $this->belongsTo(User::class)->withTrashed(); } @@ -179,7 +178,7 @@ class CompanyUser extends Pivot } /** - * @return HasMany + * @return HasMany */ public function tokens() { @@ -206,4 +205,4 @@ class CompanyUser extends Pivot return isset($this->react_settings->react_notification_link) && $this->react_settings->react_notification_link; } -} \ No newline at end of file +} diff --git a/app/Models/Country.php b/app/Models/Country.php index 97efa4375f6e..6b3f2f2f5bf8 100644 --- a/app/Models/Country.php +++ b/app/Models/Country.php @@ -81,8 +81,8 @@ class Country extends StaticModel { return trans('texts.country_'.$this->name); } - public function getID() :string - { - return $this->id; - } + public function getID() :string + { + return $this->id; + } } diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 6ba2d7b18b53..d55a729c27cd 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -11,20 +11,18 @@ namespace App\Models; -use App\Utils\Ninja; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesDates; use App\Helpers\Invoice\InvoiceSum; -use App\Utils\Traits\MakesReminders; +use App\Helpers\Invoice\InvoiceSumInclusive; +use App\Models\Presenters\CreditPresenter; use App\Services\Credit\CreditService; use App\Services\Ledger\LedgerService; -use Illuminate\Support\Facades\Storage; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesInvoiceValues; -use Laracasts\Presenter\PresentableTrait; -use App\Models\Presenters\CreditPresenter; -use App\Helpers\Invoice\InvoiceSumInclusive; +use App\Utils\Traits\MakesReminders; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Carbon; +use Laracasts\Presenter\PresentableTrait; /** * App\Models\Credit @@ -122,7 +120,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read \Illuminate\Database\Eloquent\Collection $invoices * @property-read \Illuminate\Database\Eloquent\Collection $payments - * + * * @mixin \Eloquent */ class Credit extends BaseModel diff --git a/app/Models/Expense.php b/app/Models/Expense.php index 314e3961eb66..fa7078a8418a 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -225,16 +225,17 @@ class Expense extends BaseModel public function stringStatus() { - if($this->is_deleted) + if($this->is_deleted) { return ctrans('texts.deleted'); - elseif($this->payment_date) - return ctrans('texts.paid'); - elseif($this->invoice_id) + } elseif($this->payment_date) { + return ctrans('texts.paid'); + } elseif($this->invoice_id) { return ctrans('texts.invoiced'); - elseif($this->should_be_invoiced) + } elseif($this->should_be_invoiced) { return ctrans('texts.pending'); - elseif($this->trashed()) + } elseif($this->trashed()) { return ctrans('texts.archived'); + } return ctrans('texts.logged'); } diff --git a/app/Models/GatewayType.php b/app/Models/GatewayType.php index bc207c4955ac..bcce2d84d424 100644 --- a/app/Models/GatewayType.php +++ b/app/Models/GatewayType.php @@ -163,4 +163,3 @@ class GatewayType extends StaticModel } } } - diff --git a/app/Models/GroupSetting.php b/app/Models/GroupSetting.php index 1a8bd5f093f5..190721c64a2a 100644 --- a/app/Models/GroupSetting.php +++ b/app/Models/GroupSetting.php @@ -11,11 +11,10 @@ namespace App\Models; -use App\Models\Filterable; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; +use Illuminate\Database\Eloquent\SoftDeletes; /** * App\Models\GroupSetting diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 928b49525c58..2d9a5babc397 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -11,23 +11,22 @@ namespace App\Models; -use App\Utils\Ninja; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesDates; +use App\Events\Invoice\InvoiceReminderWasEmailed; +use App\Events\Invoice\InvoiceWasEmailed; use App\Helpers\Invoice\InvoiceSum; +use App\Helpers\Invoice\InvoiceSumInclusive; +use App\Models\Presenters\EntityPresenter; +use App\Services\Invoice\InvoiceService; +use App\Services\Ledger\LedgerService; +use App\Utils\Ninja; +use App\Utils\Traits\Invoice\ActionsInvoice; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesInvoiceValues; use App\Utils\Traits\MakesReminders; use App\Utils\Traits\NumberFormatter; -use App\Services\Ledger\LedgerService; -use Illuminate\Support\Facades\Storage; -use App\Services\Invoice\InvoiceService; -use App\Utils\Traits\MakesInvoiceValues; -use App\Events\Invoice\InvoiceWasEmailed; -use Laracasts\Presenter\PresentableTrait; -use App\Models\Presenters\EntityPresenter; -use App\Helpers\Invoice\InvoiceSumInclusive; -use App\Utils\Traits\Invoice\ActionsInvoice; use Illuminate\Database\Eloquent\SoftDeletes; -use App\Events\Invoice\InvoiceReminderWasEmailed; +use Illuminate\Support\Carbon; +use Laracasts\Presenter\PresentableTrait; /** * App\Models\Invoice @@ -320,7 +319,7 @@ class Invoice extends BaseModel */ public function net_payments(): \Illuminate\Database\Eloquent\Relations\MorphToMany { - return $this->morphToMany(Payment::class, 'paymentable')->withTrashed()->where('is_deleted',0)->withPivot('amount', 'refunded', 'deleted_at')->withTimestamps(); + return $this->morphToMany(Payment::class, 'paymentable')->withTrashed()->where('is_deleted', 0)->withPivot('amount', 'refunded', 'deleted_at')->withTimestamps(); } /** @@ -677,7 +676,7 @@ class Invoice extends BaseModel { $tax_type = ''; - match(intval($id)){ + match(intval($id)) { Product::PRODUCT_TYPE_PHYSICAL => $tax_type = ctrans('texts.physical_goods'), Product::PRODUCT_TYPE_SERVICE => $tax_type = ctrans('texts.services'), Product::PRODUCT_TYPE_DIGITAL => $tax_type = ctrans('texts.digital_products'), @@ -728,7 +727,7 @@ class Invoice extends BaseModel $schedule_2 = ctrans("texts.{$settings->schedule_reminder2}"); //after due date etc or disabled $label_2 = ctrans('texts.reminder2'); - $sends_email_3 = $settings->enable_reminder2 ? $send_email_enabled : $send_email_disabled; + $sends_email_3 = $settings->enable_reminder2 ? $send_email_enabled : $send_email_disabled; $days_3 = $settings->num_days_reminder3 . " " . ctrans('texts.days'); $schedule_3 = ctrans("texts.{$settings->schedule_reminder3}"); //after due date etc or disabled $label_3 = ctrans('texts.reminder3'); @@ -737,25 +736,29 @@ class Invoice extends BaseModel $days_endless = \App\Models\RecurringInvoice::frequencyForKey($settings->endless_reminder_frequency_id); $label_endless = ctrans('texts.reminder_endless'); - if($schedule_1 == ctrans('texts.disabled') || $settings->schedule_reminder1 == 'disabled' || $settings->schedule_reminder1 == '') + if($schedule_1 == ctrans('texts.disabled') || $settings->schedule_reminder1 == 'disabled' || $settings->schedule_reminder1 == '') { $reminder_schedule .= "{$label_1}: " . ctrans('texts.disabled') ."
"; - else + } else { $reminder_schedule .= "{$label_1}: {$days_1} {$schedule_1} [{$sends_email_1}]
"; + } - if($schedule_2 == ctrans('texts.disabled') || $settings->schedule_reminder2 == 'disabled' || $settings->schedule_reminder2 == '') + if($schedule_2 == ctrans('texts.disabled') || $settings->schedule_reminder2 == 'disabled' || $settings->schedule_reminder2 == '') { $reminder_schedule .= "{$label_2}: " . ctrans('texts.disabled') ."
"; - else + } else { $reminder_schedule .= "{$label_2}: {$days_2} {$schedule_2} [{$sends_email_2}]
"; + } - if($schedule_3 == ctrans('texts.disabled') || $settings->schedule_reminder3 == 'disabled' || $settings->schedule_reminder3 == '') + if($schedule_3 == ctrans('texts.disabled') || $settings->schedule_reminder3 == 'disabled' || $settings->schedule_reminder3 == '') { $reminder_schedule .= "{$label_3}: " . ctrans('texts.disabled') ."
"; - else + } else { $reminder_schedule .= "{$label_3}: {$days_3} {$schedule_3} [{$sends_email_3}]
"; + } - if($sends_email_endless == ctrans('texts.disabled') || $settings->endless_reminder_frequency_id == '0' || $settings->endless_reminder_frequency_id == '') + if($sends_email_endless == ctrans('texts.disabled') || $settings->endless_reminder_frequency_id == '0' || $settings->endless_reminder_frequency_id == '') { $reminder_schedule .= "{$label_endless}: " . ctrans('texts.disabled') ."
"; - else + } else { $reminder_schedule .= "{$label_endless}: {$days_endless} [{$sends_email_endless}]
"; + } return $reminder_schedule; diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index eff3ab15915f..2f5c6c08a1df 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -11,13 +11,10 @@ namespace App\Models; -use App\Events\Invoice\InvoiceWasUpdated; -use App\Utils\Ninja; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Storage; /** * App\Models\InvoiceInvitation diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 41e36c74bbf2..1f80aaed0a91 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -15,13 +15,12 @@ use App\Events\Payment\PaymentWasRefunded; use App\Events\Payment\PaymentWasVoided; use App\Services\Ledger\LedgerService; use App\Services\Payment\PaymentService; -use App\Utils\Ninja; +use App\Utils\Ninja; use App\Utils\Number; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesHash; use App\Utils\Traits\Payment\Refundable; -use Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; /** diff --git a/app/Models/PaymentHash.php b/app/Models/PaymentHash.php index a870489ce02f..ded9e912f38c 100644 --- a/app/Models/PaymentHash.php +++ b/app/Models/PaymentHash.php @@ -38,13 +38,13 @@ class PaymentHash extends Model 'data' => 'object', ]; - /** - * @class \App\Models\PaymentHash $this - * @property \App\Models\PaymentHash $data - * @property \App\Modes\PaymentHash $hash 32 char length AlphaNum - * @class \stdClass $data - * @property string $raw_value - */ + /** + * @class \App\Models\PaymentHash $this + * @property \App\Models\PaymentHash $data + * @property \App\Modes\PaymentHash $hash 32 char length AlphaNum + * @class \stdClass $data + * @property string $raw_value + */ /** diff --git a/app/Models/Presenters/EntityPresenter.php b/app/Models/Presenters/EntityPresenter.php index 01cfbc3063ea..8176df996596 100644 --- a/app/Models/Presenters/EntityPresenter.php +++ b/app/Models/Presenters/EntityPresenter.php @@ -16,7 +16,7 @@ use Laracasts\Presenter\Presenter; /** * Class EntityPresenter. - * + * * @property \App\Models\Company | \App\Models\Client | \App\Models\ClientContact | \App\Models\Vendor | \App\Models\VendorContact $entity * @property \App\Models\Client $client * @property \App\Models\Company $company diff --git a/app/Models/Presenters/InvoicePresenter.php b/app/Models/Presenters/InvoicePresenter.php index d2d806f976c1..f9125a6786b2 100644 --- a/app/Models/Presenters/InvoicePresenter.php +++ b/app/Models/Presenters/InvoicePresenter.php @@ -23,7 +23,7 @@ use App\Utils\Traits\MakesDates; * * Shortcuts to other presenters are here to facilitate * a clean UI / UX - * + * * @property \App\Models\Invoice $entity */ class InvoicePresenter extends EntityPresenter diff --git a/app/Models/Presenters/UserPresenter.php b/app/Models/Presenters/UserPresenter.php index 68c5722581c6..10677add63b0 100644 --- a/app/Models/Presenters/UserPresenter.php +++ b/app/Models/Presenters/UserPresenter.php @@ -18,7 +18,7 @@ class UserPresenter extends EntityPresenter { /** * Returns the first and last names concatenated. - * + * * @return string */ public function name(): string diff --git a/app/Models/Project.php b/app/Models/Project.php index a256b3e74fac..be9784d0a83a 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -2,7 +2,6 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Laracasts\Presenter\PresentableTrait; diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 6048d378f970..0ac0ce6070be 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -13,13 +13,10 @@ namespace App\Models; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Services\PurchaseOrder\PurchaseOrderService; -use App\Utils\Ninja; use App\Utils\Traits\MakesDates; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Storage; /** * App\Models\PurchaseOrder @@ -237,7 +234,7 @@ class PurchaseOrder extends BaseModel /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class)->withTrashed(); } @@ -361,7 +358,7 @@ class PurchaseOrder extends BaseModel { $tax_type = ''; - match(intval($id)){ + match(intval($id)) { Product::PRODUCT_TYPE_PHYSICAL => $tax_type = ctrans('texts.physical_goods'), Product::PRODUCT_TYPE_SERVICE => $tax_type = ctrans('texts.services'), Product::PRODUCT_TYPE_DIGITAL => $tax_type = ctrans('texts.digital_products'), diff --git a/app/Models/PurchaseOrderInvitation.php b/app/Models/PurchaseOrderInvitation.php index 8599090ed286..31fbf151aacb 100644 --- a/app/Models/PurchaseOrderInvitation.php +++ b/app/Models/PurchaseOrderInvitation.php @@ -15,7 +15,6 @@ use App\Utils\Ninja; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use Carbon\Carbon; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Str; @@ -194,5 +193,5 @@ class PurchaseOrderInvitation extends BaseModel return config('ninja.react_url')."/#/{$entity_type}s/{$this->{$entity_type}->hashed_id}/edit"; } - + } diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 054690249095..f6e0ceb9b1ed 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -15,14 +15,12 @@ use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; use App\Models\Presenters\QuotePresenter; use App\Services\Quote\QuoteService; -use App\Utils\Ninja; use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesInvoiceValues; use App\Utils\Traits\MakesReminders; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Storage; use Laracasts\Presenter\PresentableTrait; /** @@ -108,7 +106,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $history * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * + * * @mixin \Eloquent * @mixin \Illuminate\Database\Eloquent\Builder */ diff --git a/app/Models/QuoteInvitation.php b/app/Models/QuoteInvitation.php index 34e01ea5cbbe..65aef2e2556a 100644 --- a/app/Models/QuoteInvitation.php +++ b/app/Models/QuoteInvitation.php @@ -15,7 +15,6 @@ use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Storage; /** * App\Models\QuoteInvitation diff --git a/app/Models/RecurringQuote.php b/app/Models/RecurringQuote.php index 8652c8edca6d..24af3f9a2464 100644 --- a/app/Models/RecurringQuote.php +++ b/app/Models/RecurringQuote.php @@ -482,9 +482,9 @@ class RecurringQuote extends BaseModel { $invoice_calc = null; - if ($this->uses_inclusive_taxes) { + if ($this->uses_inclusive_taxes) { $invoice_calc = new InvoiceSumInclusive($this); - } else { + } else { $invoice_calc = new InvoiceSum($this); } diff --git a/app/Models/Scheduler.php b/app/Models/Scheduler.php index b3aa8bc9abd5..bff76f4d6f4a 100644 --- a/app/Models/Scheduler.php +++ b/app/Models/Scheduler.php @@ -11,9 +11,6 @@ namespace App\Models; -use App\Models\Company; -use App\Models\BaseModel; -use App\Models\RecurringInvoice; use App\Services\Scheduler\SchedulerService; use Illuminate\Database\Eloquent\SoftDeletes; diff --git a/app/Models/Task.php b/app/Models/Task.php index be0c86135e8a..9bbab1d15a79 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -229,11 +229,13 @@ class Task extends BaseModel public function getRate(): float { - if($this->project && $this->project->task_rate > 0) + if($this->project && $this->project->task_rate > 0) { return $this->project->task_rate; + } - if($this->client) + if($this->client) { return $this->client->getSetting('default_task_rate'); + } return $this->company->settings->default_task_rate ?? 0; } diff --git a/app/Models/Traits/Excludable.php b/app/Models/Traits/Excludable.php index e31011793648..e95e71eb253f 100644 --- a/app/Models/Traits/Excludable.php +++ b/app/Models/Traits/Excludable.php @@ -35,10 +35,10 @@ trait Excludable /** * Exclude an array of elements from the result. - * + * * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) - * + * * @param \Illuminate\Database\Eloquent\Builder $query * @param array $columns * diff --git a/app/Models/User.php b/app/Models/User.php index aec9b0e787d5..d6c023b61269 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -11,26 +11,25 @@ namespace App\Models; -use App\Models\Company; -use App\Utils\TruthSource; use App\Jobs\Mail\NinjaMailer; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; use App\Jobs\Mail\NinjaMailerJob; -use App\Services\User\UserService; -use App\Utils\Traits\UserSettings; -use Illuminate\Support\Facades\App; use App\Jobs\Mail\NinjaMailerObject; use App\Mail\Admin\ResetPasswordObject; -use Illuminate\Database\Eloquent\Model; use App\Models\Presenters\UserPresenter; -use Illuminate\Notifications\Notifiable; -use Laracasts\Presenter\PresentableTrait; +use App\Services\User\UserService; +use App\Utils\Traits\MakesHash; use App\Utils\Traits\UserSessionAttributes; -use Illuminate\Database\Eloquent\SoftDeletes; +use App\Utils\Traits\UserSettings; +use App\Utils\TruthSource; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; +use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\App; +use Laracasts\Presenter\PresentableTrait; /** * App\Models\User @@ -664,8 +663,9 @@ class User extends Authenticatable implements MustVerifyEmail { $locale = $this->language->locale ?? null; - if($locale) + if($locale) { App::setLocale($locale); + } return $locale; } diff --git a/app/Notifications/Admin/EntitySentNotification.php b/app/Notifications/Admin/EntitySentNotification.php index 5033d813d1fd..1aab61930798 100644 --- a/app/Notifications/Admin/EntitySentNotification.php +++ b/app/Notifications/Admin/EntitySentNotification.php @@ -12,7 +12,6 @@ namespace App\Notifications\Admin; use App\Utils\Number; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -67,7 +66,7 @@ class EntitySentNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Admin/EntityViewedNotification.php b/app/Notifications/Admin/EntityViewedNotification.php index 69f7b7e0033c..6fa39e757f7a 100644 --- a/app/Notifications/Admin/EntityViewedNotification.php +++ b/app/Notifications/Admin/EntityViewedNotification.php @@ -12,7 +12,6 @@ namespace App\Notifications\Admin; use App\Utils\Number; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -67,7 +66,7 @@ class EntityViewedNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Admin/NewPaymentNotification.php b/app/Notifications/Admin/NewPaymentNotification.php index 70694ccc0d6c..5867382f4c24 100644 --- a/app/Notifications/Admin/NewPaymentNotification.php +++ b/app/Notifications/Admin/NewPaymentNotification.php @@ -12,7 +12,6 @@ namespace App\Notifications\Admin; use App\Utils\Number; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -57,7 +56,7 @@ class NewPaymentNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ClientContactRequestCancellation.php b/app/Notifications/ClientContactRequestCancellation.php index 618dee18906c..6384f0d638d6 100644 --- a/app/Notifications/ClientContactRequestCancellation.php +++ b/app/Notifications/ClientContactRequestCancellation.php @@ -14,7 +14,6 @@ namespace App\Notifications; use Closure; use Illuminate\Bus\Queueable; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; use Illuminate\Queue\InteractsWithQueue; @@ -63,7 +62,7 @@ class ClientContactRequestCancellation extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ClientContactResetPassword.php b/app/Notifications/ClientContactResetPassword.php index 2ba6593fb39d..4f048de0ec19 100644 --- a/app/Notifications/ClientContactResetPassword.php +++ b/app/Notifications/ClientContactResetPassword.php @@ -14,7 +14,6 @@ namespace App\Notifications; use Closure; use Illuminate\Bus\Queueable; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; @@ -63,7 +62,7 @@ class ClientContactResetPassword extends Notification * Build the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/NewAccountCreated.php b/app/Notifications/NewAccountCreated.php index 845aecad8c34..163a0625e211 100644 --- a/app/Notifications/NewAccountCreated.php +++ b/app/Notifications/NewAccountCreated.php @@ -13,7 +13,6 @@ namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; use Illuminate\Queue\InteractsWithQueue; @@ -57,7 +56,7 @@ class NewAccountCreated extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/ClientAccountNotFound.php b/app/Notifications/Ninja/ClientAccountNotFound.php index 84087991f618..519c4f5e111d 100644 --- a/app/Notifications/Ninja/ClientAccountNotFound.php +++ b/app/Notifications/Ninja/ClientAccountNotFound.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -42,7 +41,7 @@ class ClientAccountNotFound extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/DomainFailureNotification.php b/app/Notifications/Ninja/DomainFailureNotification.php index 2e4dc99059c5..26b33f99e33e 100644 --- a/app/Notifications/Ninja/DomainFailureNotification.php +++ b/app/Notifications/Ninja/DomainFailureNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -45,7 +44,7 @@ class DomainFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/DomainRenewalFailureNotification.php b/app/Notifications/Ninja/DomainRenewalFailureNotification.php index 719a93d5e152..dfb189253d8a 100644 --- a/app/Notifications/Ninja/DomainRenewalFailureNotification.php +++ b/app/Notifications/Ninja/DomainRenewalFailureNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -45,7 +44,7 @@ class DomainRenewalFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/EmailBounceNotification.php b/app/Notifications/Ninja/EmailBounceNotification.php index 796a1f6368f0..4ae6966d725a 100644 --- a/app/Notifications/Ninja/EmailBounceNotification.php +++ b/app/Notifications/Ninja/EmailBounceNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -44,7 +43,7 @@ class EmailBounceNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/EmailQuotaNotification.php b/app/Notifications/Ninja/EmailQuotaNotification.php index 8ef6cbf6ac51..45f4fe79d24c 100644 --- a/app/Notifications/Ninja/EmailQuotaNotification.php +++ b/app/Notifications/Ninja/EmailQuotaNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -44,7 +43,7 @@ class EmailQuotaNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/EmailSpamNotification.php b/app/Notifications/Ninja/EmailSpamNotification.php index ca355ca87141..e4cd98b6c5b4 100644 --- a/app/Notifications/Ninja/EmailSpamNotification.php +++ b/app/Notifications/Ninja/EmailSpamNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; diff --git a/app/Notifications/Ninja/GenericNinjaAdminNotification.php b/app/Notifications/Ninja/GenericNinjaAdminNotification.php index 7b40141aa22a..ee211d29e542 100644 --- a/app/Notifications/Ninja/GenericNinjaAdminNotification.php +++ b/app/Notifications/Ninja/GenericNinjaAdminNotification.php @@ -56,7 +56,7 @@ class GenericNinjaAdminNotification extends Notification public function toSlack($notifiable) { - $content = ''; + $content = ''; foreach($this->message_array as $message) { $content .= $message . "\n"; diff --git a/app/Notifications/Ninja/GmailCredentialNotification.php b/app/Notifications/Ninja/GmailCredentialNotification.php index 0bc8226e1e5d..893c5cc09a5d 100644 --- a/app/Notifications/Ninja/GmailCredentialNotification.php +++ b/app/Notifications/Ninja/GmailCredentialNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -44,7 +43,7 @@ class GmailCredentialNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/NewAccountCreated.php b/app/Notifications/Ninja/NewAccountCreated.php index 77d570caa415..7e0636f4c3e7 100644 --- a/app/Notifications/Ninja/NewAccountCreated.php +++ b/app/Notifications/Ninja/NewAccountCreated.php @@ -13,7 +13,6 @@ namespace App\Notifications\Ninja; use Illuminate\Bus\Queueable; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; use Illuminate\Queue\InteractsWithQueue; @@ -57,7 +56,7 @@ class NewAccountCreated extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/NewAccountNotification.php b/app/Notifications/Ninja/NewAccountNotification.php index 2b215897686a..2d7afdebe8cf 100644 --- a/app/Notifications/Ninja/NewAccountNotification.php +++ b/app/Notifications/Ninja/NewAccountNotification.php @@ -13,7 +13,6 @@ namespace App\Notifications\Ninja; use App\Models\Account; use App\Models\Client; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -50,7 +49,7 @@ class NewAccountNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/RenewalFailureNotification.php b/app/Notifications/Ninja/RenewalFailureNotification.php index 6d9adfc865ad..8231395b4f65 100644 --- a/app/Notifications/Ninja/RenewalFailureNotification.php +++ b/app/Notifications/Ninja/RenewalFailureNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -42,7 +41,7 @@ class RenewalFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/SpamNotification.php b/app/Notifications/Ninja/SpamNotification.php index d81e7909713b..bf895e89defb 100644 --- a/app/Notifications/Ninja/SpamNotification.php +++ b/app/Notifications/Ninja/SpamNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -45,7 +44,7 @@ class SpamNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/UserQualityNotification.php b/app/Notifications/Ninja/UserQualityNotification.php index 4e1780665e5d..0a8dfc89f9b3 100644 --- a/app/Notifications/Ninja/UserQualityNotification.php +++ b/app/Notifications/Ninja/UserQualityNotification.php @@ -12,7 +12,6 @@ namespace App\Notifications\Ninja; use App\Models\User; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -49,7 +48,7 @@ class UserQualityNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/WePayFailureNotification.php b/app/Notifications/Ninja/WePayFailureNotification.php index e11e321c46ba..4af13a2b88fe 100644 --- a/app/Notifications/Ninja/WePayFailureNotification.php +++ b/app/Notifications/Ninja/WePayFailureNotification.php @@ -11,7 +11,6 @@ namespace App\Notifications\Ninja; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; @@ -44,7 +43,7 @@ class WePayFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ResetPasswordNotification.php b/app/Notifications/ResetPasswordNotification.php index f3fc5497d45a..84a16d032fae 100644 --- a/app/Notifications/ResetPasswordNotification.php +++ b/app/Notifications/ResetPasswordNotification.php @@ -3,13 +3,12 @@ namespace App\Notifications; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; //@deprecated class ResetPasswordNotification extends Notification { -// use Queueable; + // use Queueable; public $token; @@ -38,7 +37,7 @@ class ResetPasswordNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * + * */ public function toMail($notifiable) { diff --git a/app/Observers/ClientObserver.php b/app/Observers/ClientObserver.php index e33316e1833a..902e111e535d 100644 --- a/app/Observers/ClientObserver.php +++ b/app/Observers/ClientObserver.php @@ -11,44 +11,44 @@ namespace App\Observers; +use App\Jobs\Client\CheckVat; +use App\Jobs\Client\UpdateTaxData; +use App\Jobs\Util\WebhookHandler; use App\Models\Client; use App\Models\Webhook; -use App\Jobs\Client\CheckVat; -use App\Jobs\Util\WebhookHandler; -use App\Jobs\Client\UpdateTaxData; class ClientObserver { public $afterCommit = true; private $eu_country_codes = [ - 'AT' => '40', - 'BE' => '56', - 'BG' => '100', - 'CY' => '196', - 'CZ' => '203', - 'DE' => '276', - 'DK' => '208', - 'EE' => '233', - 'ES' => '724', - 'FI' => '246', - 'FR' => '250', - 'GR' => '300', - 'HR' => '191', - 'HU' => '348', - 'IE' => '372', - 'IT' => '380', - 'LT' => '440', - 'LU' => '442', - 'LV' => '428', - 'MT' => '470', - 'NL' => '528', - 'PL' => '616', - 'PT' => '620', - 'RO' => '642', - 'SE' => '752', - 'SI' => '705', - 'SK' => '703', + 'AT' => '40', + 'BE' => '56', + 'BG' => '100', + 'CY' => '196', + 'CZ' => '203', + 'DE' => '276', + 'DK' => '208', + 'EE' => '233', + 'ES' => '724', + 'FI' => '246', + 'FR' => '250', + 'GR' => '300', + 'HR' => '191', + 'HU' => '348', + 'IE' => '372', + 'IT' => '380', + 'LT' => '440', + 'LU' => '442', + 'LV' => '428', + 'MT' => '470', + 'NL' => '528', + 'PL' => '616', + 'PT' => '620', + 'RO' => '642', + 'SE' => '752', + 'SI' => '705', + 'SK' => '703', ]; /** diff --git a/app/Observers/CompanyObserver.php b/app/Observers/CompanyObserver.php index 15ed25274945..28dda997c878 100644 --- a/app/Observers/CompanyObserver.php +++ b/app/Observers/CompanyObserver.php @@ -36,8 +36,9 @@ class CompanyObserver */ public function updated(Company $company) { - if (Ninja::isHosted() && $company->portal_mode == 'domain' && $company->isDirty('portal_domain')) + if (Ninja::isHosted() && $company->portal_mode == 'domain' && $company->isDirty('portal_domain')) { \Modules\Admin\Jobs\Domain\CustomDomain::dispatch($company->getOriginal('portal_domain'), $company)->onQueue('domain'); + } } diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php index 8a65fc375a3f..c1ad0e744db4 100644 --- a/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php +++ b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php @@ -12,15 +12,15 @@ namespace App\PaymentDrivers\Authorize; +use App\Exceptions\GenericPaymentDriverFailure; use App\Models\Client; use App\PaymentDrivers\AuthorizePaymentDriver; -use App\Exceptions\GenericPaymentDriverFailure; +use net\authorize\api\contract\v1\CreateCustomerProfileRequest; use net\authorize\api\contract\v1\CustomerAddressType; use net\authorize\api\contract\v1\CustomerProfileType; use net\authorize\api\contract\v1\GetCustomerProfileRequest; -use net\authorize\api\controller\GetCustomerProfileController; -use net\authorize\api\contract\v1\CreateCustomerProfileRequest; use net\authorize\api\controller\CreateCustomerProfileController; +use net\authorize\api\controller\GetCustomerProfileController; /** * Class BaseDriver. @@ -137,27 +137,27 @@ class AuthorizeCreateCustomer } // This is how we can harvest client profiles and attach them within Invoice Ninja -// $request = new net\authorize\api\contract\v1\GetCustomerProfileRequest(); -// $request->setMerchantAuthentication($driver->merchant_authentication); -// $request->setCustomerProfileId($gateway_customer_reference); -// $controller = new net\authorize\api\controller\GetCustomerProfileController($request); -// $response = $controller->executeWithApiResponse($driver->mode()); + // $request = new net\authorize\api\contract\v1\GetCustomerProfileRequest(); + // $request->setMerchantAuthentication($driver->merchant_authentication); + // $request->setCustomerProfileId($gateway_customer_reference); + // $controller = new net\authorize\api\controller\GetCustomerProfileController($request); + // $response = $controller->executeWithApiResponse($driver->mode()); -// if (($response != null) && ($response->getMessages()->getResultCode() == "Ok") ) -// { -// echo "GetCustomerProfile SUCCESS : " . "\n"; -// $profileSelected = $response->getProfile(); -// $paymentProfilesSelected = $profileSelected->getPaymentProfiles(); -// echo "Profile Has " . count($paymentProfilesSelected). " Payment Profiles" . "\n"; + // if (($response != null) && ($response->getMessages()->getResultCode() == "Ok") ) + // { + // echo "GetCustomerProfile SUCCESS : " . "\n"; + // $profileSelected = $response->getProfile(); + // $paymentProfilesSelected = $profileSelected->getPaymentProfiles(); + // echo "Profile Has " . count($paymentProfilesSelected). " Payment Profiles" . "\n"; -// foreach ($profileSelected->getPaymentProfiles() as $paymentProfile) { -// echo "\nCustomer Profile ID: " . $paymentProfile->getCustomerProfileId() . "\n"; -// echo "Payment profile ID: " . $paymentProfile->getCustomerPaymentProfileId() . "\n"; -// echo "Credit Card Number: " . $paymentProfile->getPayment()->getCreditCard()->getCardNumber() . "\n"; -// if ($paymentProfile->getBillTo() != null) { -// echo "First Name in Billing Address: " . $paymentProfile->getBillTo()->getFirstName() . "\n"; -// } -// } + // foreach ($profileSelected->getPaymentProfiles() as $paymentProfile) { + // echo "\nCustomer Profile ID: " . $paymentProfile->getCustomerProfileId() . "\n"; + // echo "Payment profile ID: " . $paymentProfile->getCustomerPaymentProfileId() . "\n"; + // echo "Credit Card Number: " . $paymentProfile->getPayment()->getCreditCard()->getCardNumber() . "\n"; + // if ($paymentProfile->getBillTo() != null) { + // echo "First Name in Billing Address: " . $paymentProfile->getBillTo()->getFirstName() . "\n"; + // } + // } } // $request = new net\authorize\api\contract\v1\GetCustomerProfileIdsRequest(); @@ -174,7 +174,7 @@ class AuthorizeCreateCustomer // $request->setCustomerProfileId($customer_profile_id); // $controller = new net\authorize\api\controller\GetCustomerProfileController($request); // $response = $controller->executeWithApiResponse($auth->mode()); - + // $profileSelected = $response->getProfile(); // if($profileSelected->getEmail() == 'katnandan@gmail.com') diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php index e1cbb863ce40..be6dd72bca9a 100644 --- a/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php +++ b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php @@ -12,21 +12,20 @@ namespace App\PaymentDrivers\Authorize; -use App\Models\Payment; -use App\Models\SystemLog; +use App\Exceptions\PaymentFailed; +use App\Jobs\Util\SystemLogger; +use App\Models\ClientGatewayToken; use App\Models\GatewayType; +use App\Models\Payment; use App\Models\PaymentHash; use App\Models\PaymentType; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; -use App\Exceptions\PaymentFailed; -use App\Models\ClientGatewayToken; +use App\Models\SystemLog; use App\PaymentDrivers\AuthorizePaymentDriver; -use App\PaymentDrivers\Authorize\AuthorizeTransaction; -use net\authorize\api\contract\v1\DeleteCustomerProfileRequest; -use net\authorize\api\controller\DeleteCustomerProfileController; +use App\Utils\Traits\MakesHash; use net\authorize\api\contract\v1\DeleteCustomerPaymentProfileRequest; +use net\authorize\api\contract\v1\DeleteCustomerProfileRequest; use net\authorize\api\controller\DeleteCustomerPaymentProfileController; +use net\authorize\api\controller\DeleteCustomerProfileController; /** * Class AuthorizeCreditCard. @@ -118,7 +117,7 @@ class AuthorizeCreditCard // $response = $controller->executeWithApiResponse($this->authorize->mode()); // if (($response != null) && ($response->getMessages()->getResultCode() == "Ok") ) // { - // nlog("SUCCESS: Delete Customer Payment Profile SUCCESS"); + // nlog("SUCCESS: Delete Customer Payment Profile SUCCESS"); // } // else // nlog("unable to delete profile {$customer_profile_id}"); diff --git a/app/PaymentDrivers/Authorize/AuthorizeCustomer.php b/app/PaymentDrivers/Authorize/AuthorizeCustomer.php index 3e51b270db8e..a72fe5efe59d 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"); @@ -139,7 +139,7 @@ class AuthorizeCustomer continue; } -// $expiry = $payment_profile->getPayment()->getCreditCard()->getExpirationDate(); + // $expiry = $payment_profile->getPayment()->getCreditCard()->getExpirationDate(); $payment_meta = new \stdClass; $payment_meta->exp_month = 'xx'; diff --git a/app/PaymentDrivers/Authorize/AuthorizeTransaction.php b/app/PaymentDrivers/Authorize/AuthorizeTransaction.php index 20f184a17fe2..b727bf374525 100644 --- a/app/PaymentDrivers/Authorize/AuthorizeTransaction.php +++ b/app/PaymentDrivers/Authorize/AuthorizeTransaction.php @@ -13,17 +13,15 @@ namespace App\PaymentDrivers\Authorize; use App\Models\Invoice; -use App\Utils\Traits\MakesHash; -use net\authorize\api\contract\v1\OrderType; use App\PaymentDrivers\AuthorizePaymentDriver; +use App\Utils\Traits\MakesHash; +use net\authorize\api\contract\v1\CreateTransactionRequest; +use net\authorize\api\contract\v1\ExtendedAmountType; +use net\authorize\api\contract\v1\OpaqueDataType; +use net\authorize\api\contract\v1\OrderType; use net\authorize\api\contract\v1\PaymentType; use net\authorize\api\contract\v1\SettingType; -use net\authorize\api\contract\v1\OpaqueDataType; -use net\authorize\api\contract\v1\ExtendedAmountType; -use net\authorize\api\contract\v1\PaymentProfileType; use net\authorize\api\contract\v1\TransactionRequestType; -use net\authorize\api\contract\v1\CreateTransactionRequest; -use net\authorize\api\contract\v1\CustomerProfilePaymentType; use net\authorize\api\controller\CreateTransactionController; /** @@ -110,7 +108,7 @@ class AuthorizeTransaction $billto->setPhoneNumber(substr($this->authorize->client->phone, 0, 20)); } -//Assign to the transactionRequest field + //Assign to the transactionRequest field $transactionRequestType = new TransactionRequestType(); $transactionRequestType->setTransactionType('authCaptureTransaction'); @@ -123,8 +121,9 @@ class AuthorizeTransaction $transactionRequestType->setPayment($paymentOne); $transactionRequestType->setCurrencyCode($this->authorize->client->currency()->code); - if($billto) + if($billto) { $transactionRequestType->setBillTo($billto); + } $request = new CreateTransactionRequest(); $request->setMerchantAuthentication($this->authorize->merchant_authentication); diff --git a/app/PaymentDrivers/Authorize/RefundTransaction.php b/app/PaymentDrivers/Authorize/RefundTransaction.php index 998ffbad33a9..a667598a0ec0 100644 --- a/app/PaymentDrivers/Authorize/RefundTransaction.php +++ b/app/PaymentDrivers/Authorize/RefundTransaction.php @@ -12,16 +12,16 @@ namespace App\PaymentDrivers\Authorize; +use App\Jobs\Util\SystemLogger; use App\Models\Payment; use App\Models\SystemLog; -use App\Jobs\Util\SystemLogger; use App\PaymentDrivers\AuthorizePaymentDriver; -use net\authorize\api\contract\v1\PaymentType; -use net\authorize\api\contract\v1\CreditCardType; -use net\authorize\api\contract\v1\PaymentProfileType; -use net\authorize\api\contract\v1\TransactionRequestType; use net\authorize\api\contract\v1\CreateTransactionRequest; +use net\authorize\api\contract\v1\CreditCardType; use net\authorize\api\contract\v1\CustomerProfilePaymentType; +use net\authorize\api\contract\v1\PaymentProfileType; +use net\authorize\api\contract\v1\PaymentType; +use net\authorize\api\contract\v1\TransactionRequestType; use net\authorize\api\controller\CreateTransactionController; /** diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index 7919cbe23882..9631b3b97c66 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -15,7 +15,6 @@ use App\Events\Invoice\InvoiceWasPaid; use App\Events\Payment\PaymentWasCreated; use App\Exceptions\PaymentFailed; use App\Factory\PaymentFactory; -use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use App\Jobs\Mail\NinjaMailer; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; @@ -59,7 +58,7 @@ class BaseDriver extends AbstractPaymentDriver /** * The Client * - * @var \App\Models\Client|null $client + * @var \App\Models\Client|null $client */ public $client; @@ -733,19 +732,21 @@ class BaseDriver extends AbstractPaymentDriver $t->replace(Ninja::transformTranslations($this->client->getMergedSettings())); App::setLocale($this->client->company->locale()); - if (! $this->payment_hash || !$this->client) + if (! $this->payment_hash || !$this->client) { return 'Descriptor'; + } $invoices_string = \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray()) ?: null; - if (!$invoices_string) + if (!$invoices_string) { return str_replace(["*","<",">","'",'"'], "", $this->client->company->present()->name()); + } $invoices_string = str_replace(["*","<",">","'",'"'], "-", $invoices_string); $invoices_string = "I-".$invoices_string; - $invoices_string = substr($invoices_string,0,22); + $invoices_string = substr($invoices_string, 0, 22); $invoices_string = str_pad($invoices_string, 5, ctrans('texts.invoice'), STR_PAD_LEFT); @@ -769,7 +770,7 @@ class BaseDriver extends AbstractPaymentDriver $invoices_string = \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray()) ?: null; $amount = Number::formatMoney($this->payment_hash?->amount_with_fee() ?? 0, $this->client); - if($abbreviated && $invoices_string){ + if($abbreviated && $invoices_string) { return $invoices_string; } elseif ($abbreviated || ! $invoices_string) { return ctrans('texts.gateway_payment_text_no_invoice', [ diff --git a/app/PaymentDrivers/Braintree/ACH.php b/app/PaymentDrivers/Braintree/ACH.php index da8e220d3a65..5dbbb56e650e 100644 --- a/app/PaymentDrivers/Braintree/ACH.php +++ b/app/PaymentDrivers/Braintree/ACH.php @@ -42,8 +42,7 @@ class ACH implements MethodInterface try { $data['gateway'] = $this->braintree; $data['client_token'] = $this->braintree->gateway->clientToken()->generate(); - } - catch(\Exception $e){ + } catch(\Exception $e) { throw new PaymentFailed("Unable to generate client token, check your Braintree credentials. Error: " . $e->getMessage(), 500); diff --git a/app/PaymentDrivers/CheckoutCom/CheckoutSetupWebhook.php b/app/PaymentDrivers/CheckoutCom/CheckoutSetupWebhook.php index d35d07bd22ed..5c61547d217f 100644 --- a/app/PaymentDrivers/CheckoutCom/CheckoutSetupWebhook.php +++ b/app/PaymentDrivers/CheckoutCom/CheckoutSetupWebhook.php @@ -11,28 +11,21 @@ namespace App\PaymentDrivers\CheckoutCom; -use App\Models\Payment; -use App\Models\SystemLog; use App\Libraries\MultiDB; -use App\Models\GatewayType; -use App\Models\PaymentHash; -use App\Models\PaymentType; -use Illuminate\Bus\Queueable; use App\Models\CompanyGateway; -use App\Jobs\Util\SystemLogger; -use Checkout\CheckoutApiException; -use Illuminate\Queue\SerializesModels; -use App\PaymentDrivers\Stripe\Utilities; -use Illuminate\Queue\InteractsWithQueue; -use App\PaymentDrivers\CheckoutCom\Webhook; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use Checkout\CheckoutAuthorizationException; -use Checkout\Workflows\CreateWorkflowRequest; use App\PaymentDrivers\CheckoutComPaymentDriver; +use App\PaymentDrivers\Stripe\Utilities; +use Checkout\CheckoutApiException; +use Checkout\CheckoutAuthorizationException; use Checkout\Workflows\Actions\WebhookSignature; use Checkout\Workflows\Actions\WebhookWorkflowActionRequest; use Checkout\Workflows\Conditions\EventWorkflowConditionRequest; +use Checkout\Workflows\CreateWorkflowRequest; +use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; class CheckoutSetupWebhook implements ShouldQueue { @@ -68,8 +61,9 @@ class CheckoutSetupWebhook implements ShouldQueue return $workflow['name'] == $this->authentication_webhook_name; }); - if($wf) + if($wf) { return; + } $this->createAuthenticationWorkflow(); } diff --git a/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php b/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php index c7c1069c63ff..2d162f9e8e79 100644 --- a/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php +++ b/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php @@ -11,20 +11,20 @@ namespace App\PaymentDrivers\CheckoutCom; -use App\Models\Payment; -use App\Models\SystemLog; +use App\Jobs\Util\SystemLogger; use App\Libraries\MultiDB; +use App\Models\CompanyGateway; use App\Models\GatewayType; +use App\Models\Payment; use App\Models\PaymentHash; use App\Models\PaymentType; -use Illuminate\Bus\Queueable; -use App\Models\CompanyGateway; -use App\Jobs\Util\SystemLogger; -use Illuminate\Queue\SerializesModels; +use App\Models\SystemLog; use App\PaymentDrivers\Stripe\Utilities; -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 CheckoutWebhook implements ShouldQueue { @@ -48,10 +48,11 @@ class CheckoutWebhook implements ShouldQueue $this->company_gateway = CompanyGateway::withTrashed()->find($this->company_gateway_id); - if(!isset($this->webhook_array['type'])) + if(!isset($this->webhook_array['type'])) { nlog("Checkout Webhook type not set"); + } - match($this->webhook_array['type']){ + match($this->webhook_array['type']) { 'payment_approved' => $this->paymentApproved(), }; @@ -62,7 +63,7 @@ class CheckoutWebhook implements ShouldQueue * "id":"evt_dli6ty4qo5vuxle5wklf5gwbwy","type":"payment_approved","version":"1.0.33","created_on":"2023-07-21T10:03:07.1555904Z", * "data":{"id":"pay_oqwbsd22kvpuvd35y5fhbdawxa","action_id":"act_buviezur7zsurnsorcgfn63e44","reference":"0014","amount":584168,"auth_code":"113059","currency":"USD","customer":{"id":"cus_6n4yt4q5kf4unn36o5qpbevxhe","email":"cypress@example.com"}, * "metadata":{"udf1":"Invoice Ninja","udf2":"ofhgiGjyQXbsbUwygURfYFT2C3E7iY7U"},"payment_type":"Regular","processed_on":"2023-07-21T10:02:57.4678165Z","processing":{"acquirer_transaction_id":"645272142084717830381","retrieval_reference_number":"183042259107"},"response_code":"10000","response_summary":"Approved","risk":{"flagged":false,"score":0},"3ds":{"version":"2.2.0","challenged":true,"challenge_indicator":"no_preference","exemption":"none","eci":"05","cavv":"AAABAVIREQAAAAAAAAAAAAAAAAA=","xid":"74afa3ac-25d3-4d95-b815-cefbdd7c8270","downgraded":false,"enrolled":"Y","authentication_response":"Y","flow_type":"challenged"},"scheme_id":"114455763095262", - * "source":{"id":"src_ghavmefpetjellmteqwj5jjcli","type":"card","billing_address":{},"expiry_month":10,"expiry_year":2025,"scheme":"VISA","last_4":"4242","fingerprint":"BD864B08D0B098DD83052A038FD2BA967DF2D48E375AAEEF54E37BC36B385E9A","bin":"424242","card_type":"CREDIT","card_category":"CONSUMER","issuer_country":"GB","product_id":"F","product_type":"Visa Classic","avs_check":"G","cvv_check":"Y"},"balances":{"total_authorized":584168,"total_voided":0,"available_to_void":584168,"total_captured":0,"available_to_capture":584168,"total_refunded":0,"available_to_refund":0},"event_links":{"payment":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa","payment_actions":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/actions","capture":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/captures","void":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/voids"}},"_links":{"self":{"href":"https://api.sandbox.checkout.com/workflows/events/evt_dli6ty4qo5vuxle5wklf5gwbwy"},"subject":{"href":"https://api.sandbox.checkout.com/workflows/events/subject/pay_oqwbsd22kvpuvd35y5fhbdawxa"},"payment":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa"},"payment_actions":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/actions"},"capture":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/captures"},"void":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/voids"}}} + * "source":{"id":"src_ghavmefpetjellmteqwj5jjcli","type":"card","billing_address":{},"expiry_month":10,"expiry_year":2025,"scheme":"VISA","last_4":"4242","fingerprint":"BD864B08D0B098DD83052A038FD2BA967DF2D48E375AAEEF54E37BC36B385E9A","bin":"424242","card_type":"CREDIT","card_category":"CONSUMER","issuer_country":"GB","product_id":"F","product_type":"Visa Classic","avs_check":"G","cvv_check":"Y"},"balances":{"total_authorized":584168,"total_voided":0,"available_to_void":584168,"total_captured":0,"available_to_capture":584168,"total_refunded":0,"available_to_refund":0},"event_links":{"payment":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa","payment_actions":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/actions","capture":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/captures","void":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/voids"}},"_links":{"self":{"href":"https://api.sandbox.checkout.com/workflows/events/evt_dli6ty4qo5vuxle5wklf5gwbwy"},"subject":{"href":"https://api.sandbox.checkout.com/workflows/events/subject/pay_oqwbsd22kvpuvd35y5fhbdawxa"},"payment":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa"},"payment_actions":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/actions"},"capture":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/captures"},"void":{"href":"https://api.sandbox.checkout.com/payments/pay_oqwbsd22kvpuvd35y5fhbdawxa/voids"}}} */ private function paymentApproved() @@ -71,10 +72,11 @@ class CheckoutWebhook implements ShouldQueue $payment = Payment::query()->withTrashed()->where('transaction_reference', $payment_object['id'])->first(); - if($payment && $payment->status_id == Payment::STATUS_COMPLETED) + if($payment && $payment->status_id == Payment::STATUS_COMPLETED) { return; + } - if($payment){ + if($payment) { $payment->status_id = Payment::STATUS_COMPLETED; $payment->save(); return; @@ -89,8 +91,8 @@ class CheckoutWebhook implements ShouldQueue $driver = $this->company_gateway->driver($payment_hash->fee_invoice->client)->init()->setPaymentMethod(); $payment_hash->data = array_merge((array) $payment_hash->data, $this->webhook_array); // @phpstan-ignore-line - $payment_hash->save(); - $driver->setPaymentHash($payment_hash); + $payment_hash->save(); + $driver->setPaymentHash($payment_hash); // @phpstan-ignore-line $data = [ diff --git a/app/PaymentDrivers/CheckoutCom/CreditCard.php b/app/PaymentDrivers/CheckoutCom/CreditCard.php index 8a0166eb0cdb..5436ce35ba1e 100644 --- a/app/PaymentDrivers/CheckoutCom/CreditCard.php +++ b/app/PaymentDrivers/CheckoutCom/CreditCard.php @@ -12,25 +12,25 @@ namespace App\PaymentDrivers\CheckoutCom; -use App\Models\SystemLog; -use Illuminate\View\View; -use App\Models\GatewayType; -use Illuminate\Http\Request; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; use App\Exceptions\PaymentFailed; +use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; +use App\Jobs\Util\SystemLogger; use App\Models\ClientGatewayToken; +use App\Models\GatewayType; +use App\Models\SystemLog; +use App\PaymentDrivers\CheckoutComPaymentDriver; +use App\PaymentDrivers\Common\MethodInterface; +use App\Utils\Traits\MakesHash; use Checkout\CheckoutApiException; -use Illuminate\Contracts\View\Factory; use Checkout\CheckoutArgumentException; use Checkout\CheckoutAuthorizationException; -use Checkout\Payments\Request\PaymentRequest; -use App\PaymentDrivers\Common\MethodInterface; -use App\PaymentDrivers\CheckoutComPaymentDriver; -use Checkout\Payments\Previous\Source\RequestTokenSource; -use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use Checkout\Payments\Previous\PaymentRequest as PreviousPaymentRequest; +use Checkout\Payments\Previous\Source\RequestTokenSource; +use Checkout\Payments\Request\PaymentRequest; use Checkout\Payments\Request\Source\RequestTokenSource as SourceRequestTokenSource; +use Illuminate\Contracts\View\Factory; +use Illuminate\Http\Request; +use Illuminate\View\View; class CreditCard implements MethodInterface { @@ -125,8 +125,7 @@ class CreditCard implements MethodInterface if (isset($e->error_details['error_codes']) ?? false) { $error_details = end($e->error_details['error_codes']); - } - else { + } else { $error_details = $e->getMessage(); } diff --git a/app/PaymentDrivers/CheckoutCom/Utilities.php b/app/PaymentDrivers/CheckoutCom/Utilities.php index 73b0710a6296..296f506740cd 100644 --- a/app/PaymentDrivers/CheckoutCom/Utilities.php +++ b/app/PaymentDrivers/CheckoutCom/Utilities.php @@ -12,13 +12,12 @@ namespace App\PaymentDrivers\CheckoutCom; -use stdClass; -use Exception; -use App\Models\SystemLog; -use App\Models\GatewayType; -use App\Jobs\Util\SystemLogger; use App\Exceptions\PaymentFailed; -use Checkout\Payments\PaymentType; +use App\Jobs\Util\SystemLogger; +use App\Models\GatewayType; +use App\Models\SystemLog; +use Exception; +use stdClass; trait Utilities { diff --git a/app/PaymentDrivers/CheckoutCom/Webhook.php b/app/PaymentDrivers/CheckoutCom/Webhook.php index 8fc5744762b7..2fd3ab51c0cb 100644 --- a/app/PaymentDrivers/CheckoutCom/Webhook.php +++ b/app/PaymentDrivers/CheckoutCom/Webhook.php @@ -12,25 +12,9 @@ namespace App\PaymentDrivers\CheckoutCom; -use App\Exceptions\PaymentFailed; -use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; -use App\Jobs\Util\SystemLogger; -use App\Models\ClientGatewayToken; -use App\Models\GatewayType; -use App\Models\SystemLog; use App\PaymentDrivers\CheckoutComPaymentDriver; -use App\PaymentDrivers\Common\MethodInterface; -use App\Utils\Traits\MakesHash; use Checkout\CheckoutApiException; -use Checkout\CheckoutArgumentException; use Checkout\CheckoutAuthorizationException; -use Checkout\Payments\Four\Request\PaymentRequest; -use Checkout\Payments\Four\Request\Source\RequestTokenSource; -use Checkout\Payments\PaymentRequest as PaymentsPaymentRequest; -use Checkout\Payments\Source\RequestTokenSource as SourceRequestTokenSource; -use Illuminate\Contracts\View\Factory; -use Illuminate\Http\Request; -use Illuminate\View\View; class Webhook { @@ -86,4 +70,4 @@ class Webhook } -} \ No newline at end of file +} diff --git a/app/PaymentDrivers/CheckoutComPaymentDriver.php b/app/PaymentDrivers/CheckoutComPaymentDriver.php index 8c6c92b6af02..7f4fea2ab793 100644 --- a/app/PaymentDrivers/CheckoutComPaymentDriver.php +++ b/app/PaymentDrivers/CheckoutComPaymentDriver.php @@ -148,7 +148,7 @@ class CheckoutComPaymentDriver extends BaseDriver /** * Process different view depending on payment type - * + * * @param int $gateway_type_id The gateway type * @return string The view string */ diff --git a/app/PaymentDrivers/GoCardless/ACH.php b/app/PaymentDrivers/GoCardless/ACH.php index 2f1c5f6a0bff..78258f9ab268 100644 --- a/app/PaymentDrivers/GoCardless/ACH.php +++ b/app/PaymentDrivers/GoCardless/ACH.php @@ -142,7 +142,7 @@ class ACH implements MethodInterface * Show the payment page for ACH. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function paymentView(array $data): View { diff --git a/app/PaymentDrivers/GoCardless/DirectDebit.php b/app/PaymentDrivers/GoCardless/DirectDebit.php index 48274891e818..f27696d8627d 100644 --- a/app/PaymentDrivers/GoCardless/DirectDebit.php +++ b/app/PaymentDrivers/GoCardless/DirectDebit.php @@ -97,8 +97,8 @@ class DirectDebit implements MethodInterface * } * } * } - * - * + * + * */ public function billingRequestFlows(array $data) { @@ -170,7 +170,7 @@ class DirectDebit implements MethodInterface public function authorizeResponse(Request $request) { - try{ + try { $billing_request = $this->go_cardless->gateway->billingRequests()->get($request->billing_request); @@ -194,8 +194,7 @@ class DirectDebit implements MethodInterface return redirect()->route('client.payment_methods.show', $payment_method->hashed_id); - } - catch (\Exception $exception) { + } catch (\Exception $exception) { return $this->processUnsuccessfulAuthorization($exception); } @@ -242,7 +241,7 @@ class DirectDebit implements MethodInterface * Payment view for Direct Debit. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function paymentView(array $data): View { diff --git a/app/PaymentDrivers/GoCardless/SEPA.php b/app/PaymentDrivers/GoCardless/SEPA.php index 458b34d9e225..793f1f2b9f1f 100644 --- a/app/PaymentDrivers/GoCardless/SEPA.php +++ b/app/PaymentDrivers/GoCardless/SEPA.php @@ -141,7 +141,7 @@ class SEPA implements MethodInterface * Payment view for SEPA. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function paymentView(array $data): View { diff --git a/app/PaymentDrivers/GoCardlessPaymentDriver.php b/app/PaymentDrivers/GoCardlessPaymentDriver.php index bd461197f663..3201890465bc 100644 --- a/app/PaymentDrivers/GoCardlessPaymentDriver.php +++ b/app/PaymentDrivers/GoCardlessPaymentDriver.php @@ -103,8 +103,7 @@ class GoCardlessPaymentDriver extends BaseDriver 'access_token' => $this->company_gateway->getConfigField('accessToken'), 'environment' => $this->company_gateway->getConfigField('testMode') ? \GoCardlessPro\Environment::SANDBOX : \GoCardlessPro\Environment::LIVE, ]); - } - catch(\GoCardlessPro\Core\Exception\AuthenticationException $e){ + } catch(\GoCardlessPro\Core\Exception\AuthenticationException $e) { throw new \Exception('GoCardless: Invalid Access Token', 403); diff --git a/app/PaymentDrivers/Mollie/Bancontact.php b/app/PaymentDrivers/Mollie/Bancontact.php index 8aaed1bd615a..6af012b2f3b0 100644 --- a/app/PaymentDrivers/Mollie/Bancontact.php +++ b/app/PaymentDrivers/Mollie/Bancontact.php @@ -40,7 +40,7 @@ class Bancontact implements MethodInterface * Show the authorization page for Bancontact. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView(array $data): View { diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index 01cfc9c3c718..83d9ced223bc 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -43,7 +43,7 @@ class BankTransfer implements MethodInterface * Show the authorization page for bank transfer. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView(array $data): View { diff --git a/app/PaymentDrivers/Mollie/IDEAL.php b/app/PaymentDrivers/Mollie/IDEAL.php index 3e40df10b049..f14eaeb08303 100644 --- a/app/PaymentDrivers/Mollie/IDEAL.php +++ b/app/PaymentDrivers/Mollie/IDEAL.php @@ -40,7 +40,7 @@ class IDEAL implements MethodInterface * Show the authorization page for iDEAL. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView(array $data): View { diff --git a/app/PaymentDrivers/Mollie/KBC.php b/app/PaymentDrivers/Mollie/KBC.php index 6d34591064bc..c5020cdd4983 100644 --- a/app/PaymentDrivers/Mollie/KBC.php +++ b/app/PaymentDrivers/Mollie/KBC.php @@ -40,7 +40,7 @@ class KBC implements MethodInterface * Show the authorization page for KBC. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView(array $data): View { diff --git a/app/PaymentDrivers/PayPalExpressPaymentDriver.php b/app/PaymentDrivers/PayPalExpressPaymentDriver.php index 72c05a6030b8..7f34936bfca2 100644 --- a/app/PaymentDrivers/PayPalExpressPaymentDriver.php +++ b/app/PaymentDrivers/PayPalExpressPaymentDriver.php @@ -129,8 +129,7 @@ class PayPalExpressPaymentDriver extends BaseDriver if ($response->isCancelled() && $this->client->getSetting('enable_client_portal')) { return redirect()->route('client.invoices.index')->with('warning', ctrans('texts.status_cancelled')); - } - elseif($response->isCancelled() && !$this->client->getSetting('enable_client_portal')){ + } elseif($response->isCancelled() && !$this->client->getSetting('enable_client_portal')) { redirect()->route('client.invoices.show', ['invoice' => $this->payment_hash->fee_invoice])->with('warning', ctrans('texts.status_cancelled')); } diff --git a/app/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php index f60c4e3b1762..efcdba1bfa9d 100644 --- a/app/PaymentDrivers/PayPalRestPaymentDriver.php +++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php @@ -12,15 +12,15 @@ namespace App\PaymentDrivers; -use Omnipay\Omnipay; -use App\Models\Invoice; -use App\Models\SystemLog; -use App\Models\GatewayType; -use App\Models\PaymentType; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; use App\Exceptions\PaymentFailed; +use App\Jobs\Util\SystemLogger; +use App\Models\GatewayType; +use App\Models\Invoice; +use App\Models\PaymentType; +use App\Models\SystemLog; +use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Http; +use Omnipay\Omnipay; class PayPalRestPaymentDriver extends BaseDriver { @@ -87,8 +87,9 @@ class PayPalRestPaymentDriver extends BaseDriver public function setPaymentMethod($payment_method_id) { - if(!$payment_method_id) + if(!$payment_method_id) { return $this; + } $this->paypal_payment_method = $this->funding_options[$payment_method_id]; @@ -131,18 +132,18 @@ class PayPalRestPaymentDriver extends BaseDriver { $enums = [ - 3 => 'paypal', - 1 => 'card', - 25 => 'venmo', - // 9 => 'sepa', - // 12 => 'bancontact', - // 17 => 'eps', - // 15 => 'giropay', - // 13 => 'ideal', - // 26 => 'mercadopago', - // 27 => 'mybank', - // 28 => 'paylater', - // 16 => 'p24', + 3 => 'paypal', + 1 => 'card', + 25 => 'venmo', + // 9 => 'sepa', + // 12 => 'bancontact', + // 17 => 'eps', + // 15 => 'giropay', + // 13 => 'ideal', + // 26 => 'mercadopago', + // 27 => 'mybank', + // 28 => 'paylater', + // 16 => 'p24', // 7 => 'sofort' ]; @@ -167,7 +168,7 @@ class PayPalRestPaymentDriver extends BaseDriver $response = json_decode($request['gateway_response'], true); - if($response['status'] == 'COMPLETED' && isset($response['purchase_units'])){ + if($response['status'] == 'COMPLETED' && isset($response['purchase_units'])) { $data = [ 'payment_type' => PaymentType::PAYPAL, @@ -189,8 +190,7 @@ class PayPalRestPaymentDriver extends BaseDriver return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); - } - else { + } else { SystemLogger::dispatch( ['response' => $response], @@ -211,8 +211,9 @@ class PayPalRestPaymentDriver 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); @@ -235,9 +236,9 @@ class PayPalRestPaymentDriver extends BaseDriver "email_address" => $this->client->present()->email(), "address" => [ "address_line_1" => $this->client->address1, - "address_line_2" => $this->client->address2, - "admin_area_1" => $this->client->city, - "admin_area_2" => $this->client->state, + "address_line_2" => $this->client->address2, + "admin_area_1" => $this->client->city, + "admin_area_2" => $this->client->state, "postal_code" => $this->client->postal_code, "country_code" => $this->client->country->iso_3166_2, ] @@ -282,8 +283,9 @@ class PayPalRestPaymentDriver extends BaseDriver ->withHeaders($this->getHeaders($headers)) ->{$verb}("{$this->api_endpoint_url}{$uri}", $data); - if($r->successful()) + if($r->successful()) { return $r; + } throw new PaymentFailed("Gateway failure - {$r->body()}", 401); @@ -428,5 +430,5 @@ class PayPalRestPaymentDriver extends BaseDriver return 0; } - + } diff --git a/app/PaymentDrivers/PaytracePaymentDriver.php b/app/PaymentDrivers/PaytracePaymentDriver.php index b55e8857c169..830d7aecab2c 100644 --- a/app/PaymentDrivers/PaytracePaymentDriver.php +++ b/app/PaymentDrivers/PaytracePaymentDriver.php @@ -11,19 +11,19 @@ namespace App\PaymentDrivers; +use App\Exceptions\SystemError; +use App\Http\Requests\Payments\PaymentWebhookRequest; +use App\Jobs\Util\SystemLogger; +use App\Models\ClientGatewayToken; +use App\Models\GatewayType; use App\Models\Invoice; use App\Models\Payment; -use App\Utils\CurlUtils; -use App\Models\SystemLog; -use App\Models\GatewayType; use App\Models\PaymentHash; use App\Models\PaymentType; -use App\Exceptions\SystemError; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; -use App\Models\ClientGatewayToken; +use App\Models\SystemLog; use App\PaymentDrivers\PayTrace\CreditCard; -use App\Http\Requests\Payments\PaymentWebhookRequest; +use App\Utils\CurlUtils; +use App\Utils\Traits\MakesHash; class PaytracePaymentDriver extends BaseDriver { diff --git a/app/PaymentDrivers/Razorpay/Hosted.php b/app/PaymentDrivers/Razorpay/Hosted.php index 1d5b42358a7d..694d55c9ee50 100644 --- a/app/PaymentDrivers/Razorpay/Hosted.php +++ b/app/PaymentDrivers/Razorpay/Hosted.php @@ -41,7 +41,7 @@ class Hosted implements MethodInterface * Show the authorization page for Razorpay. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView(array $data): View { @@ -63,7 +63,7 @@ class Hosted implements MethodInterface * Payment view for the Razorpay. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function paymentView(array $data): View { diff --git a/app/PaymentDrivers/Square/CreditCard.php b/app/PaymentDrivers/Square/CreditCard.php index 080356edc357..55b11b98f62d 100644 --- a/app/PaymentDrivers/Square/CreditCard.php +++ b/app/PaymentDrivers/Square/CreditCard.php @@ -12,23 +12,22 @@ namespace App\PaymentDrivers\Square; +use App\Exceptions\PaymentFailed; +use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; +use App\Jobs\Util\SystemLogger; +use App\Models\ClientGatewayToken; +use App\Models\GatewayType; use App\Models\Invoice; use App\Models\Payment; -use App\Models\SystemLog; -use Illuminate\View\View; -use App\Models\GatewayType; use App\Models\PaymentType; -use Illuminate\Support\Str; -use Illuminate\Http\Request; -use Square\Http\ApiResponse; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; -use App\Exceptions\PaymentFailed; -use App\Models\ClientGatewayToken; -use Illuminate\Http\RedirectResponse; -use App\PaymentDrivers\SquarePaymentDriver; +use App\Models\SystemLog; use App\PaymentDrivers\Common\MethodInterface; -use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; +use App\PaymentDrivers\SquarePaymentDriver; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Request; +use Illuminate\View\View; +use Square\Http\ApiResponse; class CreditCard implements MethodInterface { @@ -43,7 +42,7 @@ class CreditCard implements MethodInterface * Authorization page for credit card. * * @param array $data - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function authorizeView($data): View { @@ -125,7 +124,7 @@ class CreditCard implements MethodInterface if ($request->shouldUseToken()) { $body->setCustomerId($cgt->gateway_customer_reference); - }elseif ($request->has('verificationToken') && $request->input('verificationToken')) { + } elseif ($request->has('verificationToken') && $request->input('verificationToken')) { $body->setVerificationToken($request->input('verificationToken')); } @@ -135,7 +134,7 @@ class CreditCard implements MethodInterface $body = json_decode($response->getBody()); - if($request->store_card){ + if($request->store_card) { $this->createCard($body->payment->id); } @@ -232,8 +231,7 @@ class CreditCard implements MethodInterface return $this->square_driver->processInternallyFailedPayment($this->square_driver, $e); } - } - else { + } else { throw new PaymentFailed($body->errors[0]->detail, 500); } diff --git a/app/PaymentDrivers/Square/SquareWebhook.php b/app/PaymentDrivers/Square/SquareWebhook.php index 67d656e8c926..42757f8a1125 100644 --- a/app/PaymentDrivers/Square/SquareWebhook.php +++ b/app/PaymentDrivers/Square/SquareWebhook.php @@ -11,22 +11,22 @@ namespace App\PaymentDrivers\Square; -use App\Models\Payment; -use App\Models\SystemLog; +use App\Jobs\Mail\PaymentFailedMailer; +use App\Jobs\Util\SystemLogger; use App\Libraries\MultiDB; +use App\Models\CompanyGateway; use App\Models\GatewayType; +use App\Models\Payment; use App\Models\PaymentHash; use App\Models\PaymentType; -use Illuminate\Bus\Queueable; -use App\Models\CompanyGateway; -use App\Jobs\Util\SystemLogger; -use App\Jobs\Mail\PaymentFailedMailer; -use Illuminate\Queue\SerializesModels; -use App\PaymentDrivers\Stripe\Utilities; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\SystemLog; use App\PaymentDrivers\SquarePaymentDriver; +use App\PaymentDrivers\Stripe\Utilities; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; class SquareWebhook implements ShouldQueue { @@ -43,13 +43,13 @@ class SquareWebhook implements ShouldQueue public \Square\SquareClient $square; private array $source_type = [ - 'CARD' => PaymentType::CREDIT_CARD_OTHER, - 'BANK_ACCOUNT' => PaymentType::ACH, - 'WALLET' => PaymentType::CREDIT_CARD_OTHER, - 'BUY_NOW_PAY_LATER' => PaymentType::CREDIT_CARD_OTHER, - 'SQUARE_ACCOUNT' => PaymentType::CREDIT_CARD_OTHER, - 'CASH' => PaymentType::CASH, - 'EXTERNAL' =>PaymentType::CREDIT_CARD_OTHER + 'CARD' => PaymentType::CREDIT_CARD_OTHER, + 'BANK_ACCOUNT' => PaymentType::ACH, + 'WALLET' => PaymentType::CREDIT_CARD_OTHER, + 'BUY_NOW_PAY_LATER' => PaymentType::CREDIT_CARD_OTHER, + 'SQUARE_ACCOUNT' => PaymentType::CREDIT_CARD_OTHER, + 'CASH' => PaymentType::CASH, + 'EXTERNAL' =>PaymentType::CREDIT_CARD_OTHER ]; public function __construct(public array $webhook_array, public string $company_key, public int $company_gateway_id) @@ -71,7 +71,7 @@ class SquareWebhook implements ShouldQueue $payment_status = false; - match($status){ + match($status) { 'APPROVED' => $payment_status = false, 'COMPLETED' => $payment_status = Payment::STATUS_COMPLETED, 'PENDING' => $payment_status = Payment::STATUS_PENDING, @@ -80,7 +80,7 @@ class SquareWebhook implements ShouldQueue default => $payment_status = false, }; - if(!$payment_status){ + if(!$payment_status) { nlog("Square Webhook - Payment Status Not Found or not worthy of processing"); nlog($this->webhook_array); } @@ -88,13 +88,13 @@ class SquareWebhook implements ShouldQueue $payment = $this->retrieveOrCreatePayment($payment_id, $payment_status); /** If the status was pending and now is reporting as Failed / Cancelled - process failure path */ - if($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_CANCELLED, Payment::STATUS_FAILED])){ + if($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_CANCELLED, Payment::STATUS_FAILED])) { $payment->service()->deletePayment(); if ($this->driver->payment_hash) { $error = ctrans('texts.client_payment_failure_body', [ 'invoice' => implode(',', $payment->invoices->pluck('number')->toArray()), - 'amount' => array_sum(array_column($this->driver->payment_hash->invoices(), 'amount')) + $this->driver->payment_hash->fee_total, + 'amount' => array_sum(array_column($this->driver->payment_hash->invoices(), 'amount')) + $this->driver->payment_hash->fee_total, ]); } else { $error = 'Payment for '.$payment->client->present()->name()." for {$payment->amount} failed"; @@ -107,8 +107,7 @@ class SquareWebhook implements ShouldQueue $error ); - } - elseif($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_COMPLETED, Payment::STATUS_COMPLETED])){ + } elseif($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_COMPLETED, Payment::STATUS_COMPLETED])) { $payment->status_id = Payment::STATUS_COMPLETED; $payment->save(); } @@ -130,7 +129,7 @@ class SquareWebhook implements ShouldQueue nlog("searching square for payment"); - if($apiResponse->isSuccess()){ + if($apiResponse->isSuccess()) { nlog("Searching by payment hash"); @@ -166,11 +165,10 @@ class SquareWebhook implements ShouldQueue return $payment; - } - else{ + } else { nlog("Square Webhook - Payment not found: {$payment_reference}"); nlog($apiResponse->getErrors()); return null; } } -} \ No newline at end of file +} diff --git a/app/PaymentDrivers/SquarePaymentDriver.php b/app/PaymentDrivers/SquarePaymentDriver.php index 5e6e3ecbb738..a52f0e44ad39 100644 --- a/app/PaymentDrivers/SquarePaymentDriver.php +++ b/app/PaymentDrivers/SquarePaymentDriver.php @@ -11,22 +11,22 @@ namespace App\PaymentDrivers; +use App\Http\Requests\Payments\PaymentWebhookRequest; +use App\Jobs\Util\SystemLogger; +use App\Models\ClientGatewayToken; +use App\Models\GatewayType; use App\Models\Invoice; use App\Models\Payment; -use App\Models\SystemLog; -use App\Models\GatewayType; use App\Models\PaymentHash; use App\Models\PaymentType; -use App\Jobs\Util\SystemLogger; -use App\Utils\Traits\MakesHash; -use Square\Utils\WebhooksHelper; -use App\Models\ClientGatewayToken; -use Square\Models\WebhookSubscription; +use App\Models\SystemLog; use App\PaymentDrivers\Square\CreditCard; use App\PaymentDrivers\Square\SquareWebhook; -use Square\Models\CreateWebhookSubscriptionRequest; -use App\Http\Requests\Payments\PaymentWebhookRequest; +use App\Utils\Traits\MakesHash; use Square\Models\Builders\RefundPaymentRequestBuilder; +use Square\Models\CreateWebhookSubscriptionRequest; +use Square\Models\WebhookSubscription; +use Square\Utils\WebhooksHelper; class SquarePaymentDriver extends BaseDriver { @@ -128,7 +128,7 @@ class SquarePaymentDriver extends BaseDriver $status = $refundPaymentResponse->getRefund()->getStatus(); - if(in_array($status, ['COMPLETED', 'PENDING'])){ + if(in_array($status, ['COMPLETED', 'PENDING'])) { $transaction_reference = $refundPaymentResponse->getRefund()->getId(); @@ -153,8 +153,7 @@ class SquarePaymentDriver extends BaseDriver ); return $data; - } - elseif(in_array($status, ['REJECTED', 'FAILED'])) { + } elseif(in_array($status, ['REJECTED', 'FAILED'])) { $transaction_reference = $refundPaymentResponse->getRefund()->getId(); @@ -194,17 +193,17 @@ class SquarePaymentDriver extends BaseDriver 'code' => $error->getCode(), ]; - SystemLogger::dispatch( - [ - 'server_response' => $data, - 'data' => request()->all() - ], - SystemLog::CATEGORY_GATEWAY_RESPONSE, - SystemLog::EVENT_GATEWAY_FAILURE, - SystemLog::TYPE_SQUARE, - $this->client, - $this->client->company - ); + SystemLogger::dispatch( + [ + 'server_response' => $data, + 'data' => request()->all() + ], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_FAILURE, + SystemLog::TYPE_SQUARE, + $this->client, + $this->client->company + ); return $data; } @@ -234,7 +233,7 @@ class SquarePaymentDriver extends BaseDriver $body->setCustomerId($cgt->gateway_customer_reference); $body->setAmountMoney($amount_money); $body->setReferenceId($payment_hash->hash); - $body->setNote(substr($description,0,500)); + $body->setNote(substr($description, 0, 500)); $response = $this->square->getPaymentsApi()->createPayment($body); $body = json_decode($response->getBody()); @@ -292,10 +291,10 @@ class SquarePaymentDriver extends BaseDriver if ($api_response->isSuccess()) { //array of WebhookSubscription objects - foreach($api_response->getResult()->getSubscriptions() ?? [] as $subscription) - { - if($subscription->getName() == 'Invoice_Ninja_Webhook_Subscription') - return $subscription->getId(); + foreach($api_response->getResult()->getSubscriptions() ?? [] as $subscription) { + if($subscription->getName() == 'Invoice_Ninja_Webhook_Subscription') { + return $subscription->getId(); + } } } else { @@ -327,8 +326,9 @@ class SquarePaymentDriver extends BaseDriver public function createWebhooks(): void { - if($this->checkWebhooks()) + if($this->checkWebhooks()) { return; + } $this->init(); @@ -367,7 +367,7 @@ class SquarePaymentDriver extends BaseDriver $signature_key = $this->company_gateway->getConfigField('signatureKey'); $notification_url = $this->company_gateway->webhookUrl(); - $body = ''; + $body = ''; $handle = fopen('php://input', 'r'); while(!feof($handle)) { $body .= fread($handle, 1024); @@ -394,8 +394,8 @@ class SquarePaymentDriver extends BaseDriver //getsubscriptionid here $subscription_id = $this->checkWebhooks(); - if(!$subscription_id){ - nlog('No Subscription Found'); + if(!$subscription_id) { + nlog('No Subscription Found'); return; } diff --git a/app/PaymentDrivers/Stripe/ACH.php b/app/PaymentDrivers/Stripe/ACH.php index cf31a8a6dd26..de2c4f3cf68f 100644 --- a/app/PaymentDrivers/Stripe/ACH.php +++ b/app/PaymentDrivers/Stripe/ACH.php @@ -193,8 +193,9 @@ class ACH $meta = $token->meta; - if(isset($meta->state) && $meta->state == 'unauthorized') + if(isset($meta->state) && $meta->state == 'unauthorized') { return redirect()->route('client.payment_methods.show', $token->hashed_id); + } } if (count($data['tokens']) == 0) { @@ -595,8 +596,9 @@ class ACH 'company_id' => $this->stripe->client->company_id, ])->first(); - if($token) + if($token) { return $token; + } return $this->stripe->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]); } catch (Exception $e) { diff --git a/app/PaymentDrivers/Stripe/Jobs/ChargeRefunded.php b/app/PaymentDrivers/Stripe/Jobs/ChargeRefunded.php index d0393dd2e752..a3628e7d44e9 100644 --- a/app/PaymentDrivers/Stripe/Jobs/ChargeRefunded.php +++ b/app/PaymentDrivers/Stripe/Jobs/ChargeRefunded.php @@ -11,18 +11,18 @@ namespace App\PaymentDrivers\Stripe\Jobs; -use App\Models\Company; -use App\Models\Payment; use App\Libraries\MultiDB; -use App\Models\PaymentHash; -use Illuminate\Bus\Queueable; +use App\Models\Company; use App\Models\CompanyGateway; -use Illuminate\Queue\SerializesModels; +use App\Models\Payment; +use App\Models\PaymentHash; use App\PaymentDrivers\Stripe\Utilities; -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\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; class ChargeRefunded implements ShouldQueue { @@ -93,10 +93,10 @@ class ChargeRefunded implements ShouldQueue if($payment->status_id == Payment::STATUS_COMPLETED) { $invoice_collection = $payment->paymentables - ->where('paymentable_type','invoices') - ->map(function ($pivot){ + ->where('paymentable_type', 'invoices') + ->map(function ($pivot) { return [ - 'invoice_id' => $pivot->paymentable_id, + 'invoice_id' => $pivot->paymentable_id, 'amount' => $pivot->amount - $pivot->refunded ]; }); @@ -106,15 +106,14 @@ class ChargeRefunded implements ShouldQueue $invoice_collection = $payment->paymentables ->where('paymentable_type', 'invoices') - ->map(function ($pivot) use ($amount_refunded){ + ->map(function ($pivot) use ($amount_refunded) { return [ 'invoice_id' => $pivot->paymentable_id, 'amount' => $amount_refunded ]; }); - } - elseif($invoice_collection->sum('amount') != $amount_refunded) { + } elseif($invoice_collection->sum('amount') != $amount_refunded) { //too many edges cases at this point, return early return; } diff --git a/app/PaymentDrivers/Stripe/SEPA.php b/app/PaymentDrivers/Stripe/SEPA.php index 1023d8ff6580..cd999ba76e64 100644 --- a/app/PaymentDrivers/Stripe/SEPA.php +++ b/app/PaymentDrivers/Stripe/SEPA.php @@ -11,15 +11,15 @@ namespace App\PaymentDrivers\Stripe; -use App\Models\Payment; -use App\Models\SystemLog; -use App\Models\GatewayType; -use App\Models\PaymentType; -use App\Jobs\Util\SystemLogger; use App\Exceptions\PaymentFailed; -use App\Models\ClientGatewayToken; -use App\PaymentDrivers\StripePaymentDriver; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; +use App\Jobs\Util\SystemLogger; +use App\Models\ClientGatewayToken; +use App\Models\GatewayType; +use App\Models\Payment; +use App\Models\PaymentType; +use App\Models\SystemLog; +use App\PaymentDrivers\StripePaymentDriver; class SEPA { diff --git a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php index 58ff84400fcc..5b7239f50fca 100644 --- a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php +++ b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php @@ -208,24 +208,24 @@ class UpdatePaymentMethods switch ($type_id) { case GatewayType::CREDIT_CARD: - /** - * @class \Stripe\PaymentMethod $method - * @property \Stripe\StripeObject $card - * @class \Stripe\StripeObject $card - * @property string $exp_year - * @property string $exp_month - * @property string $brand - * @property string $last4 - */ + /** + * @class \Stripe\PaymentMethod $method + * @property \Stripe\StripeObject $card + * @class \Stripe\StripeObject $card + * @property string $exp_year + * @property string $exp_month + * @property string $brand + * @property string $last4 + */ - $payment_meta = new \stdClass; - $payment_meta->exp_month = (string) $method->card->exp_month; - $payment_meta->exp_year = (string) $method->card->exp_year; - $payment_meta->brand = (string) $method->card->brand; - $payment_meta->last4 = (string) $method->card->last4; - $payment_meta->type = GatewayType::CREDIT_CARD; + $payment_meta = new \stdClass; + $payment_meta->exp_month = (string) $method->card->exp_month; + $payment_meta->exp_year = (string) $method->card->exp_year; + $payment_meta->brand = (string) $method->card->brand; + $payment_meta->last4 = (string) $method->card->last4; + $payment_meta->type = GatewayType::CREDIT_CARD; - return $payment_meta; + return $payment_meta; case GatewayType::ALIPAY: case GatewayType::SOFORT: diff --git a/app/PaymentDrivers/StripePaymentDriver.php b/app/PaymentDrivers/StripePaymentDriver.php index a80c09789dcd..e4b75a023a3c 100644 --- a/app/PaymentDrivers/StripePaymentDriver.php +++ b/app/PaymentDrivers/StripePaymentDriver.php @@ -345,7 +345,7 @@ class StripePaymentDriver extends BaseDriver if ($this->company_gateway->require_billing_address) { $fields[] = ['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required']; -// $fields[] = ['name' => 'client_address_line_2', 'label' => ctrans('texts.address2'), 'type' => 'text', 'validation' => 'nullable']; + // $fields[] = ['name' => 'client_address_line_2', 'label' => ctrans('texts.address2'), 'type' => 'text', 'validation' => 'nullable']; $fields[] = ['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_state', 'label' => ctrans('texts.state'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_country_id', 'label' => ctrans('texts.country'), 'type' => 'text', 'validation' => 'required']; @@ -357,7 +357,7 @@ class StripePaymentDriver extends BaseDriver if ($this->company_gateway->require_shipping_address) { $fields[] = ['name' => 'client_shipping_address_line_1', 'label' => ctrans('texts.shipping_address1'), 'type' => 'text', 'validation' => 'required']; -// $fields[] = ['name' => 'client_shipping_address_line_2', 'label' => ctrans('texts.shipping_address2'), 'type' => 'text', 'validation' => 'sometimes']; + // $fields[] = ['name' => 'client_shipping_address_line_2', 'label' => ctrans('texts.shipping_address2'), 'type' => 'text', 'validation' => 'sometimes']; $fields[] = ['name' => 'client_shipping_city', 'label' => ctrans('texts.shipping_city'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_shipping_state', 'label' => ctrans('texts.shipping_state'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_shipping_postal_code', 'label' => ctrans('texts.shipping_postal_code'), 'type' => 'text', 'validation' => 'required']; @@ -783,8 +783,9 @@ class StripePaymentDriver extends BaseDriver ->where('token', $request->data['object']['payment_method']) ->first(); - if($clientgateway) + if($clientgateway) { $clientgateway->delete(); + } return response()->json([], 200); } elseif ($request->data['object']['status'] == "pending") { diff --git a/app/PaymentDrivers/WePay/ACH.php b/app/PaymentDrivers/WePay/ACH.php index 945924ffc341..3835b9630baf 100644 --- a/app/PaymentDrivers/WePay/ACH.php +++ b/app/PaymentDrivers/WePay/ACH.php @@ -113,7 +113,7 @@ class ACH } /* If the bank transfer token is PENDING - we need to verify!! */ -// + // public function verificationView(ClientGatewayToken $token) { diff --git a/app/PaymentDrivers/WePayPaymentDriver.php b/app/PaymentDrivers/WePayPaymentDriver.php index ec521443850b..9bb9a44cfc6b 100644 --- a/app/PaymentDrivers/WePayPaymentDriver.php +++ b/app/PaymentDrivers/WePayPaymentDriver.php @@ -89,7 +89,7 @@ class WePayPaymentDriver extends BaseDriver * Setup the gateway * * @param array $data user_id + company - * @return \Illuminate\View\View + * @return \Illuminate\View\View */ public function setup(array $data) { @@ -330,7 +330,7 @@ class WePayPaymentDriver extends BaseDriver if ($this->company_gateway->require_billing_address) { $fields[] = ['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required']; -// $fields[] = ['name' => 'client_address_line_2', 'label' => ctrans('texts.address2'), 'type' => 'text', 'validation' => 'nullable']; + // $fields[] = ['name' => 'client_address_line_2', 'label' => ctrans('texts.address2'), 'type' => 'text', 'validation' => 'nullable']; $fields[] = ['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_state', 'label' => ctrans('texts.state'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_country_id', 'label' => ctrans('texts.country'), 'type' => 'text', 'validation' => 'required']; @@ -338,7 +338,7 @@ class WePayPaymentDriver extends BaseDriver if ($this->company_gateway->require_shipping_address) { $fields[] = ['name' => 'client_shipping_address_line_1', 'label' => ctrans('texts.shipping_address1'), 'type' => 'text', 'validation' => 'required']; -// $fields[] = ['name' => 'client_shipping_address_line_2', 'label' => ctrans('texts.shipping_address2'), 'type' => 'text', 'validation' => 'sometimes']; + // $fields[] = ['name' => 'client_shipping_address_line_2', 'label' => ctrans('texts.shipping_address2'), 'type' => 'text', 'validation' => 'sometimes']; $fields[] = ['name' => 'client_shipping_city', 'label' => ctrans('texts.shipping_city'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_shipping_state', 'label' => ctrans('texts.shipping_state'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_shipping_postal_code', 'label' => ctrans('texts.shipping_postal_code'), 'type' => 'text', 'validation' => 'required']; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 089287512bfd..0b4a78cc1527 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -11,25 +11,23 @@ namespace App\Providers; -use App\Utils\Ninja; -use Livewire\Livewire; +use App\Helpers\Mail\GmailTransport; +use App\Helpers\Mail\Office365MailTransport; +use App\Http\Middleware\SetDomainNameDb; use App\Models\Invoice; use App\Models\Proposal; +use App\Utils\Ninja; use App\Utils\TruthSource; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Mail\Mailer; +use Illuminate\Queue\Events\JobProcessing; use Illuminate\Support\Facades\App; -use App\Helpers\Mail\GmailTransport; -use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Blade; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Queue; use Illuminate\Support\Facades\Schema; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\ServiceProvider; -use App\Http\Middleware\SetDomainNameDb; -use Illuminate\Queue\Events\JobProcessing; -use App\Helpers\Mail\Office365MailTransport; -use Illuminate\Support\Facades\ParallelTesting; -use Illuminate\Database\Eloquent\Relations\Relation; +use Livewire\Livewire; class AppServiceProvider extends ServiceProvider { @@ -105,7 +103,7 @@ class AppServiceProvider extends ServiceProvider Mailer::macro('mailgun_config', function (string $secret, string $domain, string $endpoint = 'api.mailgun.net') { // @phpstan-ignore /** @phpstan-ignore-next-line **/ - Mailer::setSymfonyTransport(app('mail.manager')->createSymfonyTransport([ + Mailer::setSymfonyTransport(app('mail.manager')->createSymfonyTransport([ 'transport' => 'mailgun', 'secret' => $secret, 'domain' => $domain, diff --git a/app/Providers/ClientPortalServiceProvider.php b/app/Providers/ClientPortalServiceProvider.php index a4ac3c02d904..9c781b417b32 100644 --- a/app/Providers/ClientPortalServiceProvider.php +++ b/app/Providers/ClientPortalServiceProvider.php @@ -14,7 +14,7 @@ class ClientPortalServiceProvider extends ServiceProvider */ public function register() { - app()->bind('customMessage', function () { + app()->bind('customMessage', function () { return new CustomMessage(); }); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 9a2d4754af0f..8c4448b2304a 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -11,271 +11,268 @@ namespace App\Providers; -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\Events\Account\AccountCreated; +use App\Events\Account\StripeConnectFailure; +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\Company\CompanyDocumentsDeleted; +use App\Events\Contact\ContactLoggedIn; +use App\Events\Credit\CreditWasArchived; +use App\Events\Credit\CreditWasCreated; +use App\Events\Credit\CreditWasDeleted; +use App\Events\Credit\CreditWasEmailed; +use App\Events\Credit\CreditWasEmailedAndFailed; +use App\Events\Credit\CreditWasMarkedSent; +use App\Events\Credit\CreditWasRestored; +use App\Events\Credit\CreditWasUpdated; +use App\Events\Credit\CreditWasViewed; +use App\Events\Design\DesignWasArchived; +use App\Events\Design\DesignWasDeleted; +use App\Events\Design\DesignWasRestored; +use App\Events\Design\DesignWasUpdated; +use App\Events\Document\DocumentWasArchived; +use App\Events\Document\DocumentWasCreated; +use App\Events\Document\DocumentWasDeleted; +use App\Events\Document\DocumentWasRestored; +use App\Events\Document\DocumentWasUpdated; +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\InvoiceReminderWasEmailed; +use App\Events\Invoice\InvoiceWasArchived; +use App\Events\Invoice\InvoiceWasCancelled; +use App\Events\Invoice\InvoiceWasCreated; +use App\Events\Invoice\InvoiceWasDeleted; +use App\Events\Invoice\InvoiceWasEmailed; +use App\Events\Invoice\InvoiceWasEmailedAndFailed; +use App\Events\Invoice\InvoiceWasMarkedSent; +use App\Events\Invoice\InvoiceWasPaid; +use App\Events\Invoice\InvoiceWasRestored; +use App\Events\Invoice\InvoiceWasReversed; +use App\Events\Invoice\InvoiceWasUpdated; +use App\Events\Invoice\InvoiceWasViewed; +use App\Events\Misc\InvitationWasViewed; +use App\Events\Payment\PaymentWasArchived; +use App\Events\Payment\PaymentWasCreated; +use App\Events\Payment\PaymentWasDeleted; +use App\Events\Payment\PaymentWasEmailed; +use App\Events\Payment\PaymentWasEmailedAndFailed; +use App\Events\Payment\PaymentWasRefunded; +use App\Events\Payment\PaymentWasRestored; +use App\Events\Payment\PaymentWasUpdated; +use App\Events\Payment\PaymentWasVoided; +use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; +use App\Events\PurchaseOrder\PurchaseOrderWasArchived; +use App\Events\PurchaseOrder\PurchaseOrderWasCreated; +use App\Events\PurchaseOrder\PurchaseOrderWasDeleted; +use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; +use App\Events\PurchaseOrder\PurchaseOrderWasRestored; +use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; +use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +use App\Events\Quote\QuoteWasApproved; +use App\Events\Quote\QuoteWasArchived; +use App\Events\Quote\QuoteWasCreated; +use App\Events\Quote\QuoteWasDeleted; +use App\Events\Quote\QuoteWasEmailed; +use App\Events\Quote\QuoteWasRestored; +use App\Events\Quote\QuoteWasUpdated; +use App\Events\Quote\QuoteWasViewed; +use App\Events\RecurringExpense\RecurringExpenseWasArchived; +use App\Events\RecurringExpense\RecurringExpenseWasCreated; +use App\Events\RecurringExpense\RecurringExpenseWasDeleted; +use App\Events\RecurringExpense\RecurringExpenseWasRestored; +use App\Events\RecurringExpense\RecurringExpenseWasUpdated; +use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; +use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; +use App\Events\RecurringInvoice\RecurringInvoiceWasDeleted; +use App\Events\RecurringInvoice\RecurringInvoiceWasRestored; +use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; +use App\Events\RecurringQuote\RecurringQuoteWasArchived; +use App\Events\RecurringQuote\RecurringQuoteWasCreated; +use App\Events\RecurringQuote\RecurringQuoteWasDeleted; +use App\Events\RecurringQuote\RecurringQuoteWasRestored; +use App\Events\RecurringQuote\RecurringQuoteWasUpdated; +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\UserLoggedIn; +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\VendorContactLoggedIn; +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\Listeners\Account\StripeConnectFailureListener; +use App\Listeners\Activity\ArchivedClientActivity; +use App\Listeners\Activity\ClientUpdatedActivity; +use App\Listeners\Activity\CreatedClientActivity; +use App\Listeners\Activity\CreatedCreditActivity; +use App\Listeners\Activity\CreatedExpenseActivity; +use App\Listeners\Activity\CreatedQuoteActivity; +use App\Listeners\Activity\CreatedSubscriptionActivity; +use App\Listeners\Activity\CreatedTaskActivity; +use App\Listeners\Activity\CreatedVendorActivity; +use App\Listeners\Activity\CreditArchivedActivity; +use App\Listeners\Activity\DeleteClientActivity; +use App\Listeners\Activity\DeleteCreditActivity; +use App\Listeners\Activity\ExpenseArchivedActivity; +use App\Listeners\Activity\ExpenseDeletedActivity; +use App\Listeners\Activity\ExpenseRestoredActivity; +use App\Listeners\Activity\ExpenseUpdatedActivity; +use App\Listeners\Activity\PaymentArchivedActivity; +use App\Listeners\Activity\PaymentCreatedActivity; +use App\Listeners\Activity\PaymentDeletedActivity; +use App\Listeners\Activity\PaymentRefundedActivity; +use App\Listeners\Activity\PaymentUpdatedActivity; +use App\Listeners\Activity\PaymentVoidedActivity; +use App\Listeners\Activity\QuoteUpdatedActivity; +use App\Listeners\Activity\RestoreClientActivity; +use App\Listeners\Activity\SubscriptionArchivedActivity; +use App\Listeners\Activity\SubscriptionDeletedActivity; +use App\Listeners\Activity\SubscriptionRestoredActivity; +use App\Listeners\Activity\SubscriptionUpdatedActivity; +use App\Listeners\Activity\TaskArchivedActivity; +use App\Listeners\Activity\TaskDeletedActivity; +use App\Listeners\Activity\TaskRestoredActivity; +use App\Listeners\Activity\TaskUpdatedActivity; +use App\Listeners\Activity\UpdatedCreditActivity; +use App\Listeners\Activity\VendorArchivedActivity; +use App\Listeners\Activity\VendorDeletedActivity; +use App\Listeners\Activity\VendorRestoredActivity; +use App\Listeners\Activity\VendorUpdatedActivity; +use App\Listeners\Contact\UpdateContactLastLogin; +use App\Listeners\Credit\CreditCreatedNotification; +use App\Listeners\Credit\CreditEmailedNotification; +use App\Listeners\Credit\CreditRestoredActivity; +use App\Listeners\Credit\CreditViewedActivity; +use App\Listeners\Document\DeleteCompanyDocuments; +use App\Listeners\Invoice\CreateInvoiceActivity; +use App\Listeners\Invoice\InvoiceArchivedActivity; +use App\Listeners\Invoice\InvoiceCancelledActivity; +use App\Listeners\Invoice\InvoiceCreatedNotification; +use App\Listeners\Invoice\InvoiceDeletedActivity; +use App\Listeners\Invoice\InvoiceEmailActivity; +use App\Listeners\Invoice\InvoiceEmailedNotification; +use App\Listeners\Invoice\InvoiceEmailFailedActivity; +use App\Listeners\Invoice\InvoiceFailedEmailNotification; +use App\Listeners\Invoice\InvoicePaidActivity; +use App\Listeners\Invoice\InvoiceReminderEmailActivity; +use App\Listeners\Invoice\InvoiceRestoredActivity; +use App\Listeners\Invoice\InvoiceReversedActivity; +use App\Listeners\Invoice\InvoiceViewedActivity; +use App\Listeners\Invoice\UpdateInvoiceActivity; +use App\Listeners\Mail\MailSentListener; +use App\Listeners\Misc\InvitationViewedListener; +use App\Listeners\Payment\PaymentBalanceActivity; +use App\Listeners\Payment\PaymentEmailedActivity; +use App\Listeners\Payment\PaymentEmailFailureActivity; +use App\Listeners\Payment\PaymentNotification; +use App\Listeners\Payment\PaymentRestoredActivity; +use App\Listeners\PurchaseOrder\CreatePurchaseOrderActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedListener; +use App\Listeners\PurchaseOrder\PurchaseOrderArchivedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderCreatedListener; +use App\Listeners\PurchaseOrder\PurchaseOrderDeletedActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderEmailActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderEmailedNotification; +use App\Listeners\PurchaseOrder\PurchaseOrderRestoredActivity; +use App\Listeners\PurchaseOrder\PurchaseOrderViewedActivity; +use App\Listeners\PurchaseOrder\UpdatePurchaseOrderActivity; +use App\Listeners\Quote\QuoteApprovedActivity; +use App\Listeners\Quote\QuoteApprovedNotification; +use App\Listeners\Quote\QuoteApprovedWebhook; +use App\Listeners\Quote\QuoteArchivedActivity; +use App\Listeners\Quote\QuoteCreatedNotification; +use App\Listeners\Quote\QuoteDeletedActivity; +use App\Listeners\Quote\QuoteEmailActivity; +use App\Listeners\Quote\QuoteEmailedNotification; +use App\Listeners\Quote\QuoteRestoredActivity; +use App\Listeners\Quote\QuoteViewedActivity; +use App\Listeners\Quote\ReachWorkflowSettings; +use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity; +use App\Listeners\RecurringExpense\RecurringExpenseArchivedActivity; +use App\Listeners\RecurringExpense\RecurringExpenseDeletedActivity; +use App\Listeners\RecurringExpense\RecurringExpenseRestoredActivity; +use App\Listeners\RecurringExpense\RecurringExpenseUpdatedActivity; +use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity; +use App\Listeners\RecurringInvoice\RecurringInvoiceRestoredActivity; +use App\Listeners\RecurringInvoice\UpdateRecurringInvoiceActivity; +use App\Listeners\RecurringQuote\CreateRecurringQuoteActivity; +use App\Listeners\RecurringQuote\RecurringQuoteArchivedActivity; +use App\Listeners\RecurringQuote\RecurringQuoteDeletedActivity; +use App\Listeners\RecurringQuote\RecurringQuoteRestoredActivity; +use App\Listeners\RecurringQuote\UpdateRecurringQuoteActivity; +use App\Listeners\SendVerificationNotification; +use App\Listeners\User\ArchivedUserActivity; +use App\Listeners\User\CreatedUserActivity; +use App\Listeners\User\DeletedUserActivity; +use App\Listeners\User\RestoredUserActivity; +use App\Listeners\User\UpdatedUserActivity; +use App\Listeners\User\UpdateUserLastLogin; +use App\Listeners\Vendor\UpdateVendorContactLastLogin; use App\Models\Account; +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\Expense; use App\Models\Invoice; use App\Models\Payment; use App\Models\Product; use App\Models\Project; use App\Models\Proposal; -use App\Models\CompanyToken; -use App\Models\Subscription; -use App\Models\ClientContact; use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Models\Subscription; +use App\Models\Task; +use App\Models\User; +use App\Models\Vendor; use App\Models\VendorContact; -use App\Models\CompanyGateway; -use App\Observers\TaskObserver; -use App\Observers\UserObserver; -use App\Observers\QuoteObserver; -use App\Events\User\UserLoggedIn; -use App\Observers\ClientObserver; -use App\Observers\CreditObserver; -use App\Observers\VendorObserver; use App\Observers\AccountObserver; +use App\Observers\ClientContactObserver; +use App\Observers\ClientObserver; +use App\Observers\CompanyGatewayObserver; use App\Observers\CompanyObserver; +use App\Observers\CompanyTokenObserver; +use App\Observers\CreditObserver; use App\Observers\ExpenseObserver; use App\Observers\InvoiceObserver; use App\Observers\PaymentObserver; use App\Observers\ProductObserver; use App\Observers\ProjectObserver; -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\Observers\ProposalObserver; -use App\Events\Quote\QuoteWasViewed; -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\QuoteWasEmailed; -use App\Events\Quote\QuoteWasUpdated; -use App\Events\Account\AccountCreated; -use App\Events\Credit\CreditWasViewed; -use App\Events\Invoice\InvoiceWasPaid; -use App\Events\Quote\QuoteWasApproved; -use App\Events\Quote\QuoteWasArchived; -use App\Events\Quote\QuoteWasRestored; -use App\Events\Client\ClientWasCreated; -use App\Events\Client\ClientWasDeleted; -use App\Events\Client\ClientWasUpdated; -use App\Events\Contact\ContactLoggedIn; -use App\Events\Credit\CreditWasCreated; -use App\Events\Credit\CreditWasDeleted; -use App\Events\Credit\CreditWasEmailed; -use App\Events\Credit\CreditWasUpdated; -use App\Events\Design\DesignWasDeleted; -use App\Events\Design\DesignWasUpdated; -use App\Events\Vendor\VendorWasCreated; -use App\Events\Vendor\VendorWasDeleted; -use App\Events\Vendor\VendorWasUpdated; -use App\Observers\CompanyTokenObserver; -use App\Observers\SubscriptionObserver; -use Illuminate\Mail\Events\MessageSent; -use App\Events\Client\ClientWasArchived; -use App\Events\Client\ClientWasRestored; -use App\Events\Credit\CreditWasArchived; -use App\Events\Credit\CreditWasRestored; -use App\Events\Design\DesignWasArchived; -use App\Events\Design\DesignWasRestored; -use App\Events\Invoice\InvoiceWasViewed; -use App\Events\Misc\InvitationWasViewed; -use App\Events\Payment\PaymentWasVoided; -use App\Events\Vendor\VendorWasArchived; -use App\Events\Vendor\VendorWasRestored; -use App\Events\Account\StripeConnectFailure; -use App\Listeners\Mail\MailSentListener; -use App\Observers\ClientContactObserver; use App\Observers\PurchaseOrderObserver; +use App\Observers\QuoteObserver; +use App\Observers\SubscriptionObserver; +use App\Observers\TaskObserver; +use App\Observers\UserObserver; use App\Observers\VendorContactObserver; -use App\Events\Expense\ExpenseWasCreated; -use App\Events\Expense\ExpenseWasDeleted; -use App\Events\Expense\ExpenseWasUpdated; -use App\Events\Invoice\InvoiceWasCreated; -use App\Events\Invoice\InvoiceWasDeleted; -use App\Events\Invoice\InvoiceWasEmailed; -use App\Events\Invoice\InvoiceWasUpdated; -use App\Events\Payment\PaymentWasCreated; -use App\Events\Payment\PaymentWasDeleted; -use App\Events\Payment\PaymentWasEmailed; -use App\Events\Payment\PaymentWasUpdated; -use App\Observers\CompanyGatewayObserver; -use App\Events\Credit\CreditWasMarkedSent; -use App\Events\Expense\ExpenseWasArchived; -use App\Events\Expense\ExpenseWasRestored; -use App\Events\Invoice\InvoiceWasArchived; -use App\Events\Invoice\InvoiceWasRestored; -use App\Events\Invoice\InvoiceWasReversed; -use App\Events\Payment\PaymentWasArchived; -use App\Events\Payment\PaymentWasRefunded; -use App\Events\Payment\PaymentWasRestored; -use Illuminate\Mail\Events\MessageSending; -use App\Events\Document\DocumentWasCreated; -use App\Events\Document\DocumentWasDeleted; -use App\Events\Document\DocumentWasUpdated; -use App\Events\Invoice\InvoiceWasCancelled; -use App\Listeners\Quote\QuoteEmailActivity; -use App\Listeners\User\CreatedUserActivity; -use App\Listeners\User\DeletedUserActivity; -use App\Listeners\User\UpdatedUserActivity; -use App\Listeners\User\UpdateUserLastLogin; -use App\Events\Document\DocumentWasArchived; -use App\Events\Document\DocumentWasRestored; -use App\Events\Invoice\InvoiceWasMarkedSent; -use App\Events\Vendor\VendorContactLoggedIn; -use App\Listeners\Quote\QuoteViewedActivity; -use App\Listeners\User\ArchivedUserActivity; -use App\Listeners\User\RestoredUserActivity; -use App\Listeners\Quote\QuoteApprovedWebhook; -use App\Listeners\Quote\QuoteDeletedActivity; -use App\Listeners\Credit\CreditViewedActivity; -use App\Listeners\Invoice\InvoicePaidActivity; -use App\Listeners\Payment\PaymentNotification; -use App\Listeners\Quote\QuoteApprovedActivity; -use App\Listeners\Quote\QuoteArchivedActivity; -use App\Listeners\Quote\QuoteRestoredActivity; -use App\Listeners\Quote\ReachWorkflowSettings; -use App\Events\Company\CompanyDocumentsDeleted; -use App\Listeners\Activity\CreatedTaskActivity; -use App\Listeners\Activity\TaskDeletedActivity; -use App\Listeners\Activity\TaskUpdatedActivity; -use App\Listeners\Invoice\InvoiceEmailActivity; -use App\Listeners\SendVerificationNotification; -use App\Events\Credit\CreditWasEmailedAndFailed; -use App\Listeners\Activity\CreatedQuoteActivity; -use App\Listeners\Activity\DeleteClientActivity; -use App\Listeners\Activity\DeleteCreditActivity; -use App\Listeners\Activity\QuoteUpdatedActivity; -use App\Listeners\Activity\TaskArchivedActivity; -use App\Listeners\Activity\TaskRestoredActivity; -use App\Listeners\Credit\CreditRestoredActivity; -use App\Listeners\Invoice\CreateInvoiceActivity; -use App\Listeners\Invoice\InvoiceViewedActivity; -use App\Listeners\Invoice\UpdateInvoiceActivity; -use App\Listeners\Misc\InvitationViewedListener; -use App\Events\Invoice\InvoiceReminderWasEmailed; -use App\Listeners\Activity\ClientUpdatedActivity; -use App\Listeners\Activity\CreatedClientActivity; -use App\Listeners\Activity\CreatedCreditActivity; -use App\Listeners\Activity\CreatedVendorActivity; -use App\Listeners\Activity\PaymentVoidedActivity; -use App\Listeners\Activity\RestoreClientActivity; -use App\Listeners\Activity\UpdatedCreditActivity; -use App\Listeners\Activity\VendorDeletedActivity; -use App\Listeners\Activity\VendorUpdatedActivity; -use App\Listeners\Contact\UpdateContactLastLogin; -use App\Listeners\Invoice\InvoiceDeletedActivity; -use App\Listeners\Payment\PaymentBalanceActivity; -use App\Listeners\Payment\PaymentEmailedActivity; -use App\Listeners\Quote\QuoteCreatedNotification; -use App\Listeners\Quote\QuoteEmailedNotification; -use App\Events\Invoice\InvoiceWasEmailedAndFailed; -use App\Events\Payment\PaymentWasEmailedAndFailed; -use App\Listeners\Activity\ArchivedClientActivity; -use App\Listeners\Activity\CreatedExpenseActivity; -use App\Listeners\Activity\CreditArchivedActivity; -use App\Listeners\Activity\ExpenseDeletedActivity; -use App\Listeners\Activity\ExpenseUpdatedActivity; -use App\Listeners\Activity\PaymentCreatedActivity; -use App\Listeners\Activity\PaymentDeletedActivity; -use App\Listeners\Activity\PaymentUpdatedActivity; -use App\Listeners\Activity\VendorArchivedActivity; -use App\Listeners\Activity\VendorRestoredActivity; -use App\Listeners\Document\DeleteCompanyDocuments; -use App\Listeners\Invoice\InvoiceArchivedActivity; -use App\Listeners\Invoice\InvoiceRestoredActivity; -use App\Listeners\Invoice\InvoiceReversedActivity; -use App\Listeners\Payment\PaymentRestoredActivity; -use App\Listeners\Quote\QuoteApprovedNotification; -use SocialiteProviders\Apple\AppleExtendSocialite; -use SocialiteProviders\Manager\SocialiteWasCalled; -use App\Events\Subscription\SubscriptionWasCreated; -use App\Events\Subscription\SubscriptionWasDeleted; -use App\Events\Subscription\SubscriptionWasUpdated; -use App\Listeners\Activity\ExpenseArchivedActivity; -use App\Listeners\Activity\ExpenseRestoredActivity; -use App\Listeners\Activity\PaymentArchivedActivity; -use App\Listeners\Activity\PaymentRefundedActivity; -use App\Listeners\Credit\CreditCreatedNotification; -use App\Listeners\Credit\CreditEmailedNotification; -use App\Listeners\Invoice\InvoiceCancelledActivity; -use App\Events\PurchaseOrder\PurchaseOrderWasViewed; -use App\Events\Subscription\SubscriptionWasArchived; -use App\Events\Subscription\SubscriptionWasRestored; -use App\Events\PurchaseOrder\PurchaseOrderWasCreated; -use App\Events\PurchaseOrder\PurchaseOrderWasDeleted; -use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; -use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; -use App\Listeners\Invoice\InvoiceCreatedNotification; -use App\Listeners\Invoice\InvoiceEmailedNotification; -use App\Listeners\Invoice\InvoiceEmailFailedActivity; -use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; -use App\Events\PurchaseOrder\PurchaseOrderWasArchived; -use App\Events\PurchaseOrder\PurchaseOrderWasRestored; -use App\Listeners\Payment\PaymentEmailFailureActivity; -use App\Listeners\Vendor\UpdateVendorContactLastLogin; -use App\Events\RecurringQuote\RecurringQuoteWasCreated; -use App\Events\RecurringQuote\RecurringQuoteWasDeleted; -use App\Events\RecurringQuote\RecurringQuoteWasUpdated; -use App\Listeners\Account\StripeConnectFailureListener; -use App\Listeners\Activity\CreatedSubscriptionActivity; -use App\Listeners\Activity\SubscriptionDeletedActivity; -use App\Listeners\Activity\SubscriptionUpdatedActivity; -use App\Listeners\Invoice\InvoiceReminderEmailActivity; -use App\Events\RecurringQuote\RecurringQuoteWasArchived; -use App\Events\RecurringQuote\RecurringQuoteWasRestored; -use App\Listeners\Activity\SubscriptionArchivedActivity; -use App\Listeners\Activity\SubscriptionRestoredActivity; -use App\Listeners\Invoice\InvoiceFailedEmailNotification; -use SocialiteProviders\Microsoft\MicrosoftExtendSocialite; -use App\Events\RecurringExpense\RecurringExpenseWasCreated; -use App\Events\RecurringExpense\RecurringExpenseWasDeleted; -use App\Events\RecurringExpense\RecurringExpenseWasUpdated; -use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; -use App\Events\RecurringInvoice\RecurringInvoiceWasDeleted; -use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; -use App\Listeners\PurchaseOrder\PurchaseOrderEmailActivity; -use App\Events\RecurringExpense\RecurringExpenseWasArchived; -use App\Events\RecurringExpense\RecurringExpenseWasRestored; -use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; -use App\Events\RecurringInvoice\RecurringInvoiceWasRestored; -use App\Listeners\PurchaseOrder\CreatePurchaseOrderActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderViewedActivity; -use App\Listeners\PurchaseOrder\UpdatePurchaseOrderActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderCreatedListener; -use App\Listeners\PurchaseOrder\PurchaseOrderDeletedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderAcceptedListener; -use App\Listeners\PurchaseOrder\PurchaseOrderArchivedActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderRestoredActivity; -use App\Listeners\RecurringQuote\CreateRecurringQuoteActivity; -use App\Listeners\RecurringQuote\UpdateRecurringQuoteActivity; -use App\Listeners\RecurringQuote\RecurringQuoteDeletedActivity; -use App\Listeners\RecurringQuote\RecurringQuoteArchivedActivity; -use App\Listeners\RecurringQuote\RecurringQuoteRestoredActivity; -use App\Listeners\PurchaseOrder\PurchaseOrderEmailedNotification; -use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity; -use App\Listeners\RecurringInvoice\UpdateRecurringInvoiceActivity; -use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity; -use App\Listeners\RecurringExpense\RecurringExpenseDeletedActivity; -use App\Listeners\RecurringExpense\RecurringExpenseUpdatedActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity; -use App\Listeners\RecurringExpense\RecurringExpenseArchivedActivity; -use App\Listeners\RecurringExpense\RecurringExpenseRestoredActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity; -use App\Listeners\RecurringInvoice\RecurringInvoiceRestoredActivity; +use App\Observers\VendorObserver; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; +use Illuminate\Mail\Events\MessageSending; +use Illuminate\Mail\Events\MessageSent; class EventServiceProvider extends ServiceProvider { diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 3d9dc442150b..8884c9d29cf8 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -11,17 +11,17 @@ namespace App\Providers; -use App\Utils\Ninja; -use App\Models\Scheduler; -use Illuminate\Http\Request; -use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Route; -use Illuminate\Cache\RateLimiting\Limit; -use Illuminate\Support\Facades\RateLimiter; use App\Http\Middleware\ThrottleRequestsWithPredis; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Models\Scheduler; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; +use Illuminate\Http\Request; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\RateLimiter; +use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { @@ -36,7 +36,7 @@ class RouteServiceProvider extends ServiceProvider { parent::boot(); - if (Ninja::isHosted() && !config('ninja.testvars.travis')){ + if (Ninja::isHosted() && !config('ninja.testvars.travis')) { app('router')->aliasMiddleware('throttle', ThrottleRequestsWithPredis::class); } else { app('router')->aliasMiddleware('throttle', ThrottleRequests::class); diff --git a/app/Repositories/ActivityRepository.php b/app/Repositories/ActivityRepository.php index 23b6425c6b04..88648aa3134b 100644 --- a/app/Repositories/ActivityRepository.php +++ b/app/Repositories/ActivityRepository.php @@ -11,23 +11,23 @@ namespace App\Repositories; -use App\Models\User; -use App\Models\Quote; +use App\Models\Activity; use App\Models\Backup; +use App\Models\CompanyToken; use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; -use App\Models\Activity; -use App\Utils\HtmlEngine; -use App\Models\CompanyToken; use App\Models\PurchaseOrder; -use App\Utils\Traits\MakesHash; -use App\Utils\VendorHtmlEngine; +use App\Models\Quote; use App\Models\RecurringInvoice; -use App\Utils\Traits\MakesInvoiceHtml; +use App\Models\User; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; +use App\Utils\HtmlEngine; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\VendorHtmlEngine; /** * Class for activity repository. @@ -52,8 +52,9 @@ class ActivityRepository extends BaseRepository $activity->{$key} = $value; } - if($entity->company) + if($entity->company) { $activity->account_id = $entity->company->account_id; + } if ($token_id = $this->getTokenId($event_vars)) { $activity->token_id = $token_id; @@ -97,8 +98,7 @@ class ActivityRepository extends BaseRepository return; } - if(get_class($entity) == PurchaseOrder::class) - { + if(get_class($entity) == PurchaseOrder::class) { $backup = new Backup(); $entity->load('client'); diff --git a/app/Repositories/BankIntegrationRepository.php b/app/Repositories/BankIntegrationRepository.php index bd4bfb2b2d99..431ce460779e 100644 --- a/app/Repositories/BankIntegrationRepository.php +++ b/app/Repositories/BankIntegrationRepository.php @@ -11,9 +11,9 @@ namespace App\Repositories; -use App\Utils\Ninja; -use App\Models\BankIntegration; use App\Helpers\Bank\Yodlee\Yodlee; +use App\Models\BankIntegration; +use App\Utils\Ninja; /** * Class for bank integration repository. @@ -30,21 +30,20 @@ class BankIntegrationRepository extends BaseRepository return $bank_integration->fresh(); } - /** - * Removes the bank integration from Yodlee - * - * @param BankIntegration $bank_integration - * - * @return BankIntegration $bank_integration - */ + /** + * Removes the bank integration from Yodlee + * + * @param BankIntegration $bank_integration + * + * @return BankIntegration $bank_integration + */ public function delete($bank_integration) :BankIntegration { if ($bank_integration->is_deleted) { return $bank_integration; } - if(Ninja::isHosted()) - { + if(Ninja::isHosted()) { $account = $bank_integration->account; @@ -54,8 +53,7 @@ class BankIntegrationRepository extends BaseRepository try { $yodlee->deleteAccount($bank_integration->bank_account_id); - } - catch(\Exception $e){ + } catch(\Exception $e) { } diff --git a/app/Repositories/BankTransactionRepository.php b/app/Repositories/BankTransactionRepository.php index 66e54d3ff9f9..3326d50a5803 100644 --- a/app/Repositories/BankTransactionRepository.php +++ b/app/Repositories/BankTransactionRepository.php @@ -11,9 +11,9 @@ namespace App\Repositories; -use App\Models\Expense; -use App\Models\BankTransaction; use App\Jobs\Bank\MatchBankTransactions; +use App\Models\BankTransaction; +use App\Models\Expense; /** * Class for bank transaction repository. @@ -50,14 +50,14 @@ class BankTransactionRepository extends BaseRepository public function unlink($bt) { - if($bt->payment()->exists()){ + if($bt->payment()->exists()) { $bt->payment->transaction_id = null; $bt->payment_id = null; } $e = Expense::query()->whereIn('id', $this->transformKeys(explode(",", $bt->expense_id))) ->cursor() - ->each(function ($expense){ + ->each(function ($expense) { $expense->transaction_id = null; $expense->saveQuietly(); diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index f392d24f3693..68ccb310cf9a 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -11,19 +11,19 @@ namespace App\Repositories; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Utils\Helpers; -use App\Models\Company; -use App\Models\Invoice; -use App\Models\ClientContact; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; use App\Jobs\Client\UpdateTaxData; -use App\Utils\Traits\SavesDocuments; use App\Jobs\Product\UpdateOrCreateProduct; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\Credit; +use App\Models\Invoice; +use App\Models\Quote; +use App\Models\RecurringInvoice; +use App\Utils\Helpers; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; class BaseRepository { @@ -312,8 +312,9 @@ class BaseRepository } /** If the client does not have tax_data - then populate this now */ - if($client->country_id == 840 && !$client->tax_data && $model->company->calculate_taxes && !$model->company->account->isFreeHostedClient()) + if($client->country_id == 840 && !$client->tax_data && $model->company->calculate_taxes && !$model->company->account->isFreeHostedClient()) { UpdateTaxData::dispatch($client, $client->company); + } } diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php index f3d4a4e6d481..2cbe775e6990 100644 --- a/app/Repositories/InvoiceRepository.php +++ b/app/Repositories/InvoiceRepository.php @@ -98,8 +98,9 @@ class InvoiceRepository extends BaseRepository $invoice = $invoice->service()->handleRestore()->save(); /* If the reverse did not succeed due to rules, then do not restore / unarchive */ - if($invoice->is_deleted) + if($invoice->is_deleted) { return $invoice; + } parent::restore($invoice); diff --git a/app/Repositories/Migration/PaymentMigrationRepository.php b/app/Repositories/Migration/PaymentMigrationRepository.php index f8f6f686b799..6fb6b3455c26 100644 --- a/app/Repositories/Migration/PaymentMigrationRepository.php +++ b/app/Repositories/Migration/PaymentMigrationRepository.php @@ -156,7 +156,7 @@ class PaymentMigrationRepository extends BaseRepository $payment->credits->each(function ($cre) use ($credit_totals) { $cre->pivot->amount = $credit_totals; - $cre->pivot->save(); + $cre->pivot->save(); $cre->paid_to_date += $credit_totals; $cre->balance -= $credit_totals; @@ -195,7 +195,7 @@ class PaymentMigrationRepository extends BaseRepository /** * If the client is paying in a currency other than * the company currency, we need to set a record. - * + * * @param array$data * @param \App\Models\Payment $payment * @return \App\Models\Payment diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index ab9cec50c333..14023367459c 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -11,20 +11,20 @@ namespace App\Repositories; -use App\Utils\Ninja; +use App\Events\Payment\PaymentWasCreated; +use App\Events\Payment\PaymentWasDeleted; +use App\Jobs\Credit\ApplyCreditPayment; +use App\Libraries\Currency\Conversion\CurrencyApi; use App\Models\Client; use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; use App\Models\Paymentable; -use Illuminate\Http\Request; -use Illuminate\Support\Carbon; +use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use App\Utils\Traits\SavesDocuments; -use App\Jobs\Credit\ApplyCreditPayment; -use App\Events\Payment\PaymentWasCreated; -use App\Events\Payment\PaymentWasDeleted; -use App\Libraries\Currency\Conversion\CurrencyApi; +use Illuminate\Http\Request; +use Illuminate\Support\Carbon; /** * PaymentRepository. @@ -148,7 +148,7 @@ class PaymentRepository extends BaseRepository if ($invoice) { - //25-06-2023 + //25-06-2023 $paymentable = new Paymentable(); $paymentable->payment_id = $payment->id; diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index cb7e5e979f4f..3bc2661e2718 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -140,7 +140,7 @@ class TaskRepository extends BaseRepository private function harvestStartDate($time_log, $task) { - if(isset($time_log[0][0])){ + if(isset($time_log[0][0])) { return \Carbon\Carbon::createFromTimestamp($time_log[0][0])->addSeconds($task->company->utc_offset()); } diff --git a/app/Repositories/TaskStatusRepository.php b/app/Repositories/TaskStatusRepository.php index 34a1f8e63642..d586c5cc9758 100644 --- a/app/Repositories/TaskStatusRepository.php +++ b/app/Repositories/TaskStatusRepository.php @@ -64,7 +64,7 @@ class TaskStatusRepository extends BaseRepository ->where('id', '!=', $task_status->id) ->orderByRaw('ISNULL(status_order), status_order ASC') ->cursor() - ->each(function ($ts, $key) use($task_status){ + ->each(function ($ts, $key) use ($task_status) { if($ts->status_order < $task_status->status_order) { $ts->status_order--; diff --git a/app/Services/Bank/ProcessBankRules.php b/app/Services/Bank/ProcessBankRules.php index f5dd8a9f9ab7..4657b7a8e11d 100644 --- a/app/Services/Bank/ProcessBankRules.php +++ b/app/Services/Bank/ProcessBankRules.php @@ -139,7 +139,7 @@ class ProcessBankRules extends AbstractService } } - private function coalesceExpenses($expense): string + private function coalesceExpenses($expense): string { if (!$this->bank_transaction->expense_id || strlen($this->bank_transaction->expense_id) < 1) { diff --git a/app/Services/Chart/ChartService.php b/app/Services/Chart/ChartService.php index 3378c998aeec..181518792113 100644 --- a/app/Services/Chart/ChartService.php +++ b/app/Services/Chart/ChartService.php @@ -11,10 +11,10 @@ namespace App\Services\Chart; -use App\Models\User; use App\Models\Client; use App\Models\Company; use App\Models\Expense; +use App\Models\User; use Illuminate\Support\Facades\Cache; class ChartService diff --git a/app/Services/Chart/ChartServiceLegacy.php b/app/Services/Chart/ChartServiceLegacy.php index 372d89ddb919..84e53cec935c 100644 --- a/app/Services/Chart/ChartServiceLegacy.php +++ b/app/Services/Chart/ChartServiceLegacy.php @@ -15,7 +15,6 @@ use App\Models\Client; use App\Models\Company; use App\Models\Expense; use Illuminate\Support\Facades\Cache; -use App\Services\Chart\ChartQueriesLegacy; class ChartServiceLegacy { diff --git a/app/Services/Client/ClientService.php b/app/Services/Client/ClientService.php index 8aabdbcbf487..f7d35ba7639b 100644 --- a/app/Services/Client/ClientService.php +++ b/app/Services/Client/ClientService.php @@ -18,7 +18,6 @@ use App\Services\Email\Email; use App\Services\Email\EmailObject; use App\Utils\Number; use App\Utils\Traits\MakesDates; -use Carbon\Carbon; use Illuminate\Mail\Mailables\Address; use Illuminate\Support\Facades\DB; @@ -50,7 +49,7 @@ class ClientService DB::connection(config('database.default'))->rollBack(); } - } catch(\Exception $exception){ + } catch(\Exception $exception) { nlog("DB ERROR " . $exception->getMessage()); DB::connection(config('database.default'))->rollBack(); @@ -78,7 +77,7 @@ class ClientService DB::connection(config('database.default'))->rollBack(); } - } catch(\Exception $exception){ + } catch(\Exception $exception) { nlog("DB ERROR " . $exception->getMessage()); if (DB::connection(config('database.default'))->transactionLevel() > 0) { @@ -97,15 +96,14 @@ class ClientService $this->client->paid_to_date += $amount; $this->client->saveQuietly(); }, 2); - } - catch (\Throwable $throwable) { + } catch (\Throwable $throwable) { nlog("DB ERROR " . $throwable->getMessage()); if (DB::connection(config('database.default'))->transactionLevel() > 0) { DB::connection(config('database.default'))->rollBack(); } - } catch(\Exception $exception){ + } catch(\Exception $exception) { nlog("DB ERROR " . $exception->getMessage()); if (DB::connection(config('database.default'))->transactionLevel() > 0) { @@ -233,7 +231,7 @@ class ClientService $cc_contacts = $this->client ->contacts() ->where('send_email', true) - ->where('email', '!=', $email) + ->where('email', '!=', $email) ->get(); foreach ($cc_contacts as $contact) { diff --git a/app/Services/Client/PaymentMethod.php b/app/Services/Client/PaymentMethod.php index e9cd452dc9b8..e74874ad01eb 100644 --- a/app/Services/Client/PaymentMethod.php +++ b/app/Services/Client/PaymentMethod.php @@ -65,8 +65,9 @@ class PaymentMethod if ($company_gateways || $company_gateways == '0') { $transformed_ids = $this->transformKeys(explode(',', $company_gateways)); - if($company_gateways == '0') + if($company_gateways == '0') { $transformed_ids = []; + } $this->gateways = $this->client ->company diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 0ad64947b8ba..4c86a5675e24 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -12,26 +12,26 @@ namespace App\Services\Client; -use App\Utils\Number; +use App\Factory\InvoiceFactory; +use App\Factory\InvoiceInvitationFactory; +use App\Factory\InvoiceItemFactory; use App\Models\Client; use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; use App\Models\Payment; -use App\Utils\HtmlEngine; -use Illuminate\Support\Carbon; -use App\Factory\InvoiceFactory; -use App\Utils\Traits\MakesHash; -use App\Utils\PhantomJS\Phantom; -use App\Utils\HostedPDF\NinjaPdf; -use Illuminate\Support\Facades\DB; -use App\Factory\InvoiceItemFactory; -use App\Services\PdfMaker\PdfMaker; -use App\Factory\InvoiceInvitationFactory; -use Illuminate\Database\Eloquent\Builder; use App\Services\PdfMaker\Design as PdfMakerDesign; +use App\Services\PdfMaker\PdfMaker; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\HtmlEngine; +use App\Utils\Number; +use App\Utils\PhantomJS\Phantom; use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; use App\Utils\Traits\Pdf\PdfMaker as PdfMakerTrait; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\DB; class Statement { @@ -68,7 +68,7 @@ class Statement $variables['labels']['$end_date_label'] = ctrans('texts.end_date'); return $this->templateStatement($variables); - } + } $variables = $html->generateLabelsAndValues(); @@ -124,7 +124,7 @@ class Statement \DB::connection(config('database.default'))->rollBack(); } - $pdf = $this->convertToPdf($html); + $pdf = $this->convertToPdf($html); $maker = null; $state = null; @@ -134,10 +134,11 @@ class Statement private function templateStatement($variables) { - if(isset($this->options['template'])) + if(isset($this->options['template'])) { $statement_design_id = $this->options['template']; - else + } else { $statement_design_id = $this->client->getSetting('statement_design_id'); + } $template = Design::where('id', $this->decodePrimaryKey($statement_design_id)) ->where('company_id', $this->client->company_id) @@ -350,7 +351,7 @@ class Statement protected function getCredits(): Builder { return Credit::withTrashed() - ->with('client.country','invoice') + ->with('client.country', 'invoice') ->where('is_deleted', false) ->where('company_id', $this->client->company_id) ->where('client_id', $this->client->id) diff --git a/app/Services/ClientPortal/InstantPayment.php b/app/Services/ClientPortal/InstantPayment.php index 909e4f003a3d..3484122541d8 100644 --- a/app/Services/ClientPortal/InstantPayment.php +++ b/app/Services/ClientPortal/InstantPayment.php @@ -178,7 +178,7 @@ class InstantPayment $contact_id = auth()->guard('contact')->user() ? auth()->guard('contact')->user()->id : null; - $invoices->each(function ($invoice) use($contact_id) { + $invoices->each(function ($invoice) use ($contact_id) { InjectSignature::dispatch($invoice, $contact_id, $this->request->signature, request()->getClientIp()); }); } diff --git a/app/Services/Credit/CreditService.php b/app/Services/Credit/CreditService.php index 365a9d1f2176..a6c5bbcdef69 100644 --- a/app/Services/Credit/CreditService.php +++ b/app/Services/Credit/CreditService.php @@ -11,14 +11,14 @@ namespace App\Services\Credit; -use App\Utils\Ninja; +use App\Factory\PaymentFactory; use App\Models\Credit; use App\Models\Payment; use App\Models\PaymentType; -use App\Factory\PaymentFactory; -use App\Utils\Traits\MakesHash; use App\Repositories\CreditRepository; use App\Repositories\PaymentRepository; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Storage; class CreditService diff --git a/app/Services/Credit/SendEmail.php b/app/Services/Credit/SendEmail.php index f17f5f902dc7..9c2fd948afa2 100644 --- a/app/Services/Credit/SendEmail.php +++ b/app/Services/Credit/SendEmail.php @@ -11,10 +11,10 @@ namespace App\Services\Credit; -use App\Utils\Ninja; -use App\Models\ClientContact; -use App\Jobs\Entity\EmailEntity; use App\Events\Credit\CreditWasEmailed; +use App\Jobs\Entity\EmailEntity; +use App\Models\ClientContact; +use App\Utils\Ninja; class SendEmail { diff --git a/app/Services/Email/AdminEmail.php b/app/Services/Email/AdminEmail.php index abf1771d8cde..2a245337fa72 100644 --- a/app/Services/Email/AdminEmail.php +++ b/app/Services/Email/AdminEmail.php @@ -19,18 +19,13 @@ use App\Jobs\Util\SystemLogger; use App\Libraries\Google\Google; use App\Libraries\MultiDB; use App\Models\Client; -use App\Models\ClientContact; use App\Models\Company; use App\Models\Invoice; use App\Models\Payment; use App\Models\SystemLog; use App\Models\User; -use App\Models\Vendor; -use App\Models\VendorContact; -use App\Utils\HtmlEngine; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; -use App\Utils\VendorHtmlEngine; use GuzzleHttp\Exception\ClientException; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; diff --git a/app/Services/Email/AdminEmailMailable.php b/app/Services/Email/AdminEmailMailable.php index 94cfc53a83c6..f0e18158d175 100644 --- a/app/Services/Email/AdminEmailMailable.php +++ b/app/Services/Email/AdminEmailMailable.php @@ -11,13 +11,11 @@ namespace App\Services\Email; -use App\Models\Document; use Illuminate\Mail\Attachment; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailables\Headers; -use Illuminate\Support\Facades\URL; class AdminEmailMailable extends Mailable { diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index 1bde5e2a19f6..bd4095849020 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -322,13 +322,13 @@ class Email implements ShouldQueue $this->cleanUpMailers(); } - /** - * On the hosted platform we scan all outbound email for - * spam. This sequence processes the filters we use on all - * emails. - * - * @return bool - */ + /** + * On the hosted platform we scan all outbound email for + * spam. This sequence processes the filters we use on all + * emails. + * + * @return bool + */ public function preFlightChecksFail(): bool { /* Always send if disabled */ @@ -426,7 +426,7 @@ class Email implements ShouldQueue return false; } - /** + /** * Sets the mail driver to use and applies any specific configuration * the the mailable */ @@ -466,7 +466,7 @@ class Email implements ShouldQueue return $this; } - /** + /** * Allows configuration of multiple mailers * per company for use by self hosted users */ diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index bf02092819b3..4c7b9319c12c 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -11,22 +11,22 @@ namespace App\Services\Email; -use App\Models\Task; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Credit; +use App\DataMapper\EmailTemplateDefaults; +use App\Jobs\Entity\CreateRawPdf; +use App\Jobs\Invoice\CreateUbl; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\Account; +use App\Models\Credit; use App\Models\Expense; use App\Models\Invoice; use App\Models\PurchaseOrder; -use App\Jobs\Invoice\CreateUbl; +use App\Models\Quote; +use App\Models\Task; +use App\Utils\Ninja; use App\Utils\Traits\MakesHash; -use App\Jobs\Entity\CreateRawPdf; -use Illuminate\Support\Facades\App; use Illuminate\Mail\Mailables\Address; -use App\DataMapper\EmailTemplateDefaults; +use Illuminate\Support\Facades\App; use League\CommonMark\CommonMarkConverter; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; class EmailDefaults { @@ -255,7 +255,7 @@ class EmailDefaults if (strlen($this->email->email_object->settings->bcc_email) > 1) { if (Ninja::isHosted() && $this->email->company->account->isPaid()) { $bccs = array_slice(explode(',', str_replace(' ', '', $this->email->email_object->settings->bcc_email)), 0, 5); - } else { + } else { $bccs = (explode(',', str_replace(' ', '', $this->email->email_object->settings->bcc_email))); } } @@ -323,8 +323,9 @@ class EmailDefaults if ($this->email->email_object->settings->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { $xml_string = $this->email->email_object->entity->service()->getEInvoice(); - if($xml_string) + if($xml_string) { $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($xml_string), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); + } } if (!$this->email->email_object->settings->document_email_attachment || !$this->email->company->account->hasFeature(Account::FEATURE_DOCUMENTS)) { @@ -364,7 +365,7 @@ class EmailDefaults ->where('invoice_documents', 1) ->cursor() ->each(function ($expense) { - $this->email->email_object->documents = array_merge($this->email->email_object->documents, $expense->documents()->where('is_public',true)->pluck('id')->toArray()); + $this->email->email_object->documents = array_merge($this->email->email_object->documents, $expense->documents()->where('is_public', true)->pluck('id')->toArray()); }); } @@ -372,7 +373,7 @@ class EmailDefaults Task::query()->whereIn('id', $this->transformKeys($task_ids)) ->cursor() ->each(function ($task) { - $this->email->email_object->documents = array_merge($this->email->email_object->documents, $task->documents()->where('is_public',true)->pluck('id')->toArray()); + $this->email->email_object->documents = array_merge($this->email->email_object->documents, $task->documents()->where('is_public', true)->pluck('id')->toArray()); }); } } diff --git a/app/Services/Email/EmailMailable.php b/app/Services/Email/EmailMailable.php index 8c7c2c5e4362..dffb081a1d69 100644 --- a/app/Services/Email/EmailMailable.php +++ b/app/Services/Email/EmailMailable.php @@ -96,7 +96,7 @@ class EmailMailable extends Mailable $documents = Document::query()->whereIn('id', $this->email_object->documents) ->where('size', '<', $this->max_attachment_size) - ->where('is_public',1) + ->where('is_public', 1) ->cursor() ->map(function ($document) { return Attachment::fromData(fn () => $document->getFile(), $document->name); diff --git a/app/Services/Invoice/ApplyPaymentAmount.php b/app/Services/Invoice/ApplyPaymentAmount.php index 468e4524c216..5b96c5102958 100644 --- a/app/Services/Invoice/ApplyPaymentAmount.php +++ b/app/Services/Invoice/ApplyPaymentAmount.php @@ -81,7 +81,7 @@ class ApplyPaymentAmount extends AbstractService $invoice_service->checkReminderStatus(); } - if($this->invoice->balance == 0){ + if($this->invoice->balance == 0) { $this->invoice->next_send_date = null; } diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index 19a366fdc507..c16fe0c6eeef 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -11,21 +11,20 @@ namespace App\Services\Invoice; -use App\Utils\Ninja; +use App\Events\Invoice\InvoiceWasPaid; +use App\Events\Payment\PaymentWasCreated; +use App\Factory\PaymentFactory; +use App\Libraries\MultiDB; use App\Models\Client; +use App\Models\ClientGatewayToken; use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; -use App\Libraries\MultiDB; use App\Models\PaymentHash; use App\Models\PaymentType; -use Illuminate\Support\Str; -use App\DataMapper\InvoiceItem; -use App\Factory\PaymentFactory; use App\Services\AbstractService; -use App\Models\ClientGatewayToken; -use App\Events\Invoice\InvoiceWasPaid; -use App\Events\Payment\PaymentWasCreated; +use App\Utils\Ninja; +use Illuminate\Support\Str; class AutoBillInvoice extends AbstractService { @@ -230,7 +229,7 @@ class AutoBillInvoice extends AbstractService event(new PaymentWasCreated($payment, $payment->company, Ninja::eventVars())); //if we have paid the invoice in full using credits, then we need to fire the event - if($this->invoice->balance == 0){ + if($this->invoice->balance == 0) { event(new InvoiceWasPaid($this->invoice, $payment, $payment->company, Ninja::eventVars())); diff --git a/app/Services/Invoice/EInvoice/FacturaEInvoice.php b/app/Services/Invoice/EInvoice/FacturaEInvoice.php index 4ec4ca779e65..24371ad2a2f5 100644 --- a/app/Services/Invoice/EInvoice/FacturaEInvoice.php +++ b/app/Services/Invoice/EInvoice/FacturaEInvoice.php @@ -13,14 +13,13 @@ namespace App\Services\Invoice\EInvoice; use App\Models\Invoice; use App\Models\PaymentType; -use josemmo\Facturae\Facturae; use App\Services\AbstractService; +use Illuminate\Support\Facades\Storage; +use josemmo\Facturae\Facturae; +use josemmo\Facturae\FacturaeCentre; use josemmo\Facturae\FacturaeItem; use josemmo\Facturae\FacturaeParty; -use josemmo\Facturae\FacturaeCentre; use josemmo\Facturae\FacturaePayment; -use Illuminate\Support\Facades\Storage; -use josemmo\Facturae\Common\FacturaeSigner; class FacturaEInvoice extends AbstractService { @@ -193,14 +192,11 @@ class FacturaEInvoice extends AbstractService { $facturae_centres = []; - if($this->invoice->client->custom_value1 == 'yes') - { + if($this->invoice->client->custom_value1 == 'yes') { - foreach($this->invoice->client->contacts()->whereNotNull('custom_value1')->whereNull('deleted_at')->cursor() as $contact) - { + foreach($this->invoice->client->contacts()->whereNotNull('custom_value1')->whereNull('deleted_at')->cursor() as $contact) { - if(in_array($contact->custom_value1, array_keys($this->centre_codes))) - { + if(in_array($contact->custom_value1, array_keys($this->centre_codes))) { $facturae_centres[] = new FacturaeCentre([ 'role' => $this->centre_codes[$contact->custom_value1], 'code' => $contact->custom_value2, @@ -221,7 +217,7 @@ class FacturaEInvoice extends AbstractService $transaction_reference = (isset($this->invoice->custom_value1) && strlen($this->invoice->custom_value1) > 2) ? substr($this->invoice->custom_value1, 0, 20) : null; $contract_reference = (isset($this->invoice->custom_value2) && strlen($this->invoice->custom_value2) > 2) ? $this->invoice->custom_value2: null; - $this->fac->setReferences($po, $transaction_reference, $contract_reference); + $this->fac->setReferences($po, $transaction_reference, $contract_reference); return $this; } @@ -237,15 +233,16 @@ class FacturaEInvoice extends AbstractService private function setLegalTerms(): self { - $this->fac->addLegalLiteral(substr($this->invoice->public_notes,0,250)); + $this->fac->addLegalLiteral(substr($this->invoice->public_notes, 0, 250)); return $this; } private function setBillingPeriod(): self { - if(!$this->invoice->custom_value3) + if(!$this->invoice->custom_value3) { return $this; + } try { if (\Carbon\Carbon::createFromFormat('Y-m-d', $this->invoice->custom_value3)->format('Y-m-d') === $this->invoice->custom_value3 && @@ -253,8 +250,7 @@ class FacturaEInvoice extends AbstractService ) { $this->fac->setBillingPeriod(\Carbon\Carbon::parse($this->invoice->custom_value3)->format('Y-m-d'), \Carbon\Carbon::parse($this->invoice->custom_value4)->format('Y-m-d')); } - } - catch(\Exception $e) { + } catch(\Exception $e) { nlog($e->getMessage()); } @@ -263,7 +259,7 @@ class FacturaEInvoice extends AbstractService private function setPayments(): self { - $this->invoice->payments()->each(function ($payment){ + $this->invoice->payments()->each(function ($payment) { $payment_data = [ "dueDate" => \Carbon\Carbon::parse($payment->date)->format('Y-m-d'), @@ -280,7 +276,7 @@ class FacturaEInvoice extends AbstractService } /** - * + * * FacturaePayment::TYPE_CASH Cash * FacturaePayment::TYPE_DEBIT Domiciled receipt * FacturaePayment::TYPE_RECEIPT Receipt @@ -309,7 +305,7 @@ class FacturaEInvoice extends AbstractService $data = []; $method = FacturaePayment::TYPE_CARD; - match($payment->type_id){ + match($payment->type_id) { PaymentType::BANK_TRANSFER => $method = FacturaePayment::TYPE_TRANSFER , PaymentType::CASH => $method = FacturaePayment::TYPE_CASH , PaymentType::ACH => $method = FacturaePayment::TYPE_TRANSFER , @@ -361,9 +357,8 @@ class FacturaEInvoice extends AbstractService $data['method'] = $method; - if($method == FacturaePayment::TYPE_TRANSFER) - { - $data['iban'] = $payment->custom_value1; + if($method == FacturaePayment::TYPE_TRANSFER) { + $data['iban'] = $payment->custom_value1; $data['bic'] = $payment->custom_value2; } @@ -420,8 +415,9 @@ class FacturaEInvoice extends AbstractService } - if(count($data) == 0) + if(count($data) == 0) { $data[Facturae::TAX_IVA] = 0; + } return $data; } @@ -468,8 +464,9 @@ class FacturaEInvoice extends AbstractService { $company = $this->invoice->company; - if($company->getSetting('classification') == 'individual') + if($company->getSetting('classification') == 'individual') { return $this->setIndividualSeller(); + } $seller = new FacturaeParty([ "isLegalEntity" => true, @@ -548,18 +545,18 @@ class FacturaEInvoice extends AbstractService $buyer = new FacturaeParty([ "isLegalEntity" => $this->invoice->client->classification === 'individual' ? false : true, "taxNumber" => $this->invoice->client->vat_number, - "name" => substr($this->invoice->client->present()->name(),0, 40), - "firstSurname" => substr($this->invoice->client->present()->first_name(),0, 40), - "lastSurname" => substr($this->invoice->client->present()->last_name(),0, 40), - "address" => substr($this->invoice->client->address1,0, 80), - "postCode" => substr($this->invoice->client->postal_code,0,5), - "town" => substr($this->invoice->client->city,0, 50), - "province" => substr($this->invoice->client->state,0, 20), + "name" => substr($this->invoice->client->present()->name(), 0, 40), + "firstSurname" => substr($this->invoice->client->present()->first_name(), 0, 40), + "lastSurname" => substr($this->invoice->client->present()->last_name(), 0, 40), + "address" => substr($this->invoice->client->address1, 0, 80), + "postCode" => substr($this->invoice->client->postal_code, 0, 5), + "town" => substr($this->invoice->client->city, 0, 50), + "province" => substr($this->invoice->client->state, 0, 20), "countryCode" => $this->invoice->client->country->iso_3166_3, // Se asume España si se omite - "email" => substr($this->invoice->client->present()->email(),0, 60), - "phone" => substr($this->invoice->client->present()->phone(),0, 15), + "email" => substr($this->invoice->client->present()->email(), 0, 60), + "phone" => substr($this->invoice->client->present()->phone(), 0, 15), "fax" => "", - "website" => substr($this->invoice->client->present()->website(), 0 ,60), + "website" => substr($this->invoice->client->present()->website(), 0, 60), "contactPeople" => substr($this->invoice->client->present()->first_name()." ".$this->invoice->client->present()->last_name(), 0, 40), 'centres' => $this->setFace(), // "cnoCnae" => "04791", // Clasif. Nacional de Act. Económicas @@ -577,8 +574,9 @@ class FacturaEInvoice extends AbstractService $ssl_cert = $this->invoice->company->getInvoiceCert(); $ssl_passphrase = $this->invoice->company->getSslPassPhrase(); - if($ssl_cert) + if($ssl_cert) { $this->fac->sign($ssl_cert, null, $ssl_passphrase); + } return $this; } diff --git a/app/Services/Invoice/EInvoice/FatturaPA.php b/app/Services/Invoice/EInvoice/FatturaPA.php index 9d2dbe69a26e..0540275ae60d 100644 --- a/app/Services/Invoice/EInvoice/FatturaPA.php +++ b/app/Services/Invoice/EInvoice/FatturaPA.php @@ -11,9 +11,10 @@ namespace App\Services\Invoice\EInvoice; -use SimpleXMLElement; use App\Models\Invoice; use App\Services\AbstractService; +use SimpleXMLElement; + /* @@ -69,12 +70,14 @@ class FatturaPA extends AbstractService return $this->addHeader()->getXml(); } - public function addHeader() { + public function addHeader() + { $this->xml->addChild('FatturaElettronicaHeader'); return $this; } - public function addTrasmissioneData($idPaese, $idCodice, $progressivoInvio, $formatoTrasmissione, $codiceDestinatario) { + public function addTrasmissioneData($idPaese, $idCodice, $progressivoInvio, $formatoTrasmissione, $codiceDestinatario) + { $datiTrasmissione = $this->xml->FatturaElettronicaHeader->addChild('DatiTrasmissione'); $idTrasmittente = $datiTrasmissione->addChild('IdTrasmittente'); $idTrasmittente->addChild('IdPaese', $idPaese); @@ -85,24 +88,29 @@ class FatturaPA extends AbstractService return $this; } - public function addCedentePrestatore($data) { + public function addCedentePrestatore($data) + { // Add CedentePrestatore data } - public function addCessionarioCommittente($data) { + public function addCessionarioCommittente($data) + { // Add CessionarioCommittente data } - public function addBody() { + public function addBody() + { $this->xml->addChild('FatturaElettronicaBody'); return $this; } - public function addDatiGenerali($data) { + public function addDatiGenerali($data) + { // Add DatiGenerali data } - public function addLineItem($data) { + public function addLineItem($data) + { if (!isset($this->xml->FatturaElettronicaBody->DatiBeniServizi)) { $this->xml->FatturaElettronicaBody->addChild('DatiBeniServizi'); } @@ -121,7 +129,8 @@ class FatturaPA extends AbstractService return $this; } - public function addDatiPagamento($data) { + public function addDatiPagamento($data) + { // Add DatiPagamento data } diff --git a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php index 539e78f6e270..56e0e7161107 100644 --- a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php +++ b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php @@ -14,11 +14,9 @@ namespace App\Services\Invoice\EInvoice; use App\Models\Invoice; use App\Models\Product; use App\Services\AbstractService; -use horstoeko\zugferd\ZugferdProfiles; -use Illuminate\Support\Facades\Storage; -use horstoeko\zugferd\ZugferdDocumentBuilder; -use horstoeko\zugferd\ZugferdDocumentPdfBuilder; use horstoeko\zugferd\codelists\ZugferdDutyTaxFeeCategories; +use horstoeko\zugferd\ZugferdDocumentBuilder; +use horstoeko\zugferd\ZugferdProfiles; class ZugferdEInvoice extends AbstractService { @@ -58,13 +56,13 @@ class ZugferdEInvoice extends AbstractService ->setDocumentBuyerContact($client->primary_contact()->first()->first_name . " " . $client->primary_contact()->first()->last_name, "", $client->primary_contact()->first()->phone, "", $client->primary_contact()->first()->email) ->addDocumentPaymentTerm(ctrans("texts.xinvoice_payable", ['payeddue' => date_create($this->invoice->date ?? now()->format('Y-m-d'))->diff(date_create($this->invoice->due_date ?? now()->format('Y-m-d')))->format("%d"), 'paydate' => $this->invoice->due_date])); - if (!empty($this->invoice->public_notes)) { + if (!empty($this->invoice->public_notes)) { $this->xrechnung->addDocumentNote($this->invoice->public_notes); } - if (empty($this->invoice->number)){ - $this->xrechnung->setDocumentInformation("DRAFT", "380", date_create($this->invoice->date ?? now()->format('Y-m-d')), $this->invoice->client->getCurrencyCode()); + if (empty($this->invoice->number)) { + $this->xrechnung->setDocumentInformation("DRAFT", "380", date_create($this->invoice->date ?? now()->format('Y-m-d')), $this->invoice->client->getCurrencyCode()); } else { - $this->xrechnung->setDocumentInformation($this->invoice->number, "380", date_create($this->invoice->date ?? now()->format('Y-m-d')), $this->invoice->client->getCurrencyCode()); + $this->xrechnung->setDocumentInformation($this->invoice->number, "380", date_create($this->invoice->date ?? now()->format('Y-m-d')), $this->invoice->client->getCurrencyCode()); } if (!empty($this->invoice->po_number)) { $this->xrechnung->setDocumentBuyerOrderReferencedDocument($this->invoice->po_number); @@ -75,7 +73,7 @@ class ZugferdEInvoice extends AbstractService } else { $this->xrechnung->setDocumentBuyerReference($client->routing_id); } - if (!empty($client->shipping_address1) && $client->shipping_country->exists()){ + if (!empty($client->shipping_address1) && $client->shipping_country->exists()) { $this->xrechnung->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state); } @@ -95,19 +93,16 @@ class ZugferdEInvoice extends AbstractService $this->xrechnung->addNewPosition($index) ->setDocumentPositionGrossPrice($item->gross_line_total) ->setDocumentPositionNetPrice($item->line_total); - if (!empty($item->product_key)){ - if (!empty($item->notes)){ - $this->xrechnung->setDocumentPositionProductDetails($item->product_key, $item->notes); - } - else { + if (!empty($item->product_key)) { + if (!empty($item->notes)) { + $this->xrechnung->setDocumentPositionProductDetails($item->product_key, $item->notes); + } else { $this->xrechnung->setDocumentPositionProductDetails($item->product_key); } - } - else { - if (!empty($item->notes)){ + } else { + if (!empty($item->notes)) { $this->xrechnung->setDocumentPositionProductDetails($item->notes); - } - else { + } else { $this->xrechnung->setDocumentPositionProductDetails("no product name defined"); } } @@ -164,7 +159,7 @@ class ZugferdEInvoice extends AbstractService $this->xrechnung->setDocumentSummation($this->invoice->amount, $this->invoice->balance, $invoicing_data->getSubTotal(), $invoicing_data->getTotalSurcharges(), $invoicing_data->getTotalDiscount(), $invoicing_data->getSubTotal(), $invoicing_data->getItemTotalTaxes(), 0.0, $this->invoice->amount-$this->invoice->balance); - foreach ($this->tax_map as $item){ + foreach ($this->tax_map as $item) { $this->xrechnung->addDocumentTax($item["tax_type"], "VAT", $item["net_amount"], $item["tax_rate"]*$item["net_amount"], $item["tax_rate"]*100); } @@ -225,10 +220,9 @@ class ZugferdEInvoice extends AbstractService private function addtoTaxMap(string $tax_type, float $net_amount, float $tax_rate): void { $hash = hash("md5", $tax_type."-".$tax_rate); - if (array_key_exists($hash, $this->tax_map)){ + if (array_key_exists($hash, $this->tax_map)) { $this->tax_map[$hash]["net_amount"] += $net_amount; - } - else{ + } else { $this->tax_map[$hash] = [ "tax_type" => $tax_type, "net_amount" => $net_amount, diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index 5b40a550ded8..aec054eb73b7 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -45,8 +45,7 @@ class GenerateDeliveryNote $delivery_note_design_id = $this->invoice->client->getSetting('delivery_note_design_id'); $design = Design::withTrashed()->find($this->decodePrimaryKey($delivery_note_design_id)); - if($design && $design->is_template) - { + if($design && $design->is_template) { $ts = new TemplateService($design); $pdf = $ts->build([ diff --git a/app/Services/Invoice/GetInvoicePdf.php b/app/Services/Invoice/GetInvoicePdf.php index f2eeee32cbef..736df18c9d26 100644 --- a/app/Services/Invoice/GetInvoicePdf.php +++ b/app/Services/Invoice/GetInvoicePdf.php @@ -11,9 +11,9 @@ namespace App\Services\Invoice; -use App\Models\Invoice; -use App\Models\ClientContact; use App\Jobs\Entity\CreateRawPdf; +use App\Models\ClientContact; +use App\Models\Invoice; use App\Services\AbstractService; class GetInvoicePdf extends AbstractService diff --git a/app/Services/Invoice/HandleRestore.php b/app/Services/Invoice/HandleRestore.php index 45a960d4e86a..ee1c94717a34 100644 --- a/app/Services/Invoice/HandleRestore.php +++ b/app/Services/Invoice/HandleRestore.php @@ -17,7 +17,6 @@ use App\Models\Paymentable; use App\Services\AbstractService; use App\Utils\Ninja; use App\Utils\Traits\GeneratesCounter; -use Illuminate\Support\Facades\DB; class HandleRestore extends AbstractService { @@ -115,9 +114,9 @@ class HandleRestore extends AbstractService if ($this->adjustment_amount == $this->total_payments) { $this->invoice->payments()->update(['payments.deleted_at' => null, 'payments.is_deleted' => false]); - } - else + } else { $this->invoice->net_payments()->update(['payments.deleted_at' => null, 'payments.is_deleted' => false]); + } //adjust payments down by the amount applied to the invoice payment. diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index affba6b25536..78fdf1cc272f 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -292,7 +292,7 @@ class InvoiceService /** * Reset the reminders if only the * partial has been paid. - * + * * We can _ONLY_ call this _IF_ a partial * amount has been paid, otherwise we end up wiping * all reminders regardless @@ -302,11 +302,11 @@ class InvoiceService public function checkReminderStatus(): self { - if($this->invoice->partial == 0) + if($this->invoice->partial == 0) { $this->invoice->partial_due_date = null; + } - if($this->invoice->partial == 0 && $this->invoice->balance > 0) - { + if($this->invoice->partial == 0 && $this->invoice->balance > 0) { $this->invoice->reminder1_sent = null; $this->invoice->reminder2_sent = null; $this->invoice->reminder3_sent = null; @@ -386,7 +386,7 @@ class InvoiceService $this->invoice->invitations->each(function ($invitation) { try { // if (Storage::disk(config('filesystems.default'))->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) { - Storage::disk(config('filesystems.default'))->delete($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf'); + Storage::disk(config('filesystems.default'))->delete($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf'); // } // if (Ninja::isHosted() && Storage::disk('public')->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) { @@ -408,7 +408,7 @@ class InvoiceService $this->invoice->invitations->each(function ($invitation) { try { // if (Storage::disk(config('filesystems.default'))->exists($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml"))) { - Storage::disk(config('filesystems.default'))->delete($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml")); + Storage::disk(config('filesystems.default'))->delete($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml")); // } // if (Ninja::isHosted() && Storage::disk('public')->exists($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml"))) { diff --git a/app/Services/Invoice/MarkInvoiceDeleted.php b/app/Services/Invoice/MarkInvoiceDeleted.php index 318737cae128..524e1e933fc3 100644 --- a/app/Services/Invoice/MarkInvoiceDeleted.php +++ b/app/Services/Invoice/MarkInvoiceDeleted.php @@ -11,12 +11,10 @@ namespace App\Services\Invoice; -use App\Models\Credit; +use App\Jobs\Inventory\AdjustProductInventory; use App\Models\Invoice; use App\Services\AbstractService; -use Illuminate\Support\Facades\DB; use App\Utils\Traits\GeneratesCounter; -use App\Jobs\Inventory\AdjustProductInventory; class MarkInvoiceDeleted extends AbstractService { diff --git a/app/Services/Invoice/SendEmail.php b/app/Services/Invoice/SendEmail.php index 7cbc7a0cc0ee..365201a5acb5 100644 --- a/app/Services/Invoice/SendEmail.php +++ b/app/Services/Invoice/SendEmail.php @@ -11,12 +11,12 @@ namespace App\Services\Invoice; -use App\Utils\Ninja; -use App\Models\Invoice; -use App\Models\ClientContact; -use App\Jobs\Entity\EmailEntity; -use App\Services\AbstractService; use App\Events\Invoice\InvoiceWasEmailed; +use App\Jobs\Entity\EmailEntity; +use App\Models\ClientContact; +use App\Models\Invoice; +use App\Services\AbstractService; +use App\Utils\Ninja; class SendEmail extends AbstractService { diff --git a/app/Services/Invoice/UpdateReminder.php b/app/Services/Invoice/UpdateReminder.php index 43768b7cb1f9..0d8c96f3f45b 100644 --- a/app/Services/Invoice/UpdateReminder.php +++ b/app/Services/Invoice/UpdateReminder.php @@ -59,7 +59,7 @@ class UpdateReminder extends AbstractService $this->settings->schedule_reminder1 == 'before_due_date') { $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder1); -// nlog("1. {$reminder_date->format('Y-m-d')}"); + // nlog("1. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); @@ -72,7 +72,7 @@ class UpdateReminder extends AbstractService $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder1); -// nlog("2. {$reminder_date->format('Y-m-d')}"); + // nlog("2. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); @@ -94,7 +94,7 @@ class UpdateReminder extends AbstractService $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder2); -// nlog("3. {$reminder_date->format('Y-m-d')}"); + // nlog("3. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); @@ -107,7 +107,7 @@ class UpdateReminder extends AbstractService $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder2); -// nlog("4. {$reminder_date->format('Y-m-d')}"); + // nlog("4. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); @@ -129,7 +129,7 @@ class UpdateReminder extends AbstractService $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->subDays($this->settings->num_days_reminder3); -// nlog("5. {$reminder_date->format('Y-m-d')}"); + // nlog("5. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); @@ -142,7 +142,7 @@ class UpdateReminder extends AbstractService $partial_or_due_date = ($this->invoice->partial > 0 && isset($this->invoice->partial_due_date)) ? $this->invoice->partial_due_date : $this->invoice->due_date; $reminder_date = Carbon::parse($partial_or_due_date)->startOfDay()->addDays($this->settings->num_days_reminder3); -// nlog("6. {$reminder_date->format('Y-m-d')}"); + // nlog("6. {$reminder_date->format('Y-m-d')}"); if ($reminder_date->gt(now())) { $date_collection->push($reminder_date); diff --git a/app/Services/Payment/DeletePayment.php b/app/Services/Payment/DeletePayment.php index 8884dbdef622..caac1125f57f 100644 --- a/app/Services/Payment/DeletePayment.php +++ b/app/Services/Payment/DeletePayment.php @@ -11,10 +11,10 @@ namespace App\Services\Payment; +use App\Models\BankTransaction; use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; -use App\Models\BankTransaction; use Illuminate\Contracts\Container\BindingResolutionException; class DeletePayment @@ -58,7 +58,7 @@ class DeletePayment $this->payment->is_deleted = true; $this->payment->delete(); - BankTransaction::query()->where('payment_id', $this->payment->id)->cursor()->each(function ($bt){ + BankTransaction::query()->where('payment_id', $this->payment->id)->cursor()->each(function ($bt) { $bt->payment_id = null; $bt->status_id = 1; $bt->save(); @@ -109,11 +109,9 @@ class DeletePayment if ($paymentable_invoice->balance == $paymentable_invoice->amount) { $paymentable_invoice->service()->setStatus(Invoice::STATUS_SENT)->save(); - } - elseif($paymentable_invoice->balance == 0){ + } elseif($paymentable_invoice->balance == 0) { $paymentable_invoice->service()->setStatus(Invoice::STATUS_PAID)->save(); - } - else { + } else { $paymentable_invoice->service()->setStatus(Invoice::STATUS_PARTIAL)->save(); } } else { diff --git a/app/Services/Payment/RefundPayment.php b/app/Services/Payment/RefundPayment.php index 72bdab75f6b0..b06833eeff0d 100644 --- a/app/Services/Payment/RefundPayment.php +++ b/app/Services/Payment/RefundPayment.php @@ -70,8 +70,9 @@ class RefundPayment private function finalize(): self { - if($this->refund_failed) + if($this->refund_failed) { throw new PaymentRefundFailed($this->refund_failed_message); + } return $this; } @@ -89,7 +90,7 @@ class RefundPayment * 'payment_id' => (int), * 'amount' => (float), * ]; - * + * * @return $this * @throws PaymentRefundFailed */ @@ -101,14 +102,14 @@ class RefundPayment if ($this->payment->company_gateway) { $response = $this->payment->company_gateway->driver($this->payment->client)->refund($this->payment, $net_refund); - if($response['amount'] ?? false) + if($response['amount'] ?? false) { $net_refund = $response['amount']; + } - if($response['voided'] ?? false) - { - //When a transaction is voided - all invoices attached to the payment need to be reversed, this + if($response['voided'] ?? false) { + //When a transaction is voided - all invoices attached to the payment need to be reversed, this //block prevents the edge case where a partial refund was attempted. - $this->refund_data['invoices'] = $this->payment->invoices->map(function ($invoice){ + $this->refund_data['invoices'] = $this->payment->invoices->map(function ($invoice) { return [ 'invoice_id' => $invoice->id, 'amount' => $invoice->pivot->amount, @@ -277,8 +278,7 @@ class RefundPayment private function adjustInvoices() { if (isset($this->refund_data['invoices']) && count($this->refund_data['invoices']) > 0) { - foreach ($this->refund_data['invoices'] as $refunded_invoice) - { + foreach ($this->refund_data['invoices'] as $refunded_invoice) { $invoice = Invoice::withTrashed()->find($refunded_invoice['invoice_id']); if ($invoice->trashed()) { @@ -342,4 +342,4 @@ class RefundPayment return $this->payment; } -} \ No newline at end of file +} diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index cae7ecaa94de..0c844fcba6f1 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -11,14 +11,14 @@ namespace App\Services\Pdf; -use DOMDocument; -use App\Models\Quote; use App\Models\Credit; -use App\Utils\Helpers; -use Illuminate\Support\Str; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesDates; +use App\Models\Quote; use App\Services\Template\TemplateService; +use App\Utils\Helpers; +use App\Utils\Traits\MakesDates; +use DOMDocument; +use Illuminate\Support\Carbon; +use Illuminate\Support\Str; use League\CommonMark\CommonMarkConverter; class PdfBuilder @@ -74,12 +74,12 @@ class PdfBuilder return $this; } - /** - * Final method to get compiled HTML. - * - * @param bool $final @deprecated // is it? i still see it being called elsewhere - * @return string - */ + /** + * Final method to get compiled HTML. + * + * @param bool $final @deprecated // is it? i still see it being called elsewhere + * @return string + */ public function getCompiledHTML($final = false) { $html = $this->document->saveHTML(); @@ -764,13 +764,13 @@ class PdfBuilder return $data; } - /** - * Generate the structure of table headers. (
) - * - * @param string $type "product" or "task" - * @return array - * - */ + /** + * Generate the structure of table headers. () + * + * @param string $type "product" or "task" + * @return array + * + */ public function buildTableHeader(string $type): array { $this->processTaxColumns($type); diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index c7b98de46a71..e08da50cd5c9 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -69,10 +69,11 @@ class PdfMock $pdf_service->config = $pdf_config; - if(isset($this->request['design'])) + if(isset($this->request['design'])) { $pdf_designer = (new PdfDesigner($pdf_service))->buildFromPartials($this->request['design']); - else + } else { $pdf_designer = (new PdfDesigner($pdf_service))->build(); + } $pdf_service->designer = $pdf_designer; diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index 31d724fbbc0c..9ef50f988141 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -67,7 +67,7 @@ class PdfService } public function boot(): self - { + { $this->init(); diff --git a/app/Services/PdfMaker/Design.php b/app/Services/PdfMaker/Design.php index 9f90a9a2fa25..e9ffb0389864 100644 --- a/app/Services/PdfMaker/Design.php +++ b/app/Services/PdfMaker/Design.php @@ -265,9 +265,9 @@ class Design extends BaseDesign $variables = $this->context['pdf_variables']['client_details']; - $elements = collect($variables)->filter(function ($variable) use ($address_variables){ + $elements = collect($variables)->filter(function ($variable) use ($address_variables) { return in_array($variable, $address_variables); - })->map(function ($variable){ + })->map(function ($variable) { $variable = str_replace('$client.', '$client.shipping_', $variable); return ['element' => 'p', 'content' => $variable, 'show_empty' => false, 'properties' => ['data-ref' => "client_details-shipping-" . substr($variable, 1)]]; @@ -935,7 +935,7 @@ class Design extends BaseDesign //07/09/2023 don't show custom values if they are empty // $visible = intval($this->entity->{$_variable}) != 0; - $visible = intval(str_replace(['0','.'],'', $this->entity->{$_variable})) != 0; + $visible = intval(str_replace(['0','.'], '', $this->entity->{$_variable})) != 0; $elements[1]['elements'][] = ['element' => 'div', 'elements' => [ ['element' => 'span', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']], diff --git a/app/Services/PdfMaker/PdfMaker.php b/app/Services/PdfMaker/PdfMaker.php index f54cbbf26677..680bf7ef8146 100644 --- a/app/Services/PdfMaker/PdfMaker.php +++ b/app/Services/PdfMaker/PdfMaker.php @@ -97,7 +97,7 @@ class PdfMaker } - foreach($contents as $key => $content){ + foreach($contents as $key => $content) { $content->parentNode->replaceChild($replacements[$key], $content); } diff --git a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php index 32dc93f1083e..40044b90b6e5 100644 --- a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php +++ b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php @@ -11,11 +11,11 @@ namespace App\Services\PurchaseOrder; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\PurchaseOrder; use App\Models\VendorContact; use App\Services\AbstractService; use Illuminate\Support\Facades\Storage; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; class GetPurchaseOrderPdf extends AbstractService { diff --git a/app/Services/PurchaseOrder/PurchaseOrderService.php b/app/Services/PurchaseOrder/PurchaseOrderService.php index 6ee50bc5a466..2f40b51f00fa 100644 --- a/app/Services/PurchaseOrder/PurchaseOrderService.php +++ b/app/Services/PurchaseOrder/PurchaseOrderService.php @@ -13,8 +13,6 @@ namespace App\Services\PurchaseOrder; use App\Models\PurchaseOrder; use App\Utils\Traits\MakesHash; -use App\Services\PurchaseOrder\SendEmail; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; class PurchaseOrderService { @@ -132,7 +130,7 @@ class PurchaseOrderService /** * Saves the purchase order. - * @return \App\Models\PurchaseOrder + * @return \App\Models\PurchaseOrder */ public function save(): ?PurchaseOrder { diff --git a/app/Services/PurchaseOrder/SendEmail.php b/app/Services/PurchaseOrder/SendEmail.php index 900d5380bc6a..a6b2fa1c3aaf 100644 --- a/app/Services/PurchaseOrder/SendEmail.php +++ b/app/Services/PurchaseOrder/SendEmail.php @@ -11,16 +11,16 @@ namespace App\Services\PurchaseOrder; -use App\Utils\Ninja; -use App\Models\PurchaseOrder; -use App\Models\VendorContact; +use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; use App\Jobs\Mail\NinjaMailerJob; -use App\Mail\VendorTemplateEmail; -use App\Services\AbstractService; -use Illuminate\Support\Facades\App; use App\Jobs\Mail\NinjaMailerObject; use App\Mail\Engine\PurchaseOrderEmailEngine; -use App\Events\PurchaseOrder\PurchaseOrderWasEmailed; +use App\Mail\VendorTemplateEmail; +use App\Models\PurchaseOrder; +use App\Models\VendorContact; +use App\Services\AbstractService; +use App\Utils\Ninja; +use Illuminate\Support\Facades\App; class SendEmail extends AbstractService { @@ -69,48 +69,3 @@ class SendEmail extends AbstractService } } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Services/Quote/ConvertQuoteToProject.php b/app/Services/Quote/ConvertQuoteToProject.php index 59227fcfc566..4b37a3c3e8b5 100644 --- a/app/Services/Quote/ConvertQuoteToProject.php +++ b/app/Services/Quote/ConvertQuoteToProject.php @@ -12,11 +12,10 @@ namespace App\Services\Quote; -use App\DataMapper\InvoiceItem; -use App\Models\Quote; use App\Factory\ProjectFactory; use App\Factory\TaskFactory; use App\Models\Project; +use App\Models\Quote; use App\Repositories\TaskRepository; use App\Utils\Traits\GeneratesCounter; @@ -31,9 +30,9 @@ class ConvertQuoteToProject public function run(): Project { - $quote_items = collect($this->quote->line_items)->filter(function ($item){ - return $item->type_id == '2'; - }); + $quote_items = collect($this->quote->line_items)->filter(function ($item) { + return $item->type_id == '2'; + }); $project = ProjectFactory::create($this->quote->company_id, $this->quote->user_id); $project->name = ctrans('texts.quote_number_short'). " " . $this->quote->number . " [{$this->quote->client->present()->name()}]"; @@ -57,20 +56,20 @@ class ConvertQuoteToProject $task_repo = new TaskRepository(); - $quote_items->each(function($item) use($task_repo, $task_status){ + $quote_items->each(function ($item) use ($task_repo, $task_status) { - $task = TaskFactory::create($this->quote->company_id, $this->quote->user_id); - $task->client_id = $this->quote->client_id; - $task->project_id = $this->quote->project_id; - $task->description = $item->notes; - $task->status_id = $task_status->id; - $task->rate = $item->cost; - $task_repo->save([], $task); + $task = TaskFactory::create($this->quote->company_id, $this->quote->user_id); + $task->client_id = $this->quote->client_id; + $task->project_id = $this->quote->project_id; + $task->description = $item->notes; + $task->status_id = $task_status->id; + $task->rate = $item->cost; + $task_repo->save([], $task); - }); + }); event('eloquent.created: App\Models\Project', $project); return $project->fresh(); } -} \ No newline at end of file +} diff --git a/app/Services/Quote/CreateInvitations.php b/app/Services/Quote/CreateInvitations.php index 933bbdbe9de9..47c435a58f1c 100644 --- a/app/Services/Quote/CreateInvitations.php +++ b/app/Services/Quote/CreateInvitations.php @@ -42,7 +42,7 @@ class CreateInvitations $contacts->each(function ($contact) { $invitation = QuoteInvitation::query() - ->where('company_id',$this->quote->company_id) + ->where('company_id', $this->quote->company_id) ->whereClientContactId($contact->id) ->whereQuoteId($this->quote->id) ->withTrashed() diff --git a/app/Services/Quote/GetQuotePdf.php b/app/Services/Quote/GetQuotePdf.php index d58268cbe050..cd1a537aaf98 100644 --- a/app/Services/Quote/GetQuotePdf.php +++ b/app/Services/Quote/GetQuotePdf.php @@ -11,9 +11,9 @@ namespace App\Services\Quote; -use App\Models\Quote; -use App\Models\ClientContact; use App\Jobs\Entity\CreateRawPdf; +use App\Models\ClientContact; +use App\Models\Quote; use App\Services\AbstractService; class GetQuotePdf extends AbstractService diff --git a/app/Services/Quote/MarkSent.php b/app/Services/Quote/MarkSent.php index 263ce043ce20..f7c32b0ef028 100644 --- a/app/Services/Quote/MarkSent.php +++ b/app/Services/Quote/MarkSent.php @@ -11,12 +11,12 @@ namespace App\Services\Quote; -use Carbon\Carbon; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Webhook; use App\Events\Quote\QuoteWasMarkedSent; +use App\Models\Client; +use App\Models\Quote; +use App\Models\Webhook; +use App\Utils\Ninja; +use Carbon\Carbon; class MarkSent { diff --git a/app/Services/Quote/QuoteService.php b/app/Services/Quote/QuoteService.php index d6a09c08fbf1..fc6b51b45634 100644 --- a/app/Services/Quote/QuoteService.php +++ b/app/Services/Quote/QuoteService.php @@ -11,15 +11,14 @@ namespace App\Services\Quote; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Project; -use App\Utils\Traits\MakesHash; -use App\Exceptions\QuoteConversion; -use App\Repositories\QuoteRepository; use App\Events\Quote\QuoteWasApproved; +use App\Exceptions\QuoteConversion; +use App\Models\Project; +use App\Models\Quote; +use App\Repositories\QuoteRepository; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Storage; -use App\Services\Quote\ConvertQuoteToProject; class QuoteService { diff --git a/app/Services/Quote/SendEmail.php b/app/Services/Quote/SendEmail.php index d157792aa0c6..3cd0cf301bac 100644 --- a/app/Services/Quote/SendEmail.php +++ b/app/Services/Quote/SendEmail.php @@ -11,10 +11,8 @@ namespace App\Services\Quote; -use App\Utils\Ninja; -use App\Models\ClientContact; use App\Jobs\Entity\EmailEntity; -use App\Events\Quote\QuoteWasEmailed; +use App\Models\ClientContact; class SendEmail { diff --git a/app/Services/Recurring/GetInvoicePdf.php b/app/Services/Recurring/GetInvoicePdf.php index ea66fff6a8b3..019d094e6fdc 100644 --- a/app/Services/Recurring/GetInvoicePdf.php +++ b/app/Services/Recurring/GetInvoicePdf.php @@ -11,8 +11,8 @@ namespace App\Services\Recurring; -use App\Models\ClientContact; use App\Jobs\Entity\CreateRawPdf; +use App\Models\ClientContact; use App\Services\AbstractService; class GetInvoicePdf extends AbstractService diff --git a/app/Services/Recurring/RecurringService.php b/app/Services/Recurring/RecurringService.php index eca206c746e0..61ae416956b1 100644 --- a/app/Services/Recurring/RecurringService.php +++ b/app/Services/Recurring/RecurringService.php @@ -11,14 +11,13 @@ namespace App\Services\Recurring; -use App\Utils\Ninja; -use App\Jobs\Util\UnlinkFile; -use App\Models\RecurringQuote; -use Illuminate\Support\Carbon; +use App\Jobs\RecurringInvoice\SendRecurring; use App\Models\RecurringExpense; use App\Models\RecurringInvoice; +use App\Models\RecurringQuote; +use App\Utils\Ninja; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; -use App\Jobs\RecurringInvoice\SendRecurring; class RecurringService { @@ -94,7 +93,7 @@ class RecurringService //30-06-2023 try { Storage::disk(config('filesystems.default'))->delete($this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'); - Storage::disk('public')->delete($this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'); + Storage::disk('public')->delete($this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'); if (Ninja::isHosted()) { } } catch (\Exception $e) { diff --git a/app/Services/Report/ARDetailReport.php b/app/Services/Report/ARDetailReport.php index 3787acd07cd5..70526195c823 100644 --- a/app/Services/Report/ARDetailReport.php +++ b/app/Services/Report/ARDetailReport.php @@ -11,17 +11,17 @@ namespace App\Services\Report; -use Carbon\Carbon; -use App\Utils\Ninja; -use App\Utils\Number; +use App\Export\CSV\BaseExport; +use App\Libraries\MultiDB; use App\Models\Client; -use League\Csv\Writer; use App\Models\Company; use App\Models\Invoice; -use App\Libraries\MultiDB; -use App\Export\CSV\BaseExport; +use App\Utils\Ninja; +use App\Utils\Number; use App\Utils\Traits\MakesDates; +use Carbon\Carbon; use Illuminate\Support\Facades\App; +use League\Csv\Writer; class ARDetailReport extends BaseExport { @@ -102,7 +102,7 @@ class ARDetailReport extends BaseExport $query->cursor() ->each(function ($invoice) { - $this->csv->insertOne($this->buildRow($invoice)); + $this->csv->insertOne($this->buildRow($invoice)); }); return $this->csv->toString(); @@ -138,4 +138,4 @@ class ARDetailReport extends BaseExport return $header; } -} \ No newline at end of file +} diff --git a/app/Services/Report/ARSummaryReport.php b/app/Services/Report/ARSummaryReport.php index 0fd0d5b83dfb..9193a8d773f7 100644 --- a/app/Services/Report/ARSummaryReport.php +++ b/app/Services/Report/ARSummaryReport.php @@ -106,7 +106,7 @@ class ARSummaryReport extends BaseExport $this->client->present()->name(), $this->client->number, $this->client->id_number, - $this->getCurrent(), + $this->getCurrent(), $this->getAgingAmount('30'), $this->getAgingAmount('60'), $this->getAgingAmount('90'), @@ -128,7 +128,7 @@ class ARSummaryReport extends BaseExport ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->where('balance', '>', 0) ->where('is_deleted', 0) - ->where(function ($query){ + ->where(function ($query) { $query->where('due_date', '>', now()->startOfDay()) ->orWhereNull('due_date'); }) @@ -161,7 +161,7 @@ class ARSummaryReport extends BaseExport ->whereBetween('due_date', [$to, $from]) ->sum('balance'); - $this->total += $amount; + $this->total += $amount; return Number::formatMoney($amount, $this->client); } diff --git a/app/Services/Report/ClientBalanceReport.php b/app/Services/Report/ClientBalanceReport.php index 0c0eb85aca29..405cfdbe2981 100644 --- a/app/Services/Report/ClientBalanceReport.php +++ b/app/Services/Report/ClientBalanceReport.php @@ -11,15 +11,15 @@ namespace App\Services\Report; -use App\Utils\Ninja; +use App\Export\CSV\BaseExport; +use App\Libraries\MultiDB; use App\Models\Client; -use League\Csv\Writer; use App\Models\Company; use App\Models\Invoice; -use App\Libraries\MultiDB; -use App\Export\CSV\BaseExport; +use App\Utils\Ninja; use App\Utils\Traits\MakesDates; use Illuminate\Support\Facades\App; +use League\Csv\Writer; class ClientBalanceReport extends BaseExport { @@ -83,7 +83,7 @@ class ClientBalanceReport extends BaseExport ->where('is_deleted', 0) ->orderBy('balance', 'desc') ->cursor() - ->each(function ($client){ + ->each(function ($client) { $this->csv->insertOne($this->buildRow($client)); @@ -97,8 +97,9 @@ class ClientBalanceReport extends BaseExport { $headers = []; - foreach($this->report_keys as $key) + foreach($this->report_keys as $key) { $headers[] = ctrans("texts.{$key}"); + } return $headers; @@ -119,4 +120,4 @@ class ClientBalanceReport extends BaseExport $client->credit_balance, ]; } -} \ No newline at end of file +} diff --git a/app/Services/Report/ClientSalesReport.php b/app/Services/Report/ClientSalesReport.php index 7bb5b47d8324..66cd6016ca15 100644 --- a/app/Services/Report/ClientSalesReport.php +++ b/app/Services/Report/ClientSalesReport.php @@ -11,16 +11,16 @@ namespace App\Services\Report; -use App\Utils\Ninja; -use App\Utils\Number; +use App\Export\CSV\BaseExport; +use App\Libraries\MultiDB; use App\Models\Client; -use League\Csv\Writer; use App\Models\Company; use App\Models\Invoice; -use App\Libraries\MultiDB; -use App\Export\CSV\BaseExport; +use App\Utils\Ninja; +use App\Utils\Number; use App\Utils\Traits\MakesDates; use Illuminate\Support\Facades\App; +use League\Csv\Writer; class ClientSalesReport extends BaseExport { diff --git a/app/Services/Report/ProfitLoss.php b/app/Services/Report/ProfitLoss.php index b9505848130b..cbdba56c51df 100644 --- a/app/Services/Report/ProfitLoss.php +++ b/app/Services/Report/ProfitLoss.php @@ -11,19 +11,19 @@ namespace App\Services\Report; -use App\Utils\Ninja; -use App\Utils\Number; -use League\Csv\Writer; +use App\Libraries\Currency\Conversion\CurrencyApi; +use App\Libraries\MultiDB; use App\Models\Company; +use App\Models\Currency; use App\Models\Expense; use App\Models\Invoice; use App\Models\Payment; -use App\Models\Currency; -use App\Libraries\MultiDB; -use Illuminate\Support\Str; +use App\Utils\Ninja; +use App\Utils\Number; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; -use App\Libraries\Currency\Conversion\CurrencyApi; +use Illuminate\Support\Str; +use League\Csv\Writer; class ProfitLoss { diff --git a/app/Services/Report/TaxSummaryReport.php b/app/Services/Report/TaxSummaryReport.php index 661f741865cf..aaf313eaf23a 100644 --- a/app/Services/Report/TaxSummaryReport.php +++ b/app/Services/Report/TaxSummaryReport.php @@ -88,16 +88,14 @@ class TaxSummaryReport extends BaseExport $accrual_map = []; $cash_map = []; - foreach($query->cursor() as $invoice) - { + foreach($query->cursor() as $invoice) { $calc = $invoice->calc(); //Combine the line taxes with invoice taxes here to get a total tax amount $taxes = array_merge($calc->getTaxMap()->merge($calc->getTotalTaxMap())->toArray()); //filter into two arrays for accrual + cash - foreach($taxes as $tax) - { + foreach($taxes as $tax) { $key = $tax['name']; if(!isset($accrual_map[$key])) { @@ -113,12 +111,13 @@ class TaxSummaryReport extends BaseExport $cash_map[$key]['tax_amount'] = 0; } - if(in_array($invoice->status_id, [Invoice::STATUS_PARTIAL,Invoice::STATUS_PAID])){ + if(in_array($invoice->status_id, [Invoice::STATUS_PARTIAL,Invoice::STATUS_PAID])) { - if($invoice->status_id == Invoice::STATUS_PAID) - $cash_map[$key]['tax_amount'] += $tax['total']; - else - $cash_map[$key]['tax_amount'] += (($invoice->amount - $invoice->balance) / $invoice->balance) * $tax['total'] ?? 0; + if($invoice->status_id == Invoice::STATUS_PAID) { + $cash_map[$key]['tax_amount'] += $tax['total']; + } else { + $cash_map[$key]['tax_amount'] += (($invoice->amount - $invoice->balance) / $invoice->balance) * $tax['total'] ?? 0; + } } } @@ -130,8 +129,7 @@ class TaxSummaryReport extends BaseExport $this->csv->insertOne($this->buildHeader()); - foreach($accrual_map as $key => $value) - { + foreach($accrual_map as $key => $value) { $this->csv->insertOne([$key, Number::formatMoney($value['tax_amount'], $this->company)]); } diff --git a/app/Services/Report/UserSalesReport.php b/app/Services/Report/UserSalesReport.php index 9780e8a9ec82..f533bc7dc1f1 100644 --- a/app/Services/Report/UserSalesReport.php +++ b/app/Services/Report/UserSalesReport.php @@ -11,16 +11,15 @@ namespace App\Services\Report; -use App\Models\User; -use App\Utils\Ninja; -use App\Utils\Number; -use League\Csv\Writer; +use App\Export\CSV\BaseExport; +use App\Libraries\MultiDB; use App\Models\Company; use App\Models\Invoice; -use App\Libraries\MultiDB; -use App\Export\CSV\BaseExport; +use App\Utils\Ninja; +use App\Utils\Number; use App\Utils\Traits\MakesDates; use Illuminate\Support\Facades\App; +use League\Csv\Writer; class UserSalesReport extends BaseExport { @@ -40,7 +39,7 @@ class UserSalesReport extends BaseExport 'total_taxes', ]; /** - @param array $input + @param array $input [ 'date_range', 'start_date', @@ -83,7 +82,7 @@ class UserSalesReport extends BaseExport $users = $this->company->users; - $report = $users->map(function ($user) use($query){ + $report = $users->map(function ($user) use ($query) { $new_query = $query; $new_query->where('user_id', $user->id); diff --git a/app/Services/Scheduler/EmailRecord.php b/app/Services/Scheduler/EmailRecord.php index 1f5886226faf..9c0b498bb3c3 100644 --- a/app/Services/Scheduler/EmailRecord.php +++ b/app/Services/Scheduler/EmailRecord.php @@ -12,8 +12,8 @@ namespace App\Services\Scheduler; use App\Models\Scheduler; -use Illuminate\Support\Str; use App\Utils\Traits\MakesHash; +use Illuminate\Support\Str; class EmailRecord { @@ -29,8 +29,9 @@ class EmailRecord $entity = $class::find($this->decodePrimaryKey($this->scheduler->parameters['entity_id'])); - if($entity) + if($entity) { $entity->service()->sendEmail(); + } $this->scheduler->forceDelete(); } diff --git a/app/Services/Scheduler/EmailReport.php b/app/Services/Scheduler/EmailReport.php index f1def5d9b61c..9b8acf793445 100644 --- a/app/Services/Scheduler/EmailReport.php +++ b/app/Services/Scheduler/EmailReport.php @@ -11,34 +11,34 @@ namespace App\Services\Scheduler; -use App\Models\Client; -use App\Models\Scheduler; -use App\Mail\DownloadReport; -use App\Export\CSV\TaskExport; -use App\Export\CSV\QuoteExport; -use App\Utils\Traits\MakesHash; use App\Export\CSV\ClientExport; -use App\Export\CSV\CreditExport; -use App\Utils\Traits\MakesDates; 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\InvoiceItemExport; use App\Export\CSV\PaymentExport; use App\Export\CSV\ProductExport; -use App\Jobs\Mail\NinjaMailerJob; -use App\Export\CSV\DocumentExport; -use App\Export\CSV\QuoteItemExport; -use App\Services\Report\ProfitLoss; -use App\Jobs\Mail\NinjaMailerObject; -use App\Export\CSV\InvoiceItemExport; use App\Export\CSV\ProductSalesExport; +use App\Export\CSV\QuoteExport; +use App\Export\CSV\QuoteItemExport; +use App\Export\CSV\RecurringInvoiceExport; +use App\Export\CSV\TaskExport; +use App\Jobs\Mail\NinjaMailerJob; +use App\Jobs\Mail\NinjaMailerObject; +use App\Mail\DownloadReport; +use App\Models\Client; +use App\Models\Scheduler; use App\Services\Report\ARDetailReport; use App\Services\Report\ARSummaryReport; -use App\Services\Report\UserSalesReport; -use App\Services\Report\TaxSummaryReport; -use App\Export\CSV\RecurringInvoiceExport; -use App\Services\Report\ClientSalesReport; use App\Services\Report\ClientBalanceReport; +use App\Services\Report\ClientSalesReport; +use App\Services\Report\ProfitLoss; +use App\Services\Report\TaxSummaryReport; +use App\Services\Report\UserSalesReport; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; class EmailReport { @@ -76,8 +76,7 @@ class EmailReport $export = false; - match($this->scheduler->parameters['report_name']) - { + match($this->scheduler->parameters['report_name']) { 'product_sales' => $export = (new ProductSalesExport($this->scheduler->company, $data)), 'ar_detailed' => $export = (new ARDetailReport($this->scheduler->company, $data)), 'ar_summary' => $export = (new ARSummaryReport($this->scheduler->company, $data)), diff --git a/app/Services/Scheduler/SchedulerService.php b/app/Services/Scheduler/SchedulerService.php index ddf327ab35a1..d870a1cf3fde 100644 --- a/app/Services/Scheduler/SchedulerService.php +++ b/app/Services/Scheduler/SchedulerService.php @@ -12,9 +12,8 @@ namespace App\Services\Scheduler; use App\Models\Scheduler; -use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesDates; -use App\Services\Scheduler\EmailReport; +use App\Utils\Traits\MakesHash; class SchedulerService { diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index a9707222d9ea..e2e331b3f6dd 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -234,8 +234,9 @@ class SubscriptionService // Redirects from here work just fine. Livewire will respect it. $client_contact = ClientContact::find($this->decodePrimaryKey($data['contact_id'])); - if(is_string($data['client_id'])) + if(is_string($data['client_id'])) { $data['client_id'] = $this->decodePrimaryKey($data['client_id']); + } if (!$this->subscription->trial_enabled) { return new \Exception("Trials are disabled for this product"); @@ -788,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}"); @@ -969,7 +970,7 @@ class SubscriptionService ->fillDefaults() ->save(); - if($invoice->fresh()->balance == 0){ + if($invoice->fresh()->balance == 0) { $invoice->service()->markPaid()->save(); } diff --git a/app/Services/Subscription/ZeroCostProduct.php b/app/Services/Subscription/ZeroCostProduct.php index b73cc146cf93..245419edfdca 100644 --- a/app/Services/Subscription/ZeroCostProduct.php +++ b/app/Services/Subscription/ZeroCostProduct.php @@ -79,8 +79,9 @@ class ZeroCostProduct extends AbstractService 'redirect_url' => "/client/recurring_invoices/{$recurring_invoice->hashed_id}", ]; - if(isset($this->data['campaign'])) + if(isset($this->data['campaign'])) { $context['campaign'] = $this->data['campaign']; + } return $context; } diff --git a/app/Services/Tax/Providers/TaxProvider.php b/app/Services/Tax/Providers/TaxProvider.php index 00b540bbc0a4..1136b226e093 100644 --- a/app/Services/Tax/Providers/TaxProvider.php +++ b/app/Services/Tax/Providers/TaxProvider.php @@ -13,7 +13,6 @@ namespace App\Services\Tax\Providers; use App\Models\Client; use App\Models\Company; -use App\Services\Tax\Providers\EuTax; class TaxProvider { @@ -78,7 +77,7 @@ class TaxProvider try { - $this->configureProvider($this->provider, $this->company->country()->iso_3166_2); //hard coded for now to one provider, but we'll be able to swap these out later + $this->configureProvider($this->provider, $this->company->country()->iso_3166_2); //hard coded for now to one provider, but we'll be able to swap these out later $company_details = [ 'address2' => $this->company->settings->address2, @@ -101,8 +100,7 @@ class TaxProvider $this->updated_client = true; } - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog("Could not updated company tax data: " . $e->getMessage()); } @@ -165,8 +163,9 @@ class TaxProvider private function taxShippingAddress(): bool { - if($this->client->shipping_country_id == "840" && strlen($this->client->shipping_postal_code) > 3) + if($this->client->shipping_country_id == "840" && strlen($this->client->shipping_postal_code) > 3) { return true; + } return false; @@ -182,7 +181,7 @@ class TaxProvider private function configureProvider(?string $provider, string $country_code): self { - match($country_code){ + match($country_code) { 'US' => $this->configureZipTax(), "AT" => $this->configureEuTax(), "BE" => $this->configureEuTax(), @@ -251,8 +250,9 @@ class TaxProvider */ private function configureZipTax(): self { - if(!config('services.tax.zip_tax.key')) + if(!config('services.tax.zip_tax.key')) { throw new \Exception("ZipTax API key not set in .env file"); + } $this->api_credentials = config('services.tax.zip_tax.key'); @@ -262,4 +262,4 @@ class TaxProvider } -} \ No newline at end of file +} diff --git a/app/Services/Tax/Providers/ZipTax.php b/app/Services/Tax/Providers/ZipTax.php index dad7ef0768fc..fa8e1bb31f4f 100644 --- a/app/Services/Tax/Providers/ZipTax.php +++ b/app/Services/Tax/Providers/ZipTax.php @@ -31,15 +31,16 @@ class ZipTax implements TaxProviderInterface $response = $this->callApi(['key' => $this->api_key, 'address' => $string_address]); - if($response->successful()){ + if($response->successful()) { return $this->parseResponse($response->json()); } if(isset($this->address['postal_code'])) { - $response = $this->callApi(['key' => $this->api_key, 'address' => $this->address['postal_code']]); + $response = $this->callApi(['key' => $this->api_key, 'address' => $this->address['postal_code']]); - if($response->successful()) + if($response->successful()) { return $this->parseResponse($response->json()); + } } @@ -69,11 +70,13 @@ class ZipTax implements TaxProviderInterface private function parseResponse($response) { - if(isset($response['rCode']) && $response['rCode'] == 100 && isset($response['results']['0'])) + if(isset($response['rCode']) && $response['rCode'] == 100 && isset($response['results']['0'])) { return $response['results']['0']; + } - if(isset($response['rCode']) && class_exists(\Modules\Admin\Events\TaxProviderException::class)) + if(isset($response['rCode']) && class_exists(\Modules\Admin\Events\TaxProviderException::class)) { event(new \Modules\Admin\Events\TaxProviderException($response['rCode'])); + } return null; diff --git a/app/Services/Tax/TaxService.php b/app/Services/Tax/TaxService.php index d724e175ac88..b81bdaa065d0 100644 --- a/app/Services/Tax/TaxService.php +++ b/app/Services/Tax/TaxService.php @@ -37,13 +37,13 @@ class TaxService $this->client->has_valid_vat_number = true; - if(!$this->client->name && strlen($vat_check->getName()) > 2) { - $this->client->name = $vat_check->getName(); - } + if(!$this->client->name && strlen($vat_check->getName()) > 2) { + $this->client->name = $vat_check->getName(); + } - if(empty($this->client->private_notes) && strlen($vat_check->getAddress()) > 2) { - $this->client->private_notes = $vat_check->getAddress(); - } + if(empty($this->client->private_notes) && strlen($vat_check->getAddress()) > 2) { + $this->client->private_notes = $vat_check->getAddress(); + } $this->client->saveQuietly(); } @@ -56,4 +56,4 @@ class TaxService { } -} \ No newline at end of file +} diff --git a/app/Services/Tax/VatNumberCheck.php b/app/Services/Tax/VatNumberCheck.php index 61c5f2bb5073..e7f7cf58737c 100644 --- a/app/Services/Tax/VatNumberCheck.php +++ b/app/Services/Tax/VatNumberCheck.php @@ -48,7 +48,7 @@ class VatNumberCheck } } catch (\SoapFault $e) { - $this->response = ['valid' => false, 'error' => $e->getMessage()]; + $this->response = ['valid' => false, 'error' => $e->getMessage()]; } return $this; diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index c1a8ebbd1054..2c753a754d1c 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -11,34 +11,33 @@ namespace App\Services\Template; -use App\Models\Task; -use App\Models\User; -use App\Models\Quote; +use App\Libraries\MultiDB; 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\Expense; use App\Models\Invoice; use App\Models\Payment; use App\Models\Product; use App\Models\Project; -use App\Libraries\MultiDB; use App\Models\PurchaseOrder; -use Illuminate\Bus\Queueable; -use App\Utils\Traits\MakesHash; +use App\Models\Quote; use App\Models\RecurringInvoice; +use App\Models\Task; +use App\Models\User; +use App\Models\Vendor; use App\Services\Email\AdminEmail; use App\Services\Email\EmailObject; -use Illuminate\Mail\Mailables\Address; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; +use App\Utils\Traits\MakesHash; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Contracts\Database\Eloquent\Builder; +use Illuminate\Mail\Mailables\Address; +use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Storage; class TemplateAction implements ShouldQueue { @@ -55,18 +54,19 @@ class TemplateAction implements ShouldQueue * @param int $user_id requesting the template * @param string $db The database name * @param bool $send_email Determines whether to send an email - * + * * @return void */ - public function __construct(public array $ids, - private string $template, - private string $entity, - private int $user_id, - private Company $company, - private string $db, - private string $hash, - private bool $send_email = false) - { + public function __construct( + public array $ids, + private string $template, + private string $entity, + private int $user_id, + private Company $company, + private string $db, + private string $hash, + private bool $send_email = false + ) { } /** @@ -74,7 +74,7 @@ class TemplateAction implements ShouldQueue * */ public function handle() - { + { // nlog("inside template action"); MultiDB::setDb($this->db); @@ -87,7 +87,7 @@ class TemplateAction implements ShouldQueue $template_service = new TemplateService($template); - match($this->entity){ + match($this->entity) { Invoice::class => $resource->with('payments', 'client'), Quote::class => $resource->with('client'), Task::class => $resource->with('client'), @@ -103,10 +103,11 @@ class TemplateAction implements ShouldQueue ->where('company_id', $this->company->id) ->get(); - if($result->count() <= 1) + if($result->count() <= 1) { $data[$key] = collect($result); - else + } else { $data[$key] = $result; + } $ts = $template_service->build($data); @@ -115,8 +116,7 @@ class TemplateAction implements ShouldQueue if($this->send_email) { $pdf = $ts->getPdf(); $this->sendEmail($pdf, $template); - } - else { + } else { $pdf = $ts->getPdf(); $filename = "templates/{$this->hash}.pdf"; Storage::disk(config('filesystems.default'))->put($filename, $pdf); @@ -147,10 +147,10 @@ class TemplateAction implements ShouldQueue /** * Context - * + * * If I have an array of invoices, what could I possib - * - * + * + * */ private function resolveEntityString() { @@ -177,6 +177,3 @@ class TemplateAction implements ShouldQueue } } - - - diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index af129c400c6d..400276a217e0 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -69,9 +69,9 @@ class TemplateMock * @return array */ private function createVariables(string $type): array - { + { $data = [ - 'entity_type' => rtrim($type,"s"), + 'entity_type' => rtrim($type, "s"), 'design' => '', 'settings_type' => 'company', 'settings' => $this->company->settings, @@ -85,4 +85,4 @@ class TemplateMock } -} \ No newline at end of file +} diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 6ca56d0bdde3..637653300177 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,38 +11,38 @@ namespace App\Services\Template; -use Twig\TwigFilter; -use App\Utils\Number; -use Twig\Environment; -use Twig\Error\Error; use App\Models\Client; -use App\Models\Design; -use Twig\TwigFunction; use App\Models\Company; +use App\Models\Design; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; -use App\Utils\HtmlEngine; -use League\Fractal\Manager; -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\Transformers\ProjectTransformer; +use App\Transformers\PurchaseOrderTransformer; +use App\Transformers\QuoteTransformer; +use App\Transformers\TaskTransformer; +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 Twig\Loader\FilesystemLoader; use App\Utils\Traits\Pdf\PdfMaker; -use Twig\Extension\DebugExtension; -use Twig\Extra\Intl\IntlExtension; -use App\Transformers\TaskTransformer; -use App\Transformers\QuoteTransformer; -use App\Transformers\ProjectTransformer; -use Twig\Extension\StringLoaderExtension; -use App\Transformers\PurchaseOrderTransformer; +use App\Utils\VendorHtmlEngine; +use League\Fractal\Manager; use League\Fractal\Serializer\ArraySerializer; +use Twig\Environment; +use Twig\Error\Error; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; +use Twig\Error\SyntaxError; +use Twig\Extension\DebugExtension; +use Twig\Extension\StringLoaderExtension; +use Twig\Extra\Intl\IntlExtension; +use Twig\Loader\FilesystemLoader; +use Twig\Sandbox\SecurityError; +use Twig\TwigFilter; +use Twig\TwigFunction; class TemplateService { diff --git a/app/Transformers/ActivityTransformer.php b/app/Transformers/ActivityTransformer.php index 9c910daae682..6d8f465f1e95 100644 --- a/app/Transformers/ActivityTransformer.php +++ b/app/Transformers/ActivityTransformer.php @@ -11,24 +11,22 @@ namespace App\Transformers; -use App\Models\Task; -use App\Models\User; -use App\Models\Quote; +use App\Models\Activity; use App\Models\Backup; use App\Models\Client; +use App\Models\ClientContact; use App\Models\Credit; -use App\Models\Vendor; use App\Models\Expense; use App\Models\Invoice; use App\Models\Payment; -use App\Models\Activity; -use App\Models\ClientContact; use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Models\RecurringInvoice; +use App\Models\Task; +use App\Models\User; +use App\Models\Vendor; use App\Models\VendorContact; use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -use App\Transformers\EntityTransformer; -use App\Transformers\InvoiceHistoryTransformer; class ActivityTransformer extends EntityTransformer { diff --git a/app/Transformers/BankIntegrationTransformer.php b/app/Transformers/BankIntegrationTransformer.php index c414e76f466d..7757ee7559e7 100644 --- a/app/Transformers/BankIntegrationTransformer.php +++ b/app/Transformers/BankIntegrationTransformer.php @@ -12,11 +12,10 @@ namespace App\Transformers; use App\Models\Account; -use App\Models\Company; use App\Models\BankIntegration; use App\Models\BankTransaction; +use App\Models\Company; use App\Utils\Traits\MakesHash; -use App\Transformers\EntityTransformer; /** * Class BankIntegrationTransformer. diff --git a/app/Transformers/BankTransactionRuleTransformer.php b/app/Transformers/BankTransactionRuleTransformer.php index 9b9b71ed65a4..ca3bf7262acd 100644 --- a/app/Transformers/BankTransactionRuleTransformer.php +++ b/app/Transformers/BankTransactionRuleTransformer.php @@ -11,7 +11,6 @@ namespace App\Transformers; -use App\Models\BankTransaction; use App\Models\BankTransactionRule; use App\Models\Client; use App\Models\Company; diff --git a/app/Transformers/BankTransactionTransformer.php b/app/Transformers/BankTransactionTransformer.php index dd9484c13542..401d5a0a1eb8 100644 --- a/app/Transformers/BankTransactionTransformer.php +++ b/app/Transformers/BankTransactionTransformer.php @@ -11,11 +11,11 @@ namespace App\Transformers; -use App\Models\Vendor; +use App\Models\BankTransaction; use App\Models\Company; use App\Models\Expense; use App\Models\Payment; -use App\Models\BankTransaction; +use App\Models\Vendor; use App\Utils\Traits\MakesHash; /** diff --git a/app/Transformers/ClientTransformer.php b/app/Transformers/ClientTransformer.php index 4cfb7742b3e4..8bbddfa9f257 100644 --- a/app/Transformers/ClientTransformer.php +++ b/app/Transformers/ClientTransformer.php @@ -20,7 +20,6 @@ use App\Models\Document; use App\Models\GroupSetting; use App\Models\SystemLog; use App\Utils\Traits\MakesHash; -use League\Fractal\Resource\Collection; use stdClass; /** @@ -100,8 +99,9 @@ class ClientTransformer extends EntityTransformer public function includeGroupSettings(Client $client) { - if (!$client->group_settings) + if (!$client->group_settings) { return null; + } $transformer = new GroupSettingTransformer($this->serializer); diff --git a/app/Transformers/CompanyGatewayTransformer.php b/app/Transformers/CompanyGatewayTransformer.php index 9a0fd943d17b..768e8f903b5f 100644 --- a/app/Transformers/CompanyGatewayTransformer.php +++ b/app/Transformers/CompanyGatewayTransformer.php @@ -11,12 +11,12 @@ namespace App\Transformers; -use stdClass; +use App\Models\CompanyGateway; use App\Models\Gateway; use App\Models\SystemLog; -use App\Models\CompanyGateway; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\SoftDeletes; +use stdClass; /** * Class CompanyGatewayTransformer. diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index c3e9f2564193..c7d56e27f52b 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -11,43 +11,43 @@ namespace App\Transformers; -use stdClass; -use App\Models\Task; -use App\Models\User; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Design; -use App\Models\Vendor; use App\Models\Account; -use App\Models\Company; -use App\Models\Expense; -use App\Models\Invoice; -use App\Models\Payment; -use App\Models\Product; -use App\Models\Project; -use App\Models\TaxRate; -use App\Models\Webhook; use App\Models\Activity; -use App\Models\Document; -use App\Models\Scheduler; -use App\Models\SystemLog; -use App\Models\TaskStatus; -use App\Models\CompanyUser; -use App\Models\PaymentTerm; -use App\Models\CompanyToken; -use App\Models\GroupSetting; -use App\Models\Subscription; -use App\Models\CompanyLedger; -use App\Models\PurchaseOrder; -use App\Models\CompanyGateway; use App\Models\BankIntegration; use App\Models\BankTransaction; +use App\Models\BankTransactionRule; +use App\Models\Client; +use App\Models\Company; +use App\Models\CompanyGateway; +use App\Models\CompanyLedger; +use App\Models\CompanyToken; +use App\Models\CompanyUser; +use App\Models\Credit; +use App\Models\Design; +use App\Models\Document; +use App\Models\Expense; use App\Models\ExpenseCategory; -use App\Utils\Traits\MakesHash; +use App\Models\GroupSetting; +use App\Models\Invoice; +use App\Models\Payment; +use App\Models\PaymentTerm; +use App\Models\Product; +use App\Models\Project; +use App\Models\PurchaseOrder; +use App\Models\Quote; use App\Models\RecurringExpense; use App\Models\RecurringInvoice; -use App\Models\BankTransactionRule; +use App\Models\Scheduler; +use App\Models\Subscription; +use App\Models\SystemLog; +use App\Models\Task; +use App\Models\TaskStatus; +use App\Models\TaxRate; +use App\Models\User; +use App\Models\Vendor; +use App\Models\Webhook; +use App\Utils\Traits\MakesHash; +use stdClass; /** * Class CompanyTransformer. @@ -213,8 +213,7 @@ class CompanyTransformer extends EntityTransformer $user = auth()->user(); //if the user is attached to more than one company AND they are not an admin across all companies - if ($company->is_large || ($user->company_users()->count() > 1 && ($user->company_users()->where('is_admin', 1)->count() != $user->company_users()->count()))) - { + if ($company->is_large || ($user->company_users()->count() > 1 && ($user->company_users()->where('is_admin', 1)->count() != $user->company_users()->count()))) { return true; } diff --git a/app/Transformers/CreditTransformer.php b/app/Transformers/CreditTransformer.php index c6e296316043..9a720f9fb426 100644 --- a/app/Transformers/CreditTransformer.php +++ b/app/Transformers/CreditTransformer.php @@ -11,13 +11,13 @@ namespace App\Transformers; +use App\Models\Activity; use App\Models\Backup; use App\Models\Client; use App\Models\Credit; -use App\Models\Activity; +use App\Models\CreditInvitation; use App\Models\Document; use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; use League\Fractal\Resource\Item; class CreditTransformer extends EntityTransformer diff --git a/app/Transformers/ExpenseTransformer.php b/app/Transformers/ExpenseTransformer.php index 760f35909c52..aa13889a9298 100644 --- a/app/Transformers/ExpenseTransformer.php +++ b/app/Transformers/ExpenseTransformer.php @@ -12,15 +12,14 @@ namespace App\Transformers; use App\Models\Client; -use App\Models\Vendor; -use App\Models\Expense; -use App\Models\Invoice; use App\Models\Document; +use App\Models\Expense; use App\Models\ExpenseCategory; +use App\Models\Invoice; +use App\Models\Vendor; use App\Utils\Traits\MakesHash; -use League\Fractal\Resource\Item; use Illuminate\Database\Eloquent\SoftDeletes; -use App\Transformers\ExpenseCategoryTransformer; +use League\Fractal\Resource\Item; /** * class ExpenseTransformer. diff --git a/app/Transformers/PaymentTransformer.php b/app/Transformers/PaymentTransformer.php index 99a50547fc15..0f37438bce7e 100644 --- a/app/Transformers/PaymentTransformer.php +++ b/app/Transformers/PaymentTransformer.php @@ -13,9 +13,9 @@ namespace App\Transformers; use App\Models\Client; use App\Models\Credit; +use App\Models\Document; use App\Models\Invoice; use App\Models\Payment; -use App\Models\Document; use App\Models\Paymentable; use App\Models\PaymentType; use App\Utils\Traits\MakesHash; diff --git a/app/Transformers/ProductTransformer.php b/app/Transformers/ProductTransformer.php index bab47b6f7940..cc28edc2ed1d 100644 --- a/app/Transformers/ProductTransformer.php +++ b/app/Transformers/ProductTransformer.php @@ -16,7 +16,6 @@ use App\Models\Document; use App\Models\Product; use App\Models\User; use App\Utils\Traits\MakesHash; -use League\Fractal\Resource\Collection; class ProductTransformer extends EntityTransformer { @@ -95,7 +94,7 @@ class ProductTransformer extends EntityTransformer 'stock_notification_threshold' => (int) $product->stock_notification_threshold, 'max_quantity' => (int) $product->max_quantity, 'product_image' => (string) $product->product_image ?: '', - 'tax_id' => (string) $product->tax_id ?: '1', + 'tax_id' => (string) $product->tax_id ?: '1', ]; } } diff --git a/app/Transformers/PurchaseOrderTransformer.php b/app/Transformers/PurchaseOrderTransformer.php index b960def78940..8404dd56d7f9 100644 --- a/app/Transformers/PurchaseOrderTransformer.php +++ b/app/Transformers/PurchaseOrderTransformer.php @@ -11,14 +11,14 @@ namespace App\Transformers; -use App\Models\Backup; -use App\Models\Vendor; -use App\Models\Expense; use App\Models\Activity; +use App\Models\Backup; use App\Models\Document; +use App\Models\Expense; use App\Models\PurchaseOrder; -use App\Utils\Traits\MakesHash; use App\Models\PurchaseOrderInvitation; +use App\Models\Vendor; +use App\Utils\Traits\MakesHash; class PurchaseOrderTransformer extends EntityTransformer { diff --git a/app/Transformers/QuoteTransformer.php b/app/Transformers/QuoteTransformer.php index 4d4cf0ced301..649b9995e24c 100644 --- a/app/Transformers/QuoteTransformer.php +++ b/app/Transformers/QuoteTransformer.php @@ -11,11 +11,11 @@ namespace App\Transformers; -use App\Models\Quote; +use App\Models\Activity; use App\Models\Backup; use App\Models\Client; -use App\Models\Activity; use App\Models\Document; +use App\Models\Quote; use App\Models\QuoteInvitation; use App\Utils\Traits\MakesHash; use League\Fractal\Resource\Item; diff --git a/app/Transformers/RecurringExpenseTransformer.php b/app/Transformers/RecurringExpenseTransformer.php index 4b48e8654e55..2988115b3813 100644 --- a/app/Transformers/RecurringExpenseTransformer.php +++ b/app/Transformers/RecurringExpenseTransformer.php @@ -12,12 +12,12 @@ namespace App\Transformers; use App\Models\Client; -use App\Models\Vendor; use App\Models\Document; -use App\Utils\Traits\MakesHash; use App\Models\RecurringExpense; -use League\Fractal\Resource\Item; +use App\Models\Vendor; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\SoftDeletes; +use League\Fractal\Resource\Item; /** * class RecurringExpenseTransformer. diff --git a/app/Transformers/TaskTransformer.php b/app/Transformers/TaskTransformer.php index 5791fa3e5807..131789b32ff6 100644 --- a/app/Transformers/TaskTransformer.php +++ b/app/Transformers/TaskTransformer.php @@ -11,13 +11,13 @@ namespace App\Transformers; -use App\Models\Task; -use App\Models\User; use App\Models\Client; +use App\Models\Document; use App\Models\Invoice; use App\Models\Project; -use App\Models\Document; +use App\Models\Task; use App\Models\TaskStatus; +use App\Models\User; use App\Utils\Traits\MakesHash; use League\Fractal\Resource\Item; diff --git a/app/Transformers/UserTransformer.php b/app/Transformers/UserTransformer.php index 0971c7dc2b02..c0274a3e81a7 100644 --- a/app/Transformers/UserTransformer.php +++ b/app/Transformers/UserTransformer.php @@ -97,7 +97,7 @@ class UserTransformer extends EntityTransformer } /** - * + * * @param User $user */ public function includeCompanyUser(User $user) diff --git a/app/Transformers/VendorTransformer.php b/app/Transformers/VendorTransformer.php index 537c98f62f0d..aa3a28669234 100644 --- a/app/Transformers/VendorTransformer.php +++ b/app/Transformers/VendorTransformer.php @@ -16,7 +16,6 @@ use App\Models\Document; use App\Models\Vendor; use App\Models\VendorContact; use App\Utils\Traits\MakesHash; -use League\Fractal\Resource\Collection; /** * class VendorTransformer. diff --git a/app/Utils/Helpers.php b/app/Utils/Helpers.php index 0debc7da4219..0bbbca13d219 100644 --- a/app/Utils/Helpers.php +++ b/app/Utils/Helpers.php @@ -68,7 +68,7 @@ class Helpers $quote_or_credit_field = true; - }elseif($custom_fields && stripos($field, 'credit') !== false && property_exists($custom_fields, $field)) { + } elseif($custom_fields && stripos($field, 'credit') !== false && property_exists($custom_fields, $field)) { $custom_field = $custom_fields->{$field}; $custom_field_parts = explode('|', $custom_field); @@ -78,9 +78,9 @@ class Helpers $quote_or_credit_field = true; - }elseif($custom_fields && stripos($field, 'credit') !== false) { + } elseif($custom_fields && stripos($field, 'credit') !== false) { $field = str_replace("credit", "invoice", $field); - }elseif($custom_fields && stripos($field, 'quote') !== false) { + } elseif($custom_fields && stripos($field, 'quote') !== false) { $field = str_replace("quote", "invoice", $field); } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 96425e3ecd0a..e896780c1b11 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -12,22 +12,22 @@ namespace App\Utils; -use Exception; +use App\Helpers\Epc\EpcQrGenerator; +use App\Helpers\SwissQr\SwissQrGenerator; use App\Models\Account; use App\Models\Country; -use App\Models\GatewayType; -use App\Utils\Traits\AppSetup; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; use App\Models\CreditInvitation; -use App\Utils\Traits\MakesDates; +use App\Models\GatewayType; use App\Models\InvoiceInvitation; -use App\Helpers\Epc\EpcQrGenerator; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoiceInvitation; +use App\Utils\Traits\AppSetup; +use App\Utils\Traits\DesignCalculator; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; +use Exception; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Cache; -use App\Utils\Traits\DesignCalculator; -use App\Helpers\SwissQr\SwissQrGenerator; -use App\Models\RecurringInvoiceInvitation; class HtmlEngine { @@ -717,7 +717,7 @@ class HtmlEngine $tax_label .= ctrans('texts.reverse_tax_info') . "
"; } - if((int)$this->client->country_id !== (int)$this->company->settings->country_id){ + if((int)$this->client->country_id !== (int)$this->company->settings->country_id) { $tax_label .= ctrans('texts.intracommunity_tax_info') . "
"; } @@ -726,7 +726,7 @@ class HtmlEngine private function getBalance() { - if($this->entity->status_id == 1){ + if($this->entity->status_id == 1) { return $this->entity->amount; } @@ -753,7 +753,7 @@ class HtmlEngine $values = $this->buildEntityDataArray(); foreach ($values as $key => $value) { - $data[str_replace(["$","."],["_","_"],$key)] = $value['value']; + $data[str_replace(["$","."], ["_","_"], $key)] = $value['value']; } return $data; @@ -1038,8 +1038,8 @@ html { $container = $dom->createElement('div'); $container->setAttribute('style', 'display:grid; grid-auto-flow: row; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr);justify-items: center;'); - foreach ($this->entity->documents()->where('is_public',true)->get() as $document) { - if (!$document->isImage()) { + foreach ($this->entity->documents()->where('is_public', true)->get() as $document) { + if (!$document->isImage()) { continue; } diff --git a/app/Utils/Ninja.php b/app/Utils/Ninja.php index ce03dfefc3b9..d25f23ed4aaf 100644 --- a/app/Utils/Ninja.php +++ b/app/Utils/Ninja.php @@ -164,8 +164,7 @@ class Ninja ]); nlog($x->body()); - } - catch (\Exception $e) { + } catch (\Exception $e) { nlog("Attempt forwarding for {$email} - {$company_key} Failed"); } } diff --git a/app/Utils/TemplateEngine.php b/app/Utils/TemplateEngine.php index 4bd3b8310a26..b65392118765 100644 --- a/app/Utils/TemplateEngine.php +++ b/app/Utils/TemplateEngine.php @@ -12,29 +12,27 @@ namespace App\Utils; -use DB; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Vendor; -use App\Models\Invoice; -use App\Models\Payment; -use Illuminate\Support\Str; -use App\Models\ClientContact; -use App\Models\PurchaseOrder; -use App\Models\VendorContact; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -use App\Models\InvoiceInvitation; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\MakesInvoiceHtml; -use App\Mail\Engine\PaymentEmailEngine; -use App\Models\PurchaseOrderInvitation; -use App\Utils\Traits\MakesTemplateData; use App\DataMapper\EmailTemplateDefaults; -use League\CommonMark\CommonMarkConverter; +use App\Mail\Engine\PaymentEmailEngine; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; +use App\Models\Payment; +use App\Models\PurchaseOrder; +use App\Models\PurchaseOrderInvitation; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Models\Vendor; +use App\Models\VendorContact; use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\Traits\MakesTemplateData; +use DB; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Str; +use League\CommonMark\CommonMarkConverter; class TemplateEngine { @@ -106,11 +104,10 @@ class TemplateEngine } elseif (stripos($this->template, 'purchase') !== false && $purchase_order = PurchaseOrder::query()->whereHas('invitations')->withTrashed()->company()->first()) { $this->entity = 'purchase_order'; $this->entity_obj = $purchase_order; - }elseif (stripos($this->template, 'payment') !== false && $payment = Payment::query()->withTrashed()->company()->first()) { + } elseif (stripos($this->template, 'payment') !== false && $payment = Payment::query()->withTrashed()->company()->first()) { $this->entity = 'payment'; $this->entity_obj = $payment; - } - elseif ($invoice = Invoice::query()->whereHas('invitations')->withTrashed()->company()->first()) { + } elseif ($invoice = Invoice::query()->whereHas('invitations')->withTrashed()->company()->first()) { /** @var \App\Models\Invoice $invoice */ $this->entity_obj = $invoice; } else { diff --git a/app/Utils/Traits/CleanLineItems.php b/app/Utils/Traits/CleanLineItems.php index 8c6a79b85478..8ccb07d02922 100644 --- a/app/Utils/Traits/CleanLineItems.php +++ b/app/Utils/Traits/CleanLineItems.php @@ -64,13 +64,13 @@ trait CleanLineItems if (! array_key_exists('tax_id', $item)) { $item['tax_id'] = '1'; - } - elseif(array_key_exists('tax_id', $item) && $item['tax_id'] == '') { + } elseif(array_key_exists('tax_id', $item) && $item['tax_id'] == '') { - if($item['type_id'] == '2') + if($item['type_id'] == '2') { $item['tax_id'] = '2'; - else + } else { $item['tax_id'] = '1'; + } } diff --git a/app/Utils/Traits/ClientGroupSettingsSaver.php b/app/Utils/Traits/ClientGroupSettingsSaver.php index abfb40989107..2d32b3468417 100644 --- a/app/Utils/Traits/ClientGroupSettingsSaver.php +++ b/app/Utils/Traits/ClientGroupSettingsSaver.php @@ -86,7 +86,7 @@ trait ClientGroupSettingsSaver unset($settings->translations); } - foreach(['translations','pdf_variables'] as $key){ + foreach(['translations','pdf_variables'] as $key) { if (property_exists($settings, $key)) { unset($settings->{$key}); } diff --git a/app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php b/app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php index 2b4a894094f1..d5b664824890 100644 --- a/app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php +++ b/app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php @@ -63,7 +63,7 @@ trait CompanyGatewayFeesAndLimitsSaver case 'float': case 'double': return ! is_string($value) && (is_float($value) || is_numeric(strval($value))); - // return is_float($value) || is_numeric(strval($value)); + // return is_float($value) || is_numeric(strval($value)); case 'string': return (is_string($value) && method_exists($value, '__toString')) || is_null($value) || is_string($value); case 'bool': diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/CompanySettingsSaver.php index 9354c7036435..043d8db5c93f 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/CompanySettingsSaver.php @@ -11,11 +11,10 @@ namespace App\Utils\Traits; -use stdClass; -use App\Utils\Ninja; -use App\Models\Company; use App\DataMapper\CompanySettings; use App\Jobs\Company\CompanyTaxRate; +use App\Models\Company; +use stdClass; /** * Class CompanySettingsSaver. @@ -88,18 +87,16 @@ trait CompanySettingsSaver $entity->settings = $company_settings; - if($entity?->calculate_taxes && $company_settings->country_id == "840" && array_key_exists('settings', $entity->getDirty()) && !$entity?->account->isFreeHostedClient()) - { + if($entity?->calculate_taxes && $company_settings->country_id == "840" && array_key_exists('settings', $entity->getDirty()) && !$entity?->account->isFreeHostedClient()) { $old_settings = $entity->getOriginal()['settings']; /** Monitor changes of the Postal code */ - if($old_settings->postal_code != $company_settings->postal_code) + if($old_settings->postal_code != $company_settings->postal_code) { CompanyTaxRate::dispatch($entity); + } - } - elseif( $entity?->calculate_taxes && $company_settings->country_id == "840" && array_key_exists('calculate_taxes', $entity->getDirty()) && $entity->getOriginal('calculate_taxes') == 0 && !$entity?->account->isFreeHostedClient()) - { + } elseif($entity?->calculate_taxes && $company_settings->country_id == "840" && array_key_exists('calculate_taxes', $entity->getDirty()) && $entity->getOriginal('calculate_taxes') == 0 && !$entity?->account->isFreeHostedClient()) { CompanyTaxRate::dispatch($entity); } @@ -141,7 +138,7 @@ trait CompanySettingsSaver $value = 'integer'; if(in_array($key, $this->string_ids)) { - // if ($key == 'besr_id') { + // if ($key == 'besr_id') { $value = 'string'; } @@ -280,7 +277,7 @@ trait CompanySettingsSaver case 'float': case 'double': return ! is_string($value) && (is_float($value) || is_numeric(strval($value))); -// return is_float($value) || is_numeric(strval($value)); + // return is_float($value) || is_numeric(strval($value)); case 'string': return (is_string($value) && method_exists($value, '__toString')) || is_null($value) || is_string($value); case 'bool': diff --git a/app/Utils/Traits/MakesDates.php b/app/Utils/Traits/MakesDates.php index 69ccb7a8b3c4..a33afbd19fde 100644 --- a/app/Utils/Traits/MakesDates.php +++ b/app/Utils/Traits/MakesDates.php @@ -11,11 +11,11 @@ namespace App\Utils\Traits; +use App\DataMapper\Schedule\EmailStatement; +use App\Models\Company; +use Carbon\Carbon; use DateTime; use DateTimeZone; -use Carbon\Carbon; -use App\Models\Company; -use App\DataMapper\Schedule\EmailStatement; /** * Class MakesDates. @@ -127,8 +127,9 @@ trait MakesDates $first_month_of_year = $company ? $company?->first_month_of_year : 1; $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->subYearNoOverflow(); + } } @@ -161,4 +162,4 @@ trait MakesDates }; } -} \ No newline at end of file +} diff --git a/app/Utils/Traits/MakesInvoiceValues.php b/app/Utils/Traits/MakesInvoiceValues.php index 69c44fff9f82..764be096900b 100644 --- a/app/Utils/Traits/MakesInvoiceValues.php +++ b/app/Utils/Traits/MakesInvoiceValues.php @@ -578,7 +578,7 @@ html { '; $css .= 'font-size:'.$settings->font_size.'px;'; -// $css .= 'font-size:14px;'; + // $css .= 'font-size:14px;'; $css .= '}'; diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 2f3de1aebb2d..4ef6a7368322 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -16,7 +16,7 @@ use Illuminate\Support\Carbon; /** * Class MakesReminders. - * + * */ trait MakesReminders { diff --git a/app/Utils/Traits/SettingsSaver.php b/app/Utils/Traits/SettingsSaver.php index 5c06b4481edc..71877bad3161 100644 --- a/app/Utils/Traits/SettingsSaver.php +++ b/app/Utils/Traits/SettingsSaver.php @@ -64,7 +64,7 @@ trait SettingsSaver $value = 'integer'; if(in_array($key, $this->string_ids)) { - // if ($key == 'gmail_sending_user_id' || $key == 'besr_id') { + // if ($key == 'gmail_sending_user_id' || $key == 'besr_id') { $value = 'string'; } diff --git a/app/Utils/TranslationHelper.php b/app/Utils/TranslationHelper.php index 15850f62e445..20ffbd984ecb 100644 --- a/app/Utils/TranslationHelper.php +++ b/app/Utils/TranslationHelper.php @@ -11,8 +11,8 @@ namespace App\Utils; -use App\Models\PaymentTerm; use \Illuminate\Support\Facades\Cache; +use App\Models\PaymentTerm; use Illuminate\Support\Str; class TranslationHelper diff --git a/app/Utils/VendorHtmlEngine.php b/app/Utils/VendorHtmlEngine.php index 7bd05d75924c..8a7fddfbbe22 100644 --- a/app/Utils/VendorHtmlEngine.php +++ b/app/Utils/VendorHtmlEngine.php @@ -12,19 +12,19 @@ namespace App\Utils; -use Exception; use App\Models\Account; use App\Models\Country; -use App\Utils\Traits\AppSetup; -use App\Models\QuoteInvitation; use App\Models\CreditInvitation; -use App\Utils\Traits\MakesDates; use App\Models\InvoiceInvitation; +use App\Models\PurchaseOrderInvitation; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoiceInvitation; +use App\Utils\Traits\AppSetup; +use App\Utils\Traits\DesignCalculator; +use App\Utils\Traits\MakesDates; +use Exception; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Cache; -use App\Utils\Traits\DesignCalculator; -use App\Models\PurchaseOrderInvitation; -use App\Models\RecurringInvoiceInvitation; /** * Note the premise used here is that any currencies will be formatted back to the company currency and not @@ -604,54 +604,54 @@ class VendorHtmlEngine * aggregate data */ - /* + /* private function makeLineTaxes() :string { - $tax_map = $this->entity_calc->getTaxMap(); + $tax_map = $this->entity_calc->getTaxMap(); - $data = ''; + $data = ''; - foreach ($tax_map as $tax) { - $data .= ''; - $data .= ''; - $data .= ''; - } + foreach ($tax_map as $tax) { + $data .= ''; + $data .= ''; + $data .= ''; + } - return $data; + return $data; } private function makeTotalTaxes() :string { - $data = ''; + $data = ''; - if (! $this->entity_calc->getTotalTaxMap()) { - return $data; - } + if (! $this->entity_calc->getTotalTaxMap()) { + return $data; + } - foreach ($this->entity_calc->getTotalTaxMap() as $tax) { - $data .= ''; - $data .= ''; - $data .= ''; - $data .= ''; - } + foreach ($this->entity_calc->getTotalTaxMap() as $tax) { + $data .= ''; + $data .= ''; + $data .= ''; + $data .= ''; + } - return $data; + return $data; } private function parseLabelsAndValues($labels, $values, $section) :string { - $section = strtr($section, $labels); + $section = strtr($section, $labels); - return strtr($section, $values); + return strtr($section, $values); } - */ + */ /** * Builds CSS to assist with the generation * of Repeating headers and footers on the PDF. * @return string The css string - + private function generateCustomCSS() :string { $header_and_footer = ' @@ -786,7 +786,7 @@ html { $container = $dom->createElement('div'); $container->setAttribute('style', 'display:grid; grid-auto-flow: row; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr);justify-items: center;'); - foreach ($this->entity->documents()->where('is_public',true)->get() as $document) { + foreach ($this->entity->documents()->where('is_public', true)->get() as $document) { if (!$document->isImage()) { continue; } @@ -852,7 +852,7 @@ html { // return ' //
{{ payment.number }} {{ payment.date }}{{ invoice.number }} {{ invoice.date }} {{ invoice.due_date }}{{ invoice.amount|format_currency("EUR") }}{{ invoice.amount }} {{ invoice.balance|format_currency("EUR") }}{{ invoice.balance }}
{{ payment.date }} - {% if pivot.amount > 0 %} - {{ pivot.amount|format_currency("EUR") }} - {{ payment.type.name }} + {% if pivot.amount_raw > 0 %} + {{ pivot.amount }} - {{ payment.type.name }} {% else %} - ({{ pivot.refunded|format_currency("EUR") }}) + ({{ pivot.refunded }}) {% endif %}
'.$tax['name'].''.Number::formatMoney($tax['total'], $this->company).'
'.$tax['name'].''.Number::formatMoney($tax['total'], $this->company).'
'.$tax['name'].''.Number::formatMoney($tax['total'], $this->company).'
'.$tax['name'].''.Number::formatMoney($tax['total'], $this->company).'
// - // // From 269fe7b38ced32f67ee56ccc76a2ebecd2f00178 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 14:02:19 +1100 Subject: [PATCH 090/109] Remove redundant tests --- tests/Feature/PdfCreatorTest.php | 42 -------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 tests/Feature/PdfCreatorTest.php diff --git a/tests/Feature/PdfCreatorTest.php b/tests/Feature/PdfCreatorTest.php deleted file mode 100644 index 407d9833fbc1..000000000000 --- a/tests/Feature/PdfCreatorTest.php +++ /dev/null @@ -1,42 +0,0 @@ -makeTestData(); - - $this->withoutMiddleware( - ThrottleRequests::class - ); - - if(config('ninja.testvars.travis')) - $this->markTestSkipped(); - - } - -} From 9089d548b5be6632e1883faf5c32ad7db80bcde6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 14:54:32 +1100 Subject: [PATCH 091/109] Refactor for reports --- .../Reports/ActivityReportController.php | 22 +++------------- .../Reports/ClientContactReportController.php | 25 +++---------------- .../Reports/ClientReportController.php | 22 +++------------- .../Reports/InvoiceReportController.php | 22 +++------------- .../Reports/PaymentReportController.php | 22 +++------------- .../Reports/ProductReportController.php | 22 +++------------- .../PurchaseOrderItemReportController.php | 22 +++------------- .../Reports/PurchaseOrderReportController.php | 23 +++-------------- .../Reports/QuoteItemReportController.php | 22 +++------------- .../Reports/QuoteReportController.php | 22 +++------------- .../RecurringInvoiceReportController.php | 22 +++------------- .../Reports/TaskReportController.php | 22 +++------------- .../Reports/VendorReportController.php | 22 +++------------- app/Jobs/Report/PreviewReport.php | 6 ++++- app/Services/Pdf/PdfConfiguration.php | 3 ++- routes/api.php | 2 ++ 16 files changed, 48 insertions(+), 253 deletions(-) diff --git a/app/Http/Controllers/Reports/ActivityReportController.php b/app/Http/Controllers/Reports/ActivityReportController.php index 1a10c131865e..f9af9fa3af0d 100644 --- a/app/Http/Controllers/Reports/ActivityReportController.php +++ b/app/Http/Controllers/Reports/ActivityReportController.php @@ -41,28 +41,12 @@ class ActivityReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), ActivityExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), ActivityExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new ActivityExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ClientContactReportController.php b/app/Http/Controllers/Reports/ClientContactReportController.php index 002573c0eea8..0062eeffa99c 100644 --- a/app/Http/Controllers/Reports/ClientContactReportController.php +++ b/app/Http/Controllers/Reports/ClientContactReportController.php @@ -72,30 +72,11 @@ class ClientContactReportController extends BaseController return response()->json(['message' => 'working...'], 200); } + $hash = \Illuminate\Support\Str::uuid(); - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + PreviewReport::dispatch($user->company(), $request->all(), ContactExport::class, $hash); - $hash = \Illuminate\Support\Str::uuid(); + return response()->json(['message' => $hash], 200); - PreviewReport::dispatch($user->company(), $request->all(), ContactExport::class, $hash); - - return response()->json(['message' => $hash], 200); - } - - - // expect a list of visible fields, or use the default - $export = new ContactExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ClientReportController.php b/app/Http/Controllers/Reports/ClientReportController.php index a0421f5288d0..a0ff126cc69f 100644 --- a/app/Http/Controllers/Reports/ClientReportController.php +++ b/app/Http/Controllers/Reports/ClientReportController.php @@ -73,27 +73,11 @@ class ClientReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), ClientExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), ClientExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new ClientExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/InvoiceReportController.php b/app/Http/Controllers/Reports/InvoiceReportController.php index fea397431be5..d6b8a0dc08f6 100644 --- a/app/Http/Controllers/Reports/InvoiceReportController.php +++ b/app/Http/Controllers/Reports/InvoiceReportController.php @@ -72,27 +72,11 @@ class InvoiceReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), InvoiceExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), InvoiceExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - // expect a list of visible fields, or use the default - $export = new InvoiceExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/PaymentReportController.php b/app/Http/Controllers/Reports/PaymentReportController.php index 92611439bcfd..27db61d23118 100644 --- a/app/Http/Controllers/Reports/PaymentReportController.php +++ b/app/Http/Controllers/Reports/PaymentReportController.php @@ -72,29 +72,13 @@ class PaymentReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), PaymentExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), PaymentExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new PaymentExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ProductReportController.php b/app/Http/Controllers/Reports/ProductReportController.php index 5eda138752ed..fb48f5c523ef 100644 --- a/app/Http/Controllers/Reports/ProductReportController.php +++ b/app/Http/Controllers/Reports/ProductReportController.php @@ -73,28 +73,12 @@ class ProductReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), ProductExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), ProductExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new ProductExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php b/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php index 2ad7ff67a5ec..b6ede66f16ca 100644 --- a/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php +++ b/app/Http/Controllers/Reports/PurchaseOrderItemReportController.php @@ -39,28 +39,12 @@ class PurchaseOrderItemReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), PurchaseOrderItemExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), PurchaseOrderItemExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new PurchaseOrderItemExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/PurchaseOrderReportController.php b/app/Http/Controllers/Reports/PurchaseOrderReportController.php index 06aeba50a7f0..c8d14be82422 100644 --- a/app/Http/Controllers/Reports/PurchaseOrderReportController.php +++ b/app/Http/Controllers/Reports/PurchaseOrderReportController.php @@ -41,29 +41,12 @@ class PurchaseOrderReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), PurchaseOrderExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), PurchaseOrderExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - - $export = new PurchaseOrderExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/QuoteItemReportController.php b/app/Http/Controllers/Reports/QuoteItemReportController.php index 926107744c70..2fad0670c8d5 100644 --- a/app/Http/Controllers/Reports/QuoteItemReportController.php +++ b/app/Http/Controllers/Reports/QuoteItemReportController.php @@ -71,28 +71,12 @@ class QuoteItemReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), QuoteItemExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), QuoteItemExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new QuoteItemExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/QuoteReportController.php b/app/Http/Controllers/Reports/QuoteReportController.php index d7030f1f9d3a..a215846aaafc 100644 --- a/app/Http/Controllers/Reports/QuoteReportController.php +++ b/app/Http/Controllers/Reports/QuoteReportController.php @@ -71,28 +71,12 @@ class QuoteReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), QuoteExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), QuoteExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new QuoteExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/RecurringInvoiceReportController.php b/app/Http/Controllers/Reports/RecurringInvoiceReportController.php index 811f72ecb4b9..7536b256115a 100644 --- a/app/Http/Controllers/Reports/RecurringInvoiceReportController.php +++ b/app/Http/Controllers/Reports/RecurringInvoiceReportController.php @@ -39,28 +39,12 @@ class RecurringInvoiceReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), RecurringInvoiceExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), RecurringInvoiceExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new RecurringInvoiceExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/TaskReportController.php b/app/Http/Controllers/Reports/TaskReportController.php index 970a5e7699ec..8293f863c5c9 100644 --- a/app/Http/Controllers/Reports/TaskReportController.php +++ b/app/Http/Controllers/Reports/TaskReportController.php @@ -71,28 +71,12 @@ class TaskReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), TaskExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), TaskExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new TaskExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/VendorReportController.php b/app/Http/Controllers/Reports/VendorReportController.php index 50dbf6380650..d86f031df741 100644 --- a/app/Http/Controllers/Reports/VendorReportController.php +++ b/app/Http/Controllers/Reports/VendorReportController.php @@ -39,28 +39,12 @@ class VendorReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), VendorExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), VendorExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new VendorExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Jobs/Report/PreviewReport.php b/app/Jobs/Report/PreviewReport.php index 959e110ea608..1c1ce99f02ac 100644 --- a/app/Jobs/Report/PreviewReport.php +++ b/app/Jobs/Report/PreviewReport.php @@ -38,8 +38,12 @@ class PreviewReport implements ShouldQueue /** @var \App\Export\CSV\CreditExport $export */ $export = new $this->report_class($this->company, $this->request); - $report = $export->returnJson(); + if($this->request['output'] == 'json' ?? false) + $report = $export->returnJson(); + else + $report = $export->run(); + Cache::put($this->hash, $report, 60 * 60); } diff --git a/app/Services/Pdf/PdfConfiguration.php b/app/Services/Pdf/PdfConfiguration.php index e62c4c8ba920..fcca21481996 100644 --- a/app/Services/Pdf/PdfConfiguration.php +++ b/app/Services/Pdf/PdfConfiguration.php @@ -25,6 +25,7 @@ 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\Models\Vendor; use App\Models\VendorContact; @@ -51,7 +52,7 @@ class PdfConfiguration public Design $design; - public Invoice | Credit | Quote | PurchaseOrder $entity; + public Invoice | Credit | Quote | PurchaseOrder | RecurringInvoice $entity; public string $entity_design_id; diff --git a/routes/api.php b/routes/api.php index ce662bbd6171..5c24dd087290 100644 --- a/routes/api.php +++ b/routes/api.php @@ -322,6 +322,8 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::post('reports/tax_summary_report', TaxSummaryReportController::class); Route::post('reports/user_sales_report', UserSalesReportController::class); Route::post('reports/preview/{hash}', ReportPreviewController::class); + Route::post('exports/preview/{hash}', ReportPreviewController::class); + Route::post('templates/preview/{hash}', TemplatePreviewController::class); Route::post('search', SearchController::class); From da27d5bdb4bbfe6ffdd4c2775f03473a5496d045 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 15:06:13 +1100 Subject: [PATCH 092/109] Add additional import props for vendors --- .../Reports/ProfitAndLossController.php | 7 +++- app/Import/Definitions/VendorMap.php | 40 +++++++++++-------- app/Services/Report/ProfitLoss.php | 2 +- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Reports/ProfitAndLossController.php b/app/Http/Controllers/Reports/ProfitAndLossController.php index 3d1f0751066d..26e860f16bd5 100644 --- a/app/Http/Controllers/Reports/ProfitAndLossController.php +++ b/app/Http/Controllers/Reports/ProfitAndLossController.php @@ -63,14 +63,17 @@ class ProfitAndLossController extends BaseController */ public function __invoke(ProfitLossRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ProfitLoss::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ProfitLoss::class, $this->filename); return response()->json(['message' => 'working...'], 200); } // expect a list of visible fields, or use the default - $pnl = new ProfitLoss(auth()->user()->company(), $request->all()); + $pnl = new ProfitLoss($user->company(), $request->all()); $csv = $pnl->run(); $headers = [ diff --git a/app/Import/Definitions/VendorMap.php b/app/Import/Definitions/VendorMap.php index 4e5cbd37524d..1c23f5e34049 100644 --- a/app/Import/Definitions/VendorMap.php +++ b/app/Import/Definitions/VendorMap.php @@ -33,14 +33,18 @@ class VendorMap 14 => 'vendor.state', 15 => 'vendor.postal_code', 16 => 'vendor.country_id', - 17 => 'contact.first_name', - 18 => 'contact.last_name', - 19 => 'contact.email', - 20 => 'contact.phone', - 21 => 'contact.custom_value1', - 22 => 'contact.custom_value2', - 23 => 'contact.custom_value3', - 24 => 'contact.custom_value4', + 17 => 'vendor.custom_value1', + 18 => 'vendor.custom_value2', + 19 => 'vendor.custom_value3', + 20 => 'vendor.custom_value4', + 21 => 'contact.first_name', + 22 => 'contact.last_name', + 23 => 'contact.email', + 24 => 'contact.phone', + 25 => 'contact.custom_value1', + 26 => 'contact.custom_value2', + 27 => 'contact.custom_value3', + 28 => 'contact.custom_value4', ]; } @@ -65,14 +69,18 @@ class VendorMap 14 => 'texts.state', 15 => 'texts.postal_code', 16 => 'texts.country', - 17 => 'texts.first_name', - 18 => 'texts.last_name', - 19 => 'texts.email', - 20 => 'texts.phone', - 21 => 'texts.custom_value', - 22 => 'texts.custom_value', - 23 => 'texts.custom_value', - 24 => 'texts.custom_value', + 17 => 'texts.custom_value', + 18 => 'texts.custom_value', + 19 => 'texts.custom_value', + 20 => 'texts.custom_value', + 21 => 'texts.first_name', + 22 => 'texts.last_name', + 23 => 'texts.email', + 24 => 'texts.phone', + 25 => 'texts.custom_value', + 26 => 'texts.custom_value', + 27 => 'texts.custom_value', + 28 => 'texts.custom_value', ]; } } diff --git a/app/Services/Report/ProfitLoss.php b/app/Services/Report/ProfitLoss.php index cbdba56c51df..0f7e2ca97bf2 100644 --- a/app/Services/Report/ProfitLoss.php +++ b/app/Services/Report/ProfitLoss.php @@ -107,7 +107,7 @@ class ProfitLoss if ($this->is_income_billed) { //get invoiced amounts $this->filterIncome(); } else { - //$this->filterPaymentIncome(); + $this->filterInvoicePaymentIncome(); } From af1f809cfb6a6e6a578c555e01cb2c18c78d3882 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 15:46:26 +1100 Subject: [PATCH 093/109] Fixes for test refactoring --- app/Export/CSV/PaymentExport.php | 2 - .../Reports/ARSummaryReportController.php | 7 +- .../Reports/CreditReportController.php | 22 +- .../Reports/DocumentReportController.php | 22 +- .../Reports/ExpenseReportController.php | 22 +- .../Reports/InvoiceItemReportController.php | 21 +- app/Jobs/Report/PreviewReport.php | 2 +- routes/api.php | 3 +- .../Export/ReportCsvGenerationTest.php | 404 +++++++++++++----- 9 files changed, 324 insertions(+), 181 deletions(-) diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 7f77563f9b92..48f996fae794 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -71,8 +71,6 @@ class PaymentExport extends BaseExport return ['identifier' => $key, 'display_value' => $headerdisplay[$value]]; })->toArray(); - nlog($header); - $report = $query->cursor() ->map(function ($resource) { $row = $this->buildRow($resource); diff --git a/app/Http/Controllers/Reports/ARSummaryReportController.php b/app/Http/Controllers/Reports/ARSummaryReportController.php index a9c9f6e68946..cde4779451e3 100644 --- a/app/Http/Controllers/Reports/ARSummaryReportController.php +++ b/app/Http/Controllers/Reports/ARSummaryReportController.php @@ -61,14 +61,17 @@ class ARSummaryReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ARSummaryReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ARSummaryReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } // expect a list of visible fields, or use the default - $export = new ARSummaryReport(auth()->user()->company(), $request->all()); + $export = new ARSummaryReport($user->company(), $request->all()); $csv = $export->run(); diff --git a/app/Http/Controllers/Reports/CreditReportController.php b/app/Http/Controllers/Reports/CreditReportController.php index 5a1a952d6359..533a45e046e7 100644 --- a/app/Http/Controllers/Reports/CreditReportController.php +++ b/app/Http/Controllers/Reports/CreditReportController.php @@ -71,28 +71,12 @@ class CreditReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), CreditExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), CreditExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new CreditExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/DocumentReportController.php b/app/Http/Controllers/Reports/DocumentReportController.php index e7db3f74186c..fb592f9909ab 100644 --- a/app/Http/Controllers/Reports/DocumentReportController.php +++ b/app/Http/Controllers/Reports/DocumentReportController.php @@ -72,28 +72,12 @@ class DocumentReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), DocumentExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), DocumentExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new DocumentExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ExpenseReportController.php b/app/Http/Controllers/Reports/ExpenseReportController.php index 2cd849891f1f..12e3c7cf813e 100644 --- a/app/Http/Controllers/Reports/ExpenseReportController.php +++ b/app/Http/Controllers/Reports/ExpenseReportController.php @@ -73,28 +73,12 @@ class ExpenseReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), ExpenseExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), ExpenseExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new ExpenseExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/InvoiceItemReportController.php b/app/Http/Controllers/Reports/InvoiceItemReportController.php index 3bb534b7f0e8..847db7a339f5 100644 --- a/app/Http/Controllers/Reports/InvoiceItemReportController.php +++ b/app/Http/Controllers/Reports/InvoiceItemReportController.php @@ -72,26 +72,11 @@ class InvoiceItemReportController extends BaseController return response()->json(['message' => 'working...'], 200); } - if($request->has('output') && $request->input('output') == 'json') { + $hash = \Illuminate\Support\Str::uuid(); - $hash = \Illuminate\Support\Str::uuid(); + PreviewReport::dispatch($user->company(), $request->all(), InvoiceItemExport::class, $hash); - PreviewReport::dispatch($user->company(), $request->all(), InvoiceItemExport::class, $hash); + return response()->json(['message' => $hash], 200); - return response()->json(['message' => $hash], 200); - } - - $export = new InvoiceItemExport($user->company(), $request->all()); - - $csv = $export->run(); - - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Jobs/Report/PreviewReport.php b/app/Jobs/Report/PreviewReport.php index 1c1ce99f02ac..d00a99d08008 100644 --- a/app/Jobs/Report/PreviewReport.php +++ b/app/Jobs/Report/PreviewReport.php @@ -39,7 +39,7 @@ class PreviewReport implements ShouldQueue /** @var \App\Export\CSV\CreditExport $export */ $export = new $this->report_class($this->company, $this->request); - if($this->request['output'] == 'json' ?? false) + if(isset($this->request['output']) && $this->request['output'] == 'json') $report = $export->returnJson(); else $report = $export->run(); diff --git a/routes/api.php b/routes/api.php index 5c24dd087290..e9a685cbf870 100644 --- a/routes/api.php +++ b/routes/api.php @@ -89,6 +89,7 @@ use App\Http\Controllers\Auth\PasswordTimeoutController; use App\Http\Controllers\PreviewPurchaseOrderController; use App\Http\Controllers\Reports\ClientReportController; use App\Http\Controllers\Reports\CreditReportController; +use App\Http\Controllers\Reports\ReportExportController; use App\Http\Controllers\Reports\VendorReportController; use App\Http\Controllers\Reports\ExpenseReportController; use App\Http\Controllers\Reports\InvoiceReportController; @@ -322,7 +323,7 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::post('reports/tax_summary_report', TaxSummaryReportController::class); Route::post('reports/user_sales_report', UserSalesReportController::class); Route::post('reports/preview/{hash}', ReportPreviewController::class); - Route::post('exports/preview/{hash}', ReportPreviewController::class); + Route::post('exports/preview/{hash}', ReportExportController::class); Route::post('templates/preview/{hash}', TemplatePreviewController::class); Route::post('search', SearchController::class); diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index 90b12ab96adc..5f097bc4ad66 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -11,25 +11,26 @@ 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\Export\CSV\ProductExport; use App\DataMapper\CompanySettings; use App\Export\CSV\PaymentExport; +use App\Export\CSV\ProductExport; +use App\Export\CSV\TaskExport; +use App\Export\CSV\VendorExport; 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\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 @@ -113,7 +114,7 @@ class ReportCsvGenerationTest extends TestCase "contact.custom_value4", ]; - private $all_payment_report_keys = [ + private $all_payment_report_keys = [ 'payment.date', 'payment.amount', 'payment.refunded', @@ -275,9 +276,19 @@ class ReportCsvGenerationTest extends TestCase } + private function poll($hash) + { + $response = Http::retry(20, 1000, throw: false) + ->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->post(config('ninja.app_url')."/api/v1/exports/preview/{$hash}"); + + return $response; + } public function testVendorCsvGeneration() { - + $vendor = \App\Models\Vendor::factory()->create( [ @@ -292,14 +303,13 @@ class ReportCsvGenerationTest extends TestCase 'private_notes' => 'private_notes', 'public_notes' => 'public_notes', 'website' => 'website', - 'number' => '1234', + 'number' => '1234', ] ); $data = [ 'date_range' => 'all', 'report_keys' => [], - // 'report_keys' => ["vendor.name","purchase_order.number","purchase_order.amount", "item.quantity", "item.cost", "item.line_total", "item.discount", "item.notes", "item.product_key", "item.custom_value1", "item.tax_name1", "item.tax_rate1",], 'send_email' => false, ]; @@ -308,7 +318,15 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/vendors', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); $this->assertEquals('Vendor 1', $this->getFirstValueByColumn($csv, 'Vendor Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Vendor Number')); @@ -334,8 +352,7 @@ class ReportCsvGenerationTest extends TestCase $data = $export->returnJson(); $this->assertNotNull($data); - // nlog($data); - // $this->assertEquals(0, $this->traverseJson($data, 'columns.0.identifier')); + $this->assertEquals('Vendor Name', $this->traverseJson($data, 'columns.9.display_value')); $this->assertEquals('vendor', $this->traverseJson($data, '0.0.entity')); $this->assertEquals('address1', $this->traverseJson($data, '0.0.id')); @@ -345,7 +362,7 @@ class ReportCsvGenerationTest extends TestCase $this->assertEquals('address1', $this->traverseJson($data, '0.0.display_value')); } - public function testVendorCustomColumnCsvGeneration() + public function testVendorCustomColumnCsvGeneration() { \App\Models\Vendor::query()->cursor()->each(function ($t) { @@ -366,7 +383,7 @@ class ReportCsvGenerationTest extends TestCase 'private_notes' => 'private_notes', 'public_notes' => 'public_notes', 'website' => 'website', - 'number' => '1234', + 'number' => '1234', ] ); @@ -381,7 +398,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/vendors', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('Vendor 1', $this->getFirstValueByColumn($csv, 'Vendor Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Vendor Number')); @@ -405,7 +431,7 @@ class ReportCsvGenerationTest extends TestCase } - public function testTaskCustomColumnsCsvGeneration() + public function testTaskCustomColumnsCsvGeneration() { $invoice = \App\Models\Invoice::factory()->create([ @@ -463,7 +489,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/tasks', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals(3600, $this->getFirstValueByColumn($csv, 'Task Duration')); $this->assertEquals('test1', $this->getFirstValueByColumn($csv, 'Task Description')); @@ -515,12 +550,19 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/tasks', $data); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + } - - - public function testTasksCsvGeneration() { @@ -553,7 +595,15 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/tasks', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); $this->assertEquals(3600, $this->getFirstValueByColumn($csv, 'Task Duration')); $this->assertEquals('test', $this->getFirstValueByColumn($csv, 'Task Description')); @@ -592,8 +642,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/products', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('product_key', $this->getFirstValueByColumn($csv, 'Product')); $this->assertEquals('notes', $this->getFirstValueByColumn($csv, 'Notes')); @@ -602,7 +661,7 @@ class ReportCsvGenerationTest extends TestCase $this->assertEquals('Custom 1', $this->getFirstValueByColumn($csv, 'Custom Value 1')); $this->assertEquals('Custom 2', $this->getFirstValueByColumn($csv, 'Custom Value 2')); $this->assertEquals('Custom 3', $this->getFirstValueByColumn($csv, 'Custom Value 3')); - $this->assertEquals('Custom 4', $this->getFirstValueByColumn($csv, 'Custom Value 4')); + $this->assertEquals('Custom 4', $this->getFirstValueByColumn($csv, 'Custom Value 4')); $export = new ProductExport($this->company, $data); $data = $export->returnJson(); @@ -664,8 +723,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/payments', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals(100, $this->getFirstValueByColumn($csv, 'Payment Amount')); $this->assertEquals(now()->addSeconds($this->company->timezone()->utc_offset)->format('Y-m-d'), $this->getFirstValueByColumn($csv, 'Payment Date')); @@ -712,7 +780,7 @@ class ReportCsvGenerationTest extends TestCase $data = [ 'date_range' => 'all', - 'report_keys' => array_merge(["payment.amount","payment.date"],$this->all_invoice_report_keys), + 'report_keys' => array_merge(["payment.amount","payment.date"], $this->all_invoice_report_keys), 'send_email' => false, ]; @@ -721,6 +789,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/payments', $data); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + + } @@ -746,8 +825,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/payments', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals(500, $this->getFirstValueByColumn($csv, 'Payment Amount')); $this->assertEquals(0, $this->getFirstValueByColumn($csv, 'Payment Applied')); @@ -771,9 +859,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/clients', $data); - - $csv = $response->streamedContent(); -// nlog($csv); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $reader = Reader::createFromString($csv); $reader->setHeaderOffset(0); @@ -802,8 +898,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/clients', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Name')); $this->assertEquals(100, $this->getFirstValueByColumn($csv, 'Balance')); @@ -848,8 +953,6 @@ class ReportCsvGenerationTest extends TestCase $arr = $response->json(); - // nlog($arr['message']); - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, @@ -857,16 +960,6 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(409); - // sleep(1); - - // $response = $this->withHeaders([ - // 'X-API-SECRET' => config('ninja.api_secret'), - // 'X-API-TOKEN' => $this->token, - // ])->postJson('/api/v1/reports/preview/'.$arr['message']); - - // $response->assertStatus(200); - - // nlog($response->json()); } @@ -899,7 +992,11 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/credits', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Credit Credit Number')); @@ -917,6 +1014,11 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/credits', $data)->assertStatus(200); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); + } public function testInvoiceCustomColumnsCsvGeneration() @@ -947,29 +1049,29 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/invoices', $data); - - $csv = $response->streamedContent(); -// nlog($csv); + + $response->assertStatus(200); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Invoice Invoice Number')); $this->assertEquals('Unpaid', $this->getFirstValueByColumn($csv, 'Payment Amount')); $this->assertEquals('', $this->getFirstValueByColumn($csv, 'Payment Date')); - $data = [ 'date_range' => 'all', 'report_keys' => $this->all_client_report_keys, 'send_email' => false, ]; - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/invoices', $data)->assertStatus(200); - - $data = [ 'date_range' => 'all', 'report_keys' => $this->all_payment_report_keys, @@ -981,7 +1083,6 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/invoices', $data)->assertStatus(200); - } public function testRecurringInvoiceCustomColumnsCsvGeneration() @@ -1013,14 +1114,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/recurring_invoices', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Recurring Invoice Invoice Number')); $this->assertEquals('Daily', $this->getFirstValueByColumn($csv, 'Recurring Invoice How Often')); - $data = [ 'date_range' => 'all', 'report_keys' => $this->all_client_report_keys, @@ -1066,7 +1170,15 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/recurring_invoices', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Recurring Invoice Invoice Number')); $this->assertEquals('Daily', $this->getFirstValueByColumn($csv, 'Recurring Invoice How Often')); @@ -1121,9 +1233,15 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/invoice_items', $data); - - $csv = $response->streamedContent(); -// nlog($csv);// + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Invoice Invoice Number')); $this->assertEquals('Unpaid', $this->getFirstValueByColumn($csv, 'Payment Amount')); @@ -1215,7 +1333,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/quote_items', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Quote Number')); @@ -1283,9 +1410,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/purchase_orders', $data); + $response->assertStatus(200); - $csv = $response->streamedContent(); + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Amount')); $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Balance')); @@ -1355,7 +1490,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/purchase_order_items', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('Vendor 1', $this->getFirstValueByColumn($csv, 'Vendor Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Purchase Order Number')); @@ -1400,7 +1544,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/quotes', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Quote Number')); @@ -1442,7 +1595,7 @@ class ReportCsvGenerationTest extends TestCase 'terms' => 'Terms', ]); - $invoice->service()->markPaid()->save(); + $invoice->service()->markPaid()->save(); $data = [ 'date_range' => 'all', @@ -1455,7 +1608,16 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/invoices', $data); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('12345', $this->getFirstValueByColumn($csv, 'Invoice Invoice Number')); @@ -1478,8 +1640,17 @@ class ReportCsvGenerationTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/contacts', $data); - - $csv = $response->streamedContent(); + + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $reader = Reader::createFromString($csv); $reader->setHeaderOffset(0); @@ -1549,7 +1720,16 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Credit Amount')); $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Credit Balance')); @@ -1634,7 +1814,16 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); - $csv = $response->streamedContent(); + $response->assertStatus(200); + + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Invoice Amount')); $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Invoice Balance')); @@ -1709,7 +1898,14 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); - $csv = $response->streamedContent(); + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); + $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Recurring Invoice Amount')); $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Recurring Invoice Balance')); @@ -1785,9 +1981,13 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); - $csv = $response->streamedContent(); - - //nlog($csv); + $arr = $response->json(); + + $hash = $arr['message']; + + $response = $this->poll($hash); + + $csv = $response->body(); $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Quote Amount')); $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Quote Balance')); @@ -1824,7 +2024,7 @@ class ReportCsvGenerationTest extends TestCase 'client_id' => $this->client->id, 'amount' => 100, 'public_notes' => 'Public', - 'private_notes' => 'Private', + 'private_notes' => 'Private', ]); $data = [ @@ -1838,42 +2038,43 @@ class ReportCsvGenerationTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/expenses', $data); - $response->assertStatus(200); - - $csv = $response->streamedContent(); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Expense Amount')); $this->assertEquals('Public', $this->getFirstValueByColumn($csv, 'Expense Public Notes')); $this->assertEquals('Private', $this->getFirstValueByColumn($csv, 'Expense Private Notes')); $this->assertEquals($this->user->present()->name(), $this->getFirstValueByColumn($csv, 'Expense User')); - - + $data = [ 'date_range' => 'all', 'report_keys' => $this->all_client_report_keys, 'send_email' => false, ]; - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/reports/expenses', $data)->assertStatus(200); - + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); } public function testExpenseCustomColumnsCsvGeneration() { - $vendor = + $vendor = \App\Models\Vendor::factory()->create( [ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'name' => 'Vendor 1', ] - ); Expense::factory()->create([ @@ -1883,8 +2084,8 @@ class ReportCsvGenerationTest extends TestCase 'vendor_id' => $vendor->id, 'amount' => 100, 'public_notes' => 'Public', - 'private_notes' => 'Private', - 'currency_id' => 1, + 'private_notes' => 'Private', + 'currency_id' => 1, ]); $data = [ @@ -1900,7 +2101,10 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); - $csv = $response->streamedContent(); + $arr = $response->json(); + $hash = $arr['message']; + $response = $this->poll($hash); + $csv = $response->body(); $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); $this->assertEquals('Vendor 1', $this->getFirstValueByColumn($csv, 'Vendor Name')); @@ -1910,4 +2114,4 @@ class ReportCsvGenerationTest extends TestCase } -} \ No newline at end of file +} From c234d6ec2221baf18b611463fc27264a3c6ee8b1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 16:15:08 +1100 Subject: [PATCH 094/109] Report Export Controller --- .../Reports/ReportExportController.php | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 app/Http/Controllers/Reports/ReportExportController.php diff --git a/app/Http/Controllers/Reports/ReportExportController.php b/app/Http/Controllers/Reports/ReportExportController.php new file mode 100644 index 000000000000..bb936668bc87 --- /dev/null +++ b/app/Http/Controllers/Reports/ReportExportController.php @@ -0,0 +1,56 @@ +json(['message' => 'Still working.....'], 409); + } + + if($report) { + + Cache::forget($hash); + + $headers = [ + 'Content-Disposition' => 'attachment', + 'Content-Type' => 'text/csv', + ]; + + return response()->streamDownload(function () use ($report) { + echo $report; + }, $this->filename, $headers); + + } + + + } +} From a7c63a35d979945a0e04b302f5570896f109cb12 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 16:38:42 +1100 Subject: [PATCH 095/109] adjust timeouts for polling --- tests/Feature/Export/ReportCsvGenerationTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index 5f097bc4ad66..bf0189550501 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -278,7 +278,7 @@ class ReportCsvGenerationTest extends TestCase private function poll($hash) { - $response = Http::retry(20, 1000, throw: false) + $response = Http::retry(50, 1000, throw: false) ->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, From 0d285b606d96887bcd372563e58a406f33bef157 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 16:52:34 +1100 Subject: [PATCH 096/109] updates for PdfService --- app/Services/Pdf/PdfService.php | 83 +++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index 9ef50f988141..f879d4d23165 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -12,17 +12,20 @@ namespace App\Services\Pdf; use App\Models\Company; -use App\Models\CreditInvitation; -use App\Models\InvoiceInvitation; -use App\Models\PurchaseOrderInvitation; -use App\Models\QuoteInvitation; -use App\Models\RecurringInvoiceInvitation; -use App\Utils\HostedPDF\NinjaPdf; +use App\Models\Invoice; use App\Utils\HtmlEngine; -use App\Utils\PhantomJS\Phantom; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Utils\Traits\Pdf\PdfMaker; +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\PurchaseOrderInvitation; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Models\RecurringInvoiceInvitation; +use horstoeko\zugferd\ZugferdDocumentPdfBuilder; class PdfService { @@ -92,6 +95,11 @@ class PdfService if ($numbered_pdf) { $pdf = $numbered_pdf; } + + if($this->config->entity_string == "invoice" && $this->config->settings->enable_e_invoice) { + $pdf = $this->checkEInvoice($pdf); + } + } catch (\Exception $e) { nlog(print_r($e->getMessage(), 1)); throw new \Exception($e->getMessage(), $e->getCode()); @@ -162,4 +170,61 @@ class PdfService return $pdf; } + + /** + * Switch to determine if we need to embed the xml into the PDF itself + * + * @param string $pdf + * @return string + */ + private function checkEInvoice(string $pdf): string + { + if(!$this->config->entity instanceof Invoice) + return $pdf; + + $e_invoice_type = $this->config->settings->e_invoice_type; + + switch ($e_invoice_type) { + case "EN16931": + case "XInvoice_2_2": + case "XInvoice_2_1": + case "XInvoice_2_0": + case "XInvoice_1_0": + case "XInvoice-Extended": + case "XInvoice-BasicWL": + case "XInvoice-Basic": + return $this->embedEInvoiceZuGFerD($pdf) ?? $pdf; + //case "Facturae_3.2": + //case "Facturae_3.2.1": + //case "Facturae_3.2.2": + // + default: + return $pdf; + } + + } + + /** + * Embed the .xml file into the PDF + * + * @param string $pdf + * @return string + */ + private function embedEInvoiceZuGFerD(string $pdf): string + { + try { + + $e_rechnung = (new CreateEInvoice($this->config->entity, true))->handle(); + $pdfBuilder = new ZugferdDocumentPdfBuilder($e_rechnung, $pdf); + $pdfBuilder->generateDocument(); + + return $pdfBuilder->downloadString(basename($this->config->entity->getFileName())); + + } catch (\Exception $e) { + nlog("E_Invoice Merge failed - " . $e->getMessage()); + } + + return $pdf; + } + } From c66fecb39c2e08f20054ccacd39212a2b09846e9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 17:13:06 +1100 Subject: [PATCH 097/109] Updates for populating options --- app/Http/Controllers/PreviewController.php | 6 +++++- .../Controllers/PreviewPurchaseOrderController.php | 14 +++++++++++++- app/Jobs/Entity/CreateRawPdf.php | 3 ++- tests/Feature/PdfMaker/ExampleIntegrationTest.php | 4 ++++ tests/Feature/Template/TemplateTest.php | 3 ++- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 5bef76e3063d..b2bbab948f72 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -128,6 +128,9 @@ class PreviewController extends BaseController 'options' => [ 'all_pages_header' => $client->getSetting('all_pages_header'), 'all_pages_footer' => $client->getSetting('all_pages_footer'), + 'client' => $entity_obj->client ?? [], + 'vendor' => $entity_obj->vendor ?? [], + $request->input('entity')."s" => [$entity_obj], ], 'process_markdown' => $client->company->markdown_enabled, ]; @@ -271,7 +274,8 @@ class PreviewController extends BaseController 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $entity_obj->client->company->markdown_enabled, 'options' => [ - 'client' => $entity_obj->client, + 'client' => $entity_obj->client ?? [], + 'vendor' => $entity_obj->vendor ?? [], request()->input('entity_type', 'invoice')."s" => [$entity_obj], ] ]; diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index de086a030af3..8b756b627dad 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -122,6 +122,10 @@ class PreviewPurchaseOrderController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $entity_obj->company->markdown_enabled, + 'options' => [ + 'vendor' => $entity_obj->vendor ?? [], + request()->input('entity')."s" => [$entity_obj], + ] ]; $design = new Design(request()->design['name']); @@ -235,7 +239,7 @@ class PreviewPurchaseOrderController extends BaseController 'options' => [ 'client' => null, 'vendor' => $entity_obj->vendor, - 'entity' => $entity_obj, + 'purchase_orders' => [$entity_obj], 'variables' => $html->generateLabelsAndValues(), ], 'process_markdown' => $entity_obj->company->markdown_enabled, @@ -330,6 +334,10 @@ class PreviewPurchaseOrderController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $invitation->company->markdown_enabled, + 'options' => [ + 'vendor' => $invitation->purchase_order->vendor, + 'purchase_orders' => $invitation->purchase_order, + ], ]; @@ -435,6 +443,10 @@ class PreviewPurchaseOrderController extends BaseController ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $purchase_order->company->markdown_enabled, + 'options' => [ + 'vendor' => $invitation->purchase_order->vendor, + 'purchase_orders' => $invitation->purchase_order, + ], ]; $maker = new PdfMaker($state); diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 6f6592ac03c4..35b9cb16a5aa 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -83,7 +83,8 @@ class CreateRawPdf { /** Testing this override to improve PDF generation performance */ $ps = new PdfService($this->invitation, 'product', [ - 'client' => $this->entity->client, + 'client' => $this->entity->client ?? false, + 'vendor' => $this->entity->vendor ?? false, "{$this->entity_string}s" => [$this->entity], ]); diff --git a/tests/Feature/PdfMaker/ExampleIntegrationTest.php b/tests/Feature/PdfMaker/ExampleIntegrationTest.php index 1f923f9f5fbc..8c567ff58e67 100644 --- a/tests/Feature/PdfMaker/ExampleIntegrationTest.php +++ b/tests/Feature/PdfMaker/ExampleIntegrationTest.php @@ -49,6 +49,10 @@ class ExampleIntegrationTest extends TestCase 'pdf_variables' => (array) $invoice->company->settings->pdf_variables, ]), 'variables' => $engine->generateLabelsAndValues(), + 'options' => [ + 'client' => $invoice->client, + 'invoices' => [$invoice] + ], ]; $maker = new PdfMaker($state); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 6de576e7cf4b..df95599ba37a 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -684,7 +684,8 @@ class TemplateTest extends TestCase 'all_pages_header' => $entity_obj->client->getSetting('all_pages_header'), 'all_pages_footer' => $entity_obj->client->getSetting('all_pages_footer'), 'client' => $entity_obj->client, - 'entity' => $entity_obj, + 'entity' => [$entity_obj], + 'invoices' => [$entity_obj], 'variables' => $variables, ], 'process_markdown' => $entity_obj->client->company->markdown_enabled, From 6458406128798d342d7f5453fc081a9136f30d24 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 17:19:28 +1100 Subject: [PATCH 098/109] Merge support for purchase order PDF generation --- app/Jobs/Entity/CreateRawPdf.php | 42 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 35b9cb16a5aa..8421b0b8113f 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -11,38 +11,40 @@ namespace App\Jobs\Entity; -use App\Exceptions\FilePermissionsFailure; -use App\Jobs\Invoice\CreateEInvoice; +use App\Utils\Ninja; +use App\Models\Quote; use App\Models\Credit; -use App\Models\CreditInvitation; use App\Models\Design; use App\Models\Invoice; -use App\Models\InvoiceInvitation; -use App\Models\Quote; +use App\Utils\HtmlEngine; +use App\Models\PurchaseOrder; use App\Models\QuoteInvitation; +use App\Utils\Traits\MakesHash; +use App\Models\CreditInvitation; use App\Models\RecurringInvoice; -use App\Models\RecurringInvoiceInvitation; use App\Services\Pdf\PdfService; +use App\Utils\PhantomJS\Phantom; +use App\Models\InvoiceInvitation; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Traits\Pdf\PdfMaker; +use Illuminate\Support\Facades\App; +use App\Jobs\Invoice\CreateEInvoice; +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\RecurringInvoiceInvitation; +use horstoeko\zugferd\ZugferdDocumentPdfBuilder; 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\HtmlEngine; -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 horstoeko\zugferd\ZugferdDocumentPdfBuilder; -use Illuminate\Support\Facades\App; class CreateRawPdf { use NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; - public Invoice | Credit | Quote | RecurringInvoice $entity; + public Invoice | Credit | Quote | RecurringInvoice | PurchaseOrder $entity; public $company; @@ -72,10 +74,12 @@ class CreateRawPdf } elseif ($invitation instanceof RecurringInvoiceInvitation) { $this->entity = $invitation->recurring_invoice; $this->entity_string = 'recurring_invoice'; + } elseif ($invitation instanceof PurchaseOrderInvitation){ + $this->entity = $invitation->purchase_order; + $this->entity_string = 'purchase_order'; } $this->company = $invitation->company; - $this->contact = $invitation->contact; } From e8100ac1c315475c401aacc3a6c0e4bd9349d3f3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 17:39:42 +1100 Subject: [PATCH 099/109] Merge support for purchase order PDF generation --- .../Controllers/PurchaseOrderController.php | 12 +++-- app/Jobs/Entity/CreateRawPdf.php | 24 ++++++++- app/Jobs/Vendor/CreatePurchaseOrderPdf.php | 49 ++++++++++++------- .../PurchaseOrder/GetPurchaseOrderPdf.php | 20 ++++---- 4 files changed, 71 insertions(+), 34 deletions(-) diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index 51f0d744b404..0864775707af 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -24,6 +24,7 @@ use App\Http\Requests\PurchaseOrder\ShowPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\StorePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UpdatePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UploadPurchaseOrderRequest; +use App\Jobs\Entity\CreateRawPdf; use App\Jobs\PurchaseOrder\PurchaseOrderEmail; use App\Jobs\PurchaseOrder\ZipPurchaseOrders; use App\Models\Account; @@ -513,7 +514,8 @@ class PurchaseOrderController extends BaseController if ($action == 'bulk_print' && $user->can('view', $purchase_orders->first())) { $paths = $purchase_orders->map(function ($purchase_order) { - return (new \App\Jobs\Vendor\CreatePurchaseOrderPdf($purchase_order->invitations->first()))->rawPdf(); + return (new CreateRawPdf($purchase_order->invitations->first()))->handle(); + // return (new \App\Jobs\Vendor\CreatePurchaseOrderPdf($purchase_order->invitations->first()))->rawPdf(); }); $merge = (new PdfMerge($paths->toArray()))->run(); @@ -622,8 +624,8 @@ class PurchaseOrderController extends BaseController $file = $purchase_order->service()->getPurchaseOrderPdf(); return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), ['Content-Type' => 'application/pdf']); + echo $file; + }, $purchase_order->numberFormatter().".pdf", ['Content-Type' => 'application/pdf']); break; case 'restore': @@ -827,7 +829,7 @@ class PurchaseOrderController extends BaseController } return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), $headers); + echo $file; + }, $purchase_order->numberFormatter().".pdf", $headers); } } diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 8421b0b8113f..70c5754f9243 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -57,7 +57,7 @@ class CreateRawPdf /** * @param $invitation */ - public function __construct($invitation) + public function __construct($invitation, private ?string $type = null) { $this->invitation = $invitation; @@ -83,16 +83,36 @@ class CreateRawPdf $this->contact = $invitation->contact; } + private function resolveType(): string + { + if($this->type) + return $this->type; + + $type = 'product'; + + match($this->entity_string) { + 'purchase_order' => $type = 'purchase_order', + 'invoice' => $type = 'product', + 'quote' => $type = 'product', + 'credit' => $type = 'product', + 'recurring_invoice' => $type = 'product', + }; + + return $type; + + } + public function handle() { /** Testing this override to improve PDF generation performance */ - $ps = new PdfService($this->invitation, 'product', [ + $ps = new PdfService($this->invitation, $this->resolveType(), [ 'client' => $this->entity->client ?? false, 'vendor' => $this->entity->vendor ?? false, "{$this->entity_string}s" => [$this->entity], ]); $pdf = $ps->boot()->getPdf(); + return $pdf; nlog("pdf timer = ". $ps->execution_time); /* Forget the singleton*/ diff --git a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php index 8238602e2002..928f0ebc88e9 100644 --- a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php +++ b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php @@ -11,28 +11,29 @@ namespace App\Jobs\Vendor; -use App\Exceptions\FilePermissionsFailure; -use App\Libraries\MultiDB; +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\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; class CreatePurchaseOrderPdf implements ShouldQueue { @@ -79,6 +80,18 @@ class CreatePurchaseOrderPdf implements ShouldQueue public function handle() { + /** Testing this override to improve PDF generation performance */ + $ps = new PdfService($this->invitation, 'product', [ + 'client' => $this->entity->client ?? false, + 'vendor' => $this->entity->vendor ?? false, + "{$this->entity_string}s" => [$this->entity], + ]); + + nlog("returning purchase order"); + + return $ps->boot()->getPdf(); + + $pdf = $this->rawPdf(); if ($pdf) { diff --git a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php index 40044b90b6e5..1a536698202d 100644 --- a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php +++ b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php @@ -35,19 +35,21 @@ class GetPurchaseOrderPdf extends AbstractService $invitation = $this->purchase_order->invitations()->first(); } - $path = $this->purchase_order->vendor->purchase_order_filepath($invitation); + return (new CreatePurchaseOrderPdf($invitation))->handle(); - $file_path = $path.$this->purchase_order->numberFormatter().'.pdf'; + // $path = $this->purchase_order->vendor->purchase_order_filepath($invitation); - // $disk = 'public'; - $disk = config('filesystems.default'); + // $file_path = $path.$this->purchase_order->numberFormatter().'.pdf'; - $file = Storage::disk($disk)->exists($file_path); + // // $disk = 'public'; + // $disk = config('filesystems.default'); - if (! $file) { - $file_path = (new CreatePurchaseOrderPdf($invitation))->handle(); - } + // $file = Storage::disk($disk)->exists($file_path); - return $file_path; + // if (! $file) { + // $file_path = (new CreatePurchaseOrderPdf($invitation))->handle(); + // } + + // return $file_path; } } From 55ba708fd0dfca524bef2a8748bdcc4427c04a6b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 17:50:07 +1100 Subject: [PATCH 100/109] Merge support for purchase order PDF generation --- .../VendorPortal/InvitationController.php | 2 +- .../VendorPortal/PurchaseOrderController.php | 37 ++++++++++--------- app/Http/Livewire/PdfSlot.php | 7 +--- app/Jobs/PurchaseOrder/ZipPurchaseOrders.php | 21 ++++++----- app/Mail/Engine/PurchaseOrderEmailEngine.php | 16 ++++---- app/Models/BaseModel.php | 4 -- app/Services/Email/EmailDefaults.php | 9 +---- .../PurchaseOrder/GetPurchaseOrderPdf.php | 19 ++-------- tests/Feature/PurchaseOrderTest.php | 1 - 9 files changed, 48 insertions(+), 68 deletions(-) diff --git a/app/Http/Controllers/VendorPortal/InvitationController.php b/app/Http/Controllers/VendorPortal/InvitationController.php index e0666ecfe109..ab472eddcc33 100644 --- a/app/Http/Controllers/VendorPortal/InvitationController.php +++ b/app/Http/Controllers/VendorPortal/InvitationController.php @@ -94,7 +94,7 @@ class InvitationController extends Controller $file_name = $invitation->purchase_order->numberFormatter().'.pdf'; - $file = (new CreatePurchaseOrderPdf($invitation))->rawPdf(); + $file = $invitation->purchase_order->service()->getPurchaseOrderPdf(); $headers = ['Content-Type' => 'application/pdf']; diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index 9fe4e285b269..d73fbbaa12ad 100644 --- a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php +++ b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php @@ -11,23 +11,24 @@ namespace App\Http\Controllers\VendorPortal; -use App\Events\Misc\InvitationWasViewed; -use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; -use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +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\Http\Requests\VendorPortal\PurchaseOrders\ProcessPurchaseOrdersInBulkRequest; +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\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; use App\Http\Requests\VendorPortal\PurchaseOrders\ShowPurchaseOrderRequest; use App\Http\Requests\VendorPortal\PurchaseOrders\ShowPurchaseOrdersRequest; -use App\Jobs\Invoice\InjectSignature; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; -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; +use App\Http\Requests\VendorPortal\PurchaseOrders\ProcessPurchaseOrdersInBulkRequest; class PurchaseOrderController extends Controller { @@ -116,7 +117,7 @@ class PurchaseOrderController extends Controller $invitation = PurchaseOrderInvitation::withTrashed()->find($data['invitation_id']); - $file = (new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf(); + $file = $invitation->purchase_order->service()->getPurchaseOrderPdf(); $headers = ['Content-Type' => 'application/pdf']; @@ -211,7 +212,8 @@ class PurchaseOrderController extends Controller if (count($purchase_order_invitations) == 1) { $invitation = $purchase_order_invitations->first(); - $file = (new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf(); + $file = (new CreateRawPdf($invitation))->handle(); + return response()->streamDownload(function () use ($file) { echo $file; }, $invitation->purchase_order->numberFormatter().".pdf", ['Content-Type' => 'application/pdf']); @@ -226,7 +228,8 @@ class PurchaseOrderController extends Controller $zipFile = new \PhpZip\ZipFile(); try { foreach ($invitations as $invitation) { - $file = (new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf(); + + $file = (new CreateRawPdf($invitation))->handle(); $zipFile->addFromString($invitation->purchase_order->numberFormatter().".pdf", $file); } diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index f785f5f67cda..5b96d4fdcbd2 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -95,11 +95,7 @@ class PdfSlot extends Component $file_name = $this->entity->numberFormatter().'.pdf'; - if($this->entity instanceof \App\Models\PurchaseOrder) { - $file = (new CreatePurchaseOrderPdf($this->invitation, $this->invitation->company->db))->rawPdf(); - } else { - $file = (new \App\Jobs\Entity\CreateRawPdf($this->invitation))->handle(); - } + $file = (new \App\Jobs\Entity\CreateRawPdf($this->invitation))->handle(); $headers = ['Content-Type' => 'application/pdf']; @@ -108,6 +104,7 @@ class PdfSlot extends Component }, $file_name, $headers); } + public function downloadEInvoice() { diff --git a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php index 8c1f85ccd15b..10699dcbc115 100644 --- a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php +++ b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php @@ -11,20 +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 App\Models\Company; +use Illuminate\Queue\SerializesModels; use App\Models\PurchaseOrderInvitation; -use App\Models\User; -use Illuminate\Bus\Queueable; +use Illuminate\Support\Facades\Storage; +use Illuminate\Queue\InteractsWithQueue; 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 { @@ -62,7 +63,9 @@ class ZipPurchaseOrders implements ShouldQueue try { foreach ($invitations as $invitation) { - $file = (new \App\Jobs\Vendor\CreatePurchaseOrderPdf($invitation))->rawPdf(); + + $file = (new CreateRawPdf($invitation))->handle(); + $zipFile->addFromString($invitation->purchase_order->numberFormatter().".pdf", $file); } diff --git a/app/Mail/Engine/PurchaseOrderEmailEngine.php b/app/Mail/Engine/PurchaseOrderEmailEngine.php index 51f6d5bd5360..f3d181346843 100644 --- a/app/Mail/Engine/PurchaseOrderEmailEngine.php +++ b/app/Mail/Engine/PurchaseOrderEmailEngine.php @@ -11,18 +11,19 @@ namespace App\Mail\Engine; -use App\DataMapper\EmailTemplateDefaults; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; -use App\Models\Account; -use App\Models\PurchaseOrder; -use App\Models\Vendor; -use App\Utils\HtmlEngine; use App\Utils\Ninja; use App\Utils\Number; +use App\Models\Vendor; +use App\Models\Account; +use App\Utils\HtmlEngine; +use App\Models\PurchaseOrder; 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; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; class PurchaseOrderEmailEngine extends BaseEmailEngine { @@ -119,7 +120,8 @@ class PurchaseOrderEmailEngine extends BaseEmailEngine ->setTextBody($text_body); if ($this->vendor->getSetting('pdf_email_attachment') !== false && $this->purchase_order->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - $pdf = (new CreatePurchaseOrderPdf($this->invitation))->rawPdf(); + + $pdf = (new CreateRawPdf($this->invitation))->handle(); $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->purchase_order->numberFormatter().'.pdf']]); } diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 976584842f14..36c9638a0e21 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -302,10 +302,6 @@ class BaseModel extends Model if (! $invitation) { throw new \Exception('Hard fail, could not create an invitation.'); } - - if($this instanceof \App\Models\PurchaseOrder) { - return "data:application/pdf;base64,".base64_encode((new CreatePurchaseOrderPdf($invitation, $invitation->company->db))->rawPdf()); - } return "data:application/pdf;base64,".base64_encode((new CreateRawPdf($invitation))->handle()); diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 4c7b9319c12c..e1dd56b9c86e 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -299,14 +299,7 @@ class EmailDefaults } /** Purchase Order / Invoice / Credit / Quote PDF */ - if ($this->email->email_object->settings->pdf_email_attachment && $this->email->email_object->entity instanceof PurchaseOrder) { - $pdf = (new CreatePurchaseOrderPdf($this->email->email_object->invitation))->rawPdf(); - - $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($pdf), 'name' => $this->email->email_object->entity->numberFormatter().'.pdf']]); - } elseif ($this->email->email_object->settings->pdf_email_attachment && - ($this->email->email_object->entity instanceof Invoice || - $this->email->email_object->entity instanceof Quote || - $this->email->email_object->entity instanceof Credit)) { + 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/PurchaseOrder/GetPurchaseOrderPdf.php b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php index 1a536698202d..824c6f3f895f 100644 --- a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php +++ b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php @@ -11,6 +11,7 @@ namespace App\Services\PurchaseOrder; +use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\PurchaseOrder; use App\Models\VendorContact; @@ -35,21 +36,7 @@ class GetPurchaseOrderPdf extends AbstractService $invitation = $this->purchase_order->invitations()->first(); } - return (new CreatePurchaseOrderPdf($invitation))->handle(); - - // $path = $this->purchase_order->vendor->purchase_order_filepath($invitation); - - // $file_path = $path.$this->purchase_order->numberFormatter().'.pdf'; - - // // $disk = 'public'; - // $disk = config('filesystems.default'); - - // $file = Storage::disk($disk)->exists($file_path); - - // if (! $file) { - // $file_path = (new CreatePurchaseOrderPdf($invitation))->handle(); - // } - - // return $file_path; + return (new CreateRawPdf($invitation))->handle(); + } } diff --git a/tests/Feature/PurchaseOrderTest.php b/tests/Feature/PurchaseOrderTest.php index 15183ac0f2cd..4a5dfe798499 100644 --- a/tests/Feature/PurchaseOrderTest.php +++ b/tests/Feature/PurchaseOrderTest.php @@ -233,7 +233,6 @@ class PurchaseOrderTest extends TestCase $x = $purchase_order->service()->markSent()->getPurchaseOrderPdf(); - // nlog($x); } public function testPurchaseOrderRest() From 2c8dde7f20430b4e5b48fdb0b00bc05a63491f53 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 17:51:28 +1100 Subject: [PATCH 101/109] Merge support for purchase order PDF generation --- app/Http/Controllers/PurchaseOrderController.php | 1 - app/Http/Controllers/VendorPortal/InvitationController.php | 1 - app/Http/Controllers/VendorPortal/PurchaseOrderController.php | 1 - app/Http/Livewire/PdfSlot.php | 3 +-- app/Jobs/Vendor/CreatePurchaseOrderPdf.php | 1 + app/Mail/Engine/PurchaseOrderEmailEngine.php | 2 -- app/Models/BaseModel.php | 1 - app/Services/Email/EmailDefaults.php | 4 ---- app/Services/PurchaseOrder/GetPurchaseOrderPdf.php | 2 -- 9 files changed, 2 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index 0864775707af..4b0ad2e006c7 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -515,7 +515,6 @@ class PurchaseOrderController extends BaseController if ($action == 'bulk_print' && $user->can('view', $purchase_orders->first())) { $paths = $purchase_orders->map(function ($purchase_order) { return (new CreateRawPdf($purchase_order->invitations->first()))->handle(); - // return (new \App\Jobs\Vendor\CreatePurchaseOrderPdf($purchase_order->invitations->first()))->rawPdf(); }); $merge = (new PdfMerge($paths->toArray()))->run(); diff --git a/app/Http/Controllers/VendorPortal/InvitationController.php b/app/Http/Controllers/VendorPortal/InvitationController.php index ab472eddcc33..81bffff02db7 100644 --- a/app/Http/Controllers/VendorPortal/InvitationController.php +++ b/app/Http/Controllers/VendorPortal/InvitationController.php @@ -14,7 +14,6 @@ namespace App\Http\Controllers\VendorPortal; use App\Events\Misc\InvitationWasViewed; use App\Events\PurchaseOrder\PurchaseOrderWasViewed; use App\Http\Controllers\Controller; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\PurchaseOrderInvitation; use App\Utils\Ninja; use App\Utils\Traits\MakesDates; diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index d73fbbaa12ad..fb70c248b793 100644 --- a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php +++ b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php @@ -23,7 +23,6 @@ use Illuminate\Support\Facades\Cache; use Illuminate\Contracts\View\Factory; use App\Models\PurchaseOrderInvitation; use App\Events\Misc\InvitationWasViewed; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Events\PurchaseOrder\PurchaseOrderWasViewed; use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; use App\Http\Requests\VendorPortal\PurchaseOrders\ShowPurchaseOrderRequest; diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index 5b96d4fdcbd2..91a51e588acd 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -13,7 +13,6 @@ namespace App\Http\Livewire; use App\Jobs\Invoice\CreateEInvoice; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Libraries\MultiDB; use App\Models\CreditInvitation; use App\Models\InvoiceInvitation; @@ -104,7 +103,7 @@ class PdfSlot extends Component }, $file_name, $headers); } - + public function downloadEInvoice() { diff --git a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php index 928f0ebc88e9..59777bed2a91 100644 --- a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php +++ b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php @@ -35,6 +35,7 @@ use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; +/** @deprecated 26-10-2023 5.7.30x */ class CreatePurchaseOrderPdf implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; diff --git a/app/Mail/Engine/PurchaseOrderEmailEngine.php b/app/Mail/Engine/PurchaseOrderEmailEngine.php index f3d181346843..b1f4a3bb3032 100644 --- a/app/Mail/Engine/PurchaseOrderEmailEngine.php +++ b/app/Mail/Engine/PurchaseOrderEmailEngine.php @@ -15,7 +15,6 @@ use App\Utils\Ninja; use App\Utils\Number; use App\Models\Vendor; use App\Models\Account; -use App\Utils\HtmlEngine; use App\Models\PurchaseOrder; use App\Utils\Traits\MakesHash; use App\Utils\VendorHtmlEngine; @@ -23,7 +22,6 @@ use App\Jobs\Entity\CreateRawPdf; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; use App\DataMapper\EmailTemplateDefaults; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; class PurchaseOrderEmailEngine extends BaseEmailEngine { diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 36c9638a0e21..3cbeef7b171c 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -13,7 +13,6 @@ namespace App\Models; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Util\WebhookHandler; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\Traits\Excludable; use App\Utils\Traits\MakesHash; use App\Utils\Traits\UserSessionAttributes; diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index e1dd56b9c86e..45ae94ed7a7f 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -14,13 +14,9 @@ namespace App\Services\Email; use App\DataMapper\EmailTemplateDefaults; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Invoice\CreateUbl; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\Account; -use App\Models\Credit; use App\Models\Expense; use App\Models\Invoice; -use App\Models\PurchaseOrder; -use App\Models\Quote; use App\Models\Task; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; diff --git a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php index 824c6f3f895f..620836ba9b46 100644 --- a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php +++ b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php @@ -12,11 +12,9 @@ namespace App\Services\PurchaseOrder; use App\Jobs\Entity\CreateRawPdf; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\PurchaseOrder; use App\Models\VendorContact; use App\Services\AbstractService; -use Illuminate\Support\Facades\Storage; class GetPurchaseOrderPdf extends AbstractService { From b9997e9ed110aba26d24cef58e864a3d5fe4f03e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 20:26:57 +1100 Subject: [PATCH 102/109] Minor fixes for purchase order previews --- app/Http/Controllers/PreviewPurchaseOrderController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 8b756b627dad..d2dd72d35022 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -336,7 +336,7 @@ class PreviewPurchaseOrderController extends BaseController 'process_markdown' => $invitation->company->markdown_enabled, 'options' => [ 'vendor' => $invitation->purchase_order->vendor, - 'purchase_orders' => $invitation->purchase_order, + 'purchase_orders' => [$invitation->purchase_order], ], ]; @@ -445,7 +445,7 @@ class PreviewPurchaseOrderController extends BaseController 'process_markdown' => $purchase_order->company->markdown_enabled, 'options' => [ 'vendor' => $invitation->purchase_order->vendor, - 'purchase_orders' => $invitation->purchase_order, + 'purchase_orders' => [$invitation->purchase_order], ], ]; From 0d2bc0151a2ccfa4eb6a2cebf609ed2e41b320bf Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 20:33:34 +1100 Subject: [PATCH 103/109] Attempt different BASE url in github action tests --- .env.ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.ci b/.env.ci index c7434b25afac..504f9a44779a 100644 --- a/.env.ci +++ b/.env.ci @@ -2,7 +2,7 @@ APP_NAME="Invoice Ninja" APP_ENV=local APP_KEY= APP_DEBUG=true -APP_URL=http://ninja.test +APP_URL=http://localhost MULTI_DB_ENABLED=false # database DB_CONNECTION=mysql From 8e6ae34a3309b4b9ecddec5909e4575987d0d044 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 21:09:22 +1100 Subject: [PATCH 104/109] Fixes for tests --- app/Http/Requests/Vendor/StoreVendorRequest.php | 15 ++++++++++++++- app/Http/Requests/Vendor/UpdateVendorRequest.php | 15 ++++++++++++++- app/Repositories/VendorContactRepository.php | 10 ++++++++++ app/Services/Pdf/PdfBuilder.php | 2 +- app/Transformers/VendorContactTransformer.php | 1 + tests/_bootstrap.php | 2 +- 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/Vendor/StoreVendorRequest.php b/app/Http/Requests/Vendor/StoreVendorRequest.php index 3ce8ba472198..f60c7997b7cd 100644 --- a/app/Http/Requests/Vendor/StoreVendorRequest.php +++ b/app/Http/Requests/Vendor/StoreVendorRequest.php @@ -38,8 +38,21 @@ class StoreVendorRequest extends Request $user = auth()->user(); $rules = []; - + + $rules['contacts'] = 'bail|array'; $rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email'; + $rules['contacts.*.password'] = [ + 'bail', + 'nullable', + 'sometimes', + 'string', + 'min:7', // must be at least 10 characters in length + 'regex:/[a-z]/', // must contain at least one lowercase letter + 'regex:/[A-Z]/', // must contain at least one uppercase letter + 'regex:/[0-9]/', // must contain at least one digit + //'regex:/[@$!%*#?&.]/', // must contain a special character + ]; + if (isset($this->number)) { $rules['number'] = Rule::unique('vendors')->where('company_id', $user->company()->id); diff --git a/app/Http/Requests/Vendor/UpdateVendorRequest.php b/app/Http/Requests/Vendor/UpdateVendorRequest.php index b50e8cf79229..e8b6811fd135 100644 --- a/app/Http/Requests/Vendor/UpdateVendorRequest.php +++ b/app/Http/Requests/Vendor/UpdateVendorRequest.php @@ -45,7 +45,20 @@ class UpdateVendorRequest extends Request $rules['number'] = Rule::unique('vendors')->where('company_id', $user->company()->id)->ignore($this->vendor->id); } - $rules['contacts.*.email'] = 'nullable|distinct'; + $rules['contacts'] = 'bail|array'; + $rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email'; + $rules['contacts.*.password'] = [ + 'bail', + 'nullable', + 'sometimes', + 'string', + 'min:7', // must be at least 10 characters in length + 'regex:/[a-z]/', // must contain at least one lowercase letter + 'regex:/[A-Z]/', // must contain at least one uppercase letter + 'regex:/[0-9]/', // must contain at least one digit + //'regex:/[@$!%*#?&.]/', // must contain a special character + ]; + $rules['currency_id'] = 'bail|sometimes|exists:currencies,id'; if ($this->file('documents') && is_array($this->file('documents'))) { diff --git a/app/Repositories/VendorContactRepository.php b/app/Repositories/VendorContactRepository.php index 6827b57d23d8..b2b1647fcfce 100644 --- a/app/Repositories/VendorContactRepository.php +++ b/app/Repositories/VendorContactRepository.php @@ -61,13 +61,23 @@ class VendorContactRepository extends BaseRepository $update_contact->contact_key = Str::random(40); } + if (array_key_exists('email', $contact) && is_null($contact['email'])) { + $contact['email'] = ''; + } + $update_contact->fill($contact); if (array_key_exists('password', $contact) && strlen($contact['password']) > 1) { $update_contact->password = Hash::make($contact['password']); + $vendor->company->vendor_contacts()->where('email', $update_contact->email)->update(['password' => $update_contact->password]); + } + + if (array_key_exists('email', $contact)) { + $update_contact->email = trim($contact['email']); } $update_contact->saveQuietly(); + }); $vendor->load('contacts'); diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 0c844fcba6f1..7a496e17578b 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -927,7 +927,7 @@ class PdfBuilder */ private function getProductEntityDetails(): self { - if ($this->service->config->entity_string == 'invoice') { + if (in_array($this->service->config->entity_string, ['recurring_invoice', 'invoice'])) { $this->mergeSections([ 'entity-details' => [ 'id' => 'entity-details', diff --git a/app/Transformers/VendorContactTransformer.php b/app/Transformers/VendorContactTransformer.php index ca344634ce5b..7a584e18ca6a 100644 --- a/app/Transformers/VendorContactTransformer.php +++ b/app/Transformers/VendorContactTransformer.php @@ -45,6 +45,7 @@ class VendorContactTransformer extends EntityTransformer 'custom_value4' => $vendor->custom_value4 ?: '', 'link' => $vendor->getLoginLink(), 'last_login' => (int)$vendor->last_login, + 'password' => empty($vendor->password) ? '' : '**********', ]; } } diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php index 1f6877ca56ee..a631610f5897 100644 --- a/tests/_bootstrap.php +++ b/tests/_bootstrap.php @@ -3,7 +3,7 @@ // This is global bootstrap for autoloading use Codeception\Util\Fixtures; -Fixtures::add('url', 'http://www.ninja.test'); +Fixtures::add('url', 'http://localhost'); Fixtures::add('username', 'user@example.com'); Fixtures::add('password', 'password'); From d4ab212dbc923c2ae4572e18060a0bce883731a2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 26 Oct 2023 22:38:27 +1100 Subject: [PATCH 105/109] Fixes for tests --- .env.ci | 2 +- tests/Feature/Export/ReportCsvGenerationTest.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.ci b/.env.ci index 504f9a44779a..c7434b25afac 100644 --- a/.env.ci +++ b/.env.ci @@ -2,7 +2,7 @@ APP_NAME="Invoice Ninja" APP_ENV=local APP_KEY= APP_DEBUG=true -APP_URL=http://localhost +APP_URL=http://ninja.test MULTI_DB_ENABLED=false # database DB_CONNECTION=mysql diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index bf0189550501..2df5bf10648b 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -55,6 +55,9 @@ class ReportCsvGenerationTest extends TestCase $this->buildData(); + if (config('ninja.testvars.travis') !== false) + $this->markTestSkipped('Skip test no company gateways installed'); + } @@ -286,6 +289,7 @@ class ReportCsvGenerationTest extends TestCase return $response; } + public function testVendorCsvGeneration() { From ed3560a637f4d2d5e631908538795764d92ef628 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 27 Oct 2023 17:13:23 +1100 Subject: [PATCH 106/109] Working on supporting statements and variables --- .../Requests/Project/StoreProjectRequest.php | 13 ++++++++++--- .../Requests/Project/UpdateProjectRequest.php | 12 ++++++++++-- app/Services/Client/ClientService.php | 16 +++++++++------- app/Services/Client/Statement.php | 19 ++++++++++++++++--- app/Services/Email/Email.php | 2 +- openapi/api-docs.yaml | 2 +- openapi/components/schemas/invoice_item.yaml | 2 +- 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/Http/Requests/Project/StoreProjectRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php index 98664cd84c0e..a8684c0d24c8 100644 --- a/app/Http/Requests/Project/StoreProjectRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -28,18 +28,25 @@ class StoreProjectRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('create', Project::class); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('create', Project::class); } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = []; $rules['name'] = 'required'; - $rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id; + $rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id; if (isset($this->number)) { - $rules['number'] = Rule::unique('projects')->where('company_id', auth()->user()->company()->id); + $rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id); } if ($this->file('documents') && is_array($this->file('documents'))) { diff --git a/app/Http/Requests/Project/UpdateProjectRequest.php b/app/Http/Requests/Project/UpdateProjectRequest.php index 484f18f036f3..dc5484f8a255 100644 --- a/app/Http/Requests/Project/UpdateProjectRequest.php +++ b/app/Http/Requests/Project/UpdateProjectRequest.php @@ -26,15 +26,23 @@ class UpdateProjectRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('edit', $this->project); + + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('edit', $this->project); } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = []; if (isset($this->number)) { - $rules['number'] = Rule::unique('projects')->where('company_id', auth()->user()->company()->id)->ignore($this->project->id); + $rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id)->ignore($this->project->id); } if ($this->file('documents') && is_array($this->file('documents'))) { diff --git a/app/Services/Client/ClientService.php b/app/Services/Client/ClientService.php index f7d35ba7639b..e8e39fb4cae1 100644 --- a/app/Services/Client/ClientService.php +++ b/app/Services/Client/ClientService.php @@ -11,15 +11,16 @@ namespace App\Services\Client; +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\Services\Email\EmailObject; -use App\Utils\Number; use App\Utils\Traits\MakesDates; -use Illuminate\Mail\Mailables\Address; use Illuminate\Support\Facades\DB; +use App\Services\Email\EmailObject; +use Illuminate\Mail\Mailables\Address; class ClientService { @@ -42,16 +43,12 @@ class ClientService $this->client->saveQuietly(); }, 2); } catch (\Throwable $throwable) { - nlog("DB ERROR " . $throwable->getMessage()); - DB::connection(config('database.default'))->rollBack(); if (DB::connection(config('database.default'))->transactionLevel() > 0) { DB::connection(config('database.default'))->rollBack(); } } catch(\Exception $exception) { - nlog("DB ERROR " . $exception->getMessage()); - DB::connection(config('database.default'))->rollBack(); if (DB::connection(config('database.default'))->transactionLevel() > 0) { DB::connection(config('database.default'))->rollBack(); @@ -240,8 +237,13 @@ class ClientService } + $invoice = $this->client->invoices()->whereHas('invitations')->first(); + $email_object->attachments = [['file' => base64_encode($pdf), 'name' => ctrans('texts.statement') . ".pdf"]]; $email_object->client_id = $this->client->id; + $email_object->entity_class = Invoice::class; + $email_object->entity_id = $invoice->id ?? null; + $email_object->invitation_id = $invoice->invitations->first()->id ?? null; $email_object->email_template_subject = 'email_subject_statement'; $email_object->email_template_body = 'email_template_statement'; $email_object->variables = [ diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 4c86a5675e24..1fd06f81434e 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -46,6 +46,8 @@ class Statement protected bool $rollback = false; + private array $variables = []; + public function __construct(protected Client $client, public array $options) { } @@ -108,8 +110,6 @@ class Statement 'process_markdown' => $this->entity->client->company->markdown_enabled, ]; - - $maker = new PdfMaker($state); $maker @@ -118,7 +118,6 @@ class Statement $pdf = null; $html = $maker->getCompiledHTML(true); - if ($this->rollback) { \DB::connection(config('database.default'))->rollBack(); @@ -126,12 +125,26 @@ class Statement $pdf = $this->convertToPdf($html); + $this->setVariables($variables); + $maker = null; $state = null; return $pdf; } + public function setVariables($variables): self + { + $this->variables = $variables; + + return $this; + } + + public function getVariables(): array + { + return $this->variables; + } + private function templateStatement($variables) { if(isset($this->options['template'])) { diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index bd4095849020..093febece8fb 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -156,7 +156,7 @@ class Email implements ShouldQueue /** * Generates the correct set of variables - * + * @todo handle payment engine here also * @return self */ private function resolveVariables(): self diff --git a/openapi/api-docs.yaml b/openapi/api-docs.yaml index a84e3b19354e..600f56788af9 100644 --- a/openapi/api-docs.yaml +++ b/openapi/api-docs.yaml @@ -17209,7 +17209,7 @@ components: type: object properties: quantity: - type: integer + type: number example: 1 description: 'The quantity of the product offered for this line item' cost: diff --git a/openapi/components/schemas/invoice_item.yaml b/openapi/components/schemas/invoice_item.yaml index 2357c127c526..0dcf42204a2d 100644 --- a/openapi/components/schemas/invoice_item.yaml +++ b/openapi/components/schemas/invoice_item.yaml @@ -2,7 +2,7 @@ type: object properties: quantity: - type: integer + type: number example: 1 description: 'The quantity of the product offered for this line item' cost: From aa0072eb2068d07e990ae038d5f05b0b17ea340a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 27 Oct 2023 19:30:42 +1100 Subject: [PATCH 107/109] Refactor for PurchaseOrder Previews --- .../PreviewPurchaseOrderController.php | 70 ++++++++++----- .../Preview/PreviewInvoiceRequest.php | 2 +- .../Preview/PreviewPurchaseOrderRequest.php | 86 ++++++++++++++++++- app/Jobs/Cron/UpdateCalculatedFields.php | 5 +- 4 files changed, 138 insertions(+), 25 deletions(-) diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index d2dd72d35022..47098eff623e 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -11,32 +11,33 @@ namespace App\Http\Controllers; -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\Utils\Ninja; use App\Models\Client; -use App\Models\PurchaseOrder; -use App\Models\PurchaseOrderInvitation; use App\Models\Vendor; +use App\Libraries\MultiDB; +use App\Jobs\Util\PreviewPdf; +use App\Models\PurchaseOrder; use App\Models\VendorContact; -use App\Repositories\PurchaseOrderRepository; +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\Repositories\PurchaseOrderRepository; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -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; +use App\Http\Requests\Preview\PreviewPurchaseOrderRequest; class PreviewPurchaseOrderController extends BaseController { @@ -173,6 +174,35 @@ class PreviewPurchaseOrderController extends BaseController /** @var \App\Models\User $user */ $user = auth()->user(); + $invitation = $request->resolveInvitation(); + $vendor = $request->getVendor(); + $settings = $user->company()->settings; + + /** Set translations */ + App::forgetInstance('translator'); + $t = app('translator'); + App::setLocale($invitation->contact->preferredLocale()); + $t->replace(Ninja::transformTranslations($settings)); + + $entity_obj = $invitation->purchase_order; + $entity_obj->fill($request->all()); + + $ps = new PdfService($invitation, 'purchase_order', [ + 'client' => $entity_obj->client ?? false, + 'vendor' => $vendor ?? false, + "purchase_orders" => [$entity_obj], + ]); + + $pdf = $ps->boot()->getPdf(); + return $pdf; + + } + + public function livex(PreviewPurchaseOrderRequest $request) + { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $company = $user->company(); MultiDB::setDb($company->db); diff --git a/app/Http/Requests/Preview/PreviewInvoiceRequest.php b/app/Http/Requests/Preview/PreviewInvoiceRequest.php index d69d231c05b5..7bbdaebdbe29 100644 --- a/app/Http/Requests/Preview/PreviewInvoiceRequest.php +++ b/app/Http/Requests/Preview/PreviewInvoiceRequest.php @@ -104,7 +104,7 @@ class PreviewInvoiceRequest extends Request return $invitation; } - $invitation = $this->stubInvitation(); + return $this->stubInvitation(); } public function getClient(): ?Client diff --git a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php index 927937bf25a7..e7075e1a0bb8 100644 --- a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php +++ b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php @@ -11,15 +11,21 @@ namespace App\Http\Requests\Preview; +use App\Models\Vendor; +use App\Models\PurchaseOrder; use App\Http\Requests\Request; -use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; +use App\Utils\Traits\CleanLineItems; +use App\Models\PurchaseOrderInvitation; class PreviewPurchaseOrderRequest extends Request { use MakesHash; use CleanLineItems; + private ?Vendor $vendor = null; + private string $entity_plural = ''; + /** * Determine if the user is authorized to make this request. * @@ -27,7 +33,10 @@ class PreviewPurchaseOrderRequest extends Request */ public function authorize() : bool { - return auth()->user()->hasIntersectPermissionsOrAdmin(['create_purchase_order', 'edit_purchase_order', 'view_purchase_order']); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->hasIntersectPermissionsOrAdmin(['create_purchase_order', 'edit_purchase_order', 'view_purchase_order']); } public function rules() @@ -52,4 +61,77 @@ class PreviewPurchaseOrderRequest extends Request $this->replace($input); } + + + + public function resolveInvitation() + { + $invitation = false; + + if(! $this->entity_id ?? false) { + return $this->stubInvitation(); + } + + $invitation = PurchaseOrderInvitation::withTrashed()->where('purchase_order_id', $this->entity_id)->first(); + + if($invitation) { + return $invitation; + } + + return $this->stubInvitation(); + + + } + + public function getVendor(): ?Vendor + { + if(!$this->vendor) { + $this->vendor = Vendor::query()->with('contacts', 'company', 'user')->withTrashed()->find($this->vendor_id); + } + + return $this->vendor; + } + + public function setVendor(Vendor $vendor): self + { + $this->vendor = $vendor; + + return $this; + } + + public function stubInvitation() + { + $vendor = Vendor::query()->with('contacts', 'company', 'user')->withTrashed()->find($this->vendor_id); + $this->setVendor($vendor); + $invitation = false; + + $entity = $this->stubEntity($vendor); + $invitation = PurchaseOrderInvitation::factory()->make(); + $invitation->setRelation('purchase_order', $entity); + $invitation->setRelation('contact', $vendor->contacts->first()->load('vendor.company')); + $invitation->setRelation('company', $vendor->company); + + return $invitation; + } + + private function stubEntity(Vendor $vendor) + { + $entity = PurchaseOrder::factory()->make(['vendor_id' => $vendor->id,'user_id' => $vendor->user_id, 'company_id' => $vendor->company_id]); + + $entity->setRelation('vendor', $vendor); + $entity->setRelation('company', $vendor->company); + $entity->setRelation('user', $vendor->user); + $entity->fill($this->all()); + + return $entity; + } + + private function convertEntityPlural(string $entity) :self + { + + $this->entity_plural = 'purchase_orders'; + + return $this; + } + } diff --git a/app/Jobs/Cron/UpdateCalculatedFields.php b/app/Jobs/Cron/UpdateCalculatedFields.php index a5337255ecb8..77a629fce31d 100644 --- a/app/Jobs/Cron/UpdateCalculatedFields.php +++ b/app/Jobs/Cron/UpdateCalculatedFields.php @@ -79,8 +79,9 @@ class UpdateCalculatedFields $project->tasks->each(function ($task) use (&$duration) { - if(is_iterable($task->time_log)) { - foreach(json_decode($task->time_log) as $log) { + if(is_iterable(json_decode($task->time_log) )) { + + foreach(json_decode($task->time_log) as $log) { $start_time = $log[0]; $end_time = $log[1] == 0 ? time() : $log[1]; From 53a2d7a269461f46cc34ba8b5df8bfc3651d14de Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 27 Oct 2023 21:09:53 +1100 Subject: [PATCH 108/109] Fixes for previews --- app/Http/Controllers/PreviewController.php | 104 +++++++++++++----- .../PreviewPurchaseOrderController.php | 37 +++++-- 2 files changed, 105 insertions(+), 36 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index b2bbab948f72..d680935af130 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -11,33 +11,34 @@ namespace App\Http\Controllers; -use App\DataMapper\Analytics\LivePreview; -use App\Http\Requests\Preview\DesignPreviewRequest; -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\PdfMaker\Design; -use App\Services\PdfMaker\Design as PdfDesignModel; -use App\Services\PdfMaker\Design as PdfMakerDesign; -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\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\Utils\Traits\MakesInvoiceHtml; -use App\Utils\Traits\Pdf\PageNumbering; +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 Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Response; +use App\Utils\Traits\MakesInvoiceHtml; use Turbo124\Beacon\Facades\LightLogs; -use Twig\Error\SyntaxError; +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; class PreviewController extends BaseController { @@ -49,12 +50,59 @@ class PreviewController extends BaseController { parent::__construct(); } - - private function purgeCache() - { - Cache::pull("preview_".auth()->user()->id); - } + public function live(PreviewInvoiceRequest $request): mixed + { + + if (Ninja::isHosted() && !in_array($request->getHost(), ['preview.invoicing.co','staging.invoicing.co'])) { + return response()->json(['message' => 'This server cannot handle this request.'], 400); + } + + $start = microtime(true); + + /** Build models */ + $invitation = $request->resolveInvitation(); + $client = $request->getClient(); + $settings = $client->getMergedSettings(); + $entity_prop = str_replace("recurring_", "", $request->entity); + $entity_obj = $invitation->{$request->entity}; + $entity_obj->fill($request->all()); + + if(!$entity_obj->id) { + $entity_obj->design_id = intval($this->decodePrimaryKey($settings->{$entity_prop."_design_id"})); + $entity_obj->footer = empty($entity_obj->footer) ? $settings->{$entity_prop."_footer"} : $entity_obj->footer; + $entity_obj->terms = empty($entity_obj->terms) ? $settings->{$entity_prop."_terms"} : $entity_obj->terms; + $entity_obj->public_notes = empty($entity_obj->public_notes) ? $request->getClient()->public_notes : $entity_obj->public_notes; + $invitation->setRelation($request->entity, $entity_obj); + } + + $ps = new PdfService($invitation, 'product', [ + 'client' => $client ?? false, + // 'vendor' => $vendor ?? false, + "{$entity_prop}s" => [$entity_obj], + ]); + + $pdf = $ps->boot()->getPdf(); + + + if (Ninja::isHosted()) { + LightLogs::create(new LivePreview()) + ->increment() + ->batch(); + } + + /** Return PDF */ + return response()->streamDownload(function () use ($pdf) { + echo $pdf; + }, 'preview.pdf', [ + 'Content-Disposition' => 'inline', + 'Content-Type' => 'application/pdf', + 'Cache-Control:' => 'no-cache', + 'Server-Timing' => microtime(true)-$start + ]); + + } + /** * Refactor - 2023-10-19 * @@ -63,7 +111,7 @@ class PreviewController extends BaseController * @param PreviewInvoiceRequest $request * @return mixed */ - public function live(PreviewInvoiceRequest $request): mixed + public function livexx(PreviewInvoiceRequest $request): mixed { if (Ninja::isHosted() && !in_array($request->getHost(), ['preview.invoicing.co','staging.invoicing.co'])) { diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 47098eff623e..5884e09f563b 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -171,22 +171,27 @@ class PreviewPurchaseOrderController extends BaseController public function live(PreviewPurchaseOrderRequest $request) { + + $start = microtime(true); + /** @var \App\Models\User $user */ $user = auth()->user(); $invitation = $request->resolveInvitation(); $vendor = $request->getVendor(); $settings = $user->company()->settings; - - /** Set translations */ - App::forgetInstance('translator'); - $t = app('translator'); - App::setLocale($invitation->contact->preferredLocale()); - $t->replace(Ninja::transformTranslations($settings)); - $entity_obj = $invitation->purchase_order; $entity_obj->fill($request->all()); + if(!$entity_obj->id) { + $entity_obj->design_id = intval($this->decodePrimaryKey($settings->{"purchase_order_design_id"})); + $entity_obj->footer = empty($entity_obj->footer) ? $settings->{"purchase_order_footer"} : $entity_obj->footer; + $entity_obj->terms = empty($entity_obj->terms) ? $settings->{"purchase_order_terms"} : $entity_obj->terms; + $entity_obj->public_notes = empty($entity_obj->public_notes) ? $request->getVendor()->public_notes : $entity_obj->public_notes; + $invitation->setRelation($request->entity, $entity_obj); + + } + $ps = new PdfService($invitation, 'purchase_order', [ 'client' => $entity_obj->client ?? false, 'vendor' => $vendor ?? false, @@ -194,7 +199,23 @@ class PreviewPurchaseOrderController extends BaseController ]); $pdf = $ps->boot()->getPdf(); - return $pdf; + + if (Ninja::isHosted()) { + LightLogs::create(new LivePreview()) + ->increment() + ->batch(); + } + + /** Return PDF */ + return response()->streamDownload(function () use ($pdf) { + echo $pdf; + }, 'preview.pdf', [ + 'Content-Disposition' => 'inline', + 'Content-Type' => 'application/pdf', + 'Cache-Control:' => 'no-cache', + 'Server-Timing' => microtime(true)-$start + ]); + } From 483d52853d7da25a7fc4a7fb1f10f371ce8f7498 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 27 Oct 2023 21:11:10 +1100 Subject: [PATCH 109/109] v5.7.34 --- VERSION.txt | 2 +- config/ninja.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 71c2c6e276ca..57ebcacf2c5b 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.7.33 \ No newline at end of file +5.7.34 \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index d5f584da4e29..b6801e5f61f6 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -15,8 +15,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION','5.7.33'), - 'app_tag' => env('APP_TAG','5.7.33'), + 'app_version' => env('APP_VERSION','5.7.34'), + 'app_tag' => env('APP_TAG','5.7.34'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''),
+ // // '. $text .' //