Browse Source

feat: ✨ Added new events to extract payment logic

IceToast 2 years ago
parent
commit
0257bf4e85

+ 7 - 5
app/Events/PaymentEvent.php

@@ -3,6 +3,8 @@
 namespace App\Events;
 
 use App\Models\Payment;
+use App\Models\ShopProduct;
+use App\Models\User;
 use Illuminate\Broadcasting\InteractsWithSockets;
 use Illuminate\Foundation\Events\Dispatchable;
 use Illuminate\Queue\SerializesModels;
@@ -11,19 +13,19 @@ class PaymentEvent
 {
     use Dispatchable, InteractsWithSockets, SerializesModels;
 
-       /**
-     * @var User
-     */
+    public User $user;
     public Payment $payment;
-
+    public ShopProduct $shopProduct;
 
     /**
      * Create a new event instance.
      *
      * @return void
      */
-    public function __construct(Payment $payment)
+    public function __construct(User $user, Payment $payment, ShopProduct $shopProduct)
     {
+        $this->user = $user;
         $this->payment = $payment;
+        $this->shopProduct = $shopProduct;
     }
 }

+ 2 - 2
app/Listeners/PaymentListener.php → app/Listeners/CreateInvoice.php

@@ -7,7 +7,7 @@ use App\Traits\Invoiceable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Queue\InteractsWithQueue;
 
-class PaymentListener
+class CreateInvoice implements ShouldQueue
 {
 
     use Invoiceable;
@@ -23,7 +23,7 @@ class PaymentListener
         if (config('SETTINGS::INVOICE:ENABLED') == 'true') {
             // get user from payment which does hold the user_id
             $user = $event->payment->user;
-            
+
             // create invoice using the trait
             $this->createInvoice($user, $event->payment);
         }

+ 78 - 0
app/Listeners/UserPayment.php

@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Listeners;
+
+use App\Events\PaymentEvent;
+use App\Models\User;
+use Illuminate\Support\Facades\DB;
+use App\Models\PartnerDiscount;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Queue\InteractsWithQueue;
+
+class UserPayment
+{
+    /**
+     * Handle the event.
+     *
+     * @param  \App\Events\PaymentEvent  $event
+     * @return void
+     */
+    public function handle(PaymentEvent $event)
+    {
+        $user = $event->user;
+        $shopProduct = $event->shopProduct;
+
+
+        //update server limit
+        if (config('SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE') !== 0) {
+            if ($user->server_limit < config('SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE')) {
+                $user->update(['server_limit' => config('SETTINGS::USER:SERVER_LIMIT_AFTER_IRL_PURCHASE')]);
+            }
+        }
+        //update User with bought item
+        if ($shopProduct->type == "Credits") {
+            $user->increment('credits', $shopProduct->quantity);
+        } elseif ($shopProduct->type == "Server slots") {
+            $user->increment('server_limit', $shopProduct->quantity);
+        }
+        //give referral commission always
+        if ((config("SETTINGS::REFERRAL:MODE") == "commission" || config("SETTINGS::REFERRAL:MODE") == "both") && $shopProduct->type == "Credits" && config("SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION") == "true") {
+            if ($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()) {
+                $ref_user = User::findOrFail($ref_user->referral_id);
+                $increment = number_format($shopProduct->quantity * (PartnerDiscount::getCommission($ref_user->id)) / 100, 0, "", "");
+                $ref_user->increment('credits', $increment);
+
+                //LOGS REFERRALS IN THE ACTIVITY LOG
+                activity()
+                    ->performedOn($user)
+                    ->causedBy($ref_user)
+                    ->log('gained ' . $increment . ' ' . config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME") . ' for commission-referral of ' . $user->name . ' (ID:' . $user->id . ')');
+            }
+        }
+        //update role give Referral-reward
+        if ($user->role == 'member') {
+            $user->update(['role' => 'client']);
+
+            //give referral commission only on first purchase
+            if ((config("SETTINGS::REFERRAL:MODE") == "commission" || config("SETTINGS::REFERRAL:MODE") == "both") && $shopProduct->type == "Credits" && config("SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION") == "false") {
+                if ($ref_user = DB::table("user_referrals")->where('registered_user_id', '=', $user->id)->first()) {
+                    $ref_user = User::findOrFail($ref_user->referral_id);
+                    $increment = number_format($shopProduct->quantity * (PartnerDiscount::getCommission($ref_user->id)) / 100, 0, "", "");
+                    $ref_user->increment('credits', $increment);
+
+                    //LOGS REFERRALS IN THE ACTIVITY LOG
+                    activity()
+                        ->performedOn($user)
+                        ->causedBy($ref_user)
+                        ->log('gained ' . $increment . ' ' . config("SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME") . ' for commission-referral of ' . $user->name . ' (ID:' . $user->id . ')');
+                }
+            }
+        }
+
+        // LOGS PAYMENT IN THE ACTIVITY LOG
+        activity()
+            ->performedOn($user)
+            ->causedBy($user)
+            ->log('bought ' . $shopProduct->quantity . ' ' . $shopProduct->type . ' for ' . $shopProduct->price . $shopProduct->currency_code);
+    }
+}

+ 4 - 2
app/Providers/EventServiceProvider.php

@@ -4,8 +4,9 @@ namespace App\Providers;
 
 use App\Events\PaymentEvent;
 use App\Events\UserUpdateCreditsEvent;
-use App\Listeners\PaymentListener;
+use App\Listeners\CreateInvoice;
 use App\Listeners\UnsuspendServers;
+use App\Listeners\UserPayment;
 use App\Listeners\Verified;
 use Illuminate\Auth\Events\Registered;
 use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
@@ -28,7 +29,8 @@ class EventServiceProvider extends ServiceProvider
             UnsuspendServers::class,
         ],
         PaymentEvent::class => [
-            PaymentListener::class,
+            CreateInvoice::class,
+            UserPayment::class,
         ],
         SocialiteWasCalled::class => [
             // ... other providers