Project

General

Profile

Feature #42150 ยป optimize-default_activity_id.patch

Go MAEDA, 2025-01-23 12:36

View differences:

app/models/time_entry_activity.rb
58 58
  end
59 59

  
60 60
  def self.default_activity_id(user=nil, project=nil)
61
    default_activities = []
62
    default_activity = nil
63 61
    available_activities = self.available_activities(project)
62
    return nil if available_activities.empty?
63
    return available_activities.first.id if available_activities.one?
64 64

  
65
    if project && user
66
      user_membership = user.membership(project)
67
      if user_membership
68
        default_activities = user_membership.roles.where.not(:default_time_entry_activity_id => nil).sort.pluck(:default_time_entry_activity_id)
69
      end
70

  
71
      project_default_activity = self.default(project)
72
      if project_default_activity && !default_activities.include?(project_default_activity.id)
73
        default_activities << project_default_activity.id
65
    find_matching_activity = ->(ids) do
66
      ids.each do |id|
67
        activity = available_activities.detect { |a| a.id == id || a.parent_id == id }
68
        return activity.id if activity
74 69
      end
70
      nil
75 71
    end
76 72

  
77
    global_activity = self.default
78
    if global_activity && !default_activities.include?(global_activity.id)
79
      default_activities << global_activity.id
80
    end
73
    if project && user
74
      if (user_membership = user.membership(project))
75
        activity_ids = user_membership.roles.where.not(:default_time_entry_activity_id => nil).sort.pluck(:default_time_entry_activity_id)
76
        aid = find_matching_activity.call(activity_ids)
77
        return aid if aid
78
      end
81 79

  
82
    if available_activities.count == 1 && !default_activities.include?(available_activities.first.id)
83
      default_activities << available_activities.first.id
80
      if (project_default_activity = self.default(project))
81
        aid = find_matching_activity.call([project_default_activity.id])
82
        return aid if aid
83
      end
84 84
    end
85 85

  
86
    default_activities.each do |id|
87
      default_activity = available_activities.detect{ |a| a.id == id || a.parent_id == id }
88
      break unless default_activity.nil?
86
    if (global_activity = self.default)
87
      aid = find_matching_activity.call([global_activity.id])
88
      return aid if aid
89 89
    end
90 90

  
91
    default_activity&.id
91
    nil
92 92
  end
93 93
end
    (1-1/1)