Your IP : 216.73.216.93


Current Path : /home/users/unlimited/www/eshop.codeskitter.site/application/controllers/
Upload File :
Current File : /home/users/unlimited/www/eshop.codeskitter.site/application/controllers/Payment.php

    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');

    class Payment extends CI_Controller
    {

        public function __construct()
        {
            parent::__construct();
            $this->load->database();
            $this->load->library(['Paypal_lib', 'paytm', 'my_fatoorah', 'phonepe']);
            $this->load->model(['cart_model', 'address_model', 'order_model', 'transaction_model']);
            $this->data['is_logged_in'] = ($this->ion_auth->logged_in()) ? 1 : 0;
            $this->data['user'] = ($this->ion_auth->logged_in()) ? $this->ion_auth->user()->row() : array();
            $this->response['csrfName'] = $this->security->get_csrf_token_name();
            $this->response['csrfHash'] = $this->security->get_csrf_hash();
            $this->data['settings'] = get_settings('system_settings', true);
            $this->data['web_settings'] = get_settings('web_settings', true);
            $this->data['auth_settings'] = get_settings('authentication_settings', true);
            $this->data['web_logo'] = get_settings('web_logo');
        }
        public function paystack_callback(){

            if (!isset($_GET['reference'])){
                redirect(base_url("payment/cancel"));
                return false;
            }
            $this->load->library(['paystack']);
            try {
                print_r("<pre>");
                $response = $this->paystack->verify_transaction($_GET["reference"]);
                $response = json_decode($response, true);
                if(!$response["status"]){
                    redirect(base_url("payment/cancel"));
                    return false;
                }
                if($response["data"]["status"] != "success"){
                    redirect(base_url("payment/cancel"));
                    return false;

                }
                $orderId = $response["data"]["metadata"]["order_id"];
                $amount = $response["data"]["amount"];
                $order = fetch_details("orders", ["id" => $orderId]);
                if (count($order) == 0){
                    redirect(base_url("payment/cancel"));
                    return false;
                }
                $order = $order[0];
                $user_id = $order["user_id"];
                $data = [
                    'transaction_type' => 'transaction',
                    'user_id' => $user_id,
                    'order_id' => $orderId,
                    'type' => 'razorpay',
                    'txn_id' => $_GET["reference"],
                    'amount' => $amount,
                    'status' => 'success',
                    'message' => 'order placed successfully',
                ];
                $this->transaction_model->add_transaction($data);

                update_details(['active_status' => 'received'], ['order_id' => $orderId], 'order_items');
                $status = json_encode(array(array('received', date("d-m-Y h:i:sa"))));
                update_details(['status' => $status], ['order_id' => $orderId], 'order_items', false);
                return redirect(base_url("payment/success?order_id=$orderId"));

            }catch (Exception $e){
                redirect(base_url("payment/cancel"));
            }
        }

        public function paypal()
        {
            $this->form_validation->set_rules('order_id', 'Order', 'trim|required|xss_clean|numeric');
            if (!$this->form_validation->run()) {
                $this->response['error'] = true;
                $this->response['message'] = validation_errors();
                $this->response['data'] = array();
                print_r(json_encode($this->response));
                return false;
            }
            $user_id = $this->data['user']->id;
            $order_id = $this->input->post('order_id', true);

            $order = $this->db->where('id', $order_id)->get('orders')->row_array();
            if (empty($order)) {
                $this->response['error'] = true;
                $this->response['message'] = "No Order Found.";
                $this->response['data'] = array();
                print_r(json_encode($this->response));
                return false;
            }
            // Set variables for paypal form
            $returnURL = base_url() . 'payment/success';
            $cancelURL = base_url() . 'payment/delete_order/' . $order_id;
            $notifyURL = base_url() . 'app/v1/api/ipn';
            $txn_id = time() . "-" . rand();

            $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', $this->data['user']->id . '|' . $this->data['user']->email);
            $this->paypal_lib->add_field('item_number', $order['id']);
            $this->paypal_lib->add_field('amount', $order['total_payable']);
            // Render paypal form
            $this->paypal_lib->paypal_auto_form();
        }
        public function delete_order()
        {
            if (!$this->ion_auth->logged_in()) {
                redirect(base_url());
            }

            if ($_SERVER['HTTP_REFERER'] == 'https://www.sandbox.paypal.com/' || $_SERVER['HTTP_REFERER'] == 'https://www.paypal.com/') {
                $order_id = $this->uri->segment(3);
                $order_item = fetch_details('order_items', ['order_id' => $order_id], 'user_id,product_variant_id,quantity');
                foreach ($order_item as $row) {
                    $cart_data = [
                        'user_id' => $row['user_id'],
                        'product_variant_id' => $row['product_variant_id'],
                        'qty' => $row['quantity'],
                        'is_saved_for_later' => 0,
                    ];
                    $this->db->insert('cart', $cart_data);
                }
                $order = fetch_orders($order_id, false, false, false, false, false, false, false);

                $user_id = $order['order_data'][0]['user_id'];
                $returnable_amount = $order['order_data'][0]['final_total'];

                update_wallet_balance('credit', $user_id, $returnable_amount, 'Wallet Amount Credited for Order ID  : ' . $order_id);
                if ($order['order_data'][0]['order_items'][0]['status'][0][0] == 'awaiting') {
                    update_stock($order['order_data'][0]['order_items'][0]['product_variant_id'], $order['order_data'][0]['order_items'][0]['quantity'], 'plus');
                }
                delete_details(['id' => $order_id], 'orders');
                delete_details(['order_id' => $order_id], 'order_items');
                redirect('payment/cancel');
            }
        }
        public function paytm()
        {

            if ($this->ion_auth->logged_in()) {
                $this->form_validation->set_rules('mobile', 'Mobile', 'trim|required|numeric|xss_clean');
                $this->form_validation->set_rules('promo_code', 'Promo Code', 'trim|xss_clean');
                $this->form_validation->set_rules('latitude', 'Latitude', 'trim|numeric|xss_clean');
                $this->form_validation->set_rules('longitude', 'Longitude', 'trim|numeric|xss_clean');
                $this->form_validation->set_rules('deliver_date', 'Delivery Date', 'trim|xss_clean');
                $this->form_validation->set_rules('deliver_time', 'Delivery time', 'trim|xss_clean');
                $this->form_validation->set_rules('address_id', 'Address id', 'trim|required|numeric|xss_clean', array('required' => 'Please choose address'));
                $this->form_validation->set_rules('wallet_used', 'Wallet used', 'trim|xss_clean');
                if (!$this->form_validation->run()) {
                    $this->response['error'] = true;
                    $this->response['message'] = strip_tags(validation_errors());
                    $this->response['data'] = array();
                    print_r(json_encode($this->response));
                    return;
                }
                $settings = get_settings('system_settings', true);
                $app_name = isset($settings['app_name']) && !empty($settings['app_name']) ? $settings['app_name'] : 'eShop - ecommerce';
                $app_name = str_replace(" ", "", $settings['app_name']);
                $order_id = $app_name . "-" . time() . rand(1000, 9999);
                $credentials = $this->paytm->get_credentials();
                $mid =  $credentials['paytm_merchant_id'];
                $cart = get_cart_total($this->data['user']->id, false, '0', $_POST['address_id']);
                $promo_discount = 0;
                if (isset($_POST['promo_code']) && !empty($_POST['promo_code'])) {
                    $validate = validate_promo_code($_POST['promo_code'], $this->data['user']->id, $cart['total_arr']);
                    if ($validate['error'] == false) {
                        $promo_discount = $validate['data'][0]['final_discount'];
                    } else {
                        $this->session->set_flashdata('message', $validate['message']);
                        $this->session->set_flashdata('message_type', 'error');
                        redirect(base_url('cart/checkout'), 'refresh');
                    }
                }
                $wallet_amount = 0;
                if (isset($_POST['wallet_used']) && $_POST['wallet_used'] == 1) {
                    $wallet_balance = fetch_details('users', 'id=' . $this->data['user']->id, 'balance');
                    $wallet_balance = $wallet_balance[0]['balance'];
                    $final_total = $cart['overall_amount'];
                    if ($wallet_balance > 0) {
                        if ($wallet_balance >= $final_total) {
                            $wallet_amount = $final_total;
                        } else {
                            $wallet_amount = $wallet_balance;
                        }
                    } else {
                        $this->session->set_flashdata('message', 'Insufficient balance');
                        $this->session->set_flashdata('message_type', 'error');
                        redirect(base_url('cart/checkout'), 'refresh');
                    }
                }
                $overall_amount = $cart['overall_amount'] - $wallet_amount - $promo_discount;
                $overall_amount = number_format($overall_amount, 2, '.', '');

                $paramList = array();
                $paramList["MID"] = $mid;
                $paramList["ORDER_ID"] = $order_id;
                $paramList["CUST_ID"] = $this->data['user']->id;
                $paramList["INDUSTRY_TYPE_ID"] = $credentials['paytm_industry_type_id'];
                $paramList["CHANNEL_ID"] = "WEB";
                $paramList["TXN_AMOUNT"] = $overall_amount;
                $paramList["WEBSITE"] = $credentials['paytm_website'];
                $paramList["CALLBACK_URL"] = base_url("payment/paytm-response");
                $paramList["MERC_UNQ_REF"] = $_POST['address_id'] . '|' . $_POST['wallet_used'] . '|' . $_POST['promo_code'] . '|' . $_POST['latitude'] . '|' . $_POST['longitude'] . '|' . $_POST['deliver_date'] . '|' . $_POST['deliver_time'] . '|' . $_POST['mobile'];


                $checksum = $this->paytm->generateSignature($paramList, $credentials['paytm_merchant_key']);

                $form_html = "<body>
            <table align='center' cellspacing='4'>
                <tr>
                    <td align='center'><STRONG>Transaction is being processed,</STRONG></td>
                </tr>
                <tr>
                    <td align='center'>
                        <font color='blue'>Please wait ...</font>
                    </td>
                </tr>
                <tr>
                    <td align='center'>(Please do not press 'Refresh' or 'Back' button)</td>
                </tr>
                <tr>
                    <td align='center'><img src=" . base_url('assets/old-pre-loader.gif') . " alt='Please wait.. Loading' title='Please wait.. Loading..' width='140px' /></td>
                </tr>
                <tr>
                    <td align='center'><a href='#' style='padding: 8px 12px;background-color: #008CBA;color:white;text-decoration:none;' onclick='document.forms[\"payment_form\"].submit();'>Click here if you are not automatically redirected..</a></td>
                </tr>
                
            </table>
            <FORM NAME='payment_form' ACTION='https://securegw-stage.paytm.in/theia/processTransaction' METHOD='POST'>
                <input type='hidden' name='MID' value='" . $credentials['paytm_merchant_id'] . "'>
                <input type='hidden' name='WEBSITE' value='" . $credentials['paytm_website'] . "'>
                <input type='hidden' name='ORDER_ID' value='" . $order_id . "'>
                <input type='hidden' name='CUST_ID' value='" . $this->data['user']->id . "'>
                <input type='hidden' name='INDUSTRY_TYPE_ID' value='" . $credentials['paytm_industry_type_id'] . "'>
                <input type='hidden' name='CHANNEL_ID' value='WEB'>
                <input type='hidden' name='TXN_AMOUNT' value='" . $overall_amount . "'>
                <input type='hidden' name='CALLBACK_URL' value='" . $paramList['CALLBACK_URL'] . "'>
                <input type='hidden' name='CHECKSUMHASH' value='" . $checksum . "'>
                <input type='hidden' name='MERC_UNQ_REF' value='" . $_POST['address_id'] . '|' . $_POST['wallet_used'] . '|' . $_POST['promo_code'] . '|' . $_POST['latitude'] . '|' . $_POST['longitude'] . '|' . $_POST['deliver_date'] . '|' . $_POST['deliver_time'] . '|' . $_POST['mobile'] . "'>
            </FORM>
        </body>
        <script type='text/javascript'>
            document.forms[0].submit();
        </script>";
                echo $form_html;
            } else {
                redirect(base_url(), 'refresh');
            }
        }

        public function phonepe()
        {
            if ($this->ion_auth->logged_in()) {
                if ($_POST['type'] == 'wallet') {
                    $overall_amount = $_POST['amount'];
                    $amount = $overall_amount;
                    $user_id = $this->data['user']->id;
                    $settings = get_settings('system_settings', true);
                    $order_id = $_POST['order_id'];
                    $transation_id = $_POST['order_id'];
                    $mobile = $this->data['user']->mobile;
                    $data = array(
                        'merchantTransactionId' => $transation_id,
                        'merchantUserId' => $user_id,
                        'amount' => $amount * 100,
                        'redirectUrl' => base_url("payment/phonepe_response"),
                        'redirectMode' => 'POST',
                        'callbackUrl' => base_url("admin/webhook/phonepe_webhook"),
                        'mobileNumber' => $mobile,
                    );
                    $res = $this->phonepe->pay($data);
                    $this->response['error'] = false;
                    $this->response['message'] = 'trasaction initiated successfully';
                    $this->response['data'] = $res;
                    $this->response['data']['order_id'] = $order_id;
                    print_r(json_encode($this->response));
                    return;
                } else {
                    $_POST['user_id'] = $this->data['user']->id;
                    $cart = get_cart_total($this->data['user']->id, false, '0', $_POST['address_id']);
                    $wallet_balance = fetch_details('users', 'id=' . $this->data['user']->id, 'balance');
                    $wallet_balance = $wallet_balance[0]['balance'];
                    $overall_amount = $cart['overall_amount'];
                    $mobile = $cart['mobile'];
                    if ($_POST['wallet_used'] == 1 && $wallet_balance > 0) {
                        $overall_amount = $overall_amount - $wallet_balance;
                    }
                    if (!empty($_POST['promo_code'])) {
                        $validate = validate_promo_code($_POST['promo_code'], $this->data['user']->id, $cart['total_arr']);
                        if ($validate['error']) {
                            $this->response['error'] = true;
                            $this->response['message'] = $validate['message'];
                            print_r(json_encode($this->response));
                            return false;
                        } else {
                            $overall_amount = $overall_amount - $validate['data'][0]['final_discount'];
                        }
                    }
                    $amount = intval($overall_amount);
                    $user_id = $this->data['user']->id;
                    $transation_id = time() . "" . rand("100", "999");
                    $data = array(
                        'merchantTransactionId' => $transation_id,
                        'merchantUserId' => $user_id,
                        'amount' => $amount * 100,
                        'redirectUrl' => base_url("payment/phonepe_response"),
                        'redirectMode' => 'POST',
                        'callbackUrl' => base_url("admin/webhook/phonepe_webhook"),
                        'mobileNumber' => $mobile,
                    );

                    $res = $this->phonepe->pay($data);

                    $this->response['error'] = false;
                    $this->response['data'] = $res;
                    $this->response['transaction_id'] = $transation_id;
                    $this->response['message'] = $res['message'];
                    $this->response['url'] = ($res['data']['instrumentResponse']['redirectInfo']['url']) ? $res['data']['instrumentResponse']['redirectInfo']['url'] : " ";

                    print_r(json_encode($this->response));
                    return;
                }
            } else {
                $this->response['error'] = true;
                $this->response['message'] = "Unauthorised access is not allowed.";
                print_r(json_encode($this->response));
                return false;
            }
        }

        public function phonepe_response()
        {
            $paramList = array();
            $paramList = $_POST;
            if (isset($_POST['transactionId']) && !empty($_POST['transactionId'])) {
                $transation_id = $_POST['transactionId'];
                $transaction = fetch_details("transactions", ["txn_id" => $transation_id]);
            }
            $user_id = (isset($transaction[0]['user_id'])) ? $transaction[0]['user_id'] : "";
            $user_details = fetch_details('users', ['id' => $user_id]);
            session_start();

            $_SESSION["mobile"] = (isset($user_details[0]['mobile'])) ? $user_details[0]['mobile'] : "";
            $_SESSION["identity"] = (isset($user_details[0]['mobile'])) ? $user_details[0]['mobile'] : "";
            $_SESSION["user_id"] = (isset($user_details[0]['id'])) ? $user_details[0]['id'] : "";
            $_SESSION["email"] = (isset($user_details[0]['email'])) ? $user_details[0]['email'] : "";
            $_SESSION["ion_auth_session_hash"] = "6583d6c4f205998ecacc9f51b68a2a2e44ea0006";
            $transaction_type = (isset($transaction[0]['transaction_type'])) ? $transaction[0]['transaction_type'] : "";

            $order_id = (isset($transaction[0]['order_id'])) ? $transaction[0]['order_id'] : "";

            $response = $this->phonepe->check_status($_POST['transactionId']);
            $status = $paramList["code"];
            if (!empty($transation_id)) {
                $transaction = fetch_details('transactions', ['txn_id' => $transation_id], '*');
                $amount = $_POST['amount'] / 100;
            } else {
                $amount = 0;
            }
            if ($this->ion_auth->logged_in()) {
                if ($response) {
                    if ($transaction_type == "wallet") {
                        if ($status == 'PAYMENT_SUCCESS') {
                            redirect(base_url("payment/wallet_success"));
                            return false;
                        } elseif ($status == "BAD_REQUEST"  || $status == "AUTHORIZATION_FAILED" || $status == "PAYMENT_ERROR" || $status == "TRANSACTION_NOT_FOUND" || $status == "PAYMENT_DECLINED" || $status == "TIMED_OUT") {
                          
                            redirect(base_url("payment/cancel"));
                        } else {
                            $this->phonepe->check_status($transation_id);
                            redirect(base_url("payment/wallet_success"));
                        }
                    }
                    if (isset($order_id) && !empty($order_id)) {
                        if ($status == "PAYMENT_SUCCESS") {
                            redirect(base_url('payment/success'), 'refresh');
                        } elseif ($status == "BAD_REQUEST"  || $status == "AUTHORIZATION_FAILED" || $status == "PAYMENT_ERROR" || $status == "TRANSACTION_NOT_FOUND" || $status == "PAYMENT_DECLINED" || $status == "TIMED_OUT") {
                            
                            redirect(base_url('payment/cancel'), 'refresh');
                        } else {
                            redirect(base_url('payment/success'), 'refresh');
                        }
                    } else {
                        redirect(base_url(), 'refresh');
                    }
                } else {
                    $this->session->set_flashdata('message', 'Order already exists with this transaction ID');
                    $this->session->set_flashdata('message_type', 'error');
                    redirect(base_url(), 'refresh');
                }
            } else {
                redirect(base_url(), 'refresh');
            }
        }

        public function initiate_paytm_transaction()
        {
            if ($this->data['is_logged_in']) {
                $_POST['user_id'] = $this->data['user']->id;
                $cart = get_cart_total($this->data['user']->id, false, '0', $_POST['address_id']);
                $wallet_balance = fetch_details('users', 'id=' . $this->data['user']->id, 'balance');
                $wallet_balance = $wallet_balance[0]['balance'];
                $overall_amount = $cart['overall_amount'];
                if ($_POST['wallet_used'] == 1 && $wallet_balance > 0) {
                    $overall_amount = $overall_amount - $wallet_balance;
                }
                if (!empty($_POST['promo_code'])) {
                    $validate = validate_promo_code($_POST['promo_code'], $this->data['user']->id, $cart['total_arr']);
                    if ($validate['error']) {
                        $this->response['error'] = true;
                        $this->response['message'] = $validate['message'];
                        print_r(json_encode($this->response));
                        return false;
                    } else {
                        $overall_amount = $overall_amount - $validate['data'][0]['final_discount'];
                    }
                }
                $amount = $overall_amount;
                $user_id = $this->data['user']->id;
                $settings = get_settings('system_settings', true);
                $app_name = isset($settings['app_name']) && !empty($settings['app_name']) ? $settings['app_name'] : 'eShop - ecommerce';
                $app_name = str_replace(" ", "", $settings['app_name']);
                $order_id = $app_name . "-" . time() . rand(1000, 9999);
                $paytmParams = array();

                $paytmParams["body"] = array(
                    "requestType"   => "Payment",
                    "websiteName"   => "WEBSTAGING",
                    "orderId"       => $order_id,
                    "txnAmount"     => array(
                        "value"     => $amount,
                        "currency"  => "INR",
                    ),
                    "callbackUrl"   => base_url('payment/paytm_response'),
                    "userInfo"      => array(
                        "custId"    => $user_id,
                    ),
                );
                $res = $this->paytm->initiate_transaction($paytmParams);
                $this->response['error'] = false;
                $this->response['message'] = 'trasaction initiated successfully';
                $this->response['data'] = $res;
                $this->response['data']['order_id'] = $order_id;
                print_r(json_encode($this->response));
                return;
            } else {
                $this->response['error'] = true;
                $this->response['message'] = "Unauthorised access is not allowed.";
                print_r(json_encode($this->response));
                return false;
            }
        }
        public function paytm_response()
        {

            if ($this->ion_auth->logged_in()) {
                $credentials = $this->paytm->get_credentials();
                $paytmChecksum = "";
                $paramList = array();
                $isValidChecksum = "FALSE";

                $paramList = $_POST;

                $paytmChecksum = isset($paramList["CHECKSUMHASH"]) ? $paramList["CHECKSUMHASH"] : ""; //Sent by Paytm pg
                $isValidChecksum = $this->paytm->verifySignature($paramList, $credentials['paytm_merchant_key'], $paytmChecksum); //will return TRUE or FALSE string.
                if ($isValidChecksum == "TRUE") {
                    $response = verify_payment_transaction($paramList['ORDERID'], 'paytm');
                    $txn = fetch_details('transactions', ['txn_id' => $response['data']['body']['orderId']], 'COUNT(id) as total');
                    $total_txn = $txn[0]['total'];
                    if ($total_txn == 0) {
                        $status = $response['data']['body']['resultInfo']['resultStatus'];
                        $custom_data = $response['data']['body']['merchantUniqueReference'];
                        $custom_data = explode("|", $custom_data);
                        $address_id = $custom_data[0];
                        $wallet_used = $custom_data[1];
                        $promo_code = $custom_data[2];
                        $latitude = $custom_data[3];
                        $longitude = $custom_data[4];
                        $delivery_date = $custom_data[5];
                        $delivery_time = $custom_data[6];
                        $mobile = $custom_data[7];
                        if ($status == "TXN_SUCCESS" || $status == "PENDING") {
                            $cart = get_cart_total($this->data['user']->id, false, '0', $address_id);

                            $_POST['delivery_charge'] = get_delivery_charge($address_id, $cart['total_arr'],$this->data['user']->id);
                            $_POST['address_id'] = $address_id;
                            $_POST['latitude'] = $latitude;
                            $_POST['longitude'] = $longitude;
                            $_POST['delivery_date'] = $delivery_date;
                            $_POST['delivery_time'] = $delivery_time;
                            $_POST['delivery_charge'] = str_replace(',', '', $_POST['delivery_charge']);
                            $_POST['is_delivery_charge_returnable'] = intval($_POST['delivery_charge']) != 0 ? 1 : 0;
                            $quantity = implode(',', array_column($cart, 'qty'));
                            $_POST['product_variant_id'] = implode(',', array_column($cart, 'id'));
                            $_POST['quantity'] = $quantity;
                            $_POST['user_id'] = $this->data['user']->id;
                            $_POST['promo_code'] = $promo_code ? $promo_code : '';
                            $final_total = $cart['overall_amount'];
                            $wallet_balance = fetch_details('users', 'id=' . $_POST['user_id'], 'balance');
                            $_POST['mobile'] = $mobile;
                            $wallet_balance = $wallet_balance[0]['balance'];
                            $_POST['wallet_balance_used'] = 0;
                            $_POST['payment_method'] = 'Paytm';
                            if ($wallet_used == 1) {
                                $_POST['is_wallet_used'] = 1;
                                if ($wallet_balance >= $final_total) {
                                    $_POST['wallet_balance_used'] = $final_total;
                                    $_POST['payment_method'] = 'wallet';
                                } else {
                                    $_POST['wallet_balance_used'] = $wallet_balance;
                                }
                            }

                            $promo_discount = 0;
                            if (isset($_POST['promo_code']) && !empty($_POST['promo_code'])) {
                                $validate = validate_promo_code($_POST['promo_code'], $this->data['user']->id, $cart['total_arr']);
                                if ($validate['error'] == false) {
                                    $promo_discount = $validate['data'][0]['final_discount'];
                                    $_POST['promo_discount'] = $validate['data'][0]['final_discount'];
                                }
                            }
                            $_POST['final_total'] = $cart['overall_amount'] - $_POST['wallet_balance_used'] - $promo_discount;

                            $_POST['active_status'] = $status == "TXN_SUCCESS" ? 'received' : 'awaiting';
                            $data['status'] = $status == "TXN_SUCCESS" ? 'Success' : 'Pending';
                            $data['txn_id'] = $response['data']['body']['orderId'];
                            $data['message'] = 'Order placed Successfully';
                            $res = $this->order_model->place_order($_POST);
                            $data['order_id'] = $res['order_id'];
                            $data['user_id'] = $this->data['user']->id;
                            $data['type'] = 'Paytm';
                            $data['amount'] = $response['data']['body']['txnAmount'];
                            if ($res['error'] == false) {
                                $this->transaction_model->add_transaction($data);
                            }
                            redirect(base_url('payment/success'), 'refresh');
                        } else {
                            redirect(base_url('payment/cancel'), 'refresh');
                        }
                    } else {
                        redirect(base_url('payment/success'), 'refresh');
                    }
                } else {
                    $this->session->set_flashdata('message', 'Order already exists with this transaction ID');
                    $this->session->set_flashdata('message_type', 'error');
                    redirect(base_url(), 'refresh');
                }
            } else {
                redirect(base_url(), 'refresh');
            }
        }

        public function process_myfatoorah()
        {
            /**
             * step 1 : validate transaction
             * step 2: if successful - place order
             * step 3: add transaction
             * step 4: if failed
             * step 5: just add transaction and don't place order
             * step 6: redirect based on the status to payment/success or payment/cancel
             */



            $payment_id = (isset($_GET['paymentId']) && !empty($_GET['paymentId'])) ? trim($_GET['paymentId']) : "";

            if (empty($payment_id)) {
                redirect(base_url("payment/cancel"));
                return;
            }
            $status = $this->my_fatoorah->getPaymentStatus($payment_id);

            $invoice_status = (isset($status->Data->InvoiceStatus) && !empty($status->Data->InvoiceStatus)) ? $status->Data->InvoiceStatus : "";

            if ($invoice_status != 'Canceled') {
                update_details(['active_status' => 'received'], ['order_id' => $status->Data->UserDefinedField], 'order_items');
                $order_status = json_encode(array(array('received', date("d-m-Y h:i:sa"))));
                update_details(['status' => $order_status], ['order_id' => $status->Data->UserDefinedField], 'order_items', false);

                update_details(['payu_txn_id' => $payment_id], ['order_id' => $status->Data->UserDefinedField], 'transactions');
                redirect(base_url("payment/wallet_success"));
                return;
            } else {
                redirect(base_url("payment/cancel"));
            }
        }

        public function success()
        {


            $this->data['main_page'] = 'payment-success';
            $this->data['title'] = 'Payment Success | ' . $this->data['web_settings']['site_title'];
            $this->data['keywords'] = 'Payment Success, ' . $this->data['web_settings']['meta_keywords'];
            $this->data['description'] = 'Payment Success | ' . $this->data['web_settings']['meta_description'];
            $this->data['meta_description'] = '';
            $this->load->view('front-end/' . THEME . '/template', $this->data);
        }

        public function cancel()
        {

            $this->data['main_page'] = 'payment-cancel';
            $this->data['title'] = 'Payment Cancel | ' . $this->data['web_settings']['site_title'];
            $this->data['keywords'] = 'Payment Cancel, ' . $this->data['web_settings']['meta_keywords'];
            $this->data['description'] = 'Payment Cancel | ' . $this->data['web_settings']['meta_description'];
            $this->data['meta_description'] = '';
            $this->load->view('front-end/' . THEME . '/template', $this->data);
        }



        function app_payment_status()
        {


            $paypalInfo = $this->input->get();


            if (!empty($paypalInfo) && isset($_GET['st']) && strtolower($_GET['st']) == "completed") {
                $response['error'] = false;
                $response['message'] = "Pagesa është kryer me sukses.";
                $response['data'] = $paypalInfo;
            } elseif (!empty($paypalInfo) && isset($_GET['st']) && strtolower($_GET['st']) == "authorized") {
                $response['error'] = false;
                $response['message'] = "Your payment has been Authorized successfully. We will capture your transaction within 30 minutes, once we process your order. After successful capture Ads wil be credited automatically.";
                $response['data'] = $paypalInfo;
            } else {
                $response['error'] = true;
                $response['message'] = "Pagesa është refuzuar. ";
                $response['data'] = (isset($_GET)) ? $this->input->get() : "";
            }
            print_r(json_encode($response));
        }
        /* Capture all the authorized transactions
            We are using another library and API for this operation
            
        */
        function do_capture()
        {
            // Load PayPal library
            $this->config->load('paypal_lib');


            $config = array(
                'Sandbox' => $this->config->item('Sandbox'),             // Sandbox / testing mode option.
                'APIUsername' => $this->config->item('APIUsername'),     // PayPal API username of the API caller
                'APIPassword' => $this->config->item('APIPassword'),     // PayPal API password of the API caller
                'APISignature' => $this->config->item('APISignature'),     // PayPal API signature of the API caller
                'APISubject' => '',                                     // PayPal API subject (email address of 3rd party user that has granted API permission for your app)
                'APIVersion' => $this->config->item('APIVersion')        // API version you'd like to use for your call.  You can set a default version in the class and leave this blank if you want.
            );

            // Show Errors
            if ($config['Sandbox']) {
                error_reporting(E_ALL);
                ini_set('display_errors', '1');
            }

            $this->load->library('Paypal_pro', $config);

            $where = " `payment_type` = 'paypal' and (status = 'Pending' or status = 'pending') ";
            $q = $this->db->get_where('transaction', $where);
            $paypal_txns = $q->result_array();

            foreach ($paypal_txns as $transaction) {
                $DCFields = array(
                    'authorizationid' => $transaction['transaction_id'],                 // Required. The authorization identification number of the payment you want to capture. This is the transaction ID returned from DoExpressCheckoutPayment or DoDirectPayment.
                    'amt' => $transaction['amount'] . '.00',                             // Required. Must have two decimal places.  Decimal separator must be a period (.) and optional thousands separator must be a comma (,)
                    'completetype' => 'Complete',                     // Required.  The value Complete indiciates that this is the last capture you intend to make.  The value NotComplete indicates that you intend to make additional captures.
                    'currencycode' => 'USD',                     // Three-character currency code
                    'invnum' => 'NonVoIP#' . $transaction['id'],                         // Your invoice number
                    'note' => 'Transaction captured by nonVoIP system',       // Informational note about this setlement that is displayed to the buyer in an email and in his transaction history.  255 character max.
                    'softdescriptor' => 'Transaction captured by nonVoIP system',                 // Per transaction description of the payment that is passed to the customer's credit card statement.
                    'storeid' => '',                         // ID of the merchant store.  This field is required for point-of-sale transactions.  Max: 50 char
                    'terminalid' => ''                        // ID of the terminal.  50 char max.  
                );

                $PayPalRequestData = array('DCFields' => $DCFields);
                $PayPalResult = $this->paypal_pro->DoCapture($PayPalRequestData);

                if (!$this->paypal_pro->APICallSuccessful($PayPalResult['ACK'])) {
                    /* some error occured please display the approriate message */
                } else {
                    /* Successful call.  Load view or whatever you need to do here. */
                }
            }
        }

        public function wallet_success()
        {
            if (!$this->ion_auth->logged_in()) {
                redirect(base_url());
            }

            $this->data['main_page'] = 'payment-wallet-success';
            $this->data['title'] = 'Payment Success | ' . $this->data['web_settings']['site_title'];
            $this->data['keywords'] = 'Payment Success, ' . $this->data['web_settings']['meta_keywords'];
            $this->data['description'] = 'Payment Success | ' . $this->data['web_settings']['meta_description'];
            $this->data['meta_description'] = '';
            $this->load->view('front-end/' . THEME . '/template', $this->data);
        }
    }