1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.unittree.service.unit;
35
36 import fr.paris.lutece.plugins.unittree.business.unit.Unit;
37 import fr.paris.lutece.plugins.unittree.business.unit.UnitHome;
38 import fr.paris.lutece.portal.business.user.AdminUser;
39 import fr.paris.lutece.portal.business.user.AdminUserHome;
40 import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupHome;
41 import fr.paris.lutece.portal.service.util.AppPropertiesService;
42 import fr.paris.lutece.util.ReferenceItem;
43 import fr.paris.lutece.util.ReferenceList;
44
45 import org.apache.commons.collections.CollectionUtils;
46 import org.springframework.transaction.annotation.Transactional;
47
48 import java.util.ArrayList;
49 import java.util.List;
50 import java.util.Map;
51
52 import javax.inject.Inject;
53
54 import javax.servlet.http.HttpServletRequest;
55
56
57
58
59
60
61 public class UnitUserService implements IUnitUserService
62 {
63 private static final String PROPERTY_MULTI_AFFECTATION_ENABLED = "unittree.users.enableMultiAffectation";
64 private static final boolean DEFAULT_MULTI_AFFECTATION_ENABLED = false;
65 @Inject
66 private IUnitService _unitService;
67
68
69
70
71
72
73 @Override
74 public AdminUser getUser( int nIdUser )
75 {
76 return AdminUserHome.findByPrimaryKey( nIdUser );
77 }
78
79
80
81
82 @Override
83 public List<AdminUser> getUsers( int nIdUnit, Map<String, Unit> mapIdUserUnit, boolean isInDepthSearch )
84 {
85 List<AdminUser> listAdminUsers = new ArrayList<>( );
86
87
88 listAdminUsers.addAll( getUsers( nIdUnit, mapIdUserUnit ) );
89
90 if ( isInDepthSearch )
91 {
92
93 for ( Unit subUnit : _unitService.getSubUnits( nIdUnit, false ) )
94 {
95
96 listAdminUsers.addAll( getUsers( subUnit.getIdUnit( ), mapIdUserUnit, isInDepthSearch ) );
97 }
98 }
99
100 return listAdminUsers;
101 }
102
103
104
105
106 @Override
107 public List<AdminUser> getAvailableUsers( AdminUser currentUser, int nIdUnit, boolean bMultiAffectationEnabled )
108 {
109 List<AdminUser> listUsers = new ArrayList<>( );
110 Unit unit = _unitService.getUnit( nIdUnit, false );
111
112 for ( AdminUser user : AdminUserHome.findUserList( ) )
113 {
114 if ( isUserAvailable( currentUser, user, unit, bMultiAffectationEnabled ) )
115 {
116 listUsers.add( user );
117 }
118 }
119
120 return listUsers;
121 }
122
123
124
125
126 @Override
127 public List<AdminUser> getAvailableUsers( AdminUser currentUser, int nIdUnit )
128 {
129 boolean bMultiAffectationEnabled = isMultiAffectationEnabled( );
130
131 return getAvailableUsers( currentUser, nIdUnit, bMultiAffectationEnabled );
132 }
133
134
135
136
137
138
139 @Override
140 public void doProcessAddUser( int nIdUser, AdminUser currentUser, HttpServletRequest request )
141 {
142 for ( IUnitUserAttributeService service : UnitUserAttributeManager.getListUnitUserAttributeService( ) )
143 {
144 service.doAddUser( nIdUser, currentUser, request );
145 }
146 }
147
148
149
150
151 @Override
152 public void doProcessModifyUser( int nIdUser, AdminUser currentUser, HttpServletRequest request )
153 {
154 for ( IUnitUserAttributeService service : UnitUserAttributeManager.getListUnitUserAttributeService( ) )
155 {
156 service.doModifyUser( nIdUser, currentUser, request );
157 }
158 }
159
160
161
162
163 @Override
164 public void doProcessRemoveUser( int nIdUser, AdminUser currentUser, HttpServletRequest request )
165 {
166 for ( IUnitUserAttributeService service : UnitUserAttributeManager.getListUnitUserAttributeService( ) )
167 {
168 service.doRemoveUser( nIdUser, currentUser, request );
169 }
170 }
171
172
173
174
175
176
177 @Override
178 public boolean isUserInUnit( int nIdUser, int nIdUnit )
179 {
180 return UnitHome.isUserInUnit( nIdUser, nIdUnit );
181 }
182
183
184
185
186
187
188 @Override
189 @Transactional( "unittree.transactionManager" )
190 public boolean addUserToUnit( int nIdUnit, int nIdUser )
191 {
192 if ( !isUserInUnit( nIdUser, nIdUnit ) )
193 {
194 Unit unit = UnitHome.findByPrimaryKey( nIdUnit );
195 List<Unit> listUnits = _unitService.getUnitsByIdUser( nIdUser, false );
196 boolean bMultiAffectationEnabled = isMultiAffectationEnabled( );
197
198 if ( !bMultiAffectationEnabled && CollectionUtils.isNotEmpty( listUnits ) )
199 {
200 return false;
201 }
202
203 for ( Unit userUnit : listUnits )
204 {
205 if ( _unitService.isParent( unit, userUnit ) )
206 {
207 removeUserFromUnit( nIdUser, userUnit.getIdUnit( ) );
208 }
209 }
210
211 UnitHome.addUserToUnit( nIdUnit, nIdUser );
212
213 return true;
214 }
215
216 return false;
217 }
218
219
220
221
222 @Override
223 @Transactional( "unittree.transactionManager" )
224 public void removeUserFromUnit( int nIdUser, int nIdUnit )
225 {
226 UnitHome.removeUserFromUnit( nIdUser, nIdUnit );
227 }
228
229
230
231
232 @Override
233 @Transactional( "unittree.transactionManager" )
234 public void removeUsersFromUnit( int nIdUnit )
235 {
236 UnitHome.removeUsersFromUnit( nIdUnit );
237 }
238
239
240
241
242 @Override
243 public boolean isMultiAffectationEnabled( )
244 {
245 return AppPropertiesService.getPropertyBoolean( PROPERTY_MULTI_AFFECTATION_ENABLED, DEFAULT_MULTI_AFFECTATION_ENABLED );
246 }
247
248
249
250
251
252
253
254
255
256
257
258
259 private boolean haveCommonWorkgroups( AdminUser user1, AdminUser user2 )
260 {
261 ReferenceList workgroups = AdminWorkgroupHome.getUserWorkgroups( user1 );
262
263 if ( CollectionUtils.isEmpty( workgroups ) )
264 {
265 return true;
266 }
267
268 for ( ReferenceItem item : workgroups )
269 {
270 if ( AdminWorkgroupHome.isUserInWorkgroup( user2, item.getCode( ) ) )
271 {
272 return true;
273 }
274 }
275
276 return false;
277 }
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292 private boolean isUserAvailable( AdminUser currentUser, AdminUser userToCheck, Unit unit, boolean bMultiAffectationEnabled )
293 {
294 List<Unit> listUnits = _unitService.getUnitsByIdUser( userToCheck.getUserId( ), false );
295
296 if ( !bMultiAffectationEnabled && CollectionUtils.isNotEmpty( listUnits ) )
297 {
298 return false;
299 }
300
301 for ( Unit userUnit : listUnits )
302 {
303
304 if ( ( userUnit.getIdUnit( ) == unit.getIdUnit( ) ) || _unitService.isParent( userUnit, unit ) )
305 {
306 return false;
307 }
308 }
309
310
311 if ( currentUser.isAdmin( ) )
312 {
313 return true;
314 }
315
316
317
318 return currentUser.isParent( userToCheck )
319 && ( haveCommonWorkgroups( currentUser, userToCheck ) || !AdminWorkgroupHome.checkUserHasWorkgroup( userToCheck.getUserId( ) ) );
320 }
321
322
323
324
325
326
327
328
329
330
331 private List<AdminUser> getUsers( int nIdUnit, Map<String, Unit> mapIdUserUnit )
332 {
333 Unit unit = _unitService.getUnit( nIdUnit, false );
334 List<AdminUser> listUsers = new ArrayList<>( );
335 List<Integer> listIdUsers = UnitHome.findIdsUser( nIdUnit );
336
337 if ( CollectionUtils.isNotEmpty( listIdUsers ) )
338 {
339 for ( int nIdUser : listIdUsers )
340 {
341 AdminUser user = AdminUserHome.findByPrimaryKey( nIdUser );
342
343 if ( user != null )
344 {
345 listUsers.add( user );
346 mapIdUserUnit.put( Integer.toString( user.getUserId( ) ), unit );
347 }
348 }
349 }
350
351 return listUsers;
352 }
353 }