<?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();
}
}
|