Fixes for transforming and saving company settings. (#3058)

* Cleanup for settings remove from entities

* Fixes for saving and transforming company settings
This commit is contained in:
David Bomba 2019-11-13 08:26:40 +11:00 committed by GitHub
parent cb939ed986
commit 384a3b4603
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 162 additions and 53 deletions

View File

@ -35,7 +35,6 @@ class QuoteFactory
$quote->partial_due_date = null;
$quote->is_deleted = false;
$quote->line_items = json_encode([]);
$quote->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here
$quote->backup = json_encode([]);
$quote->tax_name1 = '';
$quote->tax_rate1 = 0;

View File

@ -34,7 +34,7 @@ class StoreCompanyRequest extends Request
//$this->sanitize();
$rules = [];
$rules['name'] = 'required';
//$rules['name'] = 'required';
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000'; // max 10000kb
$rules['settings'] = new ValidSettingsRule();

View File

@ -50,7 +50,10 @@ class CreateCompany
public function handle() : ?Company
{
$settings = CompanySettings::defaults();
$settings->name = isset($this->request['name']) ? $this->request['name'] : $this->request['first_name'] . ' ' . $this->request['last_name'];
$default_company_name = isset($this->request['first_name']) ?: '' . ' ' . isset($this->request['last_name']) ?: '';
$settings->name = isset($this->request['name']) ? $this->request['name'] : $default_company_name;
$company = new Company();
$company->account_id = $this->account->id;

View File

@ -30,7 +30,7 @@ use App\Models\TaxRate;
use App\Models\Timezone;
use App\Models\Traits\AccountTrait;
use App\Models\User;
use App\Utils\Traits\SettingsSaver;
use App\Utils\Traits\CompanySettingsSaver;
use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
@ -40,7 +40,7 @@ class Company extends BaseModel
{
use PresentableTrait;
use MakesHash;
use SettingsSaver;
use CompanySettingsSaver;
protected $presenter = 'App\Models\Presenters\CompanyPresenter';

View File

@ -144,6 +144,10 @@ trait SettingsSaver
/*Catch all filter */
if($this->checkAttribute($value, $settings->{$key})){
if($value == 'string' && is_null($settings->{$key}))
$settings->{$key} = '';
settype($settings->{$key}, $value);
}
else {

View File

@ -88,7 +88,7 @@ class CreateUsersTable extends Migration
$table->string('site_url', 200)->nullable();
$table->boolean('is_offsite')->default(false);
$table->boolean('is_secure')->default(false);
$table->text('fields')->nullable();
$table->mediumText('fields')->nullable();
$table->unsignedInteger('default_gateway_type_id')->default(1);
$table->timestamps(6);
});
@ -162,8 +162,8 @@ class CreateUsersTable extends Migration
$table->string('first_day_of_week')->nullable();
$table->string('first_month_of_year')->nullable();
$table->smallInteger('enable_modules')->default(0);
$table->text('custom_fields');
$table->text('settings');
$table->mediumText('custom_fields');
$table->mediumText('settings');
$table->timestamps(6);
//$table->softDeletes('deleted_at', 6);
@ -184,8 +184,8 @@ class CreateUsersTable extends Migration
$table->unsignedInteger('company_id');
$table->unsignedInteger('account_id');
$table->unsignedInteger('user_id')->index();
$table->text('permissions')->nullable();
$table->text('settings')->nullable();
$table->mediumText('permissions')->nullable();
$table->mediumText('settings')->nullable();
$table->boolean('is_owner')->default(false);
$table->boolean('is_admin')->default(false);
$table->boolean('is_locked')->default(false); // locks user out of account
@ -243,7 +243,7 @@ class CreateUsersTable extends Migration
$table->unsignedInteger('avatar_height')->nullable();
$table->unsignedInteger('avatar_size')->nullable();
$table->datetime('last_login')->nullable();
$table->text('signature')->nullable();
$table->mediumText('signature')->nullable();
$table->string('password');
$table->rememberToken();
@ -309,7 +309,7 @@ class CreateUsersTable extends Migration
$table->string('shipping_state')->nullable();
$table->string('shipping_postal_code')->nullable();
$table->unsignedInteger('shipping_country_id')->nullable();
$table->text('settings')->nullable();
$table->mediumText('settings')->nullable();
$table->boolean('is_deleted')->default(false);
$table->unsignedInteger('group_settings_id')->nullable();
@ -378,7 +378,7 @@ class CreateUsersTable extends Migration
$table->boolean('show_billing_address')->default(true)->nullable();
$table->boolean('show_shipping_address')->default(true)->nullable();
$table->boolean('update_details')->default(false)->nullable();
$table->text('config');
$table->mediumText('config');
$table->text('fees_and_limits');
$table->timestamps(6);
@ -413,9 +413,9 @@ class CreateUsersTable extends Migration
$t->boolean('is_deleted')->default(false);
$t->text('line_items')->nullable();
$t->mediumText('line_items')->nullable();
//$t->text('settings')->nullable();
$t->text('backup')->nullable();
$t->mediumText('backup')->nullable();
$t->text('footer')->nullable();
$t->text('public_notes')->nullable();
@ -483,9 +483,8 @@ class CreateUsersTable extends Migration
$t->boolean('is_deleted')->default(false);
$t->text('line_items')->nullable();
$t->text('settings')->nullable();
$t->text('backup')->nullable();
$t->mediumText('line_items')->nullable();
$t->mediumText('backup')->nullable();
$t->text('footer')->nullable();
$t->text('public_notes')->nullable();
@ -547,9 +546,8 @@ class CreateUsersTable extends Migration
$t->boolean('is_deleted')->default(false);
$t->text('line_items')->nullable();
$t->text('settings')->nullable();
$t->text('backup')->nullable();
$t->mediumText('line_items')->nullable();
$t->mediumText('backup')->nullable();
$t->text('footer')->nullable();
$t->text('public_notes')->nullable();
@ -609,9 +607,8 @@ class CreateUsersTable extends Migration
$t->boolean('is_deleted')->default(false);
$t->text('line_items')->nullable();
$t->text('settings')->nullable();
$t->text('backup')->nullable();
$t->mediumText('line_items')->nullable();
$t->mediumText('backup')->nullable();
$t->text('footer')->nullable();
$t->text('public_notes')->nullable();
@ -659,7 +656,7 @@ class CreateUsersTable extends Migration
$t->string('key')->index();
$t->string('transaction_reference')->nullable();
$t->string('message_id')->nullable();
$t->text('email_error')->nullable();
$t->mediumText('email_error')->nullable();
$t->text('signature_base64')->nullable();
$t->datetime('signature_date')->nullable();
@ -791,7 +788,7 @@ class CreateUsersTable extends Migration
$table->string('description')->nullable();
$table->boolean('is_deleted')->default(false);
$table->boolean('is_running')->default(false);
$table->text('time_log')->nullable();
$table->mediumText('time_log')->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
@ -894,7 +891,7 @@ class CreateUsersTable extends Migration
Schema::create('backups', function ($table) {
$table->increments('id');
$table->unsignedInteger('activity_id');
$table->text('json_backup')->nullable();
$table->mediumText('json_backup')->nullable();
$table->timestamps(6);
$table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');
@ -950,7 +947,7 @@ class CreateUsersTable extends Migration
$table->unsignedInteger('company_id');
$table->unsignedInteger('user_id')->nullable();
$table->string('name')->nullable();
$table->text('settings')->nullable();
$table->mediumText('settings')->nullable();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
});
@ -978,7 +975,7 @@ class CreateUsersTable extends Migration
$table->unsignedInteger('category_id')->nullable();
$table->unsignedInteger('event_id')->nullable();
$table->unsignedInteger('type_id')->nullable();
$table->text('log');
$table->mediumText('log');
$table->timestamps(6);
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');

View File

@ -2,6 +2,7 @@
namespace Tests\Feature;
use App\DataMapper\CompanySettings;
use App\DataMapper\DefaultSettings;
use App\Models\Account;
use App\Models\Client;
@ -15,14 +16,13 @@ use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Tests\MockAccountData;
use Tests\TestCase;
/**
* @test
* @covers App\Utils\Traits\SettingsSaver
* @covers App\Utils\Traits\CompanySettingsSaver
*/
class CompanySettingsTest extends TestCase
{
@ -47,11 +47,11 @@ class CompanySettingsTest extends TestCase
public function testClientNumberCantBeModified()
{
// $settings = $this->company->settings;
$settings = $this->company->settings;
// $settings->client_number_counter = 200;
$settings->client_number_counter = 200;
// $this->company->settings = $settings;
$this->company->saveSettings($settings, $this->company);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
@ -61,8 +61,30 @@ class CompanySettingsTest extends TestCase
$response->assertStatus(200);
$arr = $response->json();
// $this->assertEquals($arr['data']['settings']['timezone_id'],15);
$this->assertEquals($arr['data']['settings']['timezone_id'],15);
}
public function testNullValuesInSettings()
{
$settings = $this->company->settings;
$settings->reset_counter_date = null;
$this->company->saveSettings($settings, $this->company);
$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']['reset_counter_date'],'');
}
public function testIntegerEdgeCases()
@ -74,15 +96,21 @@ class CompanySettingsTest extends TestCase
$settings->quote_number_counter = 1.2;
$settings->credit_number_counter = 10.1;
$this->company->settings = $settings;
$this->company->saveSettings($settings, $this->company);
$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(302);
$response->assertStatus(200);
$arr = $response->json();
$this->assertTrue(is_int($arr['data']['settings']['client_number_counter']));
$this->assertTrue(is_int($arr['data']['settings']['invoice_number_counter']));
$this->assertTrue(is_int($arr['data']['settings']['quote_number_counter']));
$this->assertTrue(is_int($arr['data']['settings']['credit_number_counter']));
}
public function testFloatEdgeCases()
@ -94,14 +122,22 @@ class CompanySettingsTest extends TestCase
$settings->tax_rate2 = "10.0";
$settings->tax_rate3 = "10.5";
$this->company->settings = $settings;
$this->company->saveSettings($settings, $this->company);
$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(302);
$response->assertStatus(200);
$arr = $response->json();
$this->assertEquals($arr['data']['settings']['default_task_rate'],0);
$this->assertEquals($arr['data']['settings']['tax_rate1'],10.0);
$this->assertEquals($arr['data']['settings']['tax_rate2'],10.0);
$this->assertEquals($arr['data']['settings']['tax_rate3'],10.5);
}
@ -115,16 +151,96 @@ class CompanySettingsTest extends TestCase
$settings->show_accept_invoice_terms = "TRUE";
$settings->enable_client_portal_tasks = "FALSE";
$this->company->settings = $settings;
$this->company->saveSettings($settings, $this->company);
$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(302);
$response->assertStatus(200);
$arr = $response->json();
$this->assertTrue($arr['data']['settings']['require_invoice_signature']);
$this->assertTrue($arr['data']['settings']['require_quote_signature']);
$this->assertFalse($arr['data']['settings']['show_accept_quote_terms']);
$this->assertTrue($arr['data']['settings']['show_accept_invoice_terms']);
$this->assertFalse($arr['data']['settings']['enable_client_portal_tasks']);
}
public function testCompanyNullValueMatrixPOST()
{
$settings = CompanySettings::defaults();
$settings->reset_counter_date = null;
$this->company->saveSettings($settings, $this->company);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-Token' => $this->token,
])->post('/api/v1/companies?include=company',$this->company->toArray());
$arr = $response->json();
$response->assertStatus(200);
$this->assertEquals($arr['data'][0]['company']['settings']['reset_counter_date'],'');
}
public function testCompanyWrongValueMatrixPOST()
{
$settings = CompanySettings::defaults();
$settings->reset_counter_date = 1;
$this->company->saveSettings($settings, $this->company);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-Token' => $this->token,
])->post('/api/v1/companies?include=company',$this->company->toArray());
$arr = $response->json();
$response->assertStatus(200);
$this->assertEquals($arr['data'][0]['company']['settings']['reset_counter_date'],'');
}
public function testCompanyWrong2ValueMatrixPOST()
{
$settings = CompanySettings::defaults();
$settings->reset_counter_date = '1';
$this->company->saveSettings($settings, $this->company);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-Token' => $this->token,
])->post('/api/v1/companies?include=company',$this->company->toArray());
$arr = $response->json();
$response->assertStatus(200);
$this->assertEquals($arr['data'][0]['company']['settings']['reset_counter_date'],'1');
}
public function testCompanyrightValueMatrixPOST()
{
$settings = CompanySettings::defaults();
$settings->reset_counter_date = '1/1/2000';
$this->company->saveSettings($settings, $this->company);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-Token' => $this->token,
])->post('/api/v1/companies?include=company',$this->company->toArray());
$arr = $response->json();
$response->assertStatus(200);
$this->assertEquals($arr['data'][0]['company']['settings']['reset_counter_date'],'1/1/2000');
}
}

View File

@ -46,8 +46,8 @@ class QuoteTest extends TestCase
$data = [
'first_name' => $this->faker->firstName,
'last_name' => $this->faker->lastName,
'name' => $this->faker->company,
'email' => $this->faker->unique()->safeEmail,
'name' => $this->faker->company,
'email' => $this->faker->unique()->safeEmail,
'password' => 'ALongAndBrilliantPassword123',
'_token' => csrf_token(),
'privacy_policy' => 1,
@ -160,7 +160,6 @@ class QuoteTest extends TestCase
factory(\App\Models\Quote::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]);
$quote = Quote::where('user_id',$user->id)->first();
$quote->settings = $client->getMergedSettings();
$quote->save();
$response = $this->withHeaders([
@ -183,9 +182,7 @@ class QuoteTest extends TestCase
];
$this->assertNotNull($quote);
$this->assertNotNull($quote->settings);
$this->assertTrue(property_exists($quote->settings, 'military_time'));
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),

View File

@ -159,7 +159,6 @@ class RecurringInvoiceTest extends TestCase
factory(\App\Models\RecurringInvoice::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]);
$RecurringInvoice = RecurringInvoice::where('user_id',$user->id)->first();
$RecurringInvoice->settings = $client->getMergedSettings();
$RecurringInvoice->save();
@ -183,9 +182,6 @@ class RecurringInvoiceTest extends TestCase
];
$this->assertNotNull($RecurringInvoice);
$this->assertNotNull($RecurringInvoice->settings);
$this->assertTrue(property_exists($RecurringInvoice->settings, 'military_time'));
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),

View File

@ -160,7 +160,6 @@ class RecurringQuoteTest extends TestCase
factory(\App\Models\RecurringQuote::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]);
$RecurringQuote = RecurringQuote::where('user_id',$user->id)->first();
$RecurringQuote->settings = $client->getMergedSettings();
$RecurringQuote->save();
@ -184,9 +183,7 @@ class RecurringQuoteTest extends TestCase
];
$this->assertNotNull($RecurringQuote);
$this->assertNotNull($RecurringQuote->settings);
$this->assertTrue(property_exists($RecurringQuote->settings, 'military_time'));
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),