Fixes for settings, implement invitations from invoice request (#3047)

* Fixes for client portal localization

* Replace Invoice Ninja Logo with user defined logo and website URL in client portal

* Minor Fixes

* Refactor for invitations on invoices

* Fixes for settings
This commit is contained in:
David Bomba 2019-11-07 09:57:09 +11:00 committed by GitHub
parent 3405b91c64
commit a6f928b181
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 145 additions and 42 deletions

View File

@ -126,13 +126,13 @@ class CompanySettings extends BaseSettings
public $quote_design_id = '1';
public $invoice_footer = '';
public $invoice_labels = '';
public $show_item_taxes = false;
public $tax_name1 = '';
public $tax_rate1 = 0;
public $tax_name2 = '';
public $tax_rate2 = 0;
public $tax_name3 = '';
public $tax_rate3 = 0;
public $number_of_tax_rates = 1;
public $payment_type_id = '1';
public $custom_fields = '';
public $invoice_fields = '';
@ -190,9 +190,9 @@ class CompanySettings extends BaseSettings
public $schedule_reminder2 = ''; // (enum: after_invoice_date, before_due_date, after_due_date)
public $schedule_reminder3 = ''; // (enum: after_invoice_date, before_due_date, after_due_date)
public $late_fee_amount1 = '';
public $late_fee_amount2 = '';
public $late_fee_amount3 = '';
public $late_fee_amount1 = 0;
public $late_fee_amount2 = 0;
public $late_fee_amount3 = 0;
public $endless_reminder_frequency_id = '0';
@ -226,6 +226,7 @@ class CompanySettings extends BaseSettings
public static $casts = [
'number_of_tax_rates' => 'int',
'email_subject_custom1' => 'string',
'email_subject_custom2' => 'string',
'email_subject_custom3' => 'string',
@ -241,9 +242,9 @@ class CompanySettings extends BaseSettings
'schedule_reminder1' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'schedule_reminder2' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'schedule_reminder3' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'late_fee_amount1' => 'string',
'late_fee_amount2' => 'string',
'late_fee_amount3' => 'string',
'late_fee_amount1' => 'float',
'late_fee_amount2' => 'float',
'late_fee_amount3' => 'float',
'endless_reminder_frequency_id' => 'integer',
'client_online_payment_notification' => 'bool',
'client_manual_payment_notification' => 'bool',
@ -355,7 +356,6 @@ class CompanySettings extends BaseSettings
'reset_counter_date' => 'string',
'require_invoice_signature' => 'bool',
'require_quote_signature' => 'bool',
'show_item_taxes' => 'bool',
'state' => 'string',
'email' => 'string',
'vat_number' => 'string',

View File

@ -24,7 +24,7 @@ class InvoiceInvitationFactory
$ii->user_id = $user_id;
$ii->client_contact_id = null;
$ii->invoice_id = null;
$ii->invitation_key = Str::random(config('ninja.key_length'));
$ii->key = Str::random(config('ninja.key_length'));
$ii->transaction_reference = null;
$ii->message_id = null;
$ii->email_error = '';

View File

@ -113,7 +113,7 @@ class ForgotPasswordController extends Controller
return $response == Password::RESET_LINK_SENT
? response()->json(['message' => 'Reset link sent to your email.', 'status' => true], 201)
: response()->json(['message' => 'Unable to send reset link', 'status' => false], 401);
: response()->json(['message' => 'Email not found', 'status' => false], 401);
}
}

View File

@ -48,4 +48,10 @@ class InvitationController extends Controller
abort(404);
}
// public function invoiceRouterForIframe(string $client_hash, string $invitation_key)
// {
// }
}

View File

@ -10,7 +10,10 @@
* @OA\Property(property="fill_products", type="boolean", example=true, description="Toggles filling a product description based on product key"),
* @OA\Property(property="convert_products", type="boolean", example=true, description="___________"),
* @OA\Property(property="update_products", type="boolean", example=true, description="Toggles updating a product description which description changes"),
* @OA\Property(property="custom_surcharge_taxes", type="boolean", example=true, description="Toggles charging taxes on custom surcharge amounts"),
* @OA\Property(property="custom_surcharge_taxes1", type="boolean", example=true, description="Toggles charging taxes on custom surcharge amounts"),
* @OA\Property(property="custom_surcharge_taxes2", type="boolean", example=true, description="Toggles charging taxes on custom surcharge amounts"),
* @OA\Property(property="custom_surcharge_taxes3", type="boolean", example=true, description="Toggles charging taxes on custom surcharge amounts"),
* @OA\Property(property="custom_surcharge_taxes4", type="boolean", example=true, description="Toggles charging taxes on custom surcharge amounts"),
* @OA\Property(property="logo", type="object", example="logo.png", description="The company logo - binary"),
* @OA\Property(property="settings",ref="#/components/schemas/CompanySettings"),
* )

View File

@ -159,9 +159,9 @@
* @OA\Property(property="schedule_reminder1", type="string", example="after_invoice_date", description="(enum: after_invoice_date, before_due_date, after_due_date)"),
* @OA\Property(property="schedule_reminder2", type="string", example="after_invoice_date", description="(enum: after_invoice_date, before_due_date, after_due_date)"),
* @OA\Property(property="schedule_reminder3", type="string", example="after_invoice_date", description="(enum: after_invoice_date, before_due_date, after_due_date)"),
* @OA\Property(property="late_fee_amount1", type="string", example="10.00", description="____________"),
* @OA\Property(property="late_fee_amount2", type="string", example="20.00", description="____________"),
* @OA\Property(property="late_fee_amount3", type="string", example="100.00", description="____________"),
* @OA\Property(property="late_fee_amount1", type="float", example=10.00, description="____________"),
* @OA\Property(property="late_fee_amount2", type="float", example=20.00, description="____________"),
* @OA\Property(property="late_fee_amount3", type="float", example=100.00, description="____________"),
* @OA\Property(property="endless_reminder_frequency_id", type="string", example="1", description="____________"),
* @OA\Property(property="client_online_payment_notification", type="boolean", example=false, description="____________"),
* @OA\Property(property="client_manual_payment_notification", type="boolean", example=false, description="____________"),

View File

@ -12,11 +12,13 @@
namespace App\Http\Requests\Invoice;
use App\Http\Requests\Request;
use App\Utils\Traits\MakesHash;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Rule;
class UpdateInvoiceRequest extends Request
{
use MakesHash;
/**
* Determine if the user is authorized to make this request.
*
@ -34,7 +36,7 @@ class UpdateInvoiceRequest extends Request
public function rules()
{
//$this->sanitize();
$this->sanitize();
return [
'documents' => 'mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
@ -47,6 +49,9 @@ class UpdateInvoiceRequest extends Request
{
$input = $this->all();
if(isset($input['client_id']))
$input['client_id'] = $this->decodePrimaryKey($input['client_id']);
$this->replace($input);
return $this->all();

View File

@ -23,6 +23,7 @@ use Illuminate\Contracts\Translation\HasLocalePreference;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Laracasts\Presenter\PresentableTrait;

View File

@ -21,7 +21,7 @@ class Gateway extends StaticModel
'is_offsite' => 'boolean',
'is_secure' => 'boolean',
'recommended' => 'boolean',
'visible' => 'boolean',
//'visible' => 'boolean',
'updated_at' => 'timestamp',
'created_at' => 'timestamp',
'default_gateway_type_id' => 'string',

View File

@ -23,6 +23,8 @@ use Illuminate\Database\Eloquent\Model;
class GroupSetting extends StaticModel
{
use MakesHash;
public $timestamps = false;
protected $casts = [
@ -52,5 +54,15 @@ class GroupSetting extends StaticModel
return $this->hasMany(Client::class, 'id', 'group_settings_id');
}
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
return $this
->where('id', $this->decodePrimaryKey($value))->firstOrFail();
}
}

View File

@ -21,8 +21,9 @@ class InvoiceInvitation extends BaseModel
use MakesDates;
protected $guarded = [
protected $fillable = [
'id',
'client_contact_id',
];
public function entityType()

View File

@ -13,6 +13,7 @@ namespace App\Repositories;
use App\Models\Activity;
use App\Models\Backup;
use App\Models\Client;
use Illuminate\Support\Facades\Log;
/**
@ -54,6 +55,17 @@ class ActivityRepository extends BaseRepository
{
$backup = new Backup();
// if(get_class($entity) == Client::class)
// $settings = $entity->getMergedSettings();
// else
// $settings = $entity->client->getMergedSettings();
// $entity->clientMergedDettings = $settings;
if(get_class($entity) == Client::class)
$entity->load('company');
else
$entity->load('company','client');
$backup->activity_id = $activity->id;
$backup->json_backup = $entity->toJson();
$backup->save();

View File

@ -34,7 +34,7 @@ class ClientContactRepository extends BaseRepository
});
/* Set first record to primary - always*/
/* Set first record to primary - always */
$contacts = $contacts->sortBy('is_primary');
$contacts->first(function($contact){

View File

@ -72,7 +72,39 @@ class InvoiceRepository extends BaseRepository
}
}
event(new CreateInvoiceInvitation($invoice));
if(isset($data['invitations']))
{
$invitations = collect($data['invitations']);
/* Get array of Keyss which have been removed from the invitations array and soft delete each invitation */
collect($invoice->invitations->pluck('key'))->diff($invitations->pluck('key'))->each(function($invitation){
InvoiceInvitation::destroy($invitation);
});
foreach($data['invitations'] as $invitation)
{
$inv = InvoiceInvitation::whereKey($invitation['key'])->first();
if(!$inv)
{
$invitation['client_contact_id'] = $this->decodePrimaryKey($invitation['client_contact_id']);
$new_invitation = InvoiceInvitationFactory::create($invoice->company_id, $invoice->user_id);
$new_invitation->fill($invitation);
$new_invitation->invoice_id = $invoice->id;
$new_invitation->save();
}
}
}
//event(new CreateInvoiceInvitation($invoice));
$invoice = $invoice->calc()->getInvoice();
@ -88,7 +120,7 @@ class InvoiceRepository extends BaseRepository
if($finished_amount != $starting_amount)
UpdateCompanyLedgerWithInvoice::dispatchNow($invoice, ($finished_amount - $starting_amount));
return $invoice;
return $invoice->fresh();
}

View File

@ -63,6 +63,8 @@ class ClientTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($client->id),
'user_id' => $this->encodePrimaryKey($client->user_id),
'assigned_user_id' => $this->encodePrimaryKey($client->assigned_user_id),
'name' => $client->name ?: '',
'website' => $client->website ?: '',
'private_notes' => $client->private_notes ?: '',
@ -89,7 +91,7 @@ class ClientTransformer extends EntityTransformer
'shipping_state' => $client->shipping_state ?: '',
'shipping_postal_code' => $client->shipping_postal_code ?: '',
'shipping_country_id' => $client->shipping_country_id ?: '',
'settings' => $client->settings ?: '',
'settings' => $client->settings ?: new \stdClass,
'is_deleted' => (bool) $client->is_deleted,
'vat_number' => $client->vat_number ?: '',
'id_number' => $client->id_number ?: '',

View File

@ -18,10 +18,12 @@ use App\Models\Company;
use App\Models\CompanyGateway;
use App\Models\CompanyUser;
use App\Models\GroupSetting;
use App\Models\TaxRate;
use App\Models\User;
use App\Transformers\CompanyGatewayTransformer;
use App\Transformers\CompanyUserTransformer;
use App\Transformers\GroupSettingTransformer;
use App\Transformers\TaxRateTransformer;
use App\Utils\Traits\MakesHash;
/**
@ -72,7 +74,11 @@ class CompanyTransformer extends EntityTransformer
'update_products' => (bool)$company->update_products,
'fill_products' => (bool)$company->fill_products,
'convert_products' => (bool)$company->convert_products,
'custom_surcharge_taxes' => (bool)$company->custom_surcharge_taxes,
'custom_surcharge_taxes1' => (bool)$company->custom_surcharge_taxes1,
'custom_surcharge_taxes2' => (bool)$company->custom_surcharge_taxes2,
'custom_surcharge_taxes3' => (bool)$company->custom_surcharge_taxes3,
'custom_surcharge_taxes4' => (bool)$company->custom_surcharge_taxes4,
'custom_fields' => (string) $company->custom_fields,
'size_id' => (string) $company->size_id ?: '',
'industry_id' => (string) $company->industry_id ?: '',
'first_month_of_year' => (string) $company->first_month_of_year ?: '',
@ -133,4 +139,13 @@ class CompanyTransformer extends EntityTransformer
return $this->includeItem($company->account, $transformer, Account::class);
}
public function includeTaxRates(Company $company)
{
$transformer = new TaxRateTransformer($this->serializer);
return $this->includeCollection($company->tax_rates, $transformer, TaxRate::class);
}
}

View File

@ -45,7 +45,7 @@ class GatewayTransformer extends EntityTransformer
'provider' => (string)$gateway->provider ?: '',
'visible' => (bool)$gateway->visible,
'sort_order' => (int)$gateway->sort_order,
'recommended' => (bool)$gateway->recommended,
//'recommended' => (bool)$gateway->recommended,
'site_url' => (string)$gateway->site_url ?: '',
'is_offsite' => (bool)$gateway->is_offsite,
'is_secure' => (bool)$gateway->is_secure,

View File

@ -24,7 +24,8 @@ class InvoiceInvitationTransformer extends EntityTransformer
return [
'id' => $this->encodePrimaryKey($invitation->id),
'key' => $invitation->getName() ?: '',
'client_contact_id' => $this->encodePrimaryKey($invitation->client_contact_id),
'key' => $invitation->key,
'link' => $invitation->getLink() ?: '',
'sent_date' => $invitation->sent_date ?: '',
'viewed_date' => $invitation->sent_date ?: '',

View File

@ -83,6 +83,8 @@ class InvoiceTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($invoice->id),
'user_id' => $this->encodePrimaryKey($invoice->user_id),
'assigned_user_id' => $this->encodePrimaryKey($invoice->assigned_user_id),
'amount' => (float) $invoice->amount,
'balance' => (float) $invoice->balance,
'client_id' => (string) $this->encodePrimaryKey($invoice->client_id),

View File

@ -55,6 +55,8 @@ class PaymentTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($payment->id),
'user_id' => $this->encodePrimaryKey($payment->user_id),
'assigned_user_id' => $this->encodePrimaryKey($payment->assigned_user_id),
'amount' => (float) $payment->amount,
'transaction_reference' => $payment->transaction_reference ?: '',
'payment_date' => $payment->payment_date ?: '',

View File

@ -60,6 +60,8 @@ class ProductTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($product->id),
'user_id' => $this->encodePrimaryKey($product->user_id),
'assigned_user_id' => $this->encodePrimaryKey($product->assigned_user_id),
'product_key' => $product->product_key ?: '',
'notes' => $product->notes ?: '',
'cost' => (float) $product->cost ?: 0,

View File

@ -80,6 +80,8 @@ class QuoteTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($quote->id),
'user_id' => $this->encodePrimaryKey($quote->user_id),
'assigned_user_id' => $this->encodePrimaryKey($quote->assigned_user_id),
'amount' => (float) $quote->amount ?: '',
'balance' => (float) $quote->balance ?: '',
'client_id' => (string) $quote->client_id,

View File

@ -81,6 +81,8 @@ class RecurringInvoiceTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($invoice->id),
'user_id' => $this->encodePrimaryKey($invoice->user_id),
'assigned_user_id' => $this->encodePrimaryKey($invoice->assigned_user_id),
'amount' => (float) $invoice->amount ?: '',
'balance' => (float) $invoice->balance ?: '',
'client_id' => (string) $invoice->client_id,

View File

@ -81,6 +81,8 @@ class RecurringQuoteTransformer extends EntityTransformer
{
return [
'id' => $this->encodePrimaryKey($quote->id),
'user_id' => $this->encodePrimaryKey($quote->user_id),
'assigned_user_id' => $this->encodePrimaryKey($quote->assigned_user_id),
'amount' => (float) $quote->amount ?: '',
'balance' => (float) $quote->balance ?: '',
'client_id' => (string) $quote->client_id,

View File

@ -83,7 +83,7 @@ class CreateUsersTable extends Migration
$table->string('provider');
$table->boolean('visible')->default(true);
$table->unsignedInteger('sort_order')->default(10000);
$table->boolean('recommended')->default(0);
//$table->boolean('recommended')->default(0);
$table->string('site_url', 200)->nullable();
$table->boolean('is_offsite')->default(false);
$table->boolean('is_secure')->default(false);
@ -668,7 +668,7 @@ class CreateUsersTable extends Migration
$t->unsignedInteger('user_id');
$t->unsignedInteger('client_contact_id');
$t->unsignedInteger('invoice_id')->index();
$t->string('invitation_key')->index()->unique();
$t->string('key')->index();
$t->timestamps(6);
$t->softDeletes();

View File

@ -67,7 +67,7 @@ class PaymentLibrariesSeeder extends Seeder
['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' => ''],
['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' => ''],
];

View File

@ -93,7 +93,7 @@ class RandomDataSeeder extends Seeder
]);
factory(\App\Models\Client::class, 6)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company){
factory(\App\Models\Client::class, 10)->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

@ -15,7 +15,7 @@
@endif
<form method="POST" action="{{ route($passwordEmailRoute) }}">
@csrf
<h1>trans('texts.password_recovery')</h1>
<h1>{{trans('texts.password_recovery')}}</h1>
<p class="text-muted"></p>
<div class="input-group mb-3">
<div class="input-group-prepend">
@ -23,7 +23,7 @@
<i class="icon-user"></i>
</span>
</div>
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="trans('texts.email')" required autofocus>
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="{{trans('texts.email')}}" required autofocus>
@if ($errors->has('email'))
<span class="invalid-feedback" role="alert">
@ -35,7 +35,7 @@
<div class="row">
<div class="col-6">
<button class="btn btn-primary px-4" type="submit">trans('texts.send_email')</button>
<button class="btn btn-primary px-4" type="submit">{{trans('texts.send_email')}}</button>
</div>
</div>
</form>

View File

@ -12,7 +12,7 @@
<form method="POST" action="{{ route('client.password.update') }}">
@csrf
<input type="hidden" name="token" value="{{ $token }}">
<h1>@lang('texts.change_password')</h1>
<h1>{{trans('texts.change_password')}}</h1>
<p class="text-muted"></p>
<div class="input-group mb-3">
<div class="input-group-prepend">
@ -20,7 +20,7 @@
<i class="icon-user"></i>
</span>
</div>
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="@lang('texts.email')" required autofocus>
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="{{trans('texts.email')}}" required autofocus>
@if ($errors->has('email'))
<span class="invalid-feedback" role="alert">
@ -36,7 +36,7 @@
<i class="icon-lock"></i>
</span>
</div>
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="@lang('texts.password')" required>
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="{{trans('texts.password')}}" required>
@if ($errors->has('password'))
<span class="invalid-feedback" role="alert">
@ -51,12 +51,12 @@
<i class="icon-lock"></i>
</span>
</div>
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" placeholder="@lang('texts.confirm_password')" required>
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" placeholder="{{trans('texts.confirm_password')}}" required>
</div>
<div class="row">
<div class="col-6">
<button class="btn btn-primary px-4" type="submit">@lang('texts.change_password')</button>
<button class="btn btn-primary px-4" type="submit">{{trans('texts.change_password')}}</button>
</div>
</div>
</form>

View File

@ -3,9 +3,9 @@
<button class="navbar-toggler sidebar-toggler d-lg-none mr-auto" type="button" data-toggle="sidebar-show">
<span class="navbar-toggler-icon"></span>
</button>
<a class="navbar-brand" href="https://invoiceninja.com">
<img class="navbar-brand-full" src="/images/logo.png" width="50" height="50" alt="Invoice Ninja Logo">
<img class="navbar-brand-minimized" src="/images/logo.png" width="30" height="30" alt="Invoice Ninja Logo">
<a class="navbar-brand" href="{!! $settings->website ?: 'https://invoiceninja.com' !!}">
<img class="navbar-brand-full" src="{!! $settings->company_logo ?: '/images/logo.png' !!}" width="50" height="50" alt="Invoice Ninja Logo">
<img class="navbar-brand-minimized" src="{!! $settings->company_logo ?: '/images/logo.png' !!}" width="30" height="30" alt="Invoice Ninja Logo">
</a>
<button class="navbar-toggler sidebar-toggler sidebar-minimizer" type="button" data-toggle="sidebar-show">

View File

@ -62,7 +62,7 @@ $(function() {
drawCallback: function(settings){
data = this.api().ajax.json().data;
console.log(data);
},
columns: [

View File

@ -49,6 +49,7 @@ Route::group(['middleware' => ['domain_db'], 'prefix' => 'client', 'as' => 'clie
/*Invitation catches*/
Route::get('invoice/{invitation_id}','ClientPortal\InvitationController@invoiceRouter');
//Route::get('invoice/{client_hash}/{invitation_id}','ClientPortal\InvitationController@invoiceRouterForIframe'); we shouldn't need this if we force subdomain for the clients
Route::get('payment_hook/{company_gateway_id}/{gateway_type_id}','ClientPortal\PaymentHookController@process');
});

View File

@ -55,7 +55,7 @@ class CompanySettingsTest extends TestCase
$casts = CompanySettings::$casts;
$diff = array_diff_key($company_settings, $casts);
\Log::error($diff);
$this->assertEquals(1, count($diff));
}