diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 9cca30677be3..b57a6c168736 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -26,7 +26,6 @@ class CompanySettings extends BaseSettings public $military_time = false; public $language_id = ''; - public $precision = 2; public $show_currency_code = false; public $payment_terms = 1; @@ -200,7 +199,7 @@ class CompanySettings extends BaseSettings 'military_time' => 'bool', 'language_id' => 'string', 'show_currency_code' => 'bool', - 'payment_terms' => 'int', + 'payment_terms' => 'integer', 'custom_label1' => 'string', 'custom_label2' => 'string', 'custom_label3' => 'string', @@ -247,21 +246,21 @@ class CompanySettings extends BaseSettings 'inclusive_taxes' => 'bool', 'invoice_number_prefix' => 'string', 'invoice_number_pattern' => 'string', - 'invoice_number_counter' => 'int', + 'invoice_number_counter' => 'integer', 'quote_number_prefix' => 'string', 'quote_number_pattern' => 'string', - 'quote_number_counter' => 'int', + 'quote_number_counter' => 'integer', 'client_number_prefix' => 'string', 'client_number_pattern' => 'string', - 'client_number_counter' => 'int', + 'client_number_counter' => 'integer', 'credit_number_prefix' => 'string', 'credit_number_pattern' => 'string', - 'credit_number_counter' => 'int', + 'credit_number_counter' => 'integer', 'shared_invoice_quote_counter' => 'bool', 'recurring_invoice_number_prefix' => 'string', - 'reset_counter_frequency_id' => 'int', + 'reset_counter_frequency_id' => 'integer', 'reset_counter_date' => 'string', - 'counter_padding' => 'int', + 'counter_padding' => 'integer', 'design' => 'string', 'company_gateways' => 'string', ]; @@ -271,9 +270,9 @@ class CompanySettings extends BaseSettings * cannot be modified client side */ public static $protected_fields = [ - 'credit_number_counter', - 'invoice_number_counter', - 'quote_number_counter', + // 'credit_number_counter', + // 'invoice_number_counter', + // 'quote_number_counter', ]; /** diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index 5b872d98ba9a..4a150aeaf682 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -406,7 +406,7 @@ class CompanyController extends BaseController * */ public function update(UpdateCompanyRequest $request, Company $company) - {\Log::error($request->all()); + { $company = $this->company_repo->save($request->all(), $company); $company->saveSettings($request->input('settings')); diff --git a/app/Models/Company.php b/app/Models/Company.php index fb252db650e9..a5c093c606e9 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -41,7 +41,7 @@ class Company extends BaseModel use PresentableTrait; use MakesHash; use CompanySettingsSaver; - + protected $presenter = 'App\Models\Presenters\CompanyPresenter'; protected $fillable = [ @@ -65,14 +65,14 @@ class Company extends BaseModel protected $hidden = [ 'id', - 'settings', - 'account_id', - 'company_key', + // 'settings', + // 'account_id', + // 'company_key', 'db', - 'domain', + // 'domain', 'ip', - 'industry_id', - 'size_id', + // 'industry_id', + // 'size_id', ]; protected $casts = [ diff --git a/app/Utils/Traits/CompanySettingsSaver.php b/app/Utils/Traits/CompanySettingsSaver.php index 66ddeb801fb9..714a638919d8 100644 --- a/app/Utils/Traits/CompanySettingsSaver.php +++ b/app/Utils/Traits/CompanySettingsSaver.php @@ -22,16 +22,22 @@ trait CompanySettingsSaver public function saveSettings($settings) { + if(!$settings) return; - - \Log::error(print_r($settings)); + $company_settings = $this->settings; //unset protected properties. foreach(CompanySettings::$protected_fields as $field) unset($settings[$field]); + //make sure the inbound settings have the correct casts! + //$settings = CompanySettings::setCasts($settings, CompanySettings::$casts); + +//todo checks are here +// $settings = $this->checkSettingType($settings, CompanySettings::$casts); + //iterate through set properties with new values; foreach($settings as $key => $value) $company_settings->{$key} = $value; @@ -40,4 +46,83 @@ trait CompanySettingsSaver $this->save(); } + + private function checkSettingType($settings, $casts) + { + $settings = (object)$settings; + + foreach ($casts as $key => $value){ + + \Log::error("the gettype of {$key} = ". gettype($settings->{$key})); + + if(substr($key, -3) == '_id'){ + $value = "integer"; + + if($this->checkAttribute($value, (int)$settings->{$key})){ + //throw new \Exception($settings->{$key}. " " . $key . " is not type ". $value); + \Log::error($settings->{$key}. " " . $key . " is type ". $value); + } + else { + \Log::error($settings->{$key}. " " . $key . " is nottype ". $value); + } + continue; + } + + if(is_null($settings->{$key}) || !isset($settings->{$key}) || $settings->{$key} == ''){ + \Log::error("skipping ".$settings->{$key}. " " . $key . " is type ". $value); + + continue; + } + + \Log::error("checking ".$settings->{$key}. " " . $key . " is type ". $value); + + if($this->checkAttribute($value, $settings->{$key})){ + //throw new \Exception($settings->{$key}. " " . $key . " is not type ". $value); + \Log::error($settings->{$key}. " " . $key . " is type ". $value); + } + else { + \Log::error($settings->{$key}. " " . $key . " is nottype ". $value); + } + + } + } + + + private function checkAttribute($key, $value) + { + switch ($key) + { + case 'int': + case 'integer': + return is_int($value); + case 'real': + case 'float': + case 'double': + return is_float($value); + case 'string': + return method_exists($value, '__toString' ) || is_null($value) || is_string($value); + case 'bool': + case 'boolean': + return is_bool($value); + case 'object': + return is_object($value); + case 'array': + return is_array($value); + case 'json': + json_decode($string); + return (json_last_error() == JSON_ERROR_NONE); + default: + return $value; + } + } + + + + + + + + + + } \ No newline at end of file diff --git a/tests/Feature/CompanySettingsTest.php b/tests/Feature/CompanySettingsTest.php new file mode 100644 index 000000000000..87c3938ab354 --- /dev/null +++ b/tests/Feature/CompanySettingsTest.php @@ -0,0 +1,89 @@ +makeTestData(); + + Session::start(); + + $this->faker = \Faker\Factory::create(); + + Model::reguard(); + + } + + public function testClientNumberCantBeModified() + { + $settings = $this->company->settings; + + $settings->client_number_counter = 200; + + $this->company->settings = $settings; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-Token' => $this->token, + ])->put('/api/v1/companies/'.$this->encodePrimaryKey($this->company->id), $this->company->toArray()); + + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals($arr['data']['settings']['timezone_id'],15); + } + + public function testSettingCasts() + { + $settings = $this->company->settings; + + $settings->client_number_counter = "a"; + + $this->company->settings = $settings; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-Token' => $this->token, + ])->put('/api/v1/companies/'.$this->encodePrimaryKey($this->company->id), $this->company->toArray()); + + + $response->assertStatus(200); + + $arr = $response->json(); + //\Log::error($arr); + + // $this->assertEquals($arr['data']['settings']['client_number_counter'],1); + } +} \ No newline at end of file diff --git a/tests/Unit/CompanySettingsTest.php b/tests/Unit/CompanySettingsTest.php index 80a67b5c53cd..b704df580900 100644 --- a/tests/Unit/CompanySettingsTest.php +++ b/tests/Unit/CompanySettingsTest.php @@ -48,4 +48,5 @@ class CompanySettingsTest extends TestCase $this->assertTrue(isset($this->company_settings->timezone_id)); } + }