Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/admin.ondemand.codeskitter.site/app/Controllers/partner/
Upload File :
Current File : /home/users/unlimited/www/admin.ondemand.codeskitter.site/app/Controllers/partner/Partner.php

<?php
namespace App\Controllers\partner;
use Stripe\Exception\AuthenticationException;
use App\Controllers\BaseController;
use App\Libraries\Flutterwave;
use App\Libraries\Paypal;
use App\Libraries\Paystack;
use App\Libraries\Razorpay;
use App\Models\Cash_collection_model;
use App\Models\Partners_model;
use App\Models\Service_ratings_model;
use App\Models\Settlement_model;
use App\Libraries\Stripe;
use App\Models\Partner_subscription_model;
use App\Models\Settlement_CashCollection_history_model;
use Exception;
use Yabacon\Paystack\MetadataBuilder;
require APPPATH . 'Views/backend/partner/Razorpay.php';
use Razorpay\Api\Api;
class Partner extends BaseController
{
    protected $db; // Declare the $db property
    protected $builder; // Explicitly declare the $builder property
    protected $stripe_secret_key; // Explicitly declare the $stripe_secret_key property
    protected string $stripe_currency; // Add type declaration for $stripe_currency
    protected $validation; // Declare the $validation property
    protected $data; // Declare the $validation property
    protected $stripe; // Declare the $validation property

    protected Settlement_model $settle_commission; 
    protected Cash_collection_model $cash_collection; 
    protected Partners_model $partner; 
    protected Partner_subscription_model $subscription; 
    
    public function __construct()
    {
        helper('function', 'form', 'url', 'filesystem', 'ResponceServices');
        helper('ResponceServices');
        $this->validation = \Config\Services::validation();
        $this->ionAuth = new \IonAuth\Libraries\IonAuth();
        $user = $this->ionAuth->user()->row();
        $this->data['admin'] = $this->userIsAdmin;
        $this->data['partner'] = $this->userIsPartner;
        $this->settle_commission = new Settlement_model();
        $this->cash_collection = new Cash_collection_model();
        $this->data['settings'] = $this->settings;
        $this->partner = new Partners_model();
        $this->subscription = new Partner_subscription_model();
        $session = session();
        $lang = $session->get('lang');
        if (empty($lang)) {
            $lang = 'en';
        }
        $this->data['current_lang'] = $lang;
        $languages_locale = fetch_details('languages', [], [], null, '0', 'id', 'ASC');
        $available_languages = [];
        foreach ($languages_locale as $row) {
            $code = $row['code']; 
            $filePath = FCPATH . '/public/uploads/languages/' . $code . '.json';
            if (file_exists($filePath)) {
                $available_languages[] = $row;
            }
        }
        $this->data['languages_locale'] = $available_languages;
        $profile = '';
        if (!empty($data)) {
            $data = $data[0];
            if ($data['image'] != '') {
                if (check_exists(base_url($data['image']))) {
                    $profile = '<img alt="image" src="' .  base_url($data['image']) . '" class="rounded-circle mr-1">';
                } else {
                    $profile = '<figure class="avatar mb-2 avatar-sm mt-1" data-initial="' . strtoupper($data['username'][0]) . '"></figure>';
                }
            } else {
                $profile = '<figure class="avatar mb-2 avatar-sm mt-1" data-initial="' . strtoupper($data['username'][0]) . '"></figure>';
            }
            $this->data['profile_picture'] = $profile;
        }
        $this->data['profile_picture'] = $profile;
        $this->db      = \Config\Database::connect();
        $this->builder = $this->db->table('settings');
        $this->builder->select('value');
        $this->builder->where('variable', 'payment_gateways_settings');
        $query = $this->builder->get()->getResultArray();
        if (count($query) == 1) {
            $settings = $query[0]['value'];
            $settings = json_decode($settings, true);
        }
        $this->stripe_secret_key = $settings['stripe_secret_key'];
        $this->stripe_currency = $settings['stripe_currency'];
    }
    public function review()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        setPageInfo($this->data, 'Reviews | Provider Panel', 'reviews');
        return view('backend/partner/template', $this->data);
    }
    public function review_list()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        $uri = service('uri');
        $partner_id = $this->userId;
        $ratings_model = new Service_ratings_model();
        $limit = (isset($_GET['limit']) && !empty($_GET['limit'])) ? $_GET['limit'] : 10;
        $offset = (isset($_GET['offset']) && !empty($_GET['offset'])) ? $_GET['offset'] : 0;
        $sort = (isset($_GET['sort']) && !empty($_GET['sort'])) ? $_GET['sort'] : 'id';
        $order = (isset($_GET['order']) && !empty($_GET['order'])) ? $_GET['order'] : 'ASC';
        $search = (isset($_GET['search']) && !empty($_GET['search'])) ? $_GET['search'] : '';

        $where = "( s.user_id = {$partner_id} OR pb.partner_id = {$partner_id} )";

        return json_encode($ratings_model->ratings_list(false, $search, $limit, $offset, $sort, $order, $where));
    }
    public function cash_collection()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        setPageInfo($this->data, 'Cash Collection | Provider Panel', 'cash_collection_history');
        return view('backend/partner/template', $this->data);
    }
    public function cash_collection_history_list()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        $limit = (isset($_GET['limit']) && !empty($_GET['limit'])) ? $_GET['limit'] : 10;
        $offset = (isset($_GET['offset']) && !empty($_GET['offset'])) ? $_GET['offset'] : 0;
        $sort = (isset($_GET['sort']) && !empty($_GET['sort'])) ? $_GET['sort'] : 'id';
        $order = (isset($_GET['order']) && !empty($_GET['order'])) ? $_GET['order'] : 'ASC';
        $search = (isset($_GET['search']) && !empty($_GET['search'])) ? $_GET['search'] : '';
        $where['c.partner_id'] = $this->userId;
        print_r(json_encode($this->cash_collection->list(false, $search, $limit, $offset, $sort, $order, $where)));
    }
    public function settlement()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        setPageInfo($this->data, 'Commission Settlement | Provider Panel', 'settlement_history');
        return view('backend/partner/template', $this->data);
    }
    public function settlement_list()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        try {
            $limit = (isset($_GET['limit']) && !empty($_GET['limit'])) ? $_GET['limit'] : 10;
            $offset = (isset($_GET['offset']) && !empty($_GET['offset'])) ? $_GET['offset'] : 0;
            $sort = (isset($_GET['sort']) && !empty($_GET['sort'])) ? $_GET['sort'] : 'id';
            $order = (isset($_GET['order']) && !empty($_GET['order'])) ? $_GET['order'] : 'ASC';
            $search = (isset($_GET['search']) && !empty($_GET['search'])) ? $_GET['search'] : '';
            $where['provider_id'] = $this->userId;
            print_r(json_encode($this->settle_commission->list(false, $search, $limit, $offset, $sort, $order, $where)));
        } catch (\Exception $th) {
            $response['error'] = true;
            $response['message'] = 'Something went wrong';
            return $this->response->setJSON($response);
        }
    }
    public function payment()
    {
        if ($this->isLoggedIn) {
            if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
                return redirect('partner/profile');
            }
            setPageInfo($this->data, 'payment | Provider Panel', 'payment');
            return view('backend/partner/template', $this->data);
        } else {
            return redirect('partner/login');
        }
    }
    public function subscription_list()
    {
        if ($this->ionAuth->loggedIn()) {
            if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
                return redirect('partner/profile');
            }
            $subscription_details = fetch_details('subscriptions', ['status' => 1, 'publish' => 1]);
            $this->data['subscription_details'] = $subscription_details;
            $user = $this->ionAuth->user()->row();
            $active_subscription_details = fetch_details('partner_subscriptions', ['partner_id' => $user->id, 'status' => 'active']);
            $this->data['active_subscription_details'] = $active_subscription_details;
            $symbol =   get_currency();
            $razorpay = new Razorpay;
            $credentials = $razorpay->get_credentials();
            $key_id = $credentials['key'];
            $secret = $credentials['secret'];
            $data = get_settings('general_settings', true);
            $partner = fetch_details('partner_details', ['partner_id' => $this->userId])[0];
            $this->stripe = new Stripe;
            $stripe_credentials = $this->stripe->get_credentials();
            $this->data['currency'] = $symbol;
            setPageInfo($this->data, 'Subscription | Provider Panel', 'subscription');
            $this->data['partner'] = $partner;
            $this->data['data'] = $data;
            $this->data['key_id'] = $key_id;
            $this->data['secret'] = $secret;
            $this->data['stripe_credentials'] = $stripe_credentials;
            $current_active_payment_gateway = get_settings('payment_gateways_settings', true);
            if (isset($current_active_payment_gateway['paypal_status']) && $current_active_payment_gateway['paypal_status'] === 'enable') {
                $payment_gateway[] = "paypal";
            }
            if (isset($current_active_payment_gateway['razorpayApiStatus']) && $current_active_payment_gateway['razorpayApiStatus'] === 'enable') {
                $payment_gateway[] = "razorpay";
            }
            if (isset($current_active_payment_gateway['paystack_status']) &&  $current_active_payment_gateway['paystack_status'] === 'enable') {
                $payment_gateway[] = "paystack";
            }
            if (isset($current_active_payment_gateway['stripe_status']) &&  $current_active_payment_gateway['stripe_status'] === 'enable') {
                $payment_gateway[] = "stripe";
            }
            if (isset($current_active_payment_gateway['flutterwave_status']) && $current_active_payment_gateway['flutterwave_status']  === 'enable') {
                $payment_gateway[] = "flutterwave";
            }
            $check_payment_gateway = get_settings('payment_gateways_settings', true);
            $payment_gateway_setting =  $check_payment_gateway['payment_gateway_setting'];
            if ($payment_gateway_setting == 0 || count($payment_gateway) == 0) {
                if ($payment_gateway_setting == 0) {
                    $msg = "online payment option is disabled";
                } else if (count($payment_gateway) == 0) {
                    $msg = "all payment gateways are currently disabled";
                }
                $this->session = \Config\Services::session();
                $_SESSION['toastMessage']  = 'Please contact the admin as ' . $msg;
                $_SESSION['toastMessageType']  = 'error';
                $this->session->markAsFlashdata('toastMessage');
                $this->session->markAsFlashdata('toastMessageType');
                return redirect()->to('partner')->withCookies();
            }
            $this->data['payment_gateway'] = $payment_gateway;
            return view('backend/partner/template', $this->data);
        } else {
            return redirect('partner/login');
        }
    }
    public function make_payment_for_subscription()
    {
        try {
            $subscription_id = $_POST['subscription_id'];
            $subscription_details = fetch_details('subscriptions', ['id' => $subscription_id]);
            $partner_id = $this->ionAuth->user()->row()->id;
            $is_already_subscribe = fetch_details('partner_subscriptions', ['partner_id' => $partner_id, 'status' => 'active']);
            if (!empty($is_already_subscribe)) {
                $errorMessage = "Already have active subscription";
                session()->setFlashdata('error', $errorMessage);
                return redirect()->back();
            }
            if ($subscription_details[0]['price'] == "0") {
                add_subscription($subscription_id, $partner_id);
                $errorMessage = "Subscription Activated.";
                session()->setFlashdata('success', $errorMessage);
                return redirect()->back();
            } else {
                $payment_gateway = $_POST['payment_method'];
                $price = calculate_subscription_price($subscription_details[0]['id']);
                $data['client_id'] = $this->userId;
                $data['package_id'] = $subscription_details[0]['id'];
                $data['net_amount'] = $price[0]['price_with_tax'];
                if ($payment_gateway == "stripe") {
                    try {
                        \Stripe\Stripe::setApiKey($this->stripe_secret_key);
                        $paymentLink = $this->generatePaymentLink($data);
                        return redirect()->to($paymentLink);
                    } catch (AuthenticationException $e) {
                        $errorMessage = "Invalid API Key provided.";
                        session()->setFlashdata('error', $errorMessage);
                        return redirect()->back();
                    }
                } else if ($payment_gateway == "razorpay") {
                    try {
                        $paymentLink = $this->RazorpaygeneratePaymentLink($data);
                        return redirect()->to($paymentLink);
                    } catch (Exception $e) {
                        $errorMessage = "Invalid API Key provided.";
                        session()->setFlashdata('error', $errorMessage);
                        return redirect()->back();
                    }
                } else if ($payment_gateway == "paystack") {
                    try {
                        $paymentLink = $this->PaystackgeneratePaymentLink($data);
                        return redirect()->to($paymentLink);
                    } catch (AuthenticationException $e) {
                        $errorMessage = "Invalid API Key provided.";
                        session()->setFlashdata('error', $errorMessage);
                        return redirect()->back();
                    }
                } else if ($payment_gateway == "paypal") {
                    $paymentLink = $this->PaypalgeneratePaymentLink($data);
                } else if ($payment_gateway == "flutterwave") {
                    try {
                        $paymentLink = $this->FlutterwavegeneratePaymentLink($data);
                        return redirect()->to($paymentLink);
                    } catch (AuthenticationException $e) {
                        $errorMessage = "Invalid API Key provided.";
                        session()->setFlashdata('error', $errorMessage);
                        return redirect()->back();
                    }
                }
            }
        } catch (\Throwable $th) {
         
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - make_payment_for_subscription()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    private function FlutterwavegeneratePaymentLink($param)
    {
        $user_data = fetch_details('users', ['id' => $this->userId])[0];
        $flutterwave = new Flutterwave();
        $flutterwave_credentials = $flutterwave->get_credentials();
        $secret_key = $flutterwave_credentials['secret_key'];
        $data = [
            'transaction_type' => 'transaction',
            'user_id' => $this->userId,
            'partner_id' =>  $this->userId,
            'order_id' =>  "0",
            'type' => 'flutterwave',
            'txn_id' => "0",
            'amount' => $param['net_amount'],
            'status' => 'pending',
            'currency_code' => NULL,
            'subscription_id' => $param['package_id'],
            'message' => 'subscription successfull'
        ];
        $insert_id = add_transaction($data);
        add_subscription($param['package_id'], $this->userId, $insert_id);
        $email = $user_data['email'];
        $amount = $param['net_amount'];
        $request = [
            'tx_ref' => time(),
            'amount' => $amount,
            'currency' => $flutterwave_credentials['currency_code'],
            'payment_options' => 'card',
            'redirect_url' => base_url() . '/partner/flutterwave_callback',
            'customer' => [
                'email' => $email,
                'name' =>  $user_data['username'],
            ],
            'meta' => [
                'subscription_id' => $param['package_id'],
                'price' => $param['net_amount'],
                'transaction_id'=> $insert_id ,
            ],
            'customizations' => [
                'title' => 'Paying for a subscription',
                'description' => 'subscription'
            ]
        ];
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://api.flutterwave.com/v3/payments',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_POSTFIELDS => json_encode($request),
            CURLOPT_HTTPHEADER => array(
                'Authorization: Bearer ' . $secret_key,
                'Content-Type: application/json'
            ),
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        $res = json_decode($response);
        if ($res->status == 'success') {
            $link = $res->data->link;
        } else {
            $link = "";
        }
        return $link;
    }
    public function flutterwave_callback()
    {
        if ($_GET['status'] == 'cancelled') {
            $settings = get_settings('general_settings', true);
            $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
            setPageInfo($this->data, 'Payment Cancel | Provider Panel', 'payment-cancel');
            $this->data['keywords'] = 'Payment Cancel, ';
            $this->data['description'] = 'Payment Cancel | ';
            $this->data['meta_description'] = '';
            return view('backend/partner/template', $this->data);
        } elseif ($_GET['status'] == 'successful') {
            $txid = $_GET['transaction_id'];
            $flutterwave = new Flutterwave();
            $flutterwave_credentials = $flutterwave->get_credentials();
            $secret_key = $flutterwave_credentials['secret_key'];
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => "https://api.flutterwave.com/v3/transactions/{$txid}/verify",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 0,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_HTTPHEADER => array(
                    "Content-Type: application/json",
                    "Authorization: Bearer ". $secret_key
                ),
            ));
            $response = curl_exec($curl);
            curl_close($curl);
            $res = json_decode($response);
            if ($res->status && $res->status!='error') {
                $amountPaid = $res->data->charged_amount;
                $amountToPay = $res->data->meta->price;
                if ($amountPaid >= $amountToPay) {
                    $settings = get_settings('general_settings', true);
                    $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
                    setPageInfo($this->data, 'Payment Success | Provider Panel', 'payment-success');
                    $this->data['keywords'] = 'Payment Success, ';
                    $this->data['description'] = 'Payment Success | ';
                    $this->data['meta_description'] = '';
                    header('Refresh: 2; URL=' . base_url() . '/partner/subscription');
                    return view('backend/partner/template', $this->data);
                } else {
                    $settings = get_settings('general_settings', true);
                    $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
                    setPageInfo($this->data, 'Payment Cancel | Provider Panel', 'payment-cancel');
                    $this->data['keywords'] = 'Payment Cancel, ';
                    $this->data['description'] = 'Payment Cancel | ';
                    $this->data['meta_description'] = '';
                    return view('backend/partner/template', $this->data);
                }
            } else {
                $settings = get_settings('general_settings', true);
                $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
                setPageInfo($this->data, 'Payment Cancel | Provider Panel', 'payment-cancel');
                $this->data['keywords'] = 'Payment Cancel, ';
                $this->data['description'] = 'Payment Cancel | ';
                $this->data['meta_description'] = '';
                return view('backend/partner/template', $this->data);
            }
        }
    }
    private function PaystackgeneratePaymentLink($param)
    {
        try {
            $user_data = fetch_details('users', ['id' => $this->userId])[0];
            $paystack = new Paystack();
            $paystack_credentials = $paystack->get_credentials();
            $secret_key = $paystack_credentials['secret'];
            $data = [
                'transaction_type' => 'transaction',
                'user_id' => $this->userId,
                'partner_id' =>  $this->userId,
                'order_id' =>  "0",
                'type' => 'paystack',
                'txn_id' => "0",
                'amount' => $param['net_amount'],
                'status' => 'pending',
                'currency_code' => NULL,
                'subscription_id' => $param['package_id'],
                'message' => 'subscription successfull'
            ];
            $insert_id = add_transaction($data);
            $paystack = new \Yabacon\Paystack($secret_key);
            $metadata = new MetadataBuilder;
            $metadata->withTransactionId($insert_id);
            try {
                $transaction = $paystack->transaction->initialize([
                    'amount'     => $param['net_amount'] * 100,
                    'email'      => $user_data['email'],
                    'reference'  => rand(),
                    'metadata' => $metadata->build()
                ]);
                $authorization_url = $transaction->data->authorization_url;
                add_subscription($param['package_id'], $this->userId, $insert_id);
                return $authorization_url;
            } catch (\Yabacon\Paystack\Exception\ApiException $e) {
                $errorMessage = $$e;
                session()->setFlashdata('error', $errorMessage);
                return redirect()->back();
            }
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - PaystackgeneratePaymentLink()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    private function RazorpaygeneratePaymentLink($param)
    {
        try {
            $razorpay = new Razorpay;
            $credentials = $razorpay->get_credentials();
            $key_id = $credentials['key'];
            $secret = $credentials['secret'];
            $api = new Api($key_id, $secret);
            $data = [
                'transaction_type' => 'transaction',
                'user_id' => $this->userId,
                'partner_id' =>  $this->userId,
                'order_id' =>  "0",
                'type' => 'razorpay',
                'txn_id' => "0",
                'amount' => $param['net_amount'] * 100,
                'status' => 'pending',
                'currency_code' => NULL,
                'subscription_id' => $param['package_id'],
                'message' => 'subscription successfull'
            ];
            $insert_id = add_transaction($data);
            $checkout = $api->paymentLink->create(array(
                'amount' =>  floatval($param['net_amount']) * 100,
                'currency' => $credentials['currency'],
                'accept_partial' => false,
                'notify' => array('sms' => true, 'email' => true),
                'reminder_enable' => true,
                'notes' => array('policy_name' => 'Subscription', 'transaction_id' => $insert_id),
                'callback_url' => base_url() . '/partner/stripe_success',
                'callback_method' => 'get'
            ));
            add_subscription($param['package_id'], $this->userId, $insert_id);
            return $checkout['short_url'];
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - RazorpaygeneratePaymentLink()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    public function PaypalgeneratePaymentLink($param)
    {
        try {
            $this->paypal_lib = new Paypal();
            $user = fetch_details('users', ['id' => $this->userId]);
            $data['user'] = $user[0];
            $data['payment_type'] = "paypal";
            $data1 = [
                'transaction_type' => 'transaction',
                'user_id' => $this->userId,
                'partner_id' =>  $this->userId,
                'order_id' =>  "0",
                'type' => 'paypal',
                'txn_id' => "0",
                'amount' => $param['net_amount'],
                'status' => 'pending',
                'currency_code' => NULL,
                'subscription_id' => $param['package_id'],
                'message' => 'subscription successfull'
            ];
            $insert_id = add_transaction($data1);
            add_subscription($param['package_id'], $this->userId, $insert_id);
            $returnURL = base_url() . '/partner/stripe_success';
            $cancelURL = base_url() . '/partner/cancel';
            $notifyURL = base_url() . '/api/webhooks/paypal';
            $userID = $this->userId;
            $payeremail = $data['user']['email']; 
            $this->paypal_lib->add_field('return', $returnURL);
            $this->paypal_lib->add_field('cancel_return', $cancelURL);
            $this->paypal_lib->add_field('notify_url', $notifyURL);
            $this->paypal_lib->add_field('item_name', 'Test');
            $this->paypal_lib->add_field('custom',  $insert_id . '|' . $payeremail . '|subscription');
            $this->paypal_lib->add_field('item_number', $insert_id);
            $this->paypal_lib->add_field('amount', $param['net_amount']);
            ($this->paypal_lib->paypal_auto_form());
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - PaypalgeneratePaymentLink()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    private function generatePaymentLink($param)
    {
        try {
            $this->session       = \Config\Services::session();
            $client_id = $param['client_id'];
            $package_id = $param['package_id'];
            $amount = floatval($param['net_amount']) * 100;
            $this->db      = \Config\Database::connect();
            $package_name = $this->db->query("SELECT * FROM `subscriptions` WHERE id='$package_id'")->getFirstRow();
            $package_name = ($package_name) ? $package_name->name : '';
            $result = $this->db->query("SELECT * FROM `users` WHERE id='$client_id'")->getFirstRow();
            if ($result->strip_id == '') {
                $customer = \Stripe\Customer::create(array(
                    'email' => $result->email,
                    'description' => $result->id
                ));
                $this->db->table('users')->update(['strip_id' => $customer['id']], ['id' => $client_id]);
                $stripid = $customer['id'];
                $email = $result->email;
            } else {
                $stripid = $result->strip_id;
                $email = $result->email;
            }
            $this->session->remove('POSTDATA');
            $this->session->set('POSTDATA', $param);
            $data = [
                'transaction_type' => 'transaction',
                'user_id' => $this->userId,
                'partner_id' =>  $this->userId,
                'order_id' =>  "0",
                'type' => 'stripe',
                'txn_id' => "0",
                'amount' => $param['net_amount'],
                'status' => 'pending',
                'currency_code' => NULL,
                'subscription_id' => $package_id,
                'message' => 'subscription successfull'
            ];
            $insert_id = add_transaction($data);
            $metadata = ['transaction_id' => $insert_id];
            $checkout_payment = \Stripe\Checkout\Session::create([
                'payment_method_types' => ['card'],
                'line_items' => [[
                    'price_data' => [
                        'currency' => $this->stripe_currency,
                        'unit_amount' => $amount,
                        'product_data' => [
                            'name' => $package_name,
                        ],
                    ],
                    'quantity' => 1,
                ]],
                'customer' => $stripid,
                'client_reference_id' => $client_id,
                'mode' => 'payment',
                'success_url' => base_url() . '/partner/stripe_success',
                'cancel_url' => base_url() . '/partner/cancel',
                'payment_intent_data' => [
                    'metadata' => $metadata
                ],
            ]);
            $payment_id = $checkout_payment['payment_intent'];
            $this->session->remove('payment_intent');
            $this->session->set('payment_intent', $payment_id);
            add_subscription($package_id, $this->userId, $insert_id);
            return $checkout_payment['url'];
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - generatePaymentLink()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    public function success()
    {
        $settings = get_settings('general_settings', true);
        $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
        setPageInfo($this->data, 'Payment Success | Provider Panel', 'payment-success');
        $this->data['keywords'] = 'Payment Success, ';
        $this->data['description'] = 'Payment Success | ';
        $this->data['meta_description'] = '';
        header('Refresh: 2; URL=' . base_url() . '/partner/subscription');
        return view('backend/partner/template', $this->data);
    }
    public function cancel()
    {
        $settings = get_settings('general_settings', true);
        $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
        setPageInfo($this->data, 'Payment Cancel | Provider Panel', 'payment-cancel');
        $this->data['keywords'] = 'Payment Cancel, ';
        $this->data['description'] = 'Payment Cancel | ';
        $this->data['meta_description'] = '';
        return view('backend/partner/template', $this->data);
    }
    public function subscription_history()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
        setPageInfo($this->data, 'Subscription History | Provider Panel', 'subscription_history');
        $this->data['keywords'] = 'Subscription History , ';
        $this->data['description'] = 'Subscription History   ';
        $this->data['meta_description'] = '';
        return view('backend/partner/template', $this->data);
    }
    public function subscription_history_list()
    {
        $limit = (isset($_GET['limit']) && !empty($_GET['limit'])) ? $_GET['limit'] : 10;
        $offset = (isset($_GET['offset']) && !empty($_GET['offset'])) ? $_GET['offset'] : 0;
        $sort = (isset($_GET['sort']) && !empty($_GET['sort'])) ? $_GET['sort'] : 'id';
        $order = (isset($_GET['order']) && !empty($_GET['order'])) ? $_GET['order'] : 'ASC';
        $search = (isset($_GET['search']) && !empty($_GET['search'])) ? $_GET['search'] : '';
        $where['ps.partner_id'] = $this->userId;
        print_r(json_encode($this->subscription->list(false, $search, $limit, $offset, $sort, $order, $where)));
    }
    public function razorpay_payment()
    {
        try {
            $subscription_details = fetch_details('subscriptions', ['status' => 1, 'publish' => 1]);
            $this->data['subscription_details'] = $subscription_details;
            $user = $this->ionAuth->user()->row();
            $db      = \Config\Database::connect();
            $builder = $db->table('partner_subscriptions ps');
            $active_subscription_details = fetch_details('partner_subscriptions', ['partner_id' => $user->id, 'status' => 'active']);
            $this->data['active_subscription_details'] = $active_subscription_details;
            $razorpay = new Razorpay;
            $credentials = $razorpay->get_credentials();
            $key_id = $credentials['key'];
            $secret = $credentials['secret'];
            $api = new Api($key_id, $secret);
            $order = $api->order->create([
                'receipt' => 'order_receipt_01',
                'amount' => 500,
                'currency' => "INR",
            ]);
            $data = get_settings('general_settings', true);
            $partner = fetch_details('partner_details', ['partner_id' => $this->userId])[0];
            $symbol =   get_currency();
            $this->data['currency'] = $symbol;
            setPageInfo($this->data, 'Subscription | Provider Panel', 'subscription');
            $this->data['partner'] = $partner;
            $this->data['order'] = $order;
            $this->data['data'] = $data;
            $this->data['key_id'] = $key_id;
            $this->data['secret'] = $secret;
            return view('backend/partner/template', $this->data);
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - razorpay_payment()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
    public function settlement_cashcollection_history()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        $this->data['company'] = (isset($settings['company_title']) && $settings['company_title'] != "") ? $settings['company_title'] : "eDemand Services";
        setPageInfo($this->data, 'Booking payment management | Provider Panel', 'settlement_cashcollection_history');
        $this->data['keywords'] = 'Booking payment management , ';
        $this->data['description'] = 'Booking payment management   ';
        $this->data['meta_description'] = '';
        $partner_data = $this->db->table('users u')
            ->select('u.id,u.username,pd.company_name')
            ->join('partner_details pd', 'pd.partner_id = u.id')
            ->where('u.id',   $this->userId)
            ->get()->getResultArray();
        $this->data['partner'] = $partner_data;
        return view('backend/partner/template', $this->data);
    }
    public function settlement_cashcollection_history_list()
    {
        if (!exists(['partner_id' => $this->userId, 'is_approved' => 1], 'partner_details')) {
            return redirect('partner/profile');
        }
        try {
            helper('function');
            $uri = service('uri');
            $partner_id = $this->userId;
            $Settlement_CashCollection_history_model = new Settlement_CashCollection_history_model();
            $limit = (isset($_GET['limit']) && !empty($_GET['limit'])) ? $_GET['limit'] : 10;
            $offset = (isset($_GET['offset']) && !empty($_GET['offset'])) ? $_GET['offset'] : 0;
            $sort = (isset($_GET['sort']) && !empty($_GET['sort'])) ? $_GET['sort'] : 'id';
            $order = (isset($_GET['order']) && !empty($_GET['order'])) ? $_GET['order'] : 'DESC';
            $search = (isset($_GET['search']) && !empty($_GET['search'])) ? $_GET['search'] : '';
            $where = ['sc.provider_id' => $partner_id];
            $data = $Settlement_CashCollection_history_model->list($where, 'no', false, $limit, $offset, $sort, $order, $search);
            return $data;
        } catch (\Exception $th) {
            $response['error'] = true;
            $response['message'] = 'Something went wrong';
            return $this->response->setJSON($response);
        }
    }
    public function save_web_token()
    {
        try {
            $user = fetch_details('users', ['id' => $this->userId], ['id', 'panel_fcm_id']);
            $token = $this->request->getPost('token');
            update_details(['panel_fcm_id' => $token,], ['id' => $user[0]['id']], 'users');
            print_r(json_encode("token saved"));
        } catch (\Throwable $th) {
            log_the_responce($th, date("Y-m-d H:i:s") . '--> app/Controllers/partner/Partner.php - save_web_token()');
            return ErrorResponse("Something Went Wrong", true, [], [], 200, csrf_token(), csrf_hash());
        }
    }
}