Kanban.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Database\Eloquent\SoftDeletes;
  6. /**
  7. * @property int $id
  8. * @property int|null $unit_id
  9. * @property string $title
  10. * @property string|null $description
  11. * @property \Illuminate\Support\Carbon|null $created_at
  12. * @property \Illuminate\Support\Carbon|null $updated_at
  13. * @property \Illuminate\Support\Carbon|null $deleted_at
  14. * @property string $phase
  15. * @property string $priority
  16. * @property string $origin
  17. * @property string $scope
  18. * @property string|null $sector
  19. * @property \Illuminate\Support\Carbon|null $due_date
  20. * @property int|null $responsible_user_id
  21. * @property int|null $created_by_user_id
  22. * @property int|null $target_unit_id
  23. * @property int $order
  24. * @property-read \App\Models\Unit|null $applicantUnit
  25. * @property-read \App\Models\User|null $createdByUser
  26. * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\KanbanReply> $replies
  27. * @property-read int|null $replies_count
  28. * @property-read \App\Models\User|null $responsibleUser
  29. * @property-read \App\Models\Unit|null $targetUnit
  30. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban newModelQuery()
  31. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban newQuery()
  32. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban onlyTrashed()
  33. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban query()
  34. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban visibleToUnit(int $unitId)
  35. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereCreatedAt($value)
  36. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereCreatedByUserId($value)
  37. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereDeletedAt($value)
  38. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereDescription($value)
  39. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereDueDate($value)
  40. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereId($value)
  41. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereOrder($value)
  42. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereOrigin($value)
  43. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban wherePhase($value)
  44. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban wherePriority($value)
  45. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereResponsibleUserId($value)
  46. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereScope($value)
  47. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereSector($value)
  48. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereTargetUnitId($value)
  49. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereTitle($value)
  50. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereUnitId($value)
  51. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban whereUpdatedAt($value)
  52. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban withTrashed(bool $withTrashed = true)
  53. * @method static \Illuminate\Database\Eloquent\Builder<static>|Kanban withoutTrashed()
  54. * @mixin \Eloquent
  55. */
  56. class Kanban extends Model
  57. {
  58. use HasFactory, SoftDeletes;
  59. protected $table = 'kanbans';
  60. protected $guarded = ['id'];
  61. protected $casts = [
  62. 'created_at' => 'datetime',
  63. 'updated_at' => 'datetime',
  64. 'due_date' => 'date',
  65. ];
  66. // Relationships
  67. public function applicantUnit()
  68. {
  69. return $this->belongsTo(Unit::class, 'unit_id');
  70. }
  71. public function targetUnit()
  72. {
  73. return $this->belongsTo(Unit::class, 'target_unit_id');
  74. }
  75. public function responsibleUser()
  76. {
  77. return $this->belongsTo(User::class, 'responsible_user_id');
  78. }
  79. public function createdByUser()
  80. {
  81. return $this->belongsTo(User::class, 'created_by_user_id');
  82. }
  83. public function replies()
  84. {
  85. return $this->hasMany(KanbanReply::class, 'kanban_id');
  86. }
  87. // Query Scopes
  88. public function scopeVisibleToUnit($query, int $unitId)
  89. {
  90. return $query->where(function ($q) use ($unitId) {
  91. // Cards created by this unit (origin = unit)
  92. $q->where('unit_id', $unitId)
  93. // Cards explicitly targeted at this unit (specific or broadcast-per-unit)
  94. ->orWhere('target_unit_id', $unitId);
  95. // Note: scope='all' is NOT used here — when broadcasting the controller
  96. // already creates one card per unit each with its own target_unit_id,
  97. // so filtering by target_unit_id is sufficient and correct.
  98. });
  99. }
  100. }