diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index b57a6c168736..167553bc81fe 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -105,7 +105,7 @@ class CompanySettings extends BaseSettings public $shared_invoice_quote_counter = false; public $recurring_invoice_number_prefix = 'R'; - public $reset_counter_frequency_id = ''; + public $reset_counter_frequency_id = '0'; public $reset_counter_date = ''; public $counter_padding = 0; diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 46e989e4222b..5d81eaa6df03 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -18,9 +18,10 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Http\Exceptions\ThrottleRequestsException; use Illuminate\Support\Arr; +use Illuminate\Validation\ValidationException; use Symfony\Component\Debug\Exception\FatalThrowableError; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class Handler extends ExceptionHandler { @@ -100,6 +101,9 @@ class Handler extends ExceptionHandler else if($exception instanceof MethodNotAllowedHttpException){ return response()->json(['message'=>'Method not support for this route'],404); } + else if ($exception instanceof ValidationException) { + return response()->json(['message' => 'The given data was invalid.', 'errors' => $exception->validator->getMessageBag()], 422); + } return parent::render($request, $exception); diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index 2bb47cbbafc3..1ceaf491e1f1 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -12,6 +12,7 @@ namespace App\Http\Requests\Company; use App\Http\Requests\Request; +use App\Http\ValidationRules\ValidSettingsRule; use Illuminate\Support\Facades\Log; use Illuminate\Validation\Rule; @@ -40,7 +41,7 @@ class UpdateCompanyRequest extends Request 'size_id' => 'integer|nullable', 'country_id' => 'integer|nullable', 'work_email' => 'email|nullable', - // 'settings' => 'json', + 'settings' => new ValidSettingsRule(), ]; } diff --git a/app/Http/ValidationRules/ValidSettingsRule.php b/app/Http/ValidationRules/ValidSettingsRule.php new file mode 100644 index 000000000000..b78989f805d4 --- /dev/null +++ b/app/Http/ValidationRules/ValidSettingsRule.php @@ -0,0 +1,59 @@ +validateSettings($value); + + if (is_array($data)) + { + $this->return_data = $data; + return false; + } + else + return true; + } + + /** + * @return string + */ + public function message() + { + + return $this->return_data[0]." is not a valid ".$this->return_data[1]; + + } + + + +} diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/CompanySettingsSaver.php index bf9400faa402..09095e178628 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/CompanySettingsSaver.php @@ -32,21 +32,48 @@ trait CompanySettingsSaver foreach(CompanySettings::$protected_fields as $field) unset($settings[$field]); - //make sure the inbound settings have the correct casts! - //$settings = CompanySettings::setCasts($settings, CompanySettings::$casts); - $settings = $this->checkSettingType($settings, CompanySettings::$casts); //iterate through set properties with new values; foreach($settings as $key => $value) $company_settings->{$key} = $value; - //$company_settings = CompanySettings::setCasts($company_settings, CompanySettings::$casts); - $this->settings = $company_settings; $this->save(); } + public function validateSettings($settings) + { + $settings = (object)$settings; + $casts = CompanySettings::$casts; + + foreach ($casts as $key => $value){ + + /*Separate loop if it is a _id field which is an integer cast as a string*/ + if(substr($key, -3) == '_id' || substr($key, -14) == 'number_counter'){ + $value = "integer"; + + if(!$this->checkAttribute($value, $settings->{$key})){ + return [$key, $value]; + } + + continue; + } + + /* Handles unset settings or blank strings */ + if(is_null($settings->{$key}) || !isset($settings->{$key}) || $settings->{$key} == ''){ + continue; + } + + /*Catch all filter */ + if(!$this->checkAttribute($value, $settings->{$key})){ + return [$key, $value]; + } + + } + + return true; + } private function checkSettingType($settings, $casts) { @@ -55,7 +82,7 @@ trait CompanySettingsSaver foreach ($casts as $key => $value){ /*Separate loop if it is a _id field which is an integer cast as a string*/ - if(substr($key, -3) == '_id' || substr($key, -8) == '_counter'){ + if(substr($key, -3) == '_id' || substr($key, -14) == 'number_counter'){ $value = "integer"; if($this->checkAttribute($value, $settings->{$key})){ @@ -101,7 +128,6 @@ trait CompanySettingsSaver return method_exists($value, '__toString' ) || is_null($value) || is_string($value); case 'bool': case 'boolean': - //\Log::error("is {$value} boolean ? = ".is_bool($value) || (int) filter_var($value, FILTER_VALIDATE_BOOLEAN)); return is_bool($value) || (int) filter_var($value, FILTER_VALIDATE_BOOLEAN); case 'object': return is_object($value); @@ -117,5 +143,6 @@ trait CompanySettingsSaver // \Log::error('popping '.$key.' '.$value.' '.$settings->{$key}.' off the stack'); // \Log::error('popping '.$key.' '.$value.' '.$settings->{$key}.' off the stack'); +// \Log::error("integer testing {$key} - {$value} - ".$settings->{$key}); } \ No newline at end of file diff --git a/tests/Feature/CompanySettingsTest.php b/tests/Feature/CompanySettingsTest.php index 914534e6e00c..ebfc97308086 100644 --- a/tests/Feature/CompanySettingsTest.php +++ b/tests/Feature/CompanySettingsTest.php @@ -82,9 +82,11 @@ class CompanySettingsTest extends TestCase 'X-API-Token' => $this->token, ])->put('/api/v1/companies/'.$this->encodePrimaryKey($this->company->id), $this->company->toArray()); + $arr = $response->json(); + \Log::error(print_r($arr,1)); + $response->assertStatus(200); - $arr = $response->json(); $this->assertEquals($arr['data']['settings']['client_number_counter'],1); $this->assertEquals($arr['data']['settings']['quote_number_counter'],1);