Merge branch 'v5-develop' of https://github.com/turbo124/invoiceninja into v5-develop

This commit is contained in:
David Bomba 2023-11-14 09:03:12 +11:00
commit d4a92762d3
11 changed files with 1372 additions and 212 deletions

View File

@ -388,6 +388,7 @@ class PreviewController extends BaseController
$design_object = json_decode(json_encode(request()->input('design')), 1);
$ts = (new TemplateService());
try {
$ts->setCompany($company)
->setTemplate($design_object)
@ -395,7 +396,6 @@ class PreviewController extends BaseController
} catch(SyntaxError $e) {
// return response()->json(['message' => 'Twig syntax is invalid.', 'errors' => new \stdClass], 422);
}
$html = $ts->getHtml();

View File

@ -56,12 +56,9 @@ class StoreTaskRequest extends Request
$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.');
if(!is_array(json_decode($values, true))) {
$fail('The '.$attribute.' must be a valid array.');
return;
}
foreach ($values as $k) {
@ -119,6 +116,10 @@ class StoreTaskRequest extends Request
}
}
if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}'){
$input['time_log'] = json_encode([]);
}
$this->replace($input);
}
}

View File

@ -38,12 +38,14 @@ class UpdateTaskRequest extends Request
/** @var \App\Models\User $user */
$user = auth()->user();
/** @var \App\Models\User $user */
$user = auth()->user();
return $user->can('edit', $this->task);
}
public function rules()
{
/** @var \App\Models\User $user */
$user = auth()->user();
@ -63,12 +65,9 @@ class UpdateTaskRequest extends Request
$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.');
if(!is_array(json_decode($values, true))) {
$fail('The '.$attribute.' must be a valid array.');
return;
}
foreach ($values as $k) {
@ -129,6 +128,10 @@ class UpdateTaskRequest extends Request
}
if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}') {
$input['time_log'] = json_encode([]);
}
$this->replace($input);
}

View File

@ -268,7 +268,8 @@ class PurchaseOrder extends BaseModel
{
return $this->belongsTo(Client::class)->withTrashed();
}
public function markInvitationsSent()
public function markInvitationsSent(): void
{
$this->invitations->each(function ($invitation) {
if (! isset($invitation->sent_date)) {

View File

@ -239,4 +239,23 @@ class Task extends BaseModel
return $this->company->settings->default_task_rate ?? 0;
}
public function processLogs()
{
return
collect($this->time_log)->map(function ($log){
$parent_entity = $this->client ?? $this->company;
if($log[0])
$log[0] = Carbon::createFromTimestamp($log[0])->format($parent_entity->date_format());
if($log[1] && $log[1] != 0)
$log[1] = Carbon::createFromTimestamp($log[1])->format($parent_entity->date_format());
else
$log[1] = ctrans('texts.running');
return $log;
})->toArray();
}
}

View File

@ -1621,12 +1621,6 @@ class PdfBuilder
// Dom Traversal
///////////////////////////////////////
public function getSectionNode(string $selector)
{
return $this->document->getElementById($selector);
}
public function updateElementProperties() :self
{
foreach ($this->sections as $element) {

File diff suppressed because it is too large Load Diff

204
composer.lock generated
View File

@ -485,16 +485,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.285.3",
"version": "3.285.4",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be"
"reference": "c462af819d81cba49939949032b20799f5ef0fff"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/afa1e722f1b2c95644f375dc1a19072e4daf67be",
"reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c462af819d81cba49939949032b20799f5ef0fff",
"reference": "c462af819d81cba49939949032b20799f5ef0fff",
"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.285.3"
"source": "https://github.com/aws/aws-sdk-php/tree/3.285.4"
},
"time": "2023-11-09T19:07:19+00:00"
"time": "2023-11-10T19:25:49+00:00"
},
{
"name": "bacon/bacon-qr-code",
@ -790,16 +790,16 @@
},
{
"name": "checkout/checkout-sdk-php",
"version": "3.0.17",
"version": "3.0.18",
"source": {
"type": "git",
"url": "https://github.com/checkout/checkout-sdk-php.git",
"reference": "dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27"
"reference": "9e606ac8ad5371cfb571050e7ea2c0c05b2b3070"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27",
"reference": "dabb6dd37ad80aaa9c34e60f48f9bf8b651bdc27",
"url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/9e606ac8ad5371cfb571050e7ea2c0c05b2b3070",
"reference": "9e606ac8ad5371cfb571050e7ea2c0c05b2b3070",
"shasum": ""
},
"require": {
@ -852,9 +852,9 @@
],
"support": {
"issues": "https://github.com/checkout/checkout-sdk-php/issues",
"source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.17"
"source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.18"
},
"time": "2023-10-20T22:35:30+00:00"
"time": "2023-11-10T09:12:20+00:00"
},
{
"name": "cleverit/ubl_invoice",
@ -2487,16 +2487,16 @@
},
{
"name": "google/apiclient-services",
"version": "v0.323.0",
"version": "v0.324.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6"
"reference": "585cc823c3d59788e4a0829d5b7e41c76950d801"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d5497d30ddfafe7592102ca48bedaf222a4ca7a6",
"reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/585cc823c3d59788e4a0829d5b7e41c76950d801",
"reference": "585cc823c3d59788e4a0829d5b7e41c76950d801",
"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.323.0"
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.324.0"
},
"time": "2023-11-06T01:08:38+00:00"
"time": "2023-11-13T01:06:14+00:00"
},
{
"name": "google/auth",
@ -2589,24 +2589,24 @@
},
{
"name": "graham-campbell/result-type",
"version": "v1.1.1",
"version": "v1.1.2",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git",
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
"reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862",
"reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9.1"
"phpoption/phpoption": "^1.9.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
"phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
},
"type": "library",
"autoload": {
@ -2635,7 +2635,7 @@
],
"support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1"
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2"
},
"funding": [
{
@ -2647,7 +2647,7 @@
"type": "tidelift"
}
],
"time": "2023-02-25T20:23:15+00:00"
"time": "2023-11-12T22:16:48+00:00"
},
{
"name": "graylog2/gelf-php",
@ -7832,16 +7832,16 @@
},
{
"name": "phpoption/phpoption",
"version": "1.9.1",
"version": "1.9.2",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
"reference": "80735db690fe4fc5c76dfa7f9b770634285fa820"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820",
"reference": "80735db690fe4fc5c76dfa7f9b770634285fa820",
"shasum": ""
},
"require": {
@ -7849,7 +7849,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
"phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
},
"type": "library",
"extra": {
@ -7891,7 +7891,7 @@
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
"source": "https://github.com/schmittjoh/php-option/tree/1.9.1"
"source": "https://github.com/schmittjoh/php-option/tree/1.9.2"
},
"funding": [
{
@ -7903,7 +7903,7 @@
"type": "tidelift"
}
],
"time": "2023-02-25T19:38:58+00:00"
"time": "2023-11-12T21:59:55+00:00"
},
{
"name": "phpseclib/phpseclib",
@ -10288,16 +10288,16 @@
},
{
"name": "symfony/console",
"version": "v6.3.4",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "eca495f2ee845130855ddf1cf18460c38966c8b6"
"reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6",
"reference": "eca495f2ee845130855ddf1cf18460c38966c8b6",
"url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
"reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
"shasum": ""
},
"require": {
@ -10358,7 +10358,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.3.4"
"source": "https://github.com/symfony/console/tree/v6.3.8"
},
"funding": [
{
@ -10374,7 +10374,7 @@
"type": "tidelift"
}
],
"time": "2023-08-16T10:10:12+00:00"
"time": "2023-10-31T08:09:35+00:00"
},
{
"name": "symfony/css-selector",
@ -10867,16 +10867,16 @@
},
{
"name": "symfony/http-client",
"version": "v6.3.7",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
"reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d"
"reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d",
"reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d",
"url": "https://api.github.com/repos/symfony/http-client/zipball/0314e2d49939a9831929d6fc81c01c6df137fd0a",
"reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a",
"shasum": ""
},
"require": {
@ -10939,7 +10939,7 @@
"http"
],
"support": {
"source": "https://github.com/symfony/http-client/tree/v6.3.7"
"source": "https://github.com/symfony/http-client/tree/v6.3.8"
},
"funding": [
{
@ -10955,7 +10955,7 @@
"type": "tidelift"
}
],
"time": "2023-10-29T12:41:36+00:00"
"time": "2023-11-06T18:31:59+00:00"
},
{
"name": "symfony/http-client-contracts",
@ -11037,16 +11037,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v6.3.7",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e"
"reference": "ce332676de1912c4389222987193c3ef38033df6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e",
"reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6",
"reference": "ce332676de1912c4389222987193c3ef38033df6",
"shasum": ""
},
"require": {
@ -11094,7 +11094,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.7"
"source": "https://github.com/symfony/http-foundation/tree/v6.3.8"
},
"funding": [
{
@ -11110,20 +11110,20 @@
"type": "tidelift"
}
],
"time": "2023-10-28T23:55:27+00:00"
"time": "2023-11-07T10:17:15+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v6.3.7",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "6d4098095f93279d9536a0e9124439560cc764d0"
"reference": "929202375ccf44a309c34aeca8305408442ebcc1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/6d4098095f93279d9536a0e9124439560cc764d0",
"reference": "6d4098095f93279d9536a0e9124439560cc764d0",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1",
"reference": "929202375ccf44a309c34aeca8305408442ebcc1",
"shasum": ""
},
"require": {
@ -11207,7 +11207,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.7"
"source": "https://github.com/symfony/http-kernel/tree/v6.3.8"
},
"funding": [
{
@ -11223,7 +11223,7 @@
"type": "tidelift"
}
],
"time": "2023-10-29T14:31:45+00:00"
"time": "2023-11-10T13:47:32+00:00"
},
{
"name": "symfony/intl",
@ -12819,16 +12819,16 @@
},
{
"name": "symfony/string",
"version": "v6.3.5",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "13d76d0fb049051ed12a04bef4f9de8715bea339"
"reference": "13880a87790c76ef994c91e87efb96134522577a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339",
"reference": "13d76d0fb049051ed12a04bef4f9de8715bea339",
"url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a",
"reference": "13880a87790c76ef994c91e87efb96134522577a",
"shasum": ""
},
"require": {
@ -12885,7 +12885,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v6.3.5"
"source": "https://github.com/symfony/string/tree/v6.3.8"
},
"funding": [
{
@ -12901,7 +12901,7 @@
"type": "tidelift"
}
],
"time": "2023-09-18T10:38:32+00:00"
"time": "2023-11-09T08:28:21+00:00"
},
{
"name": "symfony/translation",
@ -13078,16 +13078,16 @@
},
{
"name": "symfony/uid",
"version": "v6.3.0",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
"reference": "01b0f20b1351d997711c56f1638f7a8c3061e384"
"reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384",
"reference": "01b0f20b1351d997711c56f1638f7a8c3061e384",
"url": "https://api.github.com/repos/symfony/uid/zipball/819fa5ac210fb7ddda4752b91a82f50be7493dd9",
"reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9",
"shasum": ""
},
"require": {
@ -13132,7 +13132,7 @@
"uuid"
],
"support": {
"source": "https://github.com/symfony/uid/tree/v6.3.0"
"source": "https://github.com/symfony/uid/tree/v6.3.8"
},
"funding": [
{
@ -13148,20 +13148,20 @@
"type": "tidelift"
}
],
"time": "2023-04-08T07:25:02+00:00"
"time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/validator",
"version": "v6.3.7",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
"reference": "9cc736663fa5839b9710ac2c303bb0b951014fc1"
"reference": "f75b40e088d095db1e788b81605a76f4563cb80e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/9cc736663fa5839b9710ac2c303bb0b951014fc1",
"reference": "9cc736663fa5839b9710ac2c303bb0b951014fc1",
"url": "https://api.github.com/repos/symfony/validator/zipball/f75b40e088d095db1e788b81605a76f4563cb80e",
"reference": "f75b40e088d095db1e788b81605a76f4563cb80e",
"shasum": ""
},
"require": {
@ -13228,7 +13228,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/validator/tree/v6.3.7"
"source": "https://github.com/symfony/validator/tree/v6.3.8"
},
"funding": [
{
@ -13244,20 +13244,20 @@
"type": "tidelift"
}
],
"time": "2023-10-28T23:11:45+00:00"
"time": "2023-11-07T10:17:15+00:00"
},
{
"name": "symfony/var-dumper",
"version": "v6.3.6",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "999ede244507c32b8e43aebaa10e9fce20de7c97"
"reference": "81acabba9046550e89634876ca64bfcd3c06aa0a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97",
"reference": "999ede244507c32b8e43aebaa10e9fce20de7c97",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a",
"reference": "81acabba9046550e89634876ca64bfcd3c06aa0a",
"shasum": ""
},
"require": {
@ -13312,7 +13312,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.3.6"
"source": "https://github.com/symfony/var-dumper/tree/v6.3.8"
},
"funding": [
{
@ -13328,20 +13328,20 @@
"type": "tidelift"
}
],
"time": "2023-10-12T18:45:56+00:00"
"time": "2023-11-08T10:42:36+00:00"
},
{
"name": "symfony/yaml",
"version": "v6.3.7",
"version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "9758b6c69d179936435d0ffb577c3708d57e38a8"
"reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8",
"reference": "9758b6c69d179936435d0ffb577c3708d57e38a8",
"url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92",
"reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92",
"shasum": ""
},
"require": {
@ -13384,7 +13384,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/yaml/tree/v6.3.7"
"source": "https://github.com/symfony/yaml/tree/v6.3.8"
},
"funding": [
{
@ -13400,7 +13400,7 @@
"type": "tidelift"
}
],
"time": "2023-10-28T23:31:00+00:00"
"time": "2023-11-06T10:58:05+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@ -13703,31 +13703,31 @@
},
{
"name": "vlucas/phpdotenv",
"version": "v5.5.0",
"version": "v5.6.0",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
"reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7"
"reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
"reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
"reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
"shasum": ""
},
"require": {
"ext-pcre": "*",
"graham-campbell/result-type": "^1.0.2",
"php": "^7.1.3 || ^8.0",
"phpoption/phpoption": "^1.8",
"symfony/polyfill-ctype": "^1.23",
"symfony/polyfill-mbstring": "^1.23.1",
"symfony/polyfill-php80": "^1.23.1"
"graham-campbell/result-type": "^1.1.2",
"php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9.2",
"symfony/polyfill-ctype": "^1.24",
"symfony/polyfill-mbstring": "^1.24",
"symfony/polyfill-php80": "^1.24"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4.1",
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-filter": "*",
"phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25"
"phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
},
"suggest": {
"ext-filter": "Required to use the boolean validator."
@ -13739,7 +13739,7 @@
"forward-command": true
},
"branch-alias": {
"dev-master": "5.5-dev"
"dev-master": "5.6-dev"
}
},
"autoload": {
@ -13771,7 +13771,7 @@
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
"source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0"
"source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0"
},
"funding": [
{
@ -13783,7 +13783,7 @@
"type": "tidelift"
}
],
"time": "2022-10-16T01:01:54+00:00"
"time": "2023-11-12T22:43:29+00:00"
},
{
"name": "voku/portable-ascii",

View File

@ -47,7 +47,7 @@ class FacturaeTest extends TestCase
$this->assertNotNull($f->run());
nlog($f->run());
// nlog($f->run());
// $this->assertTrue($this->validateInvoiceXML($path));
}

View File

@ -104,6 +104,90 @@ class TaskApiTest extends TestCase
}
}
public function testEmptyTimeLogArray()
{
$data = [
'client_id' => $this->client->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'description' => 'Test Task',
'time_log' => null,
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->postJson("/api/v1/tasks", $data);
$response->assertStatus(200);
$data = [
'client_id' => $this->client->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'description' => 'Test Task',
'time_log' => '',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->postJson("/api/v1/tasks", $data);
$response->assertStatus(200);
$data = [
'client_id' => $this->client->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'description' => 'Test Task',
'time_log' => '[]',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->postJson("/api/v1/tasks", $data);
$response->assertStatus(200);
$data = [
'client_id' => $this->client->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'description' => 'Test Task',
'time_log' => '{}',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->postJson("/api/v1/tasks", $data);
$response->assertStatus(200);
}
public function testFaultyTimeLogArray()
{
$data = [
'client_id' => $this->client->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'description' => 'Test Task',
'time_log' => 'ABBA is the best band in the world',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->postJson("/api/v1/tasks", $data);
$response->assertStatus(422);
}
public function testTaskClientRateSet()
{
$settings = ClientSettings::defaults();
@ -282,6 +366,45 @@ class TaskApiTest extends TestCase
$response->assertStatus(200);
$task->time_log = 'A very strange place';
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->putJson("/api/v1/tasks/{$task->hashed_id}?stop=true", $task->toArray());
$response->assertStatus(422);
$task->time_log = null;
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->putJson("/api/v1/tasks/{$task->hashed_id}?stop=true", $task->toArray());
$response->assertStatus(200);
$task->time_log = '';
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->putJson("/api/v1/tasks/{$task->hashed_id}?stop=true", $task->toArray());
$response->assertStatus(200);
$task->time_log = '{}';
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->putJson("/api/v1/tasks/{$task->hashed_id}?stop=true", $task->toArray());
$response->assertStatus(200);
}
public function testStoppingTaskWithDescription()

View File

@ -18,6 +18,7 @@ use App\Models\Credit;
use App\Models\Design;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\Project;
use App\Utils\HtmlEngine;
use Tests\MockAccountData;
use App\Utils\Traits\MakesDates;
@ -165,6 +166,8 @@ class TemplateTest extends TestCase
</ninja>
';
private string $stack = '<html><div id="company-details" labels="true"></div></html>';
protected function setUp() :void
{
parent::setUp();
@ -177,6 +180,136 @@ class TemplateTest extends TestCase
}
public function testPurchaseOrderDataParse()
{
$data = [];
$p = \App\Models\PurchaseOrder::factory()->create([
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'vendor_id' => $this->vendor->id,
]);
$data['purchase_orders'][] = $p;
$ts = new TemplateService();
$ts->processData($data);
$this->assertNotNull($ts);
$this->assertIsArray($ts->getData());
}
public function testTaskDataParse()
{
$data = [];
$p = \App\Models\Task::factory()->create([
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'client_id' => $this->client->id,
]);
$data['tasks'][] = $p;
$ts = new TemplateService();
$ts->processData($data);
$this->assertNotNull($ts);
$this->assertIsArray($ts->getData());
}
public function testQuoteDataParse()
{
$data = [];
$p = \App\Models\Quote::factory()->create([
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'client_id' => $this->client->id,
]);
$data['quotes'][] = $p;
$ts = new TemplateService();
$ts->processData($data);
$this->assertNotNull($ts);
$this->assertIsArray($ts->getData());
}
public function testProjectDataParse()
{
$data = [];
$p = Project::factory()->create([
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'client_id' => $this->client->id,
]);
$data['projects'][] = $p;
$ts = new TemplateService();
$ts->processData($data);
$this->assertNotNull($ts);
$this->assertIsArray($ts->getData());
}
public function testNegativeDivAttribute()
{
$dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($this->stack, 'HTML-ENTITIES', 'UTF-8'));
$node = $dom->getElementById('company-details');
$x = $node->getAttribute('nonexistentattribute');
$this->assertEquals('', $x);
}
public function testStackResolutionWithLabels()
{
$dom = new \DOMDocument();
@$dom->loadHTML(mb_convert_encoding($this->stack, 'HTML-ENTITIES', 'UTF-8'));
$node = $dom->getElementById('company-details');
$x = $node->getAttribute('labels');
$this->assertEquals('true', $x);
}
public function testStackResolution()
{
$partials['design']['includes'] = '';
$partials['design']['header'] = '';
$partials['design']['body'] = $this->stack;
$partials['design']['footer'] = '';
$tm = new TemplateMock($this->company);
$tm->init();
$variables = $tm->variables[0];
$ts = new TemplateService();
$x = $ts->setTemplate($partials)
->setCompany($this->company)
->overrideVariables($variables)
->parseGlobalStacks()
->parseVariables()
->getHtml();
$this->assertIsString($x);
}
public function testDataMaps()
{
$start = microtime(true);
@ -319,19 +452,8 @@ class TemplateTest extends TestCase
];
});
$queries = \DB::getQueryLog();
$count = count($queries);
nlog("query count = {$count}");
$x = $invoices->toArray();
// 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);
}
private function transformPayment(Payment $payment): array
@ -466,8 +588,6 @@ class TemplateTest extends TestCase
$data['invoices'] = $invoices;
$ts = $replicated_design->service()->build($data);
// nlog("results = ");
// nlog($ts->getHtml());
$this->assertNotNull($ts->getHtml());
}