Implement Company Settings Sieve (#3057)

* remove redundant custom gateways

* Implement view_all,edit_all_create_all permissions

* Fixes for company settings sieve
This commit is contained in:
David Bomba 2019-11-12 22:36:24 +11:00 committed by GitHub
parent 2ce89e5f48
commit cb939ed986
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 56 additions and 83 deletions

View File

@ -13,9 +13,9 @@ namespace App\DataMapper;
class FeesAndLimits
{
public $min_limit = 0;
public $min_limit = -1; //equivalent to null
public $max_limit = 0;
public $max_limit = -1; //equivalent to null
public $fee_amount = 0;

View File

@ -40,7 +40,7 @@ class StoreClientRequest extends Request
$this->sanitize();
/* Ensure we have a client name, and that all emails are unique*/
$rules['name'] = 'required|min:1';
//$rules['name'] = 'required|min:1';
$rules['id_number'] = 'unique:clients,id_number,' . $this->id . ',id,company_id,' . $this->company_id;
$rules['settings'] = new ValidSettingsRule();

View File

@ -12,6 +12,7 @@
namespace App\Http\Requests\Company;
use App\Http\Requests\Request;
use App\Http\ValidationRules\ValidSettingsRule;
use App\Models\ClientContact;
use App\Models\Company;
@ -31,13 +32,13 @@ class StoreCompanyRequest extends Request
public function rules()
{
//$this->sanitize();
$rules = [];
return [
'name' => 'required',
'company_logo' => 'mimes:jpeg,jpg,png,gif|max:10000', // max 10000kb
// 'settings' => 'json',
// 'documents' => 'mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
];
$rules['name'] = 'required';
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000'; // max 10000kb
$rules['settings'] = new ValidSettingsRule();
return $rules;
}

View File

@ -34,15 +34,18 @@ class UpdateCompanyRequest extends Request
public function rules()
{
return [
'company_logo' => 'mimes:jpeg,jpg,png,gif|max:10000', // max 10000kb
'industry_id' => 'integer|nullable',
'size_id' => 'integer|nullable',
'country_id' => 'integer|nullable',
'work_email' => 'email|nullable',
'settings' => new ValidSettingsRule(),
];
$rules = [];
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000'; // max 10000kb
$rules['settings'] = new ValidSettingsRule();
$rules['industry_id'] = 'integer|nullable';
$rules['size_id'] = 'integer|nullable';
$rules['country_id'] = 'integer|nullable';
$rules['work_email'] = 'email|nullable';
return $rules;
}
}

View File

@ -49,7 +49,6 @@ class ValidSettingsRule implements Rule
*/
public function message()
{
return $this->return_data[0]." is not a valid ".$this->return_data[1];
}

View File

@ -45,35 +45,19 @@ class Company extends BaseModel
protected $presenter = 'App\Models\Presenters\CompanyPresenter';
protected $fillable = [
// 'name',
// 'logo',
'industry_id',
// 'address1',
// 'address2',
// 'city',
// 'state',
// 'postal_code',
// 'phone',
// 'email',
// 'country_id',
'domain',
// 'vat_number',
// 'id_number',
'size_id',
//'settings',
'custom_fields',
'enable_product_cost',
'enable_product_quantity',
'default_quantity',
];
protected $hidden = [
'id',
// 'settings',
// 'account_id',
// 'company_key',
'db',
// 'domain',
'ip',
// 'industry_id',
// 'size_id',
];
protected $casts = [

View File

@ -28,7 +28,7 @@ class ClientPolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_client');
return $user->isAdmin() || $user->hasPermission('create_client') || $user->hasPermission('create_all');
}
}

View File

@ -30,7 +30,7 @@ class CompanyPolicy extends EntityPolicy
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_company');
return $user->isAdmin() || $user->hasPermission('create_company') || $user->hasPermission('create_all');
}
@ -47,6 +47,7 @@ class CompanyPolicy extends EntityPolicy
return ($user->isAdmin() && $entity->id == $user->companyId())
|| ($user->hasPermission('view_' . strtolower(class_basename($entity))) && $entity->id == $user->companyId())
|| ($user->hasPermission('view_all') && $entity->id == $user->companyId())
|| $user->owns($entity);
}
@ -65,6 +66,7 @@ class CompanyPolicy extends EntityPolicy
return ($user->isAdmin() && $entity->id == $user->companyId())
|| ($user->hasPermission('edit_' . strtolower(class_basename($entity))) && $entity->id == $user->companyId())
|| ($user->hasPermission('edit_all') && $entity->id == $user->companyId())
|| $user->owns($entity);
}

View File

@ -50,6 +50,7 @@ class EntityPolicy
return ($user->isAdmin() && $entity->company_id == $user->companyId())
|| ($user->hasPermission('edit_' . strtolower(class_basename($entity))) && $entity->company_id == $user->companyId())
|| ($user->hasPermission('edit_all') && $entity->company_id == $user->companyId())
|| $user->owns($entity)
|| $user->assigned($entity);
@ -69,6 +70,7 @@ class EntityPolicy
return ($user->isAdmin() && $entity->company_id == $user->companyId())
|| ($user->hasPermission('view_' . strtolower(class_basename($entity))) && $entity->company_id == $user->companyId())
|| ($user->hasPermission('view_all') && $entity->company_id == $user->companyId())
|| $user->owns($entity)
|| $user->assigned($entity);
}

View File

@ -28,7 +28,7 @@ class InvoicePolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_invoice');
return $user->isAdmin() || $user->hasPermission('create_invoice') || $user->hasPermission('create_all');
}
}

View File

@ -28,7 +28,7 @@ class PaymentPolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_payment');
return $user->isAdmin() || $user->hasPermission('create_payment') || $user->hasPermission('create_all');
}
}

View File

@ -36,7 +36,7 @@ class ProductPolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_product');
return $user->isAdmin() || $user->hasPermission('create_product') || $user->hasPermission('create_all');
}
}

View File

@ -28,7 +28,7 @@ class QuotePolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_quote');
return $user->isAdmin() || $user->hasPermission('create_quote') || $user->hasPermission('create_all');
}
}

View File

@ -28,7 +28,7 @@ class RecurringInvoicePolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_recurring_invoice');
return $user->isAdmin() || $user->hasPermission('create_recurring_invoice') || $user->hasPermission('create_all');
}
}

View File

@ -28,7 +28,7 @@ class RecurringQuotePolicy extends EntityPolicy
*/
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_recurring_quote');
return $user->isAdmin() || $user->hasPermission('create_recurring_quote') || $user->hasPermission('create_all');
}
}

View File

@ -20,5 +20,11 @@ use App\Models\TaxRate;
class TaxRatePolicy extends EntityPolicy
{
public function create(User $user) : bool
{
return $user->isAdmin();
}
}

View File

@ -30,7 +30,7 @@ class UserPolicy extends EntityPolicy
public function create(User $user) : bool
{
return $user->isAdmin() || $user->hasPermission('create_user');
return $user->isAdmin() || $user->hasPermission('create_user') || $user->hasPermission('create_all');
}

View File

@ -57,9 +57,6 @@ class BaseRepository
if ($entity->trashed())
return;
if(get_class($entity) == Client::class)
$entity->contacts()->delete();
$entity->delete();
$className = $this->getEventClass($entity, 'Archived');
@ -82,9 +79,6 @@ class BaseRepository
$entity->restore();
if(get_class($entity) == Client::class)
$entity->contacts()->restore();
if ($entity->is_deleted) {
$fromDeleted = true;
$entity->is_deleted = false;

View File

@ -60,7 +60,6 @@ class ClientRepository extends BaseRepository
*/
public function save(array $data, Client $client) : ?Client
{
$client->fill($data);
$client->save();
@ -73,6 +72,11 @@ class ClientRepository extends BaseRepository
if(isset($data['contacts']))
$contacts = $this->contact_repo->save($data['contacts'], $client);
if($data['name'] == '')
$data['name'] = $client->present()->name();
return $client;
}

View File

@ -62,13 +62,11 @@ class PaymentLibrariesSeeder extends Seeder
['name' => 'SecPay', 'provider' => 'SecPay', 'key' => 'bad8699d581d9fa040e59c0bb721a76c', 'fields' => '{"mid":"","vpnPswd":"","remotePswd":"","usageType":"","confirmEmail":"","testStatus":"true","mailCustomer":"true","additionalOptions":""}'],
['name' => 'WePay', 'provider' => 'WePay', 'is_offsite' => false, 'sort_order' => 3, 'key' => '8fdeed552015b3c7b44ed6c8ebd9e992', 'fields' => '{"accountId":"","accessToken":"","type":"goods","testMode":false,"feePayer":"payee"}'],
['name' => 'Braintree', 'provider' => 'Braintree', 'sort_order' => 3, 'key' => 'f7ec488676d310683fb51802d076d713', 'fields' => '{"merchantId":"","publicKey":"","privateKey":"","testMode":false}'],
['name' => 'Custom', 'provider' => 'Custom1', 'is_offsite' => true, 'sort_order' => 20, 'key' => 'ff0847592555bb2fdb429984e3de4147', 'fields' => ''],
['name' => 'FirstData Payeezy', 'provider' => 'FirstData_Payeezy', 'key' => '30334a52fb698046572c627ca10412e8', 'fields' => '{"gatewayId":"","password":"","keyId":"","hmac":"","testMode":false}'],
['name' => 'GoCardless', 'provider' => 'GoCardlessV2\Redirect', 'sort_order' => 9, 'is_offsite' => true, 'key' => 'b9886f9257f0c6ee7c302f1c74475f6c', 'fields' => '{"accessToken":"","webhookSecret":"","testMode":true}'],
['name' => 'PagSeguro', 'provider' => 'PagSeguro', 'key' => 'ef498756b54db63c143af0ec433da803', 'fields' => '{"email":"","token":"","sandbox":false}'],
['name' => 'PAYMILL', 'provider' => 'Paymill', 'key' => 'ca52f618a39367a4c944098ebf977e1c', 'fields' => '{"apiKey":""}'],
['name' => 'Custom', 'provider' => 'Custom2', 'is_offsite' => true, 'sort_order' => 21, 'key' => '54faab2ab6e3223dbe848b1686490baa', 'fields' => '{"text":"","name":""}'],
['name' => 'Custom', 'provider' => 'Custom3', 'is_offsite' => true, 'sort_order' => 22, 'key' => '8149a02d9e691a78da2664d0ce9ce1a9', 'fields' => ''],
];
foreach ($gateways as $gateway) {

View File

@ -93,7 +93,7 @@ class RandomDataSeeder extends Seeder
]);
factory(\App\Models\Client::class, 50)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company){
factory(\App\Models\Client::class, 20)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company){
factory(\App\Models\ClientContact::class,1)->create([
'user_id' => $user->id,

View File

@ -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->settings = $settings;
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
@ -61,9 +61,8 @@ 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 testIntegerEdgeCases()
@ -84,14 +83,6 @@ class CompanySettingsTest extends TestCase
$response->assertStatus(302);
//$arr = $response->json();
/*
$this->assertEquals($arr['data']['settings']['client_number_counter'],1);
$this->assertEquals($arr['data']['settings']['quote_number_counter'],1);
$this->assertEquals($arr['data']['settings']['credit_number_counter'],1);
$this->assertEquals($arr['data']['settings']['invoice_number_counter'],1000);
*/
}
public function testFloatEdgeCases()
@ -112,12 +103,6 @@ class CompanySettingsTest extends TestCase
$response->assertStatus(302);
// $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);
}
public function testBoolEdgeCases()
@ -139,13 +124,7 @@ class CompanySettingsTest extends TestCase
$response->assertStatus(302);
// $arr = $response->json();
// $this->assertEquals($arr['data']['settings']['require_invoice_signature'],1);
// $this->assertEquals($arr['data']['settings']['require_quote_signature'],1);
// $this->assertEquals($arr['data']['settings']['show_accept_quote_terms'],0);
// $this->assertEquals($arr['data']['settings']['show_accept_invoice_terms'],1);
// $this->assertEquals($arr['data']['settings']['show_tasks_in_portal'],0);
}
}

View File

@ -2,6 +2,7 @@
namespace Tests\Feature;
use App\DataMapper\CompanySettings;
use App\Models\Account;
use App\Models\Company;
use App\Models\CompanyToken;
@ -117,7 +118,7 @@ class CompanyTest extends TestCase
->assertStatus(200);
$settings = new \stdClass;
$settings = CompanySettings::defaults();
$settings->custom_value1 = 'test';
$settings->invoice_design_id = '2';
$settings->quote_design_id = 1;