'object' ]; public function gateway_tokens() { return $this->hasMany(ClientGatewayToken::class); } public function contacts() { return $this->hasMany(ClientContact::class)->orderBy('is_primary', 'desc'); } public function primary_contact() { return $this->hasMany(ClientContact::class)->whereIsPrimary(true); } public function company() { return $this->belongsTo(Company::class); } public function country() { return $this->belongsTo(Country::class); } public function shipping_country() { return $this->belongsTo(Country::class, 'shipping_country_id', 'id'); } public function timezone() { return Timezone::find($this->getMergedSettings()->timezone_id); } public function date_format() { return $this->getMergedSettings()->date_format; } public function datetime_format() { return $this->getMergedSettings()->datetime_format; } public function currency() { return Currency::find($this->getMergedSettings()->currency_id); } public function getMergedSettings() { return ClientSettings::buildClientSettings(new CompanySettings($this->company->settings), new ClientSettings($this->settings)); } public function documents() { return $this->morphMany(Document::class, 'documentable'); } /** * Generates an array of payment urls per client * for a given amount. * * The route produced will provide the * company_gateway and payment_type ids * * The invoice/s will need to be injected * upstream of this method as they are not * included in this logic. * * @param float $amount The amount to be charged * @return array Array of payment labels and urls */ public function getPaymentMethods($amount) :array { $settings = $this->getMergedSettings(); /* If we have a custom gateway list pass this back first */ if($settings->payment_gateways) $gateways = $this->company->company_gateways->whereIn('id', $settings->payment_gateways); else $gateways = $this->company->company_gateways; //** Filter gateways based on limits $gateways->filter(function ($method) use ($amount){ if($method->min_limit !== null && $amount < $method->min_limit) return false; if($method->max_limit !== null && $amount > $method->min_limit) return false; }); //** Get Payment methods from each gateway $payment_methods = []; foreach($gateways as $gateway) foreach($gateway->driver()->gatewayTypes() as $type) $payment_methods[] = [$gateway->id => $type]; //** Reduce gateways so that only one TYPE is present in the list ie. cannot have multiple credit card options $payment_methods_collections = collect($payment_methods); //** Plucks the remaining keys into its own collection $payment_methods_intersect = $payment_methods_collections->intersectByKeys( $payment_methods_collections->flatten(1)->unique() ); $payment_urls = []; //** Iterate through our list of payment gateways and methods and generate payment URLs $payment_list = $payment_methods_intersect->map(function ($value, $key) { $gateway = $gateways->where('id', $key)->first(); $fee_label = $gateway->calcGatewayFeeLabel($amount, $this); $payment_urls[] = [ 'label' => ctrans('texts.' . $gateway->type->alias) . $fee_label, 'url' => URL::signedRoute('payments', [ 'company_gateway_id' => $key, 'payment_method_id' => $value]) ]; }); return $payment_urls; } }