TicketType::class, 'status' => TicketStatus::class ]; protected $fillable = [ 'project_id', 'type', 'status', 'text' ]; protected static function booted() { static::creating(function (Ticket $ticket) { // If evolution force the ticket status on estimateTodo if ($ticket->type->equals(TicketType::evolution())) { $ticket->status = TicketStatus::estimateTodo(); } }); static::updating(function (Ticket $ticket) { $oldStatus = Ticket::where('id', $ticket->id)->first()->status; if (!$ticket->status->equals($oldStatus)) { event(new TicketStatusChanged($ticket, $oldStatus)); event(new NotifySubscriptions($ticket, sprintf( 'Le ticket à changé de status : %s', $ticket->status->label ))); } }); } public function project() { return $this->belongsTo(Project::class); } public function user() { return $this->belongsTo(User::class, 'created_by'); } public function messages() { return $this->hasMany(Message::class, 'ticket_id'); } public function subscriptions() { return $this->belongsToMany(User::class, 'subscriptions'); } public static function saveFile(Project $project, Ticket $ticket, TicketType $type, UploadedFile $file) { $projectAssetFullPath = Project::ticketAssetsFullPath($project->slug_name); $fileAssetPath = Project::ticketAssetsPath($project->slug_name); $fileName = sprintf( '%s-%s-%d-%d.%s', $project->slug_name, $type->getDefinition(), $ticket->id, rand(), $file->extension() ); $file->move(sprintf('%s/%d', $projectAssetFullPath, $ticket->id), $fileName); return sprintf('%s/%d/%s', $fileAssetPath, $ticket->id, $fileName); } }