Plan.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Scopes\CompanyScope;
  4. use EloquentFilter\Filterable;
  5. use Illuminate\Database\Eloquent\Factories\HasFactory;
  6. use Illuminate\Database\Eloquent\Model;
  7. use Illuminate\Database\Eloquent\SoftDeletes;
  8. use App\Models\Enums\AssetACL;
  9. use Illuminate\Database\Eloquent\Builder;
  10. use Illuminate\Support\Facades\Auth;
  11. class Plan extends Model
  12. {
  13. use HasFactory, Filterable,SoftDeletes;
  14. protected $fillable = [
  15. 'title',
  16. 'asset_id',
  17. 'parent_id',
  18. 'begin',
  19. 'end',
  20. 'description',
  21. ];
  22. protected static function booted()
  23. {
  24. parent::booted(); // TODO: Change the autogenerated stub
  25. static::addGlobalScope(new CompanyScope);
  26. }
  27. public function scopeAllowed(Builder $query) : void
  28. {
  29. $planIds = Plan::query()->withoutGlobalScope(CompanyScope::class)->leftJoin("assets", "plans.asset_id", "=", "assets.id")
  30. ->where(function ($query){
  31. $query->where('assets.acl', AssetACL::PRIVATE->value)
  32. ->where('assets.owner', Auth::id());
  33. })
  34. ->orwhere(function ($query){
  35. $query->where('assets.acl', AssetACL::CUSTOM->value)
  36. ->where('assets.whitelist', 'like', '%,' .Auth::id() . ',%');
  37. })
  38. ->orwhere(function ($query){
  39. $query->where('assets.acl', AssetACL::PRIVATE->value)
  40. ->where('assets.created_by', Auth::id());
  41. })
  42. ->pluck("plans.id")->unique();
  43. $query->whereIn("id", $planIds->toArray())->where('company_id',Auth::user()->company_id);
  44. }
  45. public function requirements()
  46. {
  47. return $this->hasMany(Requirement::class);
  48. }
  49. public function projects()
  50. {
  51. return $this->belongsToMany(Project::class, 'project_plan', 'plan_id', 'project_id');
  52. }
  53. public function children()
  54. {
  55. return $this->hasMany(Plan::class, 'parent_id');
  56. }
  57. public function asset(){
  58. return $this->belongsTo(Asset::class);
  59. }
  60. }