mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 23:07:32 -05:00 
			
		
		
		
	Restrict payments based on gateway type limits
This commit is contained in:
		
							parent
							
								
									3c4ad52463
								
							
						
					
					
						commit
						ca71ea5622
					
				@ -173,8 +173,8 @@ class ClientPortalController extends BaseController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        foreach ($account->account_gateways as $accountGateway) {
 | 
					        foreach ($account->account_gateways as $accountGateway) {
 | 
				
			||||||
            $paymentDriver = $accountGateway->paymentDriver($invitation);
 | 
					            $paymentDriver = $accountGateway->paymentDriver($invitation);
 | 
				
			||||||
            $links = array_merge($links, $paymentDriver->tokenLinks());
 | 
					            $links = array_merge($links, $paymentDriver->tokenLinks($invitation->invoice));
 | 
				
			||||||
            $links = array_merge($links, $paymentDriver->paymentLinks());
 | 
					            $links = array_merge($links, $paymentDriver->paymentLinks($invitation->invoice));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $links;
 | 
					        return $links;
 | 
				
			||||||
 | 
				
			|||||||
@ -11,4 +11,12 @@ class PaymentType extends Eloquent
 | 
				
			|||||||
     * @var bool
 | 
					     * @var bool
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public $timestamps = false;
 | 
					    public $timestamps = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function gatewayType()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $this->belongsTo('App\Models\GatewayType');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,12 +2,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use URL;
 | 
					use URL;
 | 
				
			||||||
use Session;
 | 
					use Session;
 | 
				
			||||||
 | 
					use Utils;
 | 
				
			||||||
use Request;
 | 
					use Request;
 | 
				
			||||||
use Omnipay;
 | 
					use Omnipay;
 | 
				
			||||||
use Exception;
 | 
					use Exception;
 | 
				
			||||||
use CreditCard;
 | 
					use CreditCard;
 | 
				
			||||||
use DateTime;
 | 
					use DateTime;
 | 
				
			||||||
use App\Models\AccountGatewayToken;
 | 
					use App\Models\AccountGatewayToken;
 | 
				
			||||||
 | 
					use App\Models\AccountGatewaySettings;
 | 
				
			||||||
use App\Models\Account;
 | 
					use App\Models\Account;
 | 
				
			||||||
use App\Models\Payment;
 | 
					use App\Models\Payment;
 | 
				
			||||||
use App\Models\PaymentMethod;
 | 
					use App\Models\PaymentMethod;
 | 
				
			||||||
@ -733,7 +735,7 @@ class BasePaymentDriver
 | 
				
			|||||||
        return $this->createPayment($ref);
 | 
					        return $this->createPayment($ref);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function tokenLinks()
 | 
					    public function tokenLinks($invoice)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if ( ! $this->customer()) {
 | 
					        if ( ! $this->customer()) {
 | 
				
			||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
@ -747,6 +749,10 @@ class BasePaymentDriver
 | 
				
			|||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ( !$this->invoiceMeetsGatewayTypeLimits($invoice, $paymentMethod->payment_type->gateway_type_id) ) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $url = URL::to("/payment/{$this->invitation->invitation_key}/token/".$paymentMethod->public_id);
 | 
					            $url = URL::to("/payment/{$this->invitation->invitation_key}/token/".$paymentMethod->public_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) {
 | 
					            if ($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) {
 | 
				
			||||||
@ -770,24 +776,51 @@ class BasePaymentDriver
 | 
				
			|||||||
        return $links;
 | 
					        return $links;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function paymentLinks()
 | 
					    public function paymentLinks($invoice)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $links = [];
 | 
					        $links = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach ($this->gatewayTypes() as $gatewayType) {
 | 
					        foreach ($this->gatewayTypes() as $gatewayTypeId) {
 | 
				
			||||||
            if ($gatewayType === GATEWAY_TYPE_TOKEN) {
 | 
					            if ($gatewayTypeId === GATEWAY_TYPE_TOKEN) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ( !$this->invoiceMeetsGatewayTypeLimits($invoice, $gatewayTypeId) ) {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $links[] = [
 | 
					            $links[] = [
 | 
				
			||||||
                'url' => $this->paymentUrl($gatewayType),
 | 
					                'url' => $this->paymentUrl($gatewayTypeId),
 | 
				
			||||||
                'label' => trans("texts.{$gatewayType}")
 | 
					                'label' => trans("texts.{$gatewayTypeId}")
 | 
				
			||||||
            ];
 | 
					            ];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $links;
 | 
					        return $links;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function invoiceMeetsGatewayTypeLimits( $invoice, $gatewayTypeId ) {
 | 
				
			||||||
 | 
					        if ( !$gatewayTypeId ) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $accountGatewaySettings = AccountGatewaySettings::scope()->where('account_gateway_settings.gateway_type_id',
 | 
				
			||||||
 | 
					            '=', $gatewayTypeId)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($accountGatewaySettings) {
 | 
				
			||||||
 | 
					            if ($accountGatewaySettings->min_limit && $invoice->balance < $accountGatewaySettings->min_limit) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ($accountGatewaySettings->max_limit &&  $invoice->balance >= $accountGatewaySettings->max_limit + 1) {
 | 
				
			||||||
 | 
					                // The max is limit_max + 0.99, so we add 1 to max_limit
 | 
				
			||||||
 | 
					                // Then, if the balance is greater than or equal to that value, it's over the max.
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected function paymentUrl($gatewayType)
 | 
					    protected function paymentUrl($gatewayType)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $account = $this->account();
 | 
					        $account = $this->account();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user