Accademia

User └── Business accademia └── Funnel └── Services └── Level └── Task
Rete └── Business accademia └── Funnel └── Services └── Level └── profiles ├── tasks │ └── invites │ └── transactions ├── contacts └── locations

class User < ApplicationRecord
  has_many :user_progresses
  has_many :programs, through: :user_progresses
end

class Program < ApplicationRecord
  has_many :levels
  enum mode: { self_paced: 0, supervised: 1 } # Modalità del programma
end

class Sheet < ApplicationRecord
  belongs_to :program
  has_many :tasks
end

class Task < ApplicationRecord
  belongs_to :level
  has_many :user_tasks
end

class UserProgress < ApplicationRecord
  belongs_to :user
  belongs_to :program
  belongs_to :level
  belongs_to :professional, optional: true # Se supervised, assegnato a un professionista

  enum mode: { self_paced: 0, supervised: 1 }

  def check_level_progression
    if mode == "self_paced"
      advance_level if all_tasks_completed?
    elsif mode == "supervised"
      advance_level if all_tasks_approved?
    end
  end

  def all_tasks_completed?
    level.tasks.all? { |task| user.user_tasks.find_by(task: task)&.completed? }
  end

  def all_tasks_approved?
    level.tasks.all? { |task| user.task_approvals.find_by(task: task)&.approved? }
  end

  def advance_level
    next_level = program.levels.where("order > ?", level.order).first
    update(level: next_level) if next_level
  end
end

class UserTask < ApplicationRecord
  belongs_to :user
  belongs_to :task
  enum status: { pending: 0, completed: 1 }
end

class Professional < ApplicationRecord
  has_many :user_progresses
end

class TaskApproval < ApplicationRecord
  belongs_to :user
  belongs_to :task
  belongs_to :professional

  enum status: { pending: 0, approved: 1, rejected: 2 }
end


Table of contents