'', ]; /** * Site * * @param array $attributes */ public function __construct(array $attributes = []) { self::$editableProperties = [ 'name' => [ 'label' => trans('Nom'), 'type' => CrudType::string(), 'validate' => [ 'string', 'max:255', // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed function ($attribute, $value, $fail) { $q = static::query(); if (request()->site) { $q = $q->where('id', '!=', $this->id); } if ($q->where('name', $value)->exists()) { $fail(__(':attribute est déjà utilisé', [ 'attribute' => $attribute ])); } } ], 'required' => true, 'nullable' => false, 'actions' => [ CrudAction::viewAny(), CrudAction::view(), CrudAction::create(), CrudAction::update(), ] ], 'status' => [ 'label' => trans('État'), 'type' => CrudType::string(), 'validate' => [ 'string', 'max:255' ], 'required' => true, 'nullable' => false, 'actions' => [ CrudAction::view(), CrudAction::create(), CrudAction::update(), ] ], 'description' => [ 'label' => trans('Description'), 'type' => CrudType::text(), 'validate' => [ 'string' ], 'required' => true, 'nullable' => false, 'actions' => [ CrudAction::view(), CrudAction::create(), CrudAction::update(), ] ], 'todo' => [ 'label' => trans('À Faire'), 'type' => CrudType::text(), 'required' => false, 'nullable' => true, 'actions' => [ CrudAction::view(), CrudAction::create(), CrudAction::update(), ] ], 'users' => [ 'label' => trans('Utilisateurs'), 'type' => CrudType::belongsToMany(), 'belongsToMany' => User::class, 'belongsToManyLabel' => 'name', 'nullable' => true, 'readonly' => function () { /** @var \App\Models\User */ $user = auth()->user(); return !$user->isAdmin(); }, 'actions' => [ CrudAction::viewAny(), CrudAction::view(), CrudAction::create(), CrudAction::update(), ] ], 'projects' => [ 'label' => trans('Projets'), 'type' => CrudType::belongsToMany(), 'belongsToMany' => Project::class, 'belongsToManyLabel' => 'name', 'nullable' => true, 'readonly' => function () { /** @var \App\Models\User */ $user = auth()->user(); return !$user->isAdmin(); }, 'actions' => [ CrudAction::viewAny(), CrudAction::view(), CrudAction::create(), CrudAction::update() ] ] ]; parent::__construct($attributes); } /** * Perform any actions required after the model boots. * * @return void */ protected static function booted() { static::created(function (Site $site) { $path = Site::ticketAssetsFullPath($site->slug_name); if (!File::exists($path)) { File::makeDirectory($path, 0755, true); } }); static::updating(function (Site $site) { $oldName = Site::where('id', $site->id)->first()->name; $oldPath = Site::ticketAssetsFullPath($oldName); $newPath = Site::ticketAssetsFullPath($site->slug_name); if (File::exists($oldPath)) { File::move($oldPath, $newPath); } elseif (!File::exists($newPath)) { File::makeDirectory($newPath, 0755, true); } }); static::updated(function (Site $site) { event(new SiteUpdated($site, \auth()->user())); }); static::deleted(function (Site $site) { $path = Site::ticketAssetsFullPath($site->slug_name); if (File::exists($path)) { File::deleteDirectory($path); } }); } // * RELATIONSHIPS /** * HasMany Message relation * The users of type client that would have access to this site tickets * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function users() { return $this->belongsToMany(User::class); } /** * HasMany Ticket relation * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function tickets() { return $this->hasMany(Ticket::class, 'site_id'); } /** * BelongsToMany Project relation * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function projects() { return $this->belongsToMany(Project::class); } /** * MorphMany Log relation * * @return \Illuminate\Database\Eloquent\Relations\MorphMany */ public function logs() { return $this->morphMany(Log::class, 'parent'); } /** * MorphMany File relation * * @return \Illuminate\Database\Eloquent\Relations\MorphMany */ public function files() { return $this->morphMany(File::class, 'parent'); } // * METHODS /** * Getter slugName * * @return string */ public function getSlugNameAttribute(): string { return Str::slug($this->name); } public static function ticketAssetsFullPath(string $str) { return public_path(self::ticketAssetsPath($str)); } public static function ticketAssetsPath(string $str) { return sprintf('fichiers/%s', $str); } }