7
7
8
8
class People ::SacFamily
9
9
10
- FAMILY_MEMBER_ROLE_TYPES = SacCas ::MITGLIED_HAUPTSEKTION_ROLES
11
-
12
10
delegate :household_key , to : '@person'
13
11
14
12
def initialize ( person )
@@ -22,20 +20,22 @@ def initialize(person)
22
20
# - adding a new person to household
23
21
# - adding a new child (managed)
24
22
# - 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
29
29
30
30
def update_terminated_roles
31
31
terminated_roles = @person
32
32
. roles
33
- . where ( type : terminatable_family_member_role_types ,
33
+ . where ( type : terminatable_member_role_types ,
34
34
terminated : true ,
35
35
beitragskategorie : :familie )
36
36
37
37
affected_family_roles = Role
38
- . where ( type : terminatable_family_member_role_types ,
38
+ . where ( type : terminatable_member_role_types ,
39
39
group_id : terminated_roles . collect ( &:group_id ) ,
40
40
terminated : false ,
41
41
beitragskategorie : :familie ,
@@ -60,30 +60,87 @@ def member?
60
60
family_stammsektion . present?
61
61
end
62
62
63
+ def id
64
+ return unless member?
65
+
66
+ /\A F/ =~ household_key ? household_key : "F#{ household_key } "
67
+ end
68
+
69
+ private
70
+
63
71
def family_members
64
72
return [ ] unless member?
65
73
66
74
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 } )
71
79
end
72
80
73
- def id
74
- return unless member?
81
+ def adult_family_members
82
+ family_members . select { |person | category_calculator ( person ) . adult? }
83
+ end
75
84
76
- /\A F/ =~ household_key ? household_key : "F#{ household_key } "
85
+ def housemates
86
+ @person . household_people + [ @person ]
77
87
end
78
88
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
80
127
81
128
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
+ )
87
144
end
88
145
89
146
#def update_children
@@ -95,13 +152,24 @@ def family_stammsektion
95
152
#is there adults in same household that are allowed to get mitglied familie roles?
96
153
#end
97
154
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 )
100
169
end
101
170
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 )
105
173
end
106
174
107
175
end
0 commit comments