diff --git a/app/decorators/person_decorator.rb b/app/decorators/person_decorator.rb index 82b867eb0..eca000090 100644 --- a/app/decorators/person_decorator.rb +++ b/app/decorators/person_decorator.rb @@ -25,12 +25,52 @@ def default_display_image "missing.png" end + def facilitator_since_date + facilitator_affiliations = affiliations.where("title LIKE ?", "%Facilitator%") + facilitator_affiliations.minimum(:start_date) || member_since + end + + def affiliated_since_date + affiliations.minimum(:start_date) + end + + def affiliated_end_date + return nil if affiliations.active.exists? + affiliations.maximum(:end_date) + end + + def facilitator_end_date + facilitator_affiliations = affiliations.where("title LIKE ?", "%Facilitator%") + return nil if facilitator_affiliations.active.exists? + facilitator_affiliations.maximum(:end_date) + end + def member_since_year - member_since ? member_since.year : nil + facilitator_since_date&.year + end + + def member_since_earlier_than_facilitator_affiliations? + earliest_facilitator = affiliations.where("title LIKE ?", "%Facilitator%").minimum(:start_date) + member_since.present? && earliest_facilitator.present? && member_since.beginning_of_month < earliest_facilitator.beginning_of_month + end + + def member_since_earlier_than_all_affiliations? + earliest = affiliations.minimum(:start_date) + member_since.present? && earliest.present? && member_since.beginning_of_month < earliest.beginning_of_month + end + + def member_since_differs_from_facilitator_affiliations? + earliest_facilitator = affiliations.where("title LIKE ?", "%Facilitator%").minimum(:start_date) + member_since.present? && earliest_facilitator.present? && member_since.beginning_of_month != earliest_facilitator.beginning_of_month + end + + def member_since_differs_from_all_affiliations? + earliest = affiliations.minimum(:start_date) + member_since.present? && earliest.present? && member_since.beginning_of_month != earliest.beginning_of_month end def badges - earliest = affiliations.minimum(:start_date) || member_since + earliest = facilitator_since_date years = earliest ? (Time.zone.now.year - earliest.year) : nil badges = [] badges << badge("Legacy Facilitator (10+ years)", :legacy_facilitator) if years && years >= 10 @@ -43,6 +83,9 @@ def badges badges << badge("Story Author", :stories) if user&.stories_as_creator&.any? badges << badge("Sector Leader", :sectors) if sectorable_items.where(is_leader: true).any? badges << badge("Blog Contributor", :blog_contributor) if blog_contributor? + if affiliated_since_date.present? && affiliated_since_date != facilitator_since_date + badges << badge("Affiliated since #{affiliated_since_date.strftime('%B %Y')}", :affiliated_person) + end badges end diff --git a/app/models/organization.rb b/app/models/organization.rb index c6b6e6489..f0ebe782f 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -56,7 +56,11 @@ class Organization < ApplicationRecord # Scopes # See TagFilterable, Trendable, WindowsTypeFilterable - scope :active, -> { joins(:organization_status).where(organization_statuses: { name: "Active" }) } + scope :active, -> { + status_active = joins(:organization_status).where(organization_statuses: { name: "Active" }) + affiliation_active = where(id: Affiliation.active.select(:organization_id)) + status_active.or(affiliation_active) + } scope :address, ->(address) do return all if address.blank? terms = address.to_s.strip.split(/[\s,]+/).reject(&:blank?) @@ -141,7 +145,8 @@ def organization_locality end def published? # needed for my_bookmarks - organization_status&.name == "Active" + return true if organization_status&.name == "Active" + affiliations.active.exists? end def sector_list diff --git a/app/views/organizations/_form.html.erb b/app/views/organizations/_form.html.erb index 0196355d1..ad7d49cc8 100644 --- a/app/views/organizations/_form.html.erb +++ b/app/views/organizations/_form.html.erb @@ -72,7 +72,61 @@ + <% org_earliest_aff = f.object.persisted? ? f.object.affiliations.minimum(:start_date) : nil %> + <% org_aff_ended = f.object.persisted? && f.object.affiliations.any? && !f.object.affiliations.active.exists? %> + <% org_latest_end = f.object.persisted? ? f.object.affiliations.maximum(:end_date) : nil %> + <% org_end_date = org_aff_ended ? org_latest_end : f.object.end_date %>
Auto-managed from affiliation records. Earliest affiliation start date: <%= org_earliest_aff.strftime('%b %Y') %>.
+ <% if f.object.start_date.present? && f.object.start_date.beginning_of_month != org_earliest_aff.beginning_of_month %> +Organization start_date (<%= f.object.start_date.strftime('%b %Y') %>) differs from earliest affiliation.
+ <% end %> + <% elsif has_affiliations %> +Auto-managed from affiliation records.
⚠ No affiliations have a start date. Add a start date to an affiliation record.
No affiliations yet. Set this date directly, or add affiliation records to auto-manage it.
+ <% end %> + <% if org_aff_ended %> +⚠ All affiliations have ended.
+ <% elsif f.object.end_date.present? && !has_affiliations %> +⚠ Organization end_date: <%= f.object.end_date.strftime('%b %Y') %>.
+ <% end %> +Organization start_date: <%= f.object.start_date.strftime("%b %Y") %>
+ <% end %> +- Affiliated since - <%= @organization.start_date.year %> -
+ <% org_earliest_affiliation = @organization.affiliations.minimum(:start_date) %> + <% org_affiliated_since = org_earliest_affiliation || @organization.start_date %> + <% org_show_aff_ended = @organization.affiliations.any? && !@organization.affiliations.active.exists? %> + <% org_show_end_date = org_show_aff_ended ? @organization.affiliations.maximum(:end_date) : @organization.end_date %> + <% if org_affiliated_since.present? %> ++ <% if org_show_aff_ended || org_show_end_date.present? %> + + <% end %> + Affiliated since + <%= org_affiliated_since.strftime("%b %Y") %><%= " – #{org_show_end_date.strftime('%b %Y')}" if org_show_end_date.present? %> + +
+Earliest start date from affiliation records.
+ <% if @organization.start_date.present? && @organization.start_date.beginning_of_month != org_earliest_affiliation.beginning_of_month %> +Organization start_date (<%= @organization.start_date.strftime('%b %Y') %>) differs from earliest affiliation.
+ <% end %> + <% else %> +Using organization start_date.
⚠ No affiliations have a start date. Add a start date to an affiliation to use it here instead.
⚠ All affiliations have ended.
+ <% end %> +Earliest start date from any affiliation, regardless of title.
⚠ No affiliations have a start date. Legacy member_since value is <%= person.member_since.strftime('%b %Y') %>. Add a start date to an affiliation to use it here.
Earliest start date from any affiliation, regardless of title.
⚠ No affiliations have a start date. Edit the affiliation records to add one.
Earliest start date from any affiliation, regardless of title. Edit affiliation records to change this date.
+ <% if decorated.member_since_earlier_than_all_affiliations? %> +⚠ Member since (<%= person.member_since.strftime('%b %Y') %>) is earlier than any affiliation. Create an affiliation with that start date to reflect it on the profile.
+ <% elsif decorated.member_since_differs_from_all_affiliations? %> +Member since (<%= person.member_since.strftime('%b %Y') %>) differs from the earliest affiliation start date.
+ <% end %> + <% end %> +⚠ Earlier date on file: <%= person.member_since.strftime("%b %Y") %>
+ <% elsif decorated.member_since_differs_from_all_affiliations? %> +Different date on file: <%= person.member_since.strftime("%b %Y") %>
+ <% end %> +Earliest start date from affiliations with 'facilitator' somewhere in the title.
⚠ Currently showing the legacy member_since value (<%= person.member_since.strftime('%b %Y') %>) because no Facilitator affiliation has a start date. Add a start date to a Facilitator affiliation to stop using the legacy value.
Earliest start date from affiliations with 'facilitator' somewhere in the title. Edit affiliation records to change this date.
+ <% if decorated.member_since_earlier_than_facilitator_affiliations? %> +⚠ Member since (<%= person.member_since.strftime('%b %Y') %>) is earlier than any Facilitator affiliation. Create an affiliation with that start date to reflect it on the profile.
+ <% elsif decorated.member_since_differs_from_facilitator_affiliations? %> +Member since (<%= person.member_since.strftime('%b %Y') %>) differs from the earliest Facilitator affiliation start date.
+ <% end %> + <% end %> +⚠ Earlier date on file: <%= person.member_since.strftime("%b %Y") %>
+ <% elsif decorated.member_since_differs_from_facilitator_affiliations? %> +Different date on file: <%= person.member_since.strftime("%b %Y") %>
+ <% end %> +Auto-managed by affiliations
- <% end %> -- Facilitator since - <%= @person.member_since_year %> -
+ <% if @person.profile_show_member_since? %> + <% if @person.facilitator_since_date.present? %> ++ Facilitator since + <%= @person.facilitator_since_date.strftime("%B %Y") %> +
+ <% elsif @person.affiliated_since_date.present? %> ++ Affiliated since + <%= @person.affiliated_since_date.strftime("%B %Y") %> +
+ <% end %> <% end %>