Plan.php 2.1 KB

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