Requirement.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 Illuminate\Database\Eloquent\Builder;
  9. use App\Models\Enums\AssetACL;
  10. use Illuminate\Support\Facades\Auth;
  11. class Requirement extends Model
  12. {
  13. use HasFactory,SoftDeletes,Filterable;
  14. protected $fillable = [
  15. 'title',
  16. 'asset_id',
  17. 'status',
  18. 'requirement_group_id',
  19. 'priority',
  20. 'note',
  21. 'description',
  22. 'acceptance',
  23. 'mailto',
  24. 'company_id',
  25. 'comment',
  26. 'reviewed_by',
  27. 'note',
  28. 'plan_id'
  29. ];
  30. protected $casts = [
  31. 'mailto' => 'array',
  32. ];
  33. protected static function booted()
  34. {
  35. parent::booted(); // TODO: Change the autogenerated stub
  36. static::addGlobalScope(new CompanyScope);
  37. }
  38. public function scopeAllowed(Builder $query) : void
  39. {
  40. $requirementsIds = Requirement::query()->withoutGlobalScope(CompanyScope::class)->leftJoin("assets", "requirements.asset_id", "=", "assets.id")
  41. ->where(function ($query){
  42. $query->where('assets.acl', AssetACL::PRIVATE->value)
  43. ->where('assets.owner', Auth::id());
  44. })
  45. ->orwhere(function ($query){
  46. $query->where('assets.acl', AssetACL::CUSTOM->value)
  47. ->where('assets.whitelist', 'like', '%,' .Auth::id() . ',%');
  48. })
  49. ->orwhere(function ($query){
  50. $query->where('assets.acl', AssetACL::PRIVATE->value)
  51. ->where('assets.created_by', Auth::id());
  52. })
  53. ->orwhere(function ($query){
  54. $query->whereNull('requirements.asset_id');
  55. })
  56. ->pluck("requirements.id")->unique();
  57. $query->whereIn("id", $requirementsIds->toArray())->where('company_id',Auth::user()->company_id);
  58. }
  59. public function createdBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  60. {
  61. return $this->belongsTo(User::class, 'created_by');
  62. }
  63. public function reviewedBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  64. {
  65. return $this->belongsTo(User::class, 'reviewed_by');
  66. }
  67. public function asset(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  68. {
  69. return $this->belongsTo(Asset::class);
  70. }
  71. public function plan(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  72. {
  73. return $this->belongsTo(Plan::class);
  74. }
  75. public function group(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  76. {
  77. return $this->belongsTo(RequirementGroup::class, "requirement_group_id");
  78. }
  79. public function tasks(): \Illuminate\Database\Eloquent\Relations\HasMany
  80. {
  81. return $this->hasMany(Task::class);
  82. }
  83. public function projects():\Illuminate\Database\Eloquent\Relations\BelongsToMany
  84. {
  85. return $this->belongsToMany(Project::class, 'project_requirement');
  86. }
  87. }