Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions app/app/Enums/WorkspaceSuspensionStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace App\Enums;

/**
* Workspace suspension statuses.
*/
abstract class WorkspaceSuspensionStatus
{
public const NOT_SUSPENDED = '0';
public const PENDING_SUSPENSION = 'pending_suspension';
public const REAL_SUSPENSION = 'real_suspension';

public static function all(): array
{
return [
self::NOT_SUSPENDED,
self::PENDING_SUSPENSION,
self::REAL_SUSPENSION,
];
}

public static function activeValues(): array
{
return [
self::REAL_SUSPENSION,
true,
1,
'1',
];
}

public static function activeDatabaseValues(): array
{
return [
self::REAL_SUSPENSION,
'1',
];
}

public static function isActive($status): bool
{
return in_array($status, [
self::REAL_SUSPENSION,
true,
1,
'1',
], true);
}

public static function label($status): string
{
if (self::isActive($status)) {
return 'Real Suspension';
}

if ($status === self::PENDING_SUSPENSION) {
return 'Pending Suspension';
}

return 'Not Suspended';
}
}
39 changes: 29 additions & 10 deletions app/app/Helpers/WorkspaceSuspensionHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Helpers;

use App\Customizations;
use App\Enums\WorkspaceSuspensionStatus;
use App\Workspace;
use App\WorkspaceSuspension;
use DateTime;
Expand All @@ -27,10 +28,17 @@ public static function getActiveSuspension($workspaceId)
return null;
}

$query = WorkspaceSuspension::where('workspace_id', $workspaceId)
->where('status', true);
$suspensions = WorkspaceSuspension::where('workspace_id', $workspaceId)
->orderBy('suspended_at', 'desc')
->get();

return $query->orderBy('suspended_at', 'desc')->first();
foreach ($suspensions as $suspension) {
if (WorkspaceSuspensionStatus::isActive($suspension->status)) {
return $suspension;
}
}

return null;
}

public static function getGracePeriodExtension($workspaceId)
Expand Down Expand Up @@ -73,19 +81,30 @@ public static function saveGracePeriodExtension(Workspace $workspace, $value)
$workspace->save();
}

if ($extension !== null && !$workspace->active) {
$workspace->active = true;
$workspace->save();
}

if (!Schema::hasTable('workspace_suspensions')) {
return $workspace;
}

$suspension = self::getActiveSuspension($workspace->id);
if (!$suspension) {
$suspensions = WorkspaceSuspension::where('workspace_id', $workspace->id)->get();

if ($suspensions->isEmpty()) {
return $workspace;
}

$suspension->grace_period_extension = $extension;
$suspension->save();
foreach ($suspensions as $suspension) {
$suspension->grace_period_extension = $extension;
if ($extension !== null) {
$suspension->status = WorkspaceSuspensionStatus::NOT_SUSPENDED;
}
$suspension->save();
}

return $suspension;
return $suspensions->first();
}

public static function suspendWorkspace(Workspace $workspace, $invoice = null, $daysPastDue = null, $threshold = null)
Expand All @@ -101,7 +120,7 @@ public static function suspendWorkspace(Workspace $workspace, $invoice = null, $
$suspension->workspace_id = $workspace->id;
$suspension->suspended_at = new DateTime();
$suspension->reason = 'payment_past_due';
$suspension->status = true;
$suspension->status = WorkspaceSuspensionStatus::REAL_SUSPENSION;
$isNewSuspension = true;
}

Expand All @@ -111,7 +130,7 @@ public static function suspendWorkspace(Workspace $workspace, $invoice = null, $
if (!$suspension->reason) {
$suspension->reason = 'payment_past_due';
}
$suspension->status = true;
$suspension->status = WorkspaceSuspensionStatus::REAL_SUSPENSION;

$suspension->save();

Expand Down
22 changes: 15 additions & 7 deletions app/app/Http/Controllers/Admin/WorkspaceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use App\PlanUsagePeriod;
use App\UserInvoice;
use App\Http\Requests\Admin\WorkspaceRequest;
use App\Enums\WorkspaceSuspensionStatus;
use App\Helpers\MainHelper;
use App\Helpers\WorkspaceHelper;
use App\Helpers\BillingDataHelper;
Expand Down Expand Up @@ -49,7 +50,8 @@ public function create()
{
$gracePeriodExtension = null;
$activeSuspension = null;
return view('admin.workspace.create_edit', compact('gracePeriodExtension', 'activeSuspension'));
$isWorkspaceSuspended = false;
return view('admin.workspace.create_edit', compact('gracePeriodExtension', 'activeSuspension', 'isWorkspaceSuspended'));
}

/**
Expand All @@ -62,7 +64,9 @@ public function store(WorkspaceRequest $request)

$workspace = new Workspace($request->except('grace_period_extension'));
$workspace->save();
WorkspaceSuspensionHelper::saveGracePeriodExtension($workspace, $request->input('grace_period_extension'));
if ($request->exists('grace_period_extension')) {
WorkspaceSuspensionHelper::saveGracePeriodExtension($workspace, $request->input('grace_period_extension'));
}
header("X-Goto-URL: /admin/workspace/" . $workspace->id . "/edit");
}

Expand All @@ -86,7 +90,8 @@ public function edit(Workspace $workspace)
$planHistory = PlanUsagePeriod::where("workspace_id", $workspace->id)->get();
$gracePeriodExtension = WorkspaceSuspensionHelper::getGracePeriodExtension($workspace->id);
$activeSuspension = WorkspaceSuspensionHelper::getActiveSuspension($workspace->id);
return view('admin.workspace.create_edit', compact('workspace', 'users', 'billingHistory', 'billingInfo', 'usageTriggers', 'routingACLs', 'planHistory', 'invoices', 'gracePeriodExtension', 'activeSuspension'));
$isWorkspaceSuspended = !empty($activeSuspension);
return view('admin.workspace.create_edit', compact('workspace', 'users', 'billingHistory', 'billingInfo', 'usageTriggers', 'routingACLs', 'planHistory', 'invoices', 'gracePeriodExtension', 'activeSuspension', 'isWorkspaceSuspended'));
}

/**
Expand All @@ -98,7 +103,9 @@ public function edit(Workspace $workspace)
public function update(WorkspaceRequest $request, Workspace $workspace)
{
$workspace->update($request->except('grace_period_extension'));
WorkspaceSuspensionHelper::saveGracePeriodExtension($workspace, $request->input('grace_period_extension'));
if ($request->exists('grace_period_extension')) {
WorkspaceSuspensionHelper::saveGracePeriodExtension($workspace, $request->input('grace_period_extension'));
}
header("X-Goto-URL: /admin/workspace/" . $workspace->id . "/edit");
}

Expand Down Expand Up @@ -133,15 +140,16 @@ public function destroy(Workspace $workspace)
public function data()
{
$globalGracePeriod = WorkspaceSuspensionHelper::getGlobalGracePeriod();
$realSuspensionStatus = WorkspaceSuspensionStatus::REAL_SUSPENSION;
$activeSuspensionSelect = Schema::hasTable('workspace_suspensions')
? DB::raw('(select count(*) from workspace_suspensions ws_status where ws_status.workspace_id = workspaces.id and ws_status.status = 1) as active_suspension')
? DB::raw("(select count(*) from workspace_suspensions ws_status where ws_status.workspace_id = workspaces.id and ws_status.status in ('" . $realSuspensionStatus . "', '1')) as active_suspension")
: DB::raw('0 as active_suspension');
$gracePeriodSources = array();
if (Schema::hasColumn('workspaces', 'grace_period_extension')) {
$gracePeriodSources[] = 'workspaces.grace_period_extension';
}
if (Schema::hasTable('workspace_suspensions')) {
$gracePeriodSources[] = '(select ws.grace_period_extension from workspace_suspensions ws where ws.workspace_id = workspaces.id and ws.status = 1 and ws.grace_period_extension is not null order by ws.suspended_at desc limit 1)';
$gracePeriodSources[] = "(select ws.grace_period_extension from workspace_suspensions ws where ws.workspace_id = workspaces.id and ws.status in ('" . $realSuspensionStatus . "', '1') and ws.grace_period_extension is not null order by ws.suspended_at desc limit 1)";
}
$gracePeriodSources[] = (int) $globalGracePeriod;
$gracePeriodSelect = DB::raw('COALESCE(' . implode(', ', $gracePeriodSources) . ') as grace_period');
Expand All @@ -156,7 +164,7 @@ public function data()
));

return Datatables::of($workspaces)
->edit_column('active', '@if ($active_suspension > 0) <span class="label label-danger">Suspended</span> @elseif ($active=="1") <span class="glyphicon glyphicon-ok"></span> @else <span class=\'glyphicon glyphicon-remove\'></span> @endif')
->edit_column('active', '@if ($active=="1") <span class="label label-success">Active</span> @elseif ($active_suspension > 0) <span class="label" style="background-color: #d9534f; color: #fff;">Suspended</span> @else <span class="label label-default">Inactive</span> @endif')
->edit_column('grace_period', '{{ $grace_period }} days')
->add_column('actions', '<a href="{{{ url(\'admin/workspace/\' . $id . \'/edit\' ) }}}" class="btn btn-success btn-sm iframe" ><span class="glyphicon glyphicon-pencil"></span> {{ trans("admin/modal.edit") }}</a>
<a href="{{{ url(\'admin/supportticket/?workspace_id=\' . $id) }}}" class="btn btn-success btn-sm" ><span class="glyphicon glyphicon-headphones"></span> {{ trans("admin/modal.support_tickets") }}</a>
Expand Down
2 changes: 1 addition & 1 deletion app/resources/views/admin/workspace/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<thead>
<tr>
<th>{!! trans("admin/workspaces.name") !!}</th>
<th>{!! trans("admin/workspaces.active") !!}</th>
<th>Account Status</th>
<th>Grace Period</th>
<th>{!! trans("admin/admin.created_at") !!}</th>
<th>{!! trans("admin/admin.action") !!}</th>
Expand Down
Loading