Ver Fonte

feat: ✨ Added last_billed to server model & always charge first & fixed Charge Server command

IceToast há 3 anos atrás
pai
commit
da0dd37559

+ 16 - 8
app/Console/Commands/ChargeServers.php

@@ -4,7 +4,9 @@ namespace App\Console\Commands;
 
 use App\Models\Server;
 use App\Notifications\ServersSuspendedNotification;
+use Carbon\Carbon;
 use Illuminate\Console\Command;
+use Illuminate\Support\Facades\DB;
 
 class ChargeServers extends Command
 {
@@ -45,7 +47,7 @@ class ChargeServers extends Command
      */
     public function handle()
     {
-        Server::whereNull('suspended')->with('users', 'products')->chunk(10, function ($servers) {
+        Server::whereNull('suspended')->with('user', 'product')->chunk(10, function ($servers) {
             /** @var Server $server */
             foreach ($servers as $server) {
                 /** @var Product $product */
@@ -55,23 +57,29 @@ class ChargeServers extends Command
 
                 $billing_period = $product->billing_period;
 
+
                 // check if server is due to be charged by comparing its last_billed date with the current date and the billing period
                 $newBillingDate = null;
                 switch($billing_period) {
                     case 'monthly':
-                        $newBillingDate = $server->last_billed->addMonth();
+                        $newBillingDate = Carbon::parse($server->last_billed)->addMonth();
                         break;
                     case 'weekly':
-                        $newBillingDate = $server->last_billed->addYear();
+                        $newBillingDate = Carbon::parse($server->last_billed)->addYear();
                         break;
                     case 'daily':
-                        $newBillingDate = $server->last_billed->addDay();
+                        $newBillingDate = Carbon::parse($server->last_billed)->addDay();
                         break;
+                    case 'hourly':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addHour();
                     default:
-                        $newBillingDate = $server->last_billed->addHour();
+                        $newBillingDate = Carbon::parse($server->last_billed)->addHour();
                         break;
                 };
-                if (!($newBillingDate <= now())) return;
+
+                if (!($newBillingDate->isPast())) {
+                    continue;
+                }
 
                 // check if user has enough credits to charge the server
                 if ($user->credits < $product->price) {
@@ -94,8 +102,8 @@ class ChargeServers extends Command
                 $this->line("<fg=blue>{$user->name}</> Current credits: <fg=green>{$user->credits}</> Credits to be removed: <fg=red>{$product->price}</>");
                 $user->decrement('credits', $product->price);
 
-                // update server last_billed date
-                $server->last_billed = $newBillingDate;
+                // update server last_billed date in db
+                DB::table('servers')->where('id', $server->id)->update(['last_billed' => $newBillingDate]);
             }
 
             return $this->notifyUsers();

+ 4 - 5
app/Http/Controllers/ServerController.php

@@ -10,6 +10,7 @@ use App\Models\Node;
 use App\Models\Product;
 use App\Models\Server;
 use App\Notifications\ServerCreationError;
+use Carbon\Carbon;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Client\Response;
@@ -180,6 +181,7 @@ class ServerController extends Controller
         $server = $request->user()->servers()->create([
             'name' => $request->input('name'),
             'product_id' => $request->input('product'),
+            'last_billed' => Carbon::now()->toDateTimeString(),
         ]);
 
         //get free allocation ID
@@ -201,11 +203,8 @@ class ServerController extends Controller
             'identifier' => $serverAttributes['identifier'],
         ]);
 
-        if (config('SETTINGS::SYSTEM:SERVER_CREATE_CHARGE_FIRST_HOUR', 'true') == 'true') {
-            if ($request->user()->credits >= $server->product->getHourlyPrice()) {
-                $request->user()->decrement('credits', $server->product->getHourlyPrice());
-            }
-        }
+        // Charge first billing cycle
+        $request->user()->decrement('credits', $server->product->price);
 
         return redirect()->route('servers.index')->with('success', __('Server created'));
     }

+ 7 - 6
app/Models/Server.php

@@ -47,12 +47,13 @@ class Server extends Model
      * @var string[]
      */
     protected $fillable = [
-        'name',
-        'description',
-        'suspended',
-        'identifier',
-        'product_id',
-        'pterodactyl_id',
+        "name",
+        "description",
+        "suspended",
+        "identifier",
+        "product_id",
+        "pterodactyl_id",
+        "last_billed"
     ];
 
     /**