51 lines
1.6 KiB
PHP
51 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class Task extends Model {
|
|
use HasFactory;
|
|
|
|
protected $fillable = [
|
|
'user_id', 'project_id', 'title', 'description', 'priority',
|
|
'estimate_min', 'deadline', 'recurrence',
|
|
'done', 'done_at', 'snooze_until',
|
|
];
|
|
|
|
protected $casts = [
|
|
'done' => 'boolean',
|
|
'done_at' => 'datetime',
|
|
'snooze_until' => 'datetime',
|
|
'deadline' => 'datetime',
|
|
];
|
|
|
|
public function user(): BelongsTo { return $this->belongsTo(User::class); }
|
|
public function project(): BelongsTo { return $this->belongsTo(Project::class); }
|
|
public function tags(): BelongsToMany { return $this->belongsToMany(Tag::class); }
|
|
|
|
/** Tareas activas (no hechas y no snoozed) */
|
|
public function scopeActive(Builder $q): Builder {
|
|
return $q->where('done', false)
|
|
->where(function ($q2) {
|
|
$q2->whereNull('snooze_until')
|
|
->orWhere('snooze_until', '<=', now());
|
|
});
|
|
}
|
|
|
|
public function scopeForUser(Builder $q, int $userId): Builder {
|
|
return $q->where('user_id', $userId);
|
|
}
|
|
|
|
public function getNextDueInAttribute(): int {
|
|
if (! $this->deadline) return 0;
|
|
if ($this->deadline->isPast()) return 0;
|
|
return max(0, now()->diffInSeconds($this->deadline, false));
|
|
}
|
|
}
|