HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//wwwshoopermcom/application/models/Earnings_model.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Earnings_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }

    //get paginated earnings
    public function get_paginated_earnings($user_id, $per_page, $offset)
    {
        $this->db->where('user_id', clean_number($user_id));
        $this->filter_earnings();
        $this->db->order_by('earnings.created_at', 'DESC');
        $this->db->limit($per_page, $offset);
        $query = $this->db->get('earnings');
        return $query->result();
    }

    //get earnings count
    public function get_earnings_count($user_id)
    {
        $this->db->where('user_id', clean_number($user_id));
        $this->filter_earnings();
        return $this->db->count_all_results('earnings');
    }

    //filter earnings
    public function filter_earnings()
    {
        $q = input_get('q');
        if (!empty($q)) {
            $this->db->like('earnings.order_number', $q);
        }
    }

    //add seller earnings
    public function add_seller_earnings($order_product)
    {
        if (!empty($order_product)) {
            $order = $this->order_model->get_order($order_product->order_id);
            if (!empty($order)) {
                //check if earning already added
                $this->db->where('order_number', $order->order_number);
                $this->db->where('order_product_id', $order_product->id);
                $this->db->where('user_id', $order_product->seller_id);
                $query = $this->db->get('earnings');
                $num_rows = $query->num_rows();
                if ($num_rows < 1) {
                    $earned_amount = $this->calculate_earned_amount($order_product);
                    $shipping_cost = $this->get_single_product_shipping_cost($order_product->order_id, $order_product->seller_id);
                    //add earning
                    $data = array(
                        'order_number' => $order->order_number,
                        'order_product_id' => $order_product->id,
                        'user_id' => $order_product->seller_id,
                        'price' => $order_product->product_total_price,
                        'commission_rate' => $order_product->commission_rate,
                        'shipping_cost' => $shipping_cost,
                        'earned_amount' => $earned_amount + $shipping_cost,
                        'currency' => $order_product->product_currency,
                        'exchange_rate' => 1,
                        'created_at' => date('Y-m-d H:i:s')
                    );

                    $total_earned = $data['earned_amount'];
                    $product_currency = $this->currency_model->get_currency_by_code($order_product->product_currency);
                    if (!empty($product_currency) && $this->payment_settings->currency_converter == 1 && $product_currency->exchange_rate > 0) {
                        $data['exchange_rate'] = $product_currency->exchange_rate;
                        $total_earned = get_price($total_earned, 'decimal');
                        $total_earned = $total_earned / $data['exchange_rate'];
                        $total_earned = number_format($total_earned, 2, ".", "");
                        $total_earned = get_price($total_earned, 'database');
                    }
                    $this->db->insert('earnings', $data);
                    //update seller balance and number of sales
                    $user = get_user($order_product->seller_id);
                    if (!empty($user)) {
                        $new_balance = $user->balance;
                        if ($order->payment_method != "Cash On Delivery") {
                            $new_balance = $user->balance + $total_earned;
                        }
                        $sales = $user->number_of_sales;
                        $sales = $sales + 1;
                        $data = array(
                            'balance' => $new_balance,
                            'number_of_sales' => $sales
                        );
                        $this->db->where('id', $user->id);
                        $this->db->update('users', $data);
                    }
                }
            }
        }
    }

    //refund product
    public function refund_product($order_product)
    {
        if (!empty($order_product)) {
            $order = get_order($order_product->order_id);
            $earning = $this->get_earning_by_order_product_id($order_product->id, $order->order_number);
            if (!empty($order) && !empty($earning) && $order->payment_method != "Cash On Delivery") {
                //edit vendor balance
                $user = get_user($order_product->seller_id);
                if (!empty($user)) {
                    $data = ['balance' => $user->balance - $earning->earned_amount];
                    $this->db->where('id', $user->id)->update('users', $data);
                }
                //edit order product
                $this->db->where('id', $order_product->id)->update('order_products', ['order_status' => 'refund_approved', 'updated_at' => date('Y-m-d H:i:s')]);
                //edit refund request
                $this->db->where('order_product_id', $order_product->id)->update('refund_requests', ['is_completed' => 1, 'updated_at' => date('Y-m-d H:i:s')]);
                //update earning
                $this->db->where('id', $earning->id)->update('earnings', ['is_refunded' => 1]);
                //update order date
                $this->db->where('id', $order_product->order_id)->update('orders', ['updated_at' => date('Y-m-d H:i:s')]);
            } else {
                //edit order product
                $this->db->where('id', $order_product->id)->update('order_products', ['order_status' => 'refund_approved', 'updated_at' => date('Y-m-d H:i:s')]);
                //edit refund request
                $this->db->where('order_product_id', $order_product->id)->update('refund_requests', ['is_completed' => 1, 'updated_at' => date('Y-m-d H:i:s')]);
                //update order date
                $this->db->where('id', $order_product->order_id)->update('orders', ['updated_at' => date('Y-m-d H:i:s')]);
            }
            //delete if digital product
            if ($order_product->product_type == 'digital') {
                $digital_sale = $this->db->where('order_id', $order_product->order_id)->where('product_id', $order_product->product_id)->where('buyer_id', $order_product->buyer_id)->get('digital_sales')->row();
                if (!empty($digital_sale)) {
                    $this->db->where('id', $digital_sale->id)->delete('digital_sales');
                }
            }
        }
    }

    //calculate earned amount
    public function calculate_earned_amount($order_product)
    {
        if (!empty($order_product)) {
            $price = $order_product->product_total_price;
            $earned = $price - (($price * $order_product->commission_rate) / 100);
            $order = get_order($order_product->order_id);
            if (!empty($order) && !empty($order->coupon_discount_rate) && $order->coupon_seller_id == $order_product->seller_id) {
                $earned = $earned - (($order_product->product_total_price * $order->coupon_discount_rate) / 100);
            }
            return $earned;
        }
        return 0;
    }

    //get single product shipping cost
    public function get_single_product_shipping_cost($order_id, $seller_id)
    {
        $num_products = 0;
        $seller_shipping_cost = 0;
        $order_products = $this->order_model->get_order_products($order_id);
        if (!empty($order_products)) {
            foreach ($order_products as $product) {
                if ($product->seller_id == $seller_id) {
                    $num_products += 1;
                    $seller_shipping_cost = $product->seller_shipping_cost;
                }
            }
        }
        if (!empty($num_products)) {
            $cost = $seller_shipping_cost / $num_products;
            return number_format($cost, 2, ".", "");
        }
        return 0;
    }

    //get order earning by user id
    public function get_earning_by_user_id($user_id, $order_number)
    {
        $this->db->where('order_number', $order_number);
        $this->db->where('user_id', $user_id);
        $query = $this->db->get('earnings');
        return $query->row();
    }

    //get earning by order product
    public function get_earning_by_order_product_id($order_product_id, $order_number)
    {
        return $this->db->where('order_number', $order_number)->where('order_product_id', clean_number($order_product_id))->get('earnings')->row();
    }

    //get user payout account
    public function get_user_payout_account($user_id)
    {
        $user_id = clean_number($user_id);
        $this->db->where('user_id', $user_id);
        $query = $this->db->get('users_payout_accounts');
        $row = $query->row();

        if (!empty($row)) {
            return $row;
        } else {
            $data = array(
                'user_id' => $user_id,
                'payout_paypal_email' => "",
                'iban_full_name' => "",
                'iban_country_id' => "",
                'iban_bank_name' => "",
                'iban_number' => "",
                'swift_full_name' => "",
                'swift_address' => "",
                'swift_state' => "",
                'swift_city' => "",
                'swift_postcode' => "",
                'swift_country_id' => "",
                'swift_bank_account_holder_name' => "",
                'swift_iban' => "",
                'swift_code' => "",
                'swift_bank_name' => "",
                'swift_bank_branch_city' => "",
                'swift_bank_branch_country_id' => ""
            );
            $this->db->insert('users_payout_accounts', $data);

            $this->db->where('user_id', $user_id);
            $query = $this->db->get('users_payout_accounts');
            return $query->row();
        }
    }

    //set paypal payout account
    public function set_paypal_payout_account($user_id)
    {
        $user_id = clean_number($user_id);
        $data = array(
            'payout_paypal_email' => $this->input->post('payout_paypal_email', true)
        );
        $this->db->where('user_id', $user_id);
        return $this->db->update('users_payout_accounts', $data);
    }

    //set bitcoin payout account
    public function set_bitcoin_payout_account($user_id)
    {
        $user_id = clean_number($user_id);
        $data = array(
            'payout_bitcoin_address' => $this->input->post('payout_bitcoin_address', true)
        );
        $this->db->where('user_id', $user_id);
        return $this->db->update('users_payout_accounts', $data);
    }

    //set iban payout account
    public function set_iban_payout_account($user_id)
    {
        $user_id = clean_number($user_id);
        $data = array(
            'iban_full_name' => $this->input->post('iban_full_name', true),
            'iban_country_id' => $this->input->post('iban_country_id', true),
            'iban_bank_name' => $this->input->post('iban_bank_name', true),
            'iban_number' => $this->input->post('iban_number', true),
        );
        $this->db->where('user_id', $user_id);
        return $this->db->update('users_payout_accounts', $data);
    }

    //set swift payout account
    public function set_swift_payout_account($user_id)
    {
        $user_id = clean_number($user_id);
        $data = array(
            'swift_full_name' => $this->input->post('swift_full_name', true),
            'swift_address' => $this->input->post('swift_address', true),
            'swift_state' => $this->input->post('swift_state', true),
            'swift_city' => $this->input->post('swift_city', true),
            'swift_postcode' => $this->input->post('swift_postcode', true),
            'swift_country_id' => $this->input->post('swift_country_id', true),
            'swift_bank_account_holder_name' => $this->input->post('swift_bank_account_holder_name', true),
            'swift_iban' => $this->input->post('swift_iban', true),
            'swift_code' => $this->input->post('swift_code', true),
            'swift_bank_name' => $this->input->post('swift_bank_name', true),
            'swift_bank_branch_city' => $this->input->post('swift_bank_branch_city', true),
            'swift_bank_branch_country_id' => $this->input->post('swift_bank_branch_country_id', true)
        );
        $this->db->where('user_id', $user_id);
        return $this->db->update('users_payout_accounts', $data);
    }

    //get paginated payouts
    public function get_paginated_payouts($user_id, $per_page, $offset)
    {
        $this->db->where('user_id', clean_number($user_id));
        $this->db->order_by('payouts.created_at', 'DESC');
        $this->db->limit($per_page, $offset);
        $query = $this->db->get('payouts');
        return $query->result();
    }

    //get payouts count
    public function get_payouts_count($user_id)
    {
        $this->db->where('user_id', clean_number($user_id));
        return $this->db->count_all_results('payouts');
    }

    //get active payouts
    public function get_active_payouts($user_id)
    {
        $user_id = clean_number($user_id);
        $this->db->where('user_id', $user_id);
        $this->db->where('status', 0);
        $this->db->order_by('payouts.created_at', 'DESC');
        $query = $this->db->get('payouts');
        return $query->result();
    }

    //withdraw money
    public function withdraw_money($data)
    {
        return $this->db->insert('payouts', $data);
    }
}