Skip to content

Commit 00af957

Browse files
committed
Implement SacFamily.update!
1 parent 0000227 commit 00af957

File tree

1 file changed

+94
-26
lines changed

1 file changed

+94
-26
lines changed

app/domain/people/sac_family.rb

+94-26
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
class People::SacFamily
99

10-
FAMILY_MEMBER_ROLE_TYPES = SacCas::MITGLIED_HAUPTSEKTION_ROLES
11-
1210
delegate :household_key, to: '@person'
1311

1412
def initialize(person)
@@ -22,20 +20,22 @@ def initialize(person)
2220
# - adding a new person to household
2321
# - adding a new child (managed)
2422
# - adding a manager to a child (manager)
25-
#def update!
26-
#update_children
27-
#update_adults
28-
#end
23+
def update!
24+
# do nothing unless the reference person has a family membership
25+
return unless family_stammsektion
26+
27+
non_family_housemates.each {|new_family_member| update_membership!(new_family_member) }
28+
end
2929

3030
def update_terminated_roles
3131
terminated_roles = @person
3232
.roles
33-
.where(type: terminatable_family_member_role_types,
33+
.where(type: terminatable_member_role_types,
3434
terminated: true,
3535
beitragskategorie: :familie)
3636

3737
affected_family_roles = Role
38-
.where(type: terminatable_family_member_role_types,
38+
.where(type: terminatable_member_role_types,
3939
group_id: terminated_roles.collect(&:group_id),
4040
terminated: false,
4141
beitragskategorie: :familie,
@@ -60,30 +60,87 @@ def member?
6060
family_stammsektion.present?
6161
end
6262

63+
def id
64+
return unless member?
65+
66+
/\AF/ =~ household_key ? household_key : "F#{household_key}"
67+
end
68+
69+
private
70+
6371
def family_members
6472
return [] unless member?
6573

6674
family_stammsektion.people
67-
.distinct
68-
.joins(:roles)
69-
.where(roles: { type: family_stammsektion_role_types, beitragskategorie: :familie },
70-
people: { household_key: @person.household_key })
75+
.distinct
76+
.joins(:roles)
77+
.where(roles: { type: stammsektion_role_types, beitragskategorie: :familie },
78+
people: { household_key: @person.household_key })
7179
end
7280

73-
def id
74-
return unless member?
81+
def adult_family_members
82+
family_members.select {|person| category_calculator(person).adult? }
83+
end
7584

76-
/\AF/ =~ household_key ? household_key : "F#{household_key}"
85+
def housemates
86+
@person.household_people + [@person]
7787
end
7888

79-
private
89+
def non_family_housemates
90+
housemates - family_members
91+
end
92+
93+
def update_membership!(new_family_member)
94+
calculator = category_calculator(new_family_member)
95+
96+
# Only children and adults can join a family membership, but not babies and youth
97+
return unless calculator.family_age?
98+
99+
# A family can not have more than 2 adults.
100+
# Additional adults can be in the household, but won't get a family membership.
101+
return if calculator.adult? && adult_family_members.size >= 2
102+
103+
# Do nothing if the person already has any membership related role.
104+
return if new_family_member.roles.where(type: all_member_and_neuanmeldung_role_types).exists?
105+
106+
add_stammsektion_role(new_family_member)
107+
add_zusatzsektion_roles(new_family_member)
108+
end
109+
110+
def add_stammsektion_role(new_family_member)
111+
add_role_for_person(new_family_member, family_stammsektion_role)
112+
end
113+
114+
def add_zusatzsektion_roles(new_family_member)
115+
family_member_role_scope(type: zusatzsektion_role_types).
116+
each { |role| add_role_for_person(new_family_member, role) }
117+
end
118+
119+
# Duplicate the existing role and assign the person.
120+
def add_role_for_person(person, role)
121+
role.dup.tap do |r|
122+
r.person = person
123+
r.created_at = Time.current
124+
# r.delete_on ||= Date.current.end_of_year # TODO: should not be necessary as the original role must have delete_on set
125+
end.save!
126+
end
80127

81128
def family_stammsektion
82-
@family_stammsektion ||=
83-
Role.find_by(person: @person,
84-
beitragskategorie: :familie,
85-
type: family_stammsektion_role_types)
86-
.try(:group)
129+
family_stammsektion_role&.group
130+
end
131+
132+
# Returns the first stammsektion role of any family member found
133+
def family_stammsektion_role
134+
@family_stammsektion_role ||=
135+
family_member_role_scope(type: stammsektion_role_types).first
136+
end
137+
138+
def family_member_role_scope(type:)
139+
Role.where(
140+
person: @person,
141+
beitragskategorie: :familie,
142+
type: type
143+
)
87144
end
88145

89146
#def update_children
@@ -95,13 +152,24 @@ def family_stammsektion
95152
#is there adults in same household that are allowed to get mitglied familie roles?
96153
#end
97154

98-
def family_stammsektion_role_types
99-
FAMILY_MEMBER_ROLE_TYPES.collect(&:sti_name)
155+
def stammsektion_role_types
156+
SacCas::MITGLIED_HAUPTSEKTION_ROLES.map(&:sti_name)
157+
end
158+
159+
def zusatzsektion_role_types
160+
SacCas::MITGLIED_ZUSATZSEKTION_ROLES.map(&:sti_name)
161+
end
162+
163+
def all_member_and_neuanmeldung_role_types
164+
(SacCas::MITGLIED_ROLES + SacCas::NEUANMELDUNG_ROLES).map(&:sti_name)
165+
end
166+
167+
def terminatable_member_role_types
168+
SacCas::MITGLIED_ROLES.select(&:terminatable).map(&:sti_name)
100169
end
101170

102-
def terminatable_family_member_role_types
103-
[Group::SektionsMitglieder::Mitglied,
104-
Group::SektionsMitglieder::MitgliedZusatzsektion].collect(&:sti_name)
171+
def category_calculator(person)
172+
SacCas::Beitragskategorie::Calculator.new(person)
105173
end
106174

107175
end

0 commit comments

Comments
 (0)