mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-23 20:00:33 -04:00
Implement fees and limits map for company gateways (#3053)
* Add ability to remove group settings level company logo * Company Gateway Fees and Limits * Validation tests for FeesAndLimits * Working on company gateways * Working on transforming fees_and_limits in transformer * Implement fees and limits map for company gateways
This commit is contained in:
parent
49ecde8a38
commit
e4c18e734a
57
app/DataMapper/FeesAndLimits.php
Normal file
57
app/DataMapper/FeesAndLimits.php
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://opensource.org/licenses/AAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\DataMapper;
|
||||||
|
|
||||||
|
class FeesAndLimits
|
||||||
|
{
|
||||||
|
public $min_limit = 0;
|
||||||
|
|
||||||
|
public $max_limit = 0;
|
||||||
|
|
||||||
|
public $fee_amount = 0;
|
||||||
|
|
||||||
|
public $fee_percent = 0;
|
||||||
|
|
||||||
|
public $fee_tax_name1 = '';
|
||||||
|
|
||||||
|
public $fee_tax_name2 = '';
|
||||||
|
|
||||||
|
public $fee_tax_name3 = '';
|
||||||
|
|
||||||
|
public $fee_tax_rate1 = 0;
|
||||||
|
|
||||||
|
public $fee_tax_rate2 = 0;
|
||||||
|
|
||||||
|
public $fee_tax_rate3 = 0;
|
||||||
|
|
||||||
|
public $fee_cap = 0;
|
||||||
|
|
||||||
|
public $adjust_fee_percent = false;
|
||||||
|
|
||||||
|
//public $gateway_type_id = 1;
|
||||||
|
|
||||||
|
public static $casts = [
|
||||||
|
'gateway_type_id' => 'int',
|
||||||
|
'min_limit' => 'float',
|
||||||
|
'max_limit' => 'float',
|
||||||
|
'fee_amount' => 'float',
|
||||||
|
'fee_percent' => 'float',
|
||||||
|
'fee_tax_name1' => 'string',
|
||||||
|
'fee_tax_name2' => 'string',
|
||||||
|
'fee_tax_name3' => 'string',
|
||||||
|
'fee_tax_rate1' => 'void',
|
||||||
|
'fee_tax_rate2' => 'float',
|
||||||
|
'fee_tax_rate3' => 'float',
|
||||||
|
'fee_cap' => 'float',
|
||||||
|
'adjust_fee_percent' => 'bool',
|
||||||
|
];
|
||||||
|
}
|
@ -370,6 +370,10 @@ class CompanyGatewayController extends BaseController
|
|||||||
{
|
{
|
||||||
|
|
||||||
$company_gateway->fill($request->all());
|
$company_gateway->fill($request->all());
|
||||||
|
|
||||||
|
if(!$request->has('fees_and_limits'))
|
||||||
|
$company_gateway->fees_and_limits = '';
|
||||||
|
|
||||||
$company_gateway->save();
|
$company_gateway->save();
|
||||||
|
|
||||||
return $this->itemResponse($company_gateway);
|
return $this->itemResponse($company_gateway);
|
||||||
|
@ -12,9 +12,12 @@
|
|||||||
namespace App\Http\Requests\CompanyGateway;
|
namespace App\Http\Requests\CompanyGateway;
|
||||||
|
|
||||||
use App\Http\Requests\Request;
|
use App\Http\Requests\Request;
|
||||||
|
use App\Http\ValidationRules\ValidCompanyGatewayFeesAndLimitsRule;
|
||||||
|
use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
|
||||||
class StoreCompanyGatewayRequest extends Request
|
class StoreCompanyGatewayRequest extends Request
|
||||||
{
|
{
|
||||||
|
use CompanyGatewayFeesAndLimitsSaver;
|
||||||
/**
|
/**
|
||||||
* Determine if the user is authorized to make this request.
|
* Determine if the user is authorized to make this request.
|
||||||
*
|
*
|
||||||
@ -30,10 +33,12 @@ class StoreCompanyGatewayRequest extends Request
|
|||||||
|
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->sanitize();
|
$this->sanitize();
|
||||||
|
|
||||||
$rules = [
|
$rules = [
|
||||||
'gateway_key' => 'required'
|
'gateway_key' => 'required',
|
||||||
|
'fees_and_limits' => new ValidCompanyGatewayFeesAndLimitsRule(),
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
@ -43,22 +48,15 @@ class StoreCompanyGatewayRequest extends Request
|
|||||||
{
|
{
|
||||||
$input = $this->all();
|
$input = $this->all();
|
||||||
|
|
||||||
|
if(isset($input['config']))
|
||||||
$input['config'] = encrypt($input['config']);
|
$input['config'] = encrypt($input['config']);
|
||||||
$input['min_limit'] = isset($input['fees_and_limits']['min_limit']) ? $input['fees_and_limits']['min_limit'] : null;
|
|
||||||
$input['max_limit'] = isset($input['fees_and_limits']['max_limit']) ? $input['fees_and_limits']['max_limit'] : null;
|
if(isset($input['fees_and_limits']))
|
||||||
$input['fee_amount'] = isset($input['fees_and_limits']['fee_amount']) ? $input['fees_and_limits']['fee_amount'] : null;
|
$input['fees_and_limits'] = $this->cleanFeesAndLimits($input['fees_and_limits']);
|
||||||
$input['fee_percent'] = isset($input['fees_and_limits']['fee_percent']) ? $input['fees_and_limits']['fee_percent'] : null;
|
|
||||||
$input['fee_tax_name1'] = isset($input['fees_and_limits']['fee_tax_name1']) ? $input['fees_and_limits']['fee_tax_name1'] : '';
|
|
||||||
$input['fee_tax_name2'] = isset($input['fees_and_limits']['fee_tax_name2']) ? $input['fees_and_limits']['fee_tax_name2'] : '';
|
|
||||||
$input['fee_tax_name3'] = isset($input['fees_and_limits']['fee_tax_name3']) ? $input['fees_and_limits']['fee_tax_name3'] : '';
|
|
||||||
$input['fee_tax_rate1'] = isset($input['fees_and_limits']['fee_tax_rate1']) ? $input['fees_and_limits']['fee_tax_rate1'] : 0;
|
|
||||||
$input['fee_tax_rate2'] = isset($input['fees_and_limits']['fee_tax_rate2']) ? $input['fees_and_limits']['fee_tax_rate2'] : 0;
|
|
||||||
$input['fee_tax_rate3'] = isset($input['fees_and_limits']['fee_tax_rate3']) ? $input['fees_and_limits']['fee_tax_rate3'] : 0;
|
|
||||||
$input['fee_cap'] = isset($input['fees_and_limits']['fee_cap']) ? $input['fees_and_limits']['fee_cap'] : null;
|
|
||||||
$input['adjust_fee_percent'] = isset($input['fees_and_limits']['adjust_fee_percent']) ? $input['fees_and_limits']['adjust_fee_percent'] : 0;
|
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
|
|
||||||
return $this->all();
|
return $this->all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,10 +12,14 @@
|
|||||||
namespace App\Http\Requests\CompanyGateway;
|
namespace App\Http\Requests\CompanyGateway;
|
||||||
|
|
||||||
use App\Http\Requests\Request;
|
use App\Http\Requests\Request;
|
||||||
|
use App\Http\ValidationRules\ValidCompanyGatewayFeesAndLimitsRule;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
|
use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
|
||||||
class UpdateCompanyGatewayRequest extends Request
|
class UpdateCompanyGatewayRequest extends Request
|
||||||
{
|
{
|
||||||
|
use CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the user is authorized to make this request.
|
* Determine if the user is authorized to make this request.
|
||||||
*
|
*
|
||||||
@ -29,32 +33,24 @@ class UpdateCompanyGatewayRequest extends Request
|
|||||||
|
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->sanitize();
|
$this->sanitize();
|
||||||
|
|
||||||
$rules = [
|
$rules = [
|
||||||
|
'fees_and_limits' => new ValidCompanyGatewayFeesAndLimitsRule(),
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function sanitize()
|
public function sanitize()
|
||||||
{
|
{
|
||||||
$input = $this->all();
|
$input = $this->all();
|
||||||
|
|
||||||
$input['config'] = encrypt($input['config']);
|
$input['config'] = encrypt($input['config']);
|
||||||
$input['min_limit'] = isset($input['fees_and_limits']['min_limit']) ? $input['fees_and_limits']['min_limit'] : null;
|
|
||||||
$input['max_limit'] = isset($input['fees_and_limits']['max_limit']) ? $input['fees_and_limits']['max_limit'] : null;
|
if(isset($input['fees_and_limits']))
|
||||||
$input['fee_amount'] = isset($input['fees_and_limits']['fee_amount']) ? $input['fees_and_limits']['fee_amount'] : null;
|
$input['fees_and_limits'] = $this->cleanFeesAndLimits($input['fees_and_limits']);
|
||||||
$input['fee_percent'] = isset($input['fees_and_limits']['fee_percent']) ? $input['fees_and_limits']['fee_percent'] : null;
|
|
||||||
$input['fee_tax_name1'] = isset($input['fees_and_limits']['fee_tax_name1']) ? $input['fees_and_limits']['fee_tax_name1'] : '';
|
|
||||||
$input['fee_tax_name2'] = isset($input['fees_and_limits']['fee_tax_name2']) ? $input['fees_and_limits']['fee_tax_name2'] : '';
|
|
||||||
$input['fee_tax_name3'] = isset($input['fees_and_limits']['fee_tax_name3']) ? $input['fees_and_limits']['fee_tax_name3'] : '';
|
|
||||||
$input['fee_tax_rate1'] = isset($input['fees_and_limits']['fee_tax_rate1']) ? $input['fees_and_limits']['fee_tax_rate1'] : 0;
|
|
||||||
$input['fee_tax_rate2'] = isset($input['fees_and_limits']['fee_tax_rate2']) ? $input['fees_and_limits']['fee_tax_rate2'] : 0;
|
|
||||||
$input['fee_tax_rate3'] = isset($input['fees_and_limits']['fee_tax_rate3']) ? $input['fees_and_limits']['fee_tax_rate3'] : 0;
|
|
||||||
$input['fee_cap'] = isset($input['fees_and_limits']['fee_cap']) ? $input['fees_and_limits']['fee_cap'] : null;
|
|
||||||
$input['adjust_fee_percent'] = isset($input['fees_and_limits']['adjust_fee_percent']) ? $input['fees_and_limits']['adjust_fee_percent'] : 0;
|
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ class UpdateGroupSettingRequest extends Request
|
|||||||
|
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
|
$this->sanitize();
|
||||||
|
|
||||||
$rules['settings'] = new ValidSettingsRule();
|
$rules['settings'] = new ValidSettingsRule();
|
||||||
|
|
||||||
@ -38,6 +39,16 @@ class UpdateGroupSettingRequest extends Request
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sanitize()
|
||||||
|
{
|
||||||
|
$input = $this->all();
|
||||||
|
|
||||||
|
$this->replace($input);
|
||||||
|
|
||||||
|
return $this->all();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://opensource.org/licenses/AAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Http\ValidationRules;
|
||||||
|
|
||||||
|
use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
use Illuminate\Contracts\Validation\Rule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ValidCompanyGatewayFeesAndLimitsRule
|
||||||
|
* @package App\Http\ValidationRules
|
||||||
|
*/
|
||||||
|
class ValidCompanyGatewayFeesAndLimitsRule implements Rule
|
||||||
|
{
|
||||||
|
use CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $attribute
|
||||||
|
* @param mixed $value
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
|
||||||
|
public $return_data;
|
||||||
|
|
||||||
|
public function passes($attribute, $value)
|
||||||
|
{
|
||||||
|
$data = $this->validateFeesAndLimits($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];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -141,7 +141,7 @@ class Company extends BaseModel
|
|||||||
*/
|
*/
|
||||||
public function company_gateways()
|
public function company_gateways()
|
||||||
{
|
{
|
||||||
return $this->hasMany(CompanyGateway::class)->orderBy('priority','DESC');
|
return $this->hasMany(CompanyGateway::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,6 +21,13 @@ use Illuminate\Database\Eloquent\Model;
|
|||||||
class CompanyGateway extends BaseModel
|
class CompanyGateway extends BaseModel
|
||||||
{
|
{
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'fees_and_limits' => 'object',
|
||||||
|
'updated_at' => 'timestamp',
|
||||||
|
'created_at' => 'timestamp',
|
||||||
|
'deleted_at' => 'timestamp',
|
||||||
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'gateway_key',
|
'gateway_key',
|
||||||
'accepted_credit_cards',
|
'accepted_credit_cards',
|
||||||
@ -29,17 +36,7 @@ class CompanyGateway extends BaseModel
|
|||||||
'show_shipping_address',
|
'show_shipping_address',
|
||||||
'update_details',
|
'update_details',
|
||||||
'config',
|
'config',
|
||||||
'priority',
|
'fees_and_limits',
|
||||||
'min_limit',
|
|
||||||
'max_limit',
|
|
||||||
'fee_amount',
|
|
||||||
'fee_percent',
|
|
||||||
'fee_tax_name1',
|
|
||||||
'fee_tax_name2',
|
|
||||||
'fee_tax_rate1',
|
|
||||||
'fee_tax_rate2',
|
|
||||||
'fee_cap',
|
|
||||||
'adjust_fee_percent',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
public static $credit_cards = [
|
public static $credit_cards = [
|
||||||
@ -50,6 +47,11 @@ class CompanyGateway extends BaseModel
|
|||||||
16 => ['card' => 'images/credit_cards/Test-Discover-Icon.png', 'text' => 'Discover'],
|
16 => ['card' => 'images/credit_cards/Test-Discover-Icon.png', 'text' => 'Discover'],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// public function getFeesAndLimitsAttribute()
|
||||||
|
// {
|
||||||
|
// return json_decode($this->attributes['fees_and_limits']);
|
||||||
|
// }
|
||||||
|
|
||||||
public function company()
|
public function company()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Company::class);
|
return $this->belongsTo(Company::class);
|
||||||
|
@ -36,6 +36,16 @@ class GroupSettingRepository
|
|||||||
$group_setting->fill($data);
|
$group_setting->fill($data);
|
||||||
$group_setting->save();
|
$group_setting->save();
|
||||||
|
|
||||||
|
if(array_key_exists('company_logo', $data) && $data['company_logo'] == '')
|
||||||
|
{
|
||||||
|
|
||||||
|
$settings = $group_setting->settings;
|
||||||
|
unset($settings->company_logo);
|
||||||
|
$group_setting->settings = $settings;
|
||||||
|
$group_setting->save();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return $group_setting;
|
return $group_setting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,8 +52,7 @@ class CompanyGatewayTransformer extends EntityTransformer
|
|||||||
'show_shipping_address' => (bool)$company_gateway->show_shipping_address,
|
'show_shipping_address' => (bool)$company_gateway->show_shipping_address,
|
||||||
'update_details' => (bool)$company_gateway->update_details,
|
'update_details' => (bool)$company_gateway->update_details,
|
||||||
'config' => (string) $company_gateway->getConfigTransformed(),
|
'config' => (string) $company_gateway->getConfigTransformed(),
|
||||||
//'priority' => (int)$company_gateway->priority,
|
'fees_and_limits' => $company_gateway->fees_and_limits ?: '',
|
||||||
'fees_and_limits' => $this->mapFeesAndLimits($company_gateway),
|
|
||||||
'updated_at' => $company_gateway->updated_at,
|
'updated_at' => $company_gateway->updated_at,
|
||||||
'deleted_at' => $company_gateway->deleted_at,
|
'deleted_at' => $company_gateway->deleted_at,
|
||||||
];
|
];
|
||||||
@ -66,23 +65,4 @@ class CompanyGatewayTransformer extends EntityTransformer
|
|||||||
return $this->includeItem($company_gateway->gateway, $transformer, Gateway::class);
|
return $this->includeItem($company_gateway->gateway, $transformer, Gateway::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private function mapFeesAndLimits($company_gateway)
|
|
||||||
{
|
|
||||||
$cg = new \stdClass;
|
|
||||||
$cg->min_limit = (float)$company_gateway->min_limit ?: null;
|
|
||||||
$cg->max_limit = (float)$company_gateway->max_limit ?: null;
|
|
||||||
$cg->fee_amount = (float) $company_gateway->fee_amount ?: null;
|
|
||||||
$cg->fee_percent = (float)$company_gateway->fee_percent ?: null;
|
|
||||||
$cg->fee_tax_name1 = (string)$company_gateway->fee_tax_name1 ?: '';
|
|
||||||
$cg->fee_tax_name2 = (string) $company_gateway->fee_tax_name2 ?: '';
|
|
||||||
$cg->fee_tax_name3 = (string) $company_gateway->fee_tax_name3 ?: '';
|
|
||||||
$cg->fee_tax_rate1 = (float) $company_gateway->fee_tax_rate1;
|
|
||||||
$cg->fee_tax_rate2 = (float)$company_gateway->fee_tax_rate2;
|
|
||||||
$cg->fee_tax_rate3 = (float)$company_gateway->fee_tax_rate3;
|
|
||||||
$cg->fee_cap = (float)$company_gateway->fee_cap ?: null;
|
|
||||||
$cg->adjust_fee_percent = (bool)$company_gateway->adjust_fee_percent;
|
|
||||||
|
|
||||||
return $cg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
109
app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php
Normal file
109
app/Utils/Traits/CompanyGatewayFeesAndLimitsSaver.php
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://opensource.org/licenses/AAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Utils\Traits;
|
||||||
|
|
||||||
|
use App\DataMapper\CompanySettings;
|
||||||
|
use App\DataMapper\FeesAndLimits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CompanyGatewayFeesAndLimitsSaver
|
||||||
|
* @package App\Utils\Traits
|
||||||
|
*/
|
||||||
|
trait CompanyGatewayFeesAndLimitsSaver
|
||||||
|
{
|
||||||
|
|
||||||
|
public function validateFeesAndLimits($fees_and_limits)
|
||||||
|
{
|
||||||
|
$fees_and_limits = (object)$fees_and_limits;
|
||||||
|
$casts = FeesAndLimits::$casts;
|
||||||
|
|
||||||
|
foreach($fees_and_limits as $fee_and_limit)
|
||||||
|
{
|
||||||
|
|
||||||
|
$fee_and_limit = (object)$fee_and_limit;
|
||||||
|
|
||||||
|
foreach ($casts as $key => $value)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/* Handles unset settings or blank strings */
|
||||||
|
if(!property_exists($fee_and_limit, $key) || is_null($fee_and_limit->{$key}) || !isset($fee_and_limit->{$key}) || $fee_and_limit->{$key} == '')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*Catch all filter */
|
||||||
|
if(!$this->checkAttribute($value, $fee_and_limit->{$key}))
|
||||||
|
return [$key, $value];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type checks a object property.
|
||||||
|
* @param string $key The type
|
||||||
|
* @param string $value The object property
|
||||||
|
* @return bool TRUE if the property is the expected type
|
||||||
|
*/
|
||||||
|
private function checkAttribute($key, $value) :bool
|
||||||
|
{
|
||||||
|
switch ($key)
|
||||||
|
{
|
||||||
|
case 'int':
|
||||||
|
case 'integer':
|
||||||
|
return ctype_digit(strval($value));
|
||||||
|
case 'real':
|
||||||
|
case 'float':
|
||||||
|
case 'double':
|
||||||
|
return is_float($value) || is_numeric(strval($value));
|
||||||
|
case 'string':
|
||||||
|
return method_exists($value, '__toString' ) || is_null($value) || is_string($value);
|
||||||
|
case 'bool':
|
||||||
|
case 'boolean':
|
||||||
|
return is_bool($value) || (int) filter_var($value, FILTER_VALIDATE_BOOLEAN);
|
||||||
|
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 false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cleanFeesAndLimits($fees_and_limits)
|
||||||
|
{
|
||||||
|
$new_arr = [];
|
||||||
|
|
||||||
|
foreach($fees_and_limits as $key => $value)
|
||||||
|
{
|
||||||
|
|
||||||
|
$fal = new FeesAndLimits;
|
||||||
|
|
||||||
|
foreach($value as $k => $v)
|
||||||
|
{
|
||||||
|
$fal->{$k} = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
$new_arr[$key] = (array)$fal;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return $new_arr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -379,20 +379,7 @@ class CreateUsersTable extends Migration
|
|||||||
$table->boolean('show_shipping_address')->default(true)->nullable();
|
$table->boolean('show_shipping_address')->default(true)->nullable();
|
||||||
$table->boolean('update_details')->default(false)->nullable();
|
$table->boolean('update_details')->default(false)->nullable();
|
||||||
$table->text('config');
|
$table->text('config');
|
||||||
$table->unsignedInteger('priority')->default(0);
|
$table->text('fees_and_limits');
|
||||||
|
|
||||||
$table->decimal('min_limit', 16, 4)->nullable();
|
|
||||||
$table->decimal('max_limit', 16, 4)->nullable();
|
|
||||||
$table->decimal('fee_amount', 16, 4)->nullable();
|
|
||||||
$table->decimal('fee_percent', 16, 4)->nullable();
|
|
||||||
$table->string('fee_tax_name1')->nullable();
|
|
||||||
$table->string('fee_tax_name2')->nullable();
|
|
||||||
$table->string('fee_tax_name3')->nullable();
|
|
||||||
$table->decimal('fee_tax_rate1', 16, 4)->nullable();
|
|
||||||
$table->decimal('fee_tax_rate2', 16, 4)->nullable();
|
|
||||||
$table->decimal('fee_tax_rate3', 16, 4)->nullable();
|
|
||||||
$table->unsignedInteger('fee_cap')->nullable();
|
|
||||||
$table->boolean('adjust_fee_percent')->default(false);
|
|
||||||
|
|
||||||
$table->timestamps(6);
|
$table->timestamps(6);
|
||||||
$table->softDeletes();
|
$table->softDeletes();
|
||||||
|
@ -198,7 +198,6 @@ class RandomDataSeeder extends Seeder
|
|||||||
$cg->show_shipping_address = true;
|
$cg->show_shipping_address = true;
|
||||||
$cg->update_details = true;
|
$cg->update_details = true;
|
||||||
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
||||||
$cg->priority = 1;
|
|
||||||
$cg->save();
|
$cg->save();
|
||||||
|
|
||||||
$cg = new CompanyGateway;
|
$cg = new CompanyGateway;
|
||||||
@ -210,7 +209,6 @@ class RandomDataSeeder extends Seeder
|
|||||||
$cg->show_shipping_address = true;
|
$cg->show_shipping_address = true;
|
||||||
$cg->update_details = true;
|
$cg->update_details = true;
|
||||||
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
||||||
$cg->priority = 2;
|
|
||||||
$cg->save();
|
$cg->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +223,6 @@ class RandomDataSeeder extends Seeder
|
|||||||
$cg->show_shipping_address = true;
|
$cg->show_shipping_address = true;
|
||||||
$cg->update_details = true;
|
$cg->update_details = true;
|
||||||
$cg->config = encrypt(config('ninja.testvars.paypal'));
|
$cg->config = encrypt(config('ninja.testvars.paypal'));
|
||||||
$cg->priority = 3;
|
|
||||||
$cg->save();
|
$cg->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,11 +3,13 @@
|
|||||||
namespace Tests\Feature;
|
namespace Tests\Feature;
|
||||||
|
|
||||||
use App\DataMapper\DefaultSettings;
|
use App\DataMapper\DefaultSettings;
|
||||||
|
use App\DataMapper\FeesAndLimits;
|
||||||
use App\Models\Account;
|
use App\Models\Account;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\ClientContact;
|
use App\Models\ClientContact;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use App\Utils\Traits\CompanyGatewayFeesAndLimitsSaver;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use Faker\Factory;
|
use Faker\Factory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
@ -28,7 +30,7 @@ class CompanyGatewayApiTest extends TestCase
|
|||||||
use MakesHash;
|
use MakesHash;
|
||||||
use DatabaseTransactions;
|
use DatabaseTransactions;
|
||||||
use MockAccountData;
|
use MockAccountData;
|
||||||
|
use CompanyGatewayFeesAndLimitsSaver;
|
||||||
|
|
||||||
public function setUp() :void
|
public function setUp() :void
|
||||||
{
|
{
|
||||||
@ -115,4 +117,93 @@ class CompanyGatewayApiTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testCompanyGatewayFeesAndLimitsSuccess()
|
||||||
|
{
|
||||||
|
$fee = new FeesAndLimits;
|
||||||
|
|
||||||
|
$fee = (array)$fee;
|
||||||
|
|
||||||
|
$fee_and_limit['1'] = ['min_limit' => 1];
|
||||||
|
$fee_and_limit['2'] = ['min_limit' => 1];
|
||||||
|
$fee_and_limit['3'] = ['min_limit' => 1];
|
||||||
|
$fee_and_limit['4'] = ['min_limit' => 1];
|
||||||
|
$fee_and_limit['5'] = ['min_limit' => 1];
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'config' => 'random config',
|
||||||
|
'gateway_key' => '3b6621f970ab18887c4f6dca78d3f8bb',
|
||||||
|
'fees_and_limits' => $fee_and_limit,
|
||||||
|
];
|
||||||
|
|
||||||
|
/* POST */
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token
|
||||||
|
])->post('/api/v1/company_gateways', $data);
|
||||||
|
|
||||||
|
$cg = $response->json();
|
||||||
|
|
||||||
|
$cg_id = $cg['data']['id'];
|
||||||
|
|
||||||
|
$this->assertNotNull($cg_id);
|
||||||
|
|
||||||
|
$cg_fee = $cg['data']['fees_and_limits'];
|
||||||
|
|
||||||
|
$this->assertNotNull($cg_fee);
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token
|
||||||
|
])->get('/api/v1/company_gateways/'.$this->encodePrimaryKey($cg['data']['id']));
|
||||||
|
|
||||||
|
$cg = $response->json();
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testCompanyGatewayFeesAndLimitsFails()
|
||||||
|
{
|
||||||
|
$fee_and_limit['bank_transfer'] = new FeesAndLimits;
|
||||||
|
|
||||||
|
$fee_and_limit['bank_transfer']->adjust_fee_percent = 10;
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'config' => 'random config',
|
||||||
|
'gateway_key' => '3b6621f970ab18887c4f6dca78d3f8bb',
|
||||||
|
'fees_and_limits' => $fee_and_limit,
|
||||||
|
];
|
||||||
|
|
||||||
|
/* POST */
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token
|
||||||
|
])->post('/api/v1/company_gateways', $data);
|
||||||
|
|
||||||
|
|
||||||
|
$response->assertStatus(302);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCompanyGatewayArrayBuilder()
|
||||||
|
{
|
||||||
|
$arr = [
|
||||||
|
'min_limit' => 1,
|
||||||
|
'max_limit' => 2
|
||||||
|
];
|
||||||
|
|
||||||
|
$fal = (array)new FeesAndLimits;
|
||||||
|
|
||||||
|
$new_arr = array_replace($fal, $arr);
|
||||||
|
|
||||||
|
$this->assertEquals($arr['min_limit'], $new_arr['min_limit']);
|
||||||
|
$this->assertTrue(array_key_exists('fee_amount', $new_arr));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
@ -196,7 +196,6 @@ trait MockAccountData
|
|||||||
$cg->show_shipping_address = true;
|
$cg->show_shipping_address = true;
|
||||||
$cg->update_details = true;
|
$cg->update_details = true;
|
||||||
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
||||||
$cg->priority = 1;
|
|
||||||
$cg->save();
|
$cg->save();
|
||||||
|
|
||||||
|
|
||||||
@ -209,7 +208,6 @@ trait MockAccountData
|
|||||||
$cg->show_shipping_address = true;
|
$cg->show_shipping_address = true;
|
||||||
$cg->update_details = true;
|
$cg->update_details = true;
|
||||||
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
$cg->config = encrypt(config('ninja.testvars.stripe'));
|
||||||
$cg->priority = 2;
|
|
||||||
$cg->save();
|
$cg->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user