HOME


Mini Shell 1.0
La Pieza.DO | Todo lo que buscas!

Bienvenido de nuevo!

Acceso Cuenta Delivery
DIR: /var/www/devs.lapieza.net/app/Http/Controllers/
Upload File :
Current File : /var/www/devs.lapieza.net/app/Http/Controllers/AffiliateController.php
<?php



namespace App\Http\Controllers;



use Illuminate\Http\Request;

use App\Models\AffiliateOption;

use App\Models\Order;

use App\Models\AffiliateConfig;

use App\Models\AffiliateUser;

use App\Models\AffiliatePayment;

use App\Models\AffiliateWithdrawRequest;

use App\Models\AffiliateLog;

use App\Models\AffiliateStats;

use Carbon\Carbon;

use App\Models\User;

use App\Models\Category;

use Auth;

use DB;

use Hash;

use Illuminate\Auth\Events\Registered;



class AffiliateController extends Controller

{

    public function __construct() {

        // Staff Permission Check

        $this->middleware(['permission:affiliate_registration_form_config'])->only('configs');

        $this->middleware(['permission:affiliate_configurations'])->only('index');

        $this->middleware(['permission:view_affiliate_users'])->only('users');

        $this->middleware(['permission:pay_to_affiliate_user'])->only('payment_modal');

        $this->middleware(['permission:affiliate_users_payment_history'])->only('payment_history');

        $this->middleware(['permission:view_all_referral_users'])->only('refferal_users');

        $this->middleware(['permission:view_affiliate_withdraw_requests'])->only('affiliate_withdraw_requests');

        $this->middleware(['permission:accept_affiliate_withdraw_requests'])->only('affiliate_withdraw_modal');

        $this->middleware(['permission:reject_affiliate_withdraw_request'])->only('reject_withdraw_request');

        $this->middleware(['permission:view_affiliate_logs'])->only('affiliate_logs_admin');

    }



    //

    public function index(){

        return view('affiliate.index');

    }



    public function affiliate_option_store(Request $request){

        //dd($request->all());

        $affiliate_option = AffiliateOption::where('type', $request->type)->first();

        if($affiliate_option == null){

            $affiliate_option = new AffiliateOption;

        }

        $affiliate_option->type = $request->type;



        $commision_details = array();

        if ($request->type == 'user_registration_first_purchase') {

            $affiliate_option->percentage = $request->percentage;

        }

        elseif ($request->type == 'product_sharing') {

            $commision_details['commission'] = $request->amount;

            $commision_details['commission_type'] = $request->amount_type;

        }

        elseif ($request->type == 'category_wise_affiliate') {

            foreach(Category::all() as $category) {

                $data['category_id'] = $request['categories_id_'.$category->id];

                $data['commission'] = $request['commison_amounts_'.$category->id];

                $data['commission_type'] = $request['commison_types_'.$category->id];

                array_push($commision_details, $data);

            }

        }

        elseif ($request->type == 'max_affiliate_limit') {

            $affiliate_option->percentage = $request->percentage;

        }

        $affiliate_option->details = json_encode($commision_details);



        if ($request->has('status')) {

            $affiliate_option->status = 1;

            if($request->type == 'product_sharing'){

                $affiliate_option_status_update = AffiliateOption::where('type', 'category_wise_affiliate')->first();

                $affiliate_option_status_update->status = 0;

                $affiliate_option_status_update->save();

            }

            if($request->type == 'category_wise_affiliate'){

                $affiliate_option_status_update = AffiliateOption::where('type', 'product_sharing')->first();

                $affiliate_option_status_update->status = 0;

                $affiliate_option_status_update->save();

            }

        }

        else {

            $affiliate_option->status = 0;

        }

        $affiliate_option->save();



        flash("This has been updated successfully")->success();

        return back();

    }



    public function configs(){

        return view('affiliate.configs');

    }



    public function config_store(Request $request){

        if($request->type == 'validation_time') {

            //affiliate validation time

            $affiliate_config = AffiliateConfig::where('type', $request->type)->first();

            if($affiliate_config == null){

                $affiliate_config = new AffiliateConfig;

            }

            $affiliate_config->type = $request->type;

            $affiliate_config->value = $request[$request->type];

            $affiliate_config->save();



            flash("Validation time updated successfully")->success();

        } else {



            $form = array();

            $select_types = ['select', 'multi_select', 'radio'];

            $j = 0;

            for ($i=0; $i < count($request->type); $i++) {

                $item['type'] = $request->type[$i];

                $item['label'] = $request->label[$i];

                if(in_array($request->type[$i], $select_types)){

                    $item['options'] = json_encode($request['options_'.$request->option[$j]]);

                    $j++;

                }

                array_push($form, $item);

            }

            $affiliate_config = AffiliateConfig::where('type', 'verification_form')->first();

            $affiliate_config->value = json_encode($form);



            flash("Verification form updated successfully")->success();

        }

        if($affiliate_config->save()){

            return back();

        }

    }



    public function apply_for_affiliate(Request $request){

        if(Auth::check() && AffiliateUser::where('user_id', Auth::user()->id)->first() != null){

            flash(translate("You are already an affiliate user!"))->warning();

            return back();

        }

        return view('affiliate.frontend.apply_for_affiliate');

    }



    public function affiliate_logs_admin()

    {

        $affiliate_logs = AffiliateLog::latest()->paginate(10);

        return view('affiliate.affiliate_logs',compact('affiliate_logs'));

    }



    public function store_affiliate_user(Request $request){

        if(!Auth::check()){

            if(User::where('email', $request->email)->first() != null){

                flash(translate('Email already exists!'))->error();

                return back();

            }

            if($request->password == $request->password_confirmation){

                $user = new User;

                $user->name = $request->name;

                $user->email = $request->email;

                $user->user_type = "customer";

                $user->password = Hash::make($request->password);

                $user->save();



                auth()->login($user, false);



                if(get_setting('email_verification') != 1){

                    $user->email_verified_at = date('Y-m-d H:m:s');

                    $user->save();

                }

                else {

                    event(new Registered($user));

                }

            }

            else{

                flash(translate('Sorry! Password did not match.'))->error();

                return back();

            }

        }



        $affiliate_user = Auth::user()->affiliate_user;

        if ($affiliate_user == null) {

            $affiliate_user = new AffiliateUser;

            $affiliate_user->user_id = Auth::user()->id;

        }

        $data = array();

        $i = 0;

        foreach (json_decode(AffiliateConfig::where('type', 'verification_form')->first()->value) as $key => $element) {

            $item = array();

            if ($element->type == 'text') {

                $item['type'] = 'text';

                $item['label'] = $element->label;

                $item['value'] = $request['element_'.$i];

            }

            elseif ($element->type == 'select' || $element->type == 'radio') {

                $item['type'] = 'select';

                $item['label'] = $element->label;

                $item['value'] = $request['element_'.$i];

            }

            elseif ($element->type == 'multi_select') {

                $item['type'] = 'multi_select';

                $item['label'] = $element->label;

                $item['value'] = json_encode($request['element_'.$i]);

            }

            elseif ($element->type == 'file') {

                $item['type'] = 'file';

                $item['label'] = $element->label;

                $item['value'] = $request['element_'.$i]->store('uploads/affiliate_verification_form');

            }

            array_push($data, $item);

            $i++;

        }

        $affiliate_user->informations = json_encode($data);

        if($affiliate_user->save()){

            flash(translate('Your verification request has been submitted successfully!'))->success();

            return redirect()->route('home');

        }



        flash(translate('Sorry! Something went wrong.'))->error();

        return back();

    }



    public function users(){

        $affiliate_users = AffiliateUser::paginate(12);

        return view('affiliate.users', compact('affiliate_users'));

    }



    public function show_verification_request($id){

        $affiliate_user = AffiliateUser::findOrFail($id);

        return view('affiliate.show_verification_request', compact('affiliate_user'));

    }



    public function approve_user($id)

    {

        $affiliate_user = AffiliateUser::findOrFail($id);

        $affiliate_user->status = 1;

        if($affiliate_user->save()){

            flash(translate('Affiliate user has been approved successfully'))->success();

            return redirect()->route('affiliate.users');

        }

        flash(translate('Something went wrong'))->error();

        return back();

    }



    public function reject_user($id)

    {

        $affiliate_user = AffiliateUser::findOrFail($id);

        $affiliate_user->status = 0;

        $affiliate_user->informations = null;

        if($affiliate_user->save()){

            flash(translate('Affiliate user request has been rejected successfully'))->success();

            return redirect()->route('affiliate.users');

        }

        flash(translate('Something went wrong'))->error();

        return back();

    }



    public function updateApproved(Request $request)

    {

        $affiliate_user = AffiliateUser::findOrFail($request->id);

        $affiliate_user->status = $request->status;

        if($affiliate_user->save()){

            return 1;

        }

        return 0;

    }



    public function payment_modal(Request $request)

    {

        $affiliate_user = AffiliateUser::findOrFail($request->id);

        return view('affiliate.payment_modal', compact('affiliate_user'));

    }



    public function payment_store(Request $request){

        $affiliate_payment = new AffiliatePayment;

        $affiliate_payment->affiliate_user_id = $request->affiliate_user_id;

        $affiliate_payment->amount = $request->amount;

        $affiliate_payment->payment_method = $request->payment_method;

        $affiliate_payment->save();



        $affiliate_user = AffiliateUser::findOrFail($request->affiliate_user_id);

        $affiliate_user->balance -= $request->amount;

        $affiliate_user->save();



        flash(translate('Payment completed'))->success();

        return back();

    }



    public function payment_history($id){

        $affiliate_user = AffiliateUser::findOrFail(decrypt($id));

        $affiliate_payments = $affiliate_user->affiliate_payments();

        return view('affiliate.payment_history', compact('affiliate_payments', 'affiliate_user'));

    }



    public function user_index(Request $request){

        $affiliate_logs = AffiliateLog::where('referred_by_user', Auth::user()->id)->latest()->paginate(10);



        $query = AffiliateStats::query();

        $query = $query->select(

                        DB::raw('SUM(no_of_click) AS count_click, SUM(no_of_order_item) AS count_item, SUM(no_of_delivered) AS count_delivered,  SUM(no_of_cancel) AS count_cancel')

                );

        if($request->type == 'Today') {

            $query->whereDate('created_at', Carbon::today());

        } else if($request->type == '7' || $request->type ==  '30') {

            $query->whereRaw('created_at  <= NOW() AND created_at >= DATE_SUB(created_at, INTERVAL '. $request->type .' DAY)');

        }

        $query->where('affiliate_user_id', Auth::user()->id);

        $affliate_stats = $query->first();

        $type = $request->type;



//        dd($type);

        return view('affiliate.frontend.index', compact('affiliate_logs', 'affliate_stats', 'type'));

    }



    // payment history for user

    public function user_payment_history(){

        $affiliate_user = Auth::user()->affiliate_user;

        $affiliate_payments = $affiliate_user->affiliate_payments();



        return view('affiliate.frontend.payment_history', compact('affiliate_payments'));

    }



    // withdraw request history for user

    public function user_withdraw_request_history(){

        $affiliate_user = Auth::user()->affiliate_user;

        $affiliate_withdraw_requests = AffiliateWithdrawRequest::where('user_id', Auth::user()->id)->orderBy('id', 'desc')->paginate(10);



        return view('affiliate.frontend.withdraw_request_history', compact('affiliate_withdraw_requests'));

    }



    public function payment_settings(){

        $affiliate_user = Auth::user()->affiliate_user;

        return view('affiliate.frontend.payment_settings', compact('affiliate_user'));

    }



    public function payment_settings_store(Request $request){

        $affiliate_user = Auth::user()->affiliate_user;

        $affiliate_user->paypal_email = $request->paypal_email;

        $affiliate_user->bank_information = $request->bank_information;

        $affiliate_user->save();

        flash(translate('Affiliate payment settings has been updated successfully'))->success();

        return redirect()->route('affiliate.user.index');

    }



    public function processAffiliatePoints(Order $order){

        if(addon_is_activated('affiliate_system')){

            if(AffiliateOption::where('type', 'user_registration_first_purchase')->first()->status){

                if ($order->user != null && $order->user->orders->count() == 1) {

                    if($order->user->referred_by != null){

                        $user = User::find($order->user->referred_by);

                        if ($user != null) {

                            $amount = (AffiliateOption::where('type', 'user_registration_first_purchase')->first()->percentage * $order->grand_total)/100;

                            $affiliate_user = $user->affiliate_user;

                            if($affiliate_user != null){

                                $affiliate_user->balance += $amount;

                                $affiliate_user->save();



                                // Affiliate log

                                $affiliate_log                      = new AffiliateLog;

                                $affiliate_log->user_id             = $order->user_id;

                                $affiliate_log->referred_by_user    = $order->user->referred_by;

                                $affiliate_log->amount              = $amount;

                                $affiliate_log->order_id            = $order->id;

                                $affiliate_log->affiliate_type      = 'user_registration_first_purchase';

                                $affiliate_log->save();

                            }

                        }

                    }

                }

            }

            if(AffiliateOption::where('type', 'product_sharing')->first()->status) {

                foreach ($order->orderDetails as $key => $orderDetail) {

                    $amount = 0;

                    if($orderDetail->product_referral_code != null) {

                        $referred_by_user = User::where('referral_code', $orderDetail->product_referral_code)->first();

                        if($referred_by_user != null) {

                            if(AffiliateOption::where('type', 'product_sharing')->first()->details != null && json_decode(AffiliateOption::where('type', 'product_sharing')->first()->details)->commission_type == 'amount') {

                                $amount = json_decode(AffiliateOption::where('type', 'product_sharing')->first()->details)->commission;

                            }

                            elseif(AffiliateOption::where('type', 'product_sharing')->first()->details != null && json_decode(AffiliateOption::where('type', 'product_sharing')->first()->details)->commission_type == 'percent') {

                                $amount = (json_decode(AffiliateOption::where('type', 'product_sharing')->first()->details)->commission * $orderDetail->price)/100;

                            }

                            $affiliate_user = $referred_by_user->affiliate_user;

                            if($affiliate_user != null) {

                                $affiliate_user->balance += $amount;

                                $affiliate_user->save();



                                // Affiliate log

                                $affiliate_log                      = new AffiliateLog;

                                if($order->user_id != null) {

                                    $affiliate_log->user_id         = $order->user_id;

                                }

                                else {

                                    $affiliate_log->guest_id        = $order->guest_id;

                                }

                                $affiliate_log->referred_by_user    = $referred_by_user->id;

                                $affiliate_log->amount              = $amount;

                                $affiliate_log->order_id            = $order->id;

                                $affiliate_log->order_detail_id     = $orderDetail->id;

                                $affiliate_log->affiliate_type      = 'product_sharing';

                                $affiliate_log->save();

                            }

                        }

                    }

                }

            }

            elseif (AffiliateOption::where('type', 'category_wise_affiliate')->first()->status) {

                foreach ($order->orderDetails as $key => $orderDetail) {

                    $amount = 0;

                    if($orderDetail->product_referral_code != null) {

                        $referred_by_user = User::where('referral_code', $orderDetail->product_referral_code)->first();

                        if($referred_by_user != null) {

                            if(AffiliateOption::where('type', 'category_wise_affiliate')->first()->details != null){

                                foreach (json_decode(AffiliateOption::where('type', 'category_wise_affiliate')->first()->details) as $key => $value) {

                                    if($value->category_id == $orderDetail->product->category->id){

                                        if($value->commission_type == 'amount'){

                                            $amount = $value->commission;

                                        }

                                        else {

                                            $amount = ($value->commission * $orderDetail->price)/100;

                                        }

                                    }

                                }

                            }

                            $affiliate_user = $referred_by_user->affiliate_user;

                            if($affiliate_user != null){

                                $affiliate_user->balance += $amount;

                                $affiliate_user->save();



                                // Affiliate log

                                $affiliate_log                      = new AffiliateLog;

                                if($order->user_id != null){

                                    $affiliate_log->user_id         = $order->user_id;

                                }

                                else{

                                    $affiliate_log->guest_id        = $order->guest_id;

                                }

                                $affiliate_log->referred_by_user    = $referred_by_user->id;

                                $affiliate_log->amount              = $amount;

                                $affiliate_log->order_id            = $order->id;

                                $affiliate_log->order_detail_id     = $orderDetail->id;

                                $affiliate_log->affiliate_type      = 'category_wise_affiliate';

                                $affiliate_log->save();

                            }

                        }

                    }

                }

            }

        }

    }



    public function processAffiliateStats($affiliate_user_id, $no_click = 0, $no_item = 0, $no_delivered = 0, $no_cancel = 0) {

        $affiliate_stats = AffiliateStats::whereDate('created_at', Carbon::today())

                ->where("affiliate_user_id", $affiliate_user_id)

                ->first();



        if(!$affiliate_stats) {

            $affiliate_stats = new AffiliateStats;

            $affiliate_stats->no_of_order_item = 0;

            $affiliate_stats->no_of_delivered = 0;

            $affiliate_stats->no_of_cancel = 0;

            $affiliate_stats->no_of_click = 0;

        }



        $affiliate_stats->no_of_order_item += $no_item;

        $affiliate_stats->no_of_delivered += $no_delivered;

        $affiliate_stats->no_of_cancel += $no_cancel;

        $affiliate_stats->no_of_click += $no_click;

        $affiliate_stats->affiliate_user_id = $affiliate_user_id;



//        dd($affiliate_stats);

        $affiliate_stats->save();



//        foreach($order->orderDetails as $key => $orderDetail) {

//            $referred_by_user = User::where('referral_code', $orderDetail->product_referral_code)->first();

//

//            if($referred_by_user != null) {

//                if($orderDetail->delivery_status == 'delivered') {

//                    $affiliate_stats->no_of_delivered++;

//                } if($orderDetail->delivery_status == 'cancelled') {

//                    $affiliate_stats->no_of_cancel++;

//                }

//

//                $affiliate_stats->affiliate_user_id = $referred_by_user->id;

//                dd($affiliate_stats);

//                $affiliate_stats->save();

//            }

//        }

    }



    public function refferal_users()

    {

        $refferal_users = User::where('referred_by', '!=' , null)->paginate(10);

        return view('affiliate.refferal_users', compact('refferal_users'));

    }



    // Affiliate Withdraw Request

    public function withdraw_request_store(Request $request)

    {

        $withdraw_request           = new AffiliateWithdrawRequest;

        $withdraw_request->user_id  = Auth::user()->id;

        $withdraw_request->amount   = $request->amount;

        $withdraw_request->status   = 0 ;



        if($withdraw_request->save()){



            $affiliate_user = AffiliateUser::where('user_id',Auth::user()->id)->first();

            $affiliate_user->balance = $affiliate_user->balance - $request->amount;

            $affiliate_user->save();



            flash(translate('New withdraw request created successfully'))->success();

            return redirect()->route('affiliate.user.withdraw_request_history');

        }

        else{

            flash(translate('Something went wrong'))->error();

            return back();

        }

    }



    public function affiliate_withdraw_requests()

    {

        $affiliate_withdraw_requests = AffiliateWithdrawRequest::orderBy('id', 'desc')->paginate(10);

        return view('affiliate.affiliate_withdraw_requests', compact('affiliate_withdraw_requests'));

    }



    public function affiliate_withdraw_modal(Request $request)

    {

        $affiliate_withdraw_request = AffiliateWithdrawRequest::findOrFail($request->id);

        $affiliate_user = AffiliateUser::where('user_id',$affiliate_withdraw_request->user_id)->first();

        return view('affiliate.affiliate_withdraw_modal', compact('affiliate_withdraw_request','affiliate_user'));

    }



    public function withdraw_request_payment_store(Request $request){

        $affiliate_payment = new AffiliatePayment;

        $affiliate_payment->affiliate_user_id = $request->affiliate_user_id;

        $affiliate_payment->amount = $request->amount;

        $affiliate_payment->payment_method = $request->payment_method;

        $affiliate_payment->save();



        if ($request->has('affiliate_withdraw_request_id')) {

            $affiliate_withdraw_request = AffiliateWithdrawRequest::findOrFail($request->affiliate_withdraw_request_id);

            $affiliate_withdraw_request->status = 1;

            $affiliate_withdraw_request->save();

        }



        flash(translate('Payment completed'))->success();

        return back();

    }



    public function reject_withdraw_request($id)

    {

        $affiliate_withdraw_request = AffiliateWithdrawRequest::findOrFail($id);

        $affiliate_withdraw_request->status = 2;

        if($affiliate_withdraw_request->save()){



            $affiliate_user = AffiliateUser::where('user_id', $affiliate_withdraw_request->user_id)->first();

            $affiliate_user->balance = $affiliate_user->balance + $affiliate_withdraw_request->amount;

            $affiliate_user->save();



            flash(translate('Affiliate withdraw request has been rejected successfully'))->success();

            return redirect()->route('affiliate.withdraw_requests');

        }

        flash(translate('Something went wrong'))->error();

        return back();

    }



}