/home/edulekha/crm.edulekha.com/application/controllers/gateways/Payu_money.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

/**
 * @property-read Payu_money_gateway $payu_money_gateway
 */
class Payu_money extends App_Controller
{
    public function make_payment()
    {
        check_invoice_restrictions($this->input->get('invoiceid'), $this->input->get('hash'));

        $this->load->model('invoices_model');
        $invoice = $this->invoices_model->get($this->input->get('invoiceid'));

        load_client_language($invoice->clientid);

        $data['invoice'] = $invoice;
        $data['total']   = $this->session->userdata('payu_money_total');
        $data['key']     = $this->payu_money_gateway->getSetting('key');
        $data['attempt_reference']   = $this->session->userdata('attempt_reference') ?? '';
        $data['attempt_fee']   = $this->session->userdata('attempt_fee') ?? 0;
        $data['attempt_amount']   = $this->session->userdata('attempt_amount') ?? 0;

        $posted = [];

        if ($this->input->post()) {
            $data['action_url'] = $this->payu_money_gateway->get_action_url();
            foreach ($this->input->post() as $key => $value) {
                $posted[$key] = $value;
            }
            $data['txnid']       = $posted['txnid'];
            $data['firstname']   = $posted['firstname'];
            $data['lastname']    = $posted['lastname'];
            $data['email']       = $posted['email'];
            $data['phonenumber'] = $posted['phone'];
        } else {
            $data['txnid']      = $this->payu_money_gateway->gen_transaction_id();
            $data['action_url'] = $this->uri->uri_string() . '?invoiceid=' . $invoice->id . '&hash=' . $invoice->hash;

            $data['firstname']   = '';
            $data['lastname']    = '';
            $data['email']       = '';
            $data['phonenumber'] = '';

            if (is_client_logged_in()) {
                $contact = $this->clients_model->get_contact(get_contact_user_id());
            } else {
                if (total_rows(db_prefix() . 'contacts', ['userid' => $invoice->clientid]) == 1) {
                    $contact = $this->clients_model->get_contact(get_primary_contact_user_id($invoice->clientid));
                }
            }

            if (isset($contact) && $contact) {
                $data['firstname']   = $contact->firstname;
                $data['lastname']    = $contact->lastname;
                $data['email']       = $contact->email;
                $data['phonenumber'] = $contact->phonenumber;
            }
        }

        $data['hash'] = '';

        // there is post request
        if (count($posted) > 0) {
            $data['hash'] = $this->payu_money_gateway->get_hash([
                'key'         => $posted['key'],
                'txnid'       => $posted['txnid'],
                'amount'      => $posted['amount'],
                'productinfo' => $posted['productinfo'],
                'firstname'   => $posted['firstname'],
                'email'       => $posted['email'],
                'udf1'        => $data['attempt_reference']
                ]);
        }

        echo $this->get_html($data);
    }

    public function success()
    {
        $invoiceid = $this->input->get('invoiceid');
        $hash      = $this->input->get('hash');

        check_invoice_restrictions($invoiceid, $hash);
        $this->load->model('invoices_model');
        $invoice = $this->invoices_model->get($this->input->get('invoiceid'));
        load_client_language($invoice->clientid);

        $hashInfo = $this->payu_money_gateway->get_valid_hash($_POST);
        if (!$hashInfo) {
            set_alert('warning', _l('invalid_transaction'));
        } else {
            if ($hashInfo['status'] == 'success') {
                if (total_rows('invoicepaymentrecords', ['transactionid' => $hashInfo['txnid']]) === 0) {
                    $success = $this->payu_money_gateway->addPayment([
                    'amount'        => $hashInfo['amount'],
                    'invoiceid'     => $invoiceid,
                    'transactionid' => $hashInfo['txnid'],
                    'paymentmethod' => $hashInfo['transaction_mode'],
                    'payment_attempt_reference' => $hashInfo['attempt_reference'],
                    ]);
                    if ($success) {
                        set_alert('success', _l('online_payment_recorded_success'));
                    } else {
                        set_alert('danger', _l('online_payment_recorded_success_fail_database'));
                    }
                }
            } else {
                if ($this->payu_money_gateway->getSetting('test_mode_enabled') == '1') {
                    log_activity('Payu Money Transaction Not With Status Success: ' . var_export($_POST, true));
                }
                set_alert('warning', 'Thank You. Your transaction status is ' . $hashInfo['status']);
            }
        }
        $this->session->unset_userdata('payu_money_total');
        redirect(site_url('invoice/' . $invoiceid . '/' . $hash));
    }

    public function failure()
    {
        $invoiceid = $this->input->get('invoiceid');
        $hash      = $this->input->get('hash');

        check_invoice_restrictions($invoiceid, $hash);
        $this->load->model('invoices_model');
        $invoice = $this->invoices_model->get($this->input->get('invoiceid'));
        load_client_language($invoice->clientid);

        $hashInfo = $this->payu_money_gateway->get_valid_hash($_POST);

        if (!$hashInfo) {
            set_alert('warning', _l('invalid_transaction'));
        } else {
            if ($hashInfo['unmappedstatus'] != 'userCancelled') {
                set_alert('warning', $hashInfo['error_Message'] . ' - ' . $hashInfo['status']);
            }
        }

        $this->session->unset_userdata('payu_money_total');

        redirect(site_url('invoice/' . $invoiceid . '/' . $hash));
    }

    public function get_html($data)
    {
        ob_start(); ?>
<?php echo payment_gateway_head(_l('payment_for_invoice') . ' ' . format_invoice_number($data['invoice']->id)); ?>

<body onload="submitPayuForm()" class="gateway-payu-money">
    <div class="container">
        <div class="col-md-8 col-md-offset-2 mtop30">
            <div class="mbot30 text-center">
                <?php echo payment_gateway_logo(); ?>
            </div>
            <div class="row">
                <?php echo form_open($data['action_url'], ['novalidate' => true, 'id' => 'payu_money_form']); ?>
                <div class="panel_s">
                    <div class="panel-heading">
                        <h4 class="panel-title">
                            <?php echo _l('payment_for_invoice'); ?> -
                            <?php echo e(_l('payment_total', app_format_money($data['total'], $data['invoice']->currency_name))); ?>
                        </h4>
                        <a
                            href="<?php echo site_url('invoice/' . $data['invoice']->id . '/' . $data['invoice']->hash); ?>">
                            <?php echo e(format_invoice_number($data['invoice']->id)); ?>
                        </a>
                    </div>
                    <div class="panel-body">
                        <?php if ($this->payu_money_gateway->processingFees) { ?>
                            <h4><?php echo _l('payment_attempt_amount') . ": " . e(app_format_money($data['attempt_amount'], $data['invoice']->currency_name)); ?></h4>
                            <h4><?php echo _l('payment_attempt_fee') . ": " . e(app_format_money($data['attempt_fee'], $data['invoice']->currency_name)); ?></h4>
                        <?php } ?>
                        <hr />
                        <input type="hidden" name="key" value="<?php echo $data['key'] ?>" />
                        <input type="hidden" name="hash" value="<?php echo $data['hash'] ?>" />
                        <input type="hidden" name="txnid" value="<?php echo $data['txnid'] ?>" />
                        <input type="hidden" name="amount" value="<?php echo $data['total'] ?>" />
                        <input type="hidden" name="udf1" value="<?php echo $data['attempt_reference'] ?>" />
                        <input type="hidden" name="surl"
                            value="<?php echo site_url('gateways/payu_money/success?invoiceid=' . $data['invoice']->id . '&hash=' . $data['invoice']->hash); ?>" />
                        <input type="hidden" name="furl"
                            value="<?php echo site_url('gateways/payu_money/failure?invoiceid=' . $data['invoice']->id . '&hash=' . $data['invoice']->hash); ?>" />
                        <input type="hidden" name="service_provider" value="payu_paisa" size="64" />
                        <input type="hidden" name="productinfo"
                            value="<?php echo e(str_replace('{invoice_number}', format_invoice_number($data['invoice']->id), $this->payu_money_gateway->getSetting('description_dashboard'))); ?>" />
                        <div class="form-group">
                            <label for="first_name"> <?php echo _l('client_firstname'); ?></label>
                            <input type="text" class="form-control" id="first_name" name="firstname"
                                value="<?php echo e($data['firstname']); ?>" required>
                        </div>
                        <div class="form-group">
                            <label for="last_name"> <?php echo _l('client_lastname'); ?></label>
                            <input type="text" class="form-control" id="last_name" name="lastname"
                                value="<?php echo e($data['lastname']); ?>">
                        </div>
                        <div class="form-group">
                            <label for="email"> <?php echo _l('client_email'); ?> </label>
                            <input type="email" class="form-control" id="email" name="email"
                                value="<?php echo e($data['email']); ?>" required>
                        </div>
                        <div class="form-group">
                            <label for="phone"> <?php echo _l('client_phonenumber'); ?></label>
                            <input type="text" class="form-control" id="phone" name="phone"
                                value="<?php echo e($data['phonenumber']); ?>" required>
                        </div>
                    </div>
                    <?php if (!$data['hash']) { ?>
                    <div class="panel-footer text-right">
                        <input type="submit" class="btn btn-primary" value="<?php echo _l('submit_payment'); ?>" />
                    </div>
                    <?php } ?>
                </div>
                <?php echo form_close(); ?>
            </div>
        </div>
    </div>
    <?php echo payment_gateway_scripts(); ?>
    <script>
    $(function() {
        $('#payu_money_form').validate({
            submitHandler: function(form) {
                $('input[type="submit"]').prop('disabled', true);
                return true;
            }
        });
    });
    var hash = '<?php echo $data['hash']; ?>';

    function submitPayuForm() {
        if (hash == '') {
            return;
        }
        var payu_money_form = document.forms.payu_money_form;
        payu_money_form.submit();
    }
    </script>
    <?php echo payment_gateway_footer(); ?>
    <?php
        $contents = ob_get_contents();
        ob_end_clean();

        return $contents;
    }
}