Initial commit

This commit is contained in:
Developer
2025-04-21 16:03:20 +02:00
commit 2832896157
22874 changed files with 3092801 additions and 0 deletions

106
app/Nova/Comment.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Http\Requests\NovaRequest;
class Comment extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Comments\Models\Comment::class;
public static $group = 'Content';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'body';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'body'
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('Creator', 'user', 'App\Nova\User')
->onlyOnIndex(),
BelongsTo::make('Feed')
->readonly(),
Text::make('Body')
->displayUsing(function($id) {
$part = strip_tags(mb_substr($id, 0, 100));
return $part . " ...";
})->onlyOnIndex(),
BelongsTo::make('Parent', 'parent', \App\Nova\Comment::class),
HasMany::make('Children', 'children', \App\Nova\Comment::class),
Textarea::make('Body')->alwaysShow()->showOnDetail(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

140
app/Nova/Complaint.php Normal file
View File

@@ -0,0 +1,140 @@
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\MorphTo;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Http\Requests\NovaRequest;
class Complaint extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Complaints\Models\Complaint::class;
public static $group = 'Complaints';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'id';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id',
];
public static function indexQuery(NovaRequest $request, $query)
{
if ($request->user()->hasRole('moderator')) {
$resourceRelationship = $request->get('viaResource');
if (empty($resourceRelationship)) {
return $query->where(function ($query) use ($request) {
$query->where('moderator_checking_id', $request->user()->id)->orWhere('moderator_checking_id', null);
});
}
}
}
public static function relatableUsers(NovaRequest $request, $query)
{
return $query->whereHas('roles', function ($query) {
$query->where('name', 'moderator');
});
}
public static $with = ['reason', 'user', 'moderator'];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('User')
->onlyOnIndex(),
BelongsTo::make('Moderator', 'moderator', 'App\Nova\User')
//->readonly(optional($this->resource)->user_checking_id !== null)
->readonly()
->withoutTrashed(),
BelongsTo::make('Reason')
->readonly(),
BelongsTo::make('Feed')
->readonly()->sortable(),
Select::make('Status')->options([
'pending' => 'Pending',
'reviewed_bad' => 'Reviewed Bad',
'reviewed_ok' => 'Reviewed Ok',
]),
Textarea::make('Message')->alwaysShow()->rules('required'),
DateTime::make('Created At')->format('DD MMM YYYY')->onlyOnIndex(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

View File

@@ -0,0 +1,124 @@
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\MorphTo;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Http\Requests\NovaRequest;
class ComplaintComment extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Complaints\Models\CommentComplaint::class;
public static $group = 'Complaints';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'id';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id',
];
public static function relatableUsers(NovaRequest $request, $query)
{
return $query->whereHas('roles', function ($query) {
$query->where('name', 'moderator');
});
}
public static $with = ['reason', 'user', 'moderator'];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('User')
->onlyOnIndex(),
BelongsTo::make('Moderator', 'moderator', 'App\Nova\User')
->readonly()
->withoutTrashed(),
BelongsTo::make('Reason')
->readonly(),
BelongsTo::make('Comment')
->readonly()->sortable(),
Select::make('Status')->options([
'pending' => 'Pending',
'reviewed_bad' => 'Reviewed Bad',
'reviewed_ok' => 'Reviewed Ok',
]),
Textarea::make('Message')->alwaysShow()->rules('required'),
DateTime::make('Created At')->format('DD MMM YYYY')->onlyOnIndex(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

150
app/Nova/Feed.php Normal file
View File

@@ -0,0 +1,150 @@
<?php
namespace App\Nova;
use App\Domain\Feeds\Enums\StatusEnum;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\MorphMany;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Domain\Feeds\Models\Feed as ModelsFeed;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
class Feed extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = ModelsFeed::class;
public static $group = 'Content';
// /**
// * The single value that should be used to represent the resource when being displayed.
// *
// * @var string
// */
// public static $title = 'title';
/**
* Get the value that should be displayed to represent the resource.
*
* @return string
*/
public function title()
{
if(empty($this->title)){
return $this->id;
}
return $this->title;
}
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'title', 'body'
];
public static function indexQuery(NovaRequest $request, $query)
{
return $query->where('status', 1)->where('is_ads', false);
}
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('Creator', 'user', 'App\Nova\User')
->onlyOnIndex(),
Files::make('Media Preview', 'preview')->readonly(),
Files::make('Media', 'common')->readonly(),
Files::make('Media Paid', 'paid')->readonly(),
Text::make('Title'),
Text::make('Slug')->readonly(),
Select::make('Type')->options([
'images' => 'Изображение',
'musics' => 'Аудио',
'videos' => 'Видео',
])->readonly()->displayUsingLabels(),
Text::make('Price')->readonly(),
Textarea::make('Body')->alwaysShow()->hideFromIndex(),
HasMany::make('Comments'),
HasMany::make('Complaints'),
DateTime::make('Created At')->format('DD MMM YYYY'),
DateTime::make('Updated At')->hideFromIndex(),
// Select::make('Status')->options([
// (string) StatusEnum::PENDING() => 'pending',
// (string) StatusEnum::APPROVED() => 'approved',
// (string) StatusEnum::BANNED() => 'banned',
// (string) StatusEnum::EDITABLE() => 'editable',
// ])->displayUsingLabels()->onlyOnIndex()->sortable(),
// Select::make('Status')->options([
// (string) StatusEnum::APPROVED() => 'approved',
// (string) StatusEnum::BANNED() => 'banned',
// ])->displayUsingLabels()->hideFromIndex()->hideWhenCreating(),
// Textarea::make('Status Note')->hideWhenCreating(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

126
app/Nova/FeedAds.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
namespace App\Nova;
use App\Domain\Feeds\Enums\StatusEnum;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\MorphMany;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Domain\Feeds\Models\Feed as ModelsFeed;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
class FeedAds extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = ModelsFeed::class;
public static $group = 'Content';
// /**
// * The single value that should be used to represent the resource when being displayed.
// *
// * @var string
// */
// public static $title = 'title';
/**
* Get the value that should be displayed to represent the resource.
*
* @return string
*/
public function title()
{
return $this->id;
}
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'title', 'body'
];
public static function indexQuery(NovaRequest $request, $query)
{
return $query->where('is_ads', true);
}
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
Files::make('Media Preview', 'preview'),
Files::make('Media', 'common'),
Text::make('Title')->rules('required'),
Select::make('Type')->options([
'images' => 'Изображение',
// 'musics' => 'Аудио',
'videos' => 'Видео',
])->displayUsingLabels()->rules('required'),
Textarea::make('Body')->rules('required')->alwaysShow()->hideFromIndex(),
DateTime::make('Created At')->format('DD MMM YYYY')->onlyOnIndex(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

177
app/Nova/FeedApproved.php Normal file
View File

@@ -0,0 +1,177 @@
<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\MorphMany;
use App\Domain\Feeds\Enums\StatusEnum;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Nova\Filters\SubscriptionStatusFilter;
use App\Domain\Feeds\Models\Feed as ModelsFeed;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Carbon\Carbon;
use Laravel\Nova\Fields\Boolean;
class FeedApproved extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = ModelsFeed::class;
public static $group = 'Content';
// /**
// * The single value that should be used to represent the resource when being displayed.
// *
// * @var string
// */
// public static $title = 'title';
/**
* Get the value that should be displayed to represent the resource.
*
* @return string
*/
public function title()
{
if(empty($this->title)){
return $this->id;
}
return $this->title;
}
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'title', 'body'
];
public static function indexQuery(NovaRequest $request, $query)
{
return $query->where('status', '!=', 1)->where('is_ads', false)->with('user.subscription');
}
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('Creator', 'user', 'App\Nova\User')
->onlyOnIndex(),
Select::make('Тип пользователя', 'userType')->options([
1 => 'Физ. лицо',
2 => 'Самозанятый',
3 => 'Юридическое лицо',
4 => 'ИП',
])->displayUsingLabels()->readonly(),
Boolean::make('Подписка', function () {
$last = $this->user->subscription->first();
if ($last && $last->ends_at > Carbon::now()) {
return true;
}
return false;
})->onlyOnIndex(),
Files::make('Media Preview', 'preview')->readonly(),
Files::make('Media', 'common')->readonly(),
Files::make('Media Paid', 'paid')->readonly(),
Text::make('Title'),
Text::make('Slug')->readonly()->hideFromIndex(),
Select::make('Type')->options([
'images' => 'Изображение',
'musics' => 'Аудио',
'videos' => 'Видео',
])->readonly()->displayUsingLabels(),
Text::make('Price')->readonly(),
Textarea::make('Body')->alwaysShow()->hideFromIndex(),
HasMany::make('Comments'),
HasMany::make('Complaints'),
DateTime::make('Created At')->format('DD MMM YYYY'),
DateTime::make('Updated At')->hideFromIndex(),
Text::make('StatusText', function ($model) {
if($model->status === StatusEnum::PENDING()){
return 'Нужно проверить';
}
if($model->status === StatusEnum::BANNED()){
return 'Рассмотрено - есть проблемы';
}
if($model->status === StatusEnum::EDITABLE()){
return 'Нужно повторно рассмотреть';
}
})->onlyOnIndex(),
Select::make('Status')->options([
(string) StatusEnum::APPROVED() => 'Одобрено',
(string) StatusEnum::BANNED() => 'Есть недочеты',
])->hideFromIndex()->displayUsingLabels()->hideWhenCreating(),
Textarea::make('Status Note')->hideWhenCreating(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [
new SubscriptionStatusFilter(),
];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Nova\Filters;
use Illuminate\Http\Request;
use Laravel\Nova\Filters\Filter;
class StatusWithdrawalFilter extends Filter
{
/**
* The filter's component.
*
* @var string
*/
public $component = 'select-filter';
public function name()
{
return "Статус";
}
public function authorize(Request $request)
{
return true;
}
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(Request $request, $query, $value)
{
return $query->where('status', $value);
}
/**
* Get the filter's available options.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function options(Request $request)
{
return [
'В ожидании на вывод' => 'pending',
'Выполнен' => 'success',
'Отменен' => 'cancel',
];
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Nova\Filters;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Laravel\Nova\Filters\Filter;
class SubscriptionStatusFilter extends Filter
{
/**
* The filter's component.
*
* @var string
*/
public $component = 'select-filter';
public function name()
{
return 'Подписка';
}
public function authorize(Request $request)
{
return true;
}
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(Request $request, $query, $value)
{
if ($value === 'active') {
// Фильтруем записи, где у пользователя есть активная подписка
$query->whereHas('user.subscription', function ($q) {
$q->where('ends_at', '>', Carbon::now());
});
} elseif ($value === 'inactive') {
// Фильтруем записи, где у пользователя нет активной подписки
$query->where(function ($q) {
$q->whereDoesntHave('user.subscription')
->orWhere(function ($q) {
$q->whereHas('user.subscription', function ($q) {
$q->where('ends_at', '<=', Carbon::now());
})->whereDoesntHave('user.subscription', function ($q) {
$q->where('ends_at', '>', Carbon::now());
});
});
});
}
return $query;
}
/**
* Get the filter's available options.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function options(Request $request)
{
return [
'Активна' => 'active',
'Неактивна' => 'inactive',
];
}
}

102
app/Nova/Package.php Normal file
View File

@@ -0,0 +1,102 @@
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
class Package extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Subscriptions\Models\Package::class;
public static $group = 'Subscription';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'name';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'name'
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
Text::make('Name')->rules('required'),
Number::make('Price')->min(1)->step(0.01)->rules('required'),
Select::make('Type')->options([
'month' => 'Month',
'month3' => '3 Month',
])->rules('required'),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

110
app/Nova/Point.php Normal file
View File

@@ -0,0 +1,110 @@
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\BooleanGroup;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Sparkline;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Http\Requests\NovaRequest;
class Point extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Points\Models\Point::class;
public static $group = 'Finance';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'id';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id',
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('User')
->searchable()
->withSubtitles()
->rules('required'),
Number::make('Point')->min(1)->step(0.01),
Select::make('Direction')->options([
0 => 'Приход', // COMING
1 => 'Расход', // EXPENSE
])->rules('required')->displayUsingLabels(),
Textarea::make('Comment')->alwaysShow(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

94
app/Nova/Reason.php Normal file
View File

@@ -0,0 +1,94 @@
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
class Reason extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Complaints\Models\Reason::class;
public static $group = 'Complaints';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'name';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'name',
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
Text::make('Name')
->rules('required', 'max:255'),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

59
app/Nova/Resource.php Normal file
View File

@@ -0,0 +1,59 @@
<?php
namespace App\Nova;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Resource as NovaResource;
abstract class Resource extends NovaResource
{
/**
* Build an "index" query for the given resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
return $query;
}
/**
* Build a Scout search query for the given resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Laravel\Scout\Builder $query
* @return \Laravel\Scout\Builder
*/
public static function scoutQuery(NovaRequest $request, $query)
{
return $query;
}
/**
* Build a "detail" query for the given resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public static function detailQuery(NovaRequest $request, $query)
{
return parent::detailQuery($request, $query);
}
/**
* Build a "relatable" query for the given resource.
*
* This query determines which instances of the model may be attached to other resources.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public static function relatableQuery(NovaRequest $request, $query)
{
return parent::relatableQuery($request, $query);
}
}

172
app/Nova/User.php Normal file
View File

@@ -0,0 +1,172 @@
<?php
namespace App\Nova;
use Carbon\Carbon;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Gravatar;
use Laravel\Nova\Fields\Password;
use Laravel\Nova\Fields\MorphToMany;
use Laravel\Nova\Fields\BelongsToMany;
use Vyuldashev\NovaPermission\RoleBooleanGroup;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Vyuldashev\NovaPermission\PermissionBooleanGroup;
class User extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Models\User::class;
public static $with = ['media', 'roles', 'permissions', 'subscription'];
public static $group = 'Users';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public function title()
{
return $this->first_name;
}
public function subtitle()
{
return "Username: {$this->username}";
}
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'first_name', 'last_name', 'username', 'email',
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make()->sortable(),
// Gravatar::make()->maxWidth(50),
Text::make('Имя', 'Name', function () {
return $this->first_name.' '.$this->last_name;
})->onlyOnIndex(),
Text::make('Username')
->rules('required', 'max:255')
->creationRules('unique:users,username')
->updateRules('unique:users,username,{{resourceId}}'),
Text::make('Имя', 'first_name')
->onlyOnForms()
->rules('required', 'max:255'),
Text::make('Фамилия', 'last_name')
->onlyOnForms(),
Text::make('Tелефон', 'phone'),
Text::make('ИНН', 'inn')->hideFromIndex(),
Text::make('Расчетный счет', 'checking_account')->hideFromIndex(),
Text::make('Бик банка', 'bik')->hideFromIndex(),
Text::make('Почта', 'email')
->sortable()
->rules('required', 'email', 'max:254')
->creationRules('unique:users,email')
->updateRules('unique:users,email,{{resourceId}}'),
Password::make('Password')
->onlyOnForms()
->creationRules('required', 'string', 'min:4')
->updateRules('nullable', 'string', 'min:4'),
RoleBooleanGroup::make('Roles'),
PermissionBooleanGroup::make('Permissions'),
BelongsToMany::make('Votes')->fields(function () {
return [
Text::make('Payment'),
];
}),
Boolean::make('Вер.: телефон', 'phone_verified'),
Boolean::make('Вер.: паспорт', 'passport_verified'),
Boolean::make('Загружен док.?', function () {
return $this->media->count() ? true : false;
})->onlyOnIndex(),
Boolean::make('Подписка', function () {
$last = $this->subscription()->first();
if (empty($last)) {
return false;
}
if ($last->ends_at > Carbon::now()) {
return true;
}
return false;
})->onlyOnIndex(),
Files::make('Документ', 'documents')->readonly(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
}

124
app/Nova/Vote.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Ysv\NovaLeader\NovaLeader;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Http\Requests\NovaRequest;
class Vote extends Resource
{
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Votes\Models\Vote::class;
public static $group = 'Subscription';
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'id';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id',
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
Number::make('Процент сайта', 'procent_site')->min(1)->step(0.01)->rules('required')->default(function ($request) {
return nova_get_setting('vote_procent_site');
}),
Number::make('Процент лидера', 'procent_top')->min(1)->step(0.01)->rules('required')->default(function ($request) {
return nova_get_setting('vote_procent_leader');
}),
Number::make('Процент локального лидера', 'procent_local')->min(1)->step(0.01)->rules('required')->default(function ($request) {
return nova_get_setting('vote_procent_local_leader');
}),
Boolean::make('Платный режим включен', 'type')->rules('required')->default(function ($request) {
return nova_get_setting('vote_paid_mode');
}),
DateTime::make('Created At')->format('DD MMM YYYY'),
BelongsToMany::make('Users')->fields(function () {
return [
Text::make('Payment'),
];
}),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [
(new NovaLeader)->currentLeader(),
];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
// protected static function afterCreationValidation(NovaRequest $request, $validator)
// {
// // $validator->errors()->add('field', 'Something is wrong with this field!');
// }
}

167
app/Nova/Withdrawal.php Normal file
View File

@@ -0,0 +1,167 @@
<?php
namespace App\Nova;
use Carbon\Carbon;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Nova\Filters\StatusWithdrawalFilter;
use App\Nova\Filters\SubscriptionStatusFilter;
class Withdrawal extends Resource
{
public static $group = 'Finance';
/**
* The model the resource corresponds to.
*
* @var string
*/
public static $model = \App\Domain\Payments\Models\Withdrawal::class;
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'id';
// public static $with = ['user.subscription'];
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'amount'
];
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
ID::make(__('ID'), 'id')->sortable(),
BelongsTo::make('User')->readonly(),
Select::make('Тип пользователя', 'userType')->options([
1 => 'Физ. лицо',
2 => 'Самозанятый',
3 => 'Юридическое лицо',
4 => 'ИП',
])->displayUsingLabels()->readonly(),
Text::make('Реквизиты', 'requisites')
->readonly(),
Text::make('Телефон', 'userPhone')
->readonly(),
Number::make('Amount')->min(1)->step(0.01)->readonly(),
Select::make('Status')->options([
'pending' => 'В ожидании',
'success' => 'Выполнен',
'cancel' => 'Отменен',
])->displayUsingLabels()->readonly(optional($this->resource)->status !== 'pending'),
Boolean::make('Подписка', function () {
$last = $this->user->subscription->first();
if ($last && $last->ends_at > Carbon::now()) {
return true;
}
return false;
})->onlyOnIndex(),
Textarea::make('Данные платежа', 'history_payment_details')->alwaysShow()->readonly(),
Textarea::make('Примечания (причина отказа)', 'description')->alwaysShow()->readonly(optional($this->resource)->status !== 'pending'),
DateTime::make('Created At')->format('DD MMM YYYY')->readonly(),
DateTime::make('Updated At')->hideFromIndex()->readonly(),
];
}
/**
* Get the cards available for the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function cards(Request $request)
{
return [
];
}
/**
* Get the filters available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function filters(Request $request)
{
return [
new StatusWithdrawalFilter(),
new SubscriptionStatusFilter(),
];
}
/**
* Get the lenses available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function lenses(Request $request)
{
return [];
}
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [];
}
protected static function afterUpdateValidation(NovaRequest $request, $validator)
{
if($request->created_at !== $request->updated_at){
$validator->errors()->add('status', 'Данный платеж только для чтения!');
return;
}
$status = $request->status;
$description = $request->description;
if($status === 'cancel' && empty($description)){
$validator->errors()->add('description', 'Нужно указать причину отмены платежа!');
}
}
public static function indexQuery(NovaRequest $request, $query)
{
return $query->with('user.subscription');
}
}