/home/edulekha/crm.edulekha.com/application/libraries/gateways/Paypal_braintree_gateway.php
<?php

defined('BASEPATH') or exit('No direct script access allowed');

use Omnipay\Omnipay;

class Paypal_braintree_gateway extends App_gateway
{
	public bool $processingFees = false;

	public function __construct()
    {
        /**
        * Call App_gateway __construct function
        */
        parent::__construct();
        /**
         * REQUIRED
         * Gateway unique id
         * The ID must be alpha/alphanumeric
         */
        $this->setId('paypal_braintree');

        /**
         * REQUIRED
         * Gateway name
         */
        $this->setName('Braintree');

        /**
         * Add gateway settings
        */
        $this->setSettings([
            [
                'name'      => 'merchant_id',
                'encrypted' => true,
                'label'     => 'paymentmethod_braintree_merchant_id',
            ],
            [
                'name'  => 'api_public_key',
                'label' => 'paymentmethod_braintree_public_key',
            ],
            [
                'name'      => 'api_private_key',
                'encrypted' => true,
                'label'     => 'paymentmethod_braintree_private_key',
            ],
            [
                'name'          => 'currencies',
                'label'         => 'settings_paymentmethod_currencies',
                'default_value' => 'USD',
            ],
            [
                'name'          => 'paypal_enabled',
                'type'          => 'yes_no',
                'default_value' => 1,
                'label'         => 'payment_gateway_enable_paypal',
            ],
            [
                'name'          => 'test_mode_enabled',
                'type'          => 'yes_no',
                'default_value' => 1,
                'label'         => 'settings_paymentmethod_testing_mode',
            ],
        ]);
    }

    public function process_payment($data)
    {
        $redUrl = site_url('gateways/braintree/make_payment?invoiceid='
            . $data['invoiceid']
            . '&total=' . $data['amount']
            . '&hash=' . $data['invoice']->hash);

        redirect($redUrl);
    }

    public function fetch_payment($transaction_id)
    {
        $gateway = Omnipay::create('Braintree');
        $gateway->setMerchantId($this->decryptSetting('merchant_id'));
        $gateway->setPrivateKey($this->decryptSetting('api_private_key'));
        $gateway->setPublicKey($this->getSetting('api_public_key'));
        $gateway->setTestMode($this->getSetting('test_mode_enabled'));

        return $gateway->find(['transactionReference' => $transaction_id])->send();
    }

    public function generate_token()
    {
        $gateway = Omnipay::create('Braintree');
        $gateway->setMerchantId($this->decryptSetting('merchant_id'));
        $gateway->setPrivateKey($this->decryptSetting('api_private_key'));
        $gateway->setPublicKey($this->getSetting('api_public_key'));
        $gateway->setTestMode($this->getSetting('test_mode_enabled'));

        return $gateway->clientToken()->send()->getToken();
    }

    public function finish_payment($data)
    {
        // Process online for PayPal payment start
        $gateway = Omnipay::create('Braintree');
        $gateway->setMerchantId($this->decryptSetting('merchant_id'));
        $gateway->setPrivateKey($this->decryptSetting('api_private_key'));
        $gateway->setPublicKey($this->getSetting('api_public_key'));
        $gateway->setTestMode($this->getSetting('test_mode_enabled'));

        $response = $gateway->purchase([
            'amount'   => number_format($data['amount'], 2, '.', ''),
            'currency' => $data['currency'],
            'token'    => $data['payment_method_nonce'],
            ])->send();

        return $response;
    }
}