diff --git a/app/Filters/SubscriptionFilters.php b/app/Filters/SubscriptionFilters.php new file mode 100644 index 000000000000..a7217fae7ea8 --- /dev/null +++ b/app/Filters/SubscriptionFilters.php @@ -0,0 +1,129 @@ +builder; + } + + return $this->builder->where(function ($query) use ($filter) { + $query->where('name', 'like', '%'.$filter.'%'); + }); + } + + /** + * Filters the list based on the status + * archived, active, deleted. + * + * @param string filter + * @return Builder + */ + public function status(string $filter = '') : Builder + { + if (strlen($filter) == 0) { + return $this->builder; + } + + $table = 'subscriptions'; + $filters = explode(',', $filter); + + return $this->builder->where(function ($query) use ($filters, $table) { + $query->whereNull($table.'.id'); + + if (in_array(parent::STATUS_ACTIVE, $filters)) { + $query->orWhereNull($table.'.deleted_at'); + } + + if (in_array(parent::STATUS_ARCHIVED, $filters)) { + $query->orWhere(function ($query) use ($table) { + $query->whereNotNull($table.'.deleted_at'); + + if (! in_array($table, ['users'])) { + $query->where($table.'.is_deleted', '=', 0); + } + }); + } + + if (in_array(parent::STATUS_DELETED, $filters)) { + $query->orWhere($table.'.is_deleted', '=', 1); + } + }); + } + + /** + * Sorts the list based on $sort. + * + * @param string sort formatted as column|asc + * @return Builder + */ + public function sort(string $sort) : Builder + { + $sort_col = explode('|', $sort); + + return $this->builder->orderBy($sort_col[0], $sort_col[1]); + } + + /** + * Returns the base query. + * + * @param int company_id + * @param User $user + * @return Builder + * @deprecated + */ + public function baseQuery(int $company_id, User $user) : Builder + { + $query = DB::table('subscriptions') + ->join('companies', 'companies.id', '=', 'subscriptions.company_id') + ->where('subscriptions.company_id', '=', $company_id); + + /* + * If the user does not have permissions to view all invoices + * limit the user to only the invoices they have created + */ + if (Gate::denies('view-list', Webhook::class)) { + $query->where('subscriptions.user_id', '=', $user->id); + } + + return $query; + } + + /** + * Filters the query by the users company ID. + * + * @return Illuminate\Database\Query\Builder + */ + public function entityFilter() + { + return $this->builder->company(); + } +} diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index 9a80137b50ff..6fb0fa9146e4 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -80,9 +80,9 @@ class SubscriptionController extends BaseController * ), * ) */ - public function index(): \Illuminate\Http\Response + public function index(SubscriptionFilters $filters): \Illuminate\Http\Response { - $subscriptions = Subscription::query()->company(); + $subscriptions = Subscription::filter($filters); return $this->listResponse($subscriptions); } diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php index 0b75dad02c9b..8f524fe0bf08 100644 --- a/app/Models/Subscription.php +++ b/app/Models/Subscription.php @@ -11,6 +11,7 @@ namespace App\Models; +use App\Models\Filterable; use App\Models\RecurringInvoice; use App\Services\Subscription\SubscriptionService; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -19,7 +20,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; class Subscription extends BaseModel { - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, Filterable; protected $hidden = [ 'id',