58 lines
1.6 KiB
PHP
58 lines
1.6 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Models;
|
||
|
|
|
||
|
|
use Illuminate\Database\Eloquent\Model;
|
||
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Chat Messenger élève ↔ prof de sa classe (règles d'Adam, 2026-10-13) :
|
||
|
|
* un seul fil par élève, jamais de message privé entre élèves.
|
||
|
|
*/
|
||
|
|
class FilConversation extends Model
|
||
|
|
{
|
||
|
|
protected $table = 'fils_conversation';
|
||
|
|
|
||
|
|
protected $fillable = ['classe_id', 'eleve_id', 'lu_par_prof_a', 'lu_par_eleve_a'];
|
||
|
|
|
||
|
|
protected $casts = [
|
||
|
|
'lu_par_prof_a' => 'datetime',
|
||
|
|
'lu_par_eleve_a' => 'datetime',
|
||
|
|
];
|
||
|
|
|
||
|
|
/** @return BelongsTo<Classe, $this> */
|
||
|
|
public function classe(): BelongsTo
|
||
|
|
{
|
||
|
|
return $this->belongsTo(Classe::class);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @return BelongsTo<Eleve, $this> */
|
||
|
|
public function eleve(): BelongsTo
|
||
|
|
{
|
||
|
|
return $this->belongsTo(Eleve::class);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @return HasMany<MessageChat, $this> */
|
||
|
|
public function messages(): HasMany
|
||
|
|
{
|
||
|
|
return $this->hasMany(MessageChat::class)->orderBy('created_at');
|
||
|
|
}
|
||
|
|
|
||
|
|
public function nonLusPourProf(): int
|
||
|
|
{
|
||
|
|
return $this->messages()
|
||
|
|
->where('expediteur', MessageChat::ELEVE)
|
||
|
|
->when($this->lu_par_prof_a, fn ($q) => $q->where('created_at', '>', $this->lu_par_prof_a))
|
||
|
|
->count();
|
||
|
|
}
|
||
|
|
|
||
|
|
public function nonLusPourEleve(): int
|
||
|
|
{
|
||
|
|
return $this->messages()
|
||
|
|
->where('expediteur', MessageChat::PROF)
|
||
|
|
->when($this->lu_par_eleve_a, fn ($q) => $q->where('created_at', '>', $this->lu_par_eleve_a))
|
||
|
|
->count();
|
||
|
|
}
|
||
|
|
}
|