View Javadoc
1   /*
2    * Copyright (c) 2002-2022, City of Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.plugins.dansmarue.modules.rest.service;
35  
36  import java.io.ByteArrayOutputStream;
37  import java.io.InputStream;
38  import java.text.SimpleDateFormat;
39  import java.time.Instant;
40  import java.time.LocalDate;
41  import java.time.ZoneOffset;
42  import java.time.format.DateTimeFormatter;
43  import java.time.format.DateTimeParseException;
44  import java.time.temporal.ChronoUnit;
45  import java.util.ArrayList;
46  import java.util.Calendar;
47  import java.util.Collection;
48  import java.util.Collections;
49  import java.util.Date;
50  import java.util.List;
51  import java.util.Locale;
52  import java.util.Map;
53  import java.util.Optional;
54  
55  import javax.inject.Inject;
56  import javax.servlet.http.HttpServletRequest;
57  
58  import org.apache.commons.codec.binary.Base64;
59  import org.apache.commons.io.IOUtils;
60  import org.apache.commons.lang.StringUtils;
61  
62  import fr.paris.lutece.plugins.dansmarue.business.entities.Actualite;
63  import fr.paris.lutece.plugins.dansmarue.business.entities.Adresse;
64  import fr.paris.lutece.plugins.dansmarue.business.entities.Aide;
65  import fr.paris.lutece.plugins.dansmarue.business.entities.Arrondissement;
66  import fr.paris.lutece.plugins.dansmarue.business.entities.FeuilleDeTournee;
67  import fr.paris.lutece.plugins.dansmarue.business.entities.MessageTypologie;
68  import fr.paris.lutece.plugins.dansmarue.business.entities.NotificationSignalementUserMultiContents;
69  import fr.paris.lutece.plugins.dansmarue.business.entities.ObservationRejet;
70  import fr.paris.lutece.plugins.dansmarue.business.entities.Photo;
71  import fr.paris.lutece.plugins.dansmarue.business.entities.PhotoDMR;
72  import fr.paris.lutece.plugins.dansmarue.business.entities.Priorite;
73  import fr.paris.lutece.plugins.dansmarue.business.entities.Signalement;
74  import fr.paris.lutece.plugins.dansmarue.business.entities.SignalementGeoLoc;
75  import fr.paris.lutece.plugins.dansmarue.business.entities.Signaleur;
76  import fr.paris.lutece.plugins.dansmarue.business.entities.SiraUser;
77  import fr.paris.lutece.plugins.dansmarue.business.entities.Source;
78  import fr.paris.lutece.plugins.dansmarue.business.entities.TypeSignalement;
79  import fr.paris.lutece.plugins.dansmarue.business.exceptions.AlreadyFollowedException;
80  import fr.paris.lutece.plugins.dansmarue.business.exceptions.InvalidStateActionException;
81  import fr.paris.lutece.plugins.dansmarue.business.exceptions.NonExistentFollowItem;
82  import fr.paris.lutece.plugins.dansmarue.modules.rest.dto.SignalementRestDTO;
83  import fr.paris.lutece.plugins.dansmarue.modules.rest.pojo.ErrorSignalement;
84  import fr.paris.lutece.plugins.dansmarue.modules.rest.pojo.SignalementPOJO;
85  import fr.paris.lutece.plugins.dansmarue.modules.rest.pojo.SignalementsPOJO;
86  import fr.paris.lutece.plugins.dansmarue.modules.rest.service.formatters.CategoriesFormatterJson;
87  import fr.paris.lutece.plugins.dansmarue.modules.rest.service.formatters.ErrorSignalementFormatterJson;
88  import fr.paris.lutece.plugins.dansmarue.modules.rest.service.formatters.SignalementFormatterJson;
89  import fr.paris.lutece.plugins.dansmarue.modules.rest.service.formatters.SignalementRestDTOFormatterJson;
90  import fr.paris.lutece.plugins.dansmarue.modules.rest.util.StringUtilsDmr;
91  import fr.paris.lutece.plugins.dansmarue.modules.rest.util.constants.SignalementRestConstants;
92  import fr.paris.lutece.plugins.dansmarue.modules.rest.util.exception.ParseSignalementFromJSONException;
93  import fr.paris.lutece.plugins.dansmarue.service.IActualiteService;
94  import fr.paris.lutece.plugins.dansmarue.service.IAdresseService;
95  import fr.paris.lutece.plugins.dansmarue.service.IAideService;
96  import fr.paris.lutece.plugins.dansmarue.service.IArrondissementService;
97  import fr.paris.lutece.plugins.dansmarue.service.IFeuilleDeTourneeService;
98  import fr.paris.lutece.plugins.dansmarue.service.IMessageTypologieService;
99  import fr.paris.lutece.plugins.dansmarue.service.IObservationRejetService;
100 import fr.paris.lutece.plugins.dansmarue.service.IPhotoService;
101 import fr.paris.lutece.plugins.dansmarue.service.IPrioriteService;
102 import fr.paris.lutece.plugins.dansmarue.service.ISignalementExportService;
103 import fr.paris.lutece.plugins.dansmarue.service.ISignalementService;
104 import fr.paris.lutece.plugins.dansmarue.service.ISignaleurService;
105 import fr.paris.lutece.plugins.dansmarue.service.ISiraUserService;
106 import fr.paris.lutece.plugins.dansmarue.service.ITypeSignalementService;
107 import fr.paris.lutece.plugins.dansmarue.service.IWorkflowService;
108 import fr.paris.lutece.plugins.dansmarue.service.dto.DossierSignalementDTO;
109 import fr.paris.lutece.plugins.dansmarue.service.dto.TypeSignalementDTO;
110 import fr.paris.lutece.plugins.dansmarue.service.output.SignalementOutputPrcessor;
111 import fr.paris.lutece.plugins.dansmarue.util.constants.DateConstants;
112 import fr.paris.lutece.plugins.dansmarue.util.constants.SignalementConstants;
113 import fr.paris.lutece.plugins.dansmarue.utils.IDateUtils;
114 import fr.paris.lutece.plugins.dansmarue.utils.ImgUtils;
115 import fr.paris.lutece.plugins.identitystore.v1.web.rs.dto.IdentityDto;
116 import fr.paris.lutece.plugins.identitystore.v1.web.service.IdentityService;
117 import fr.paris.lutece.plugins.identitystore.web.exception.IdentityNotFoundException;
118 import fr.paris.lutece.plugins.identitystore.web.exception.IdentityStoreException;
119 import fr.paris.lutece.plugins.leaflet.modules.dansmarue.entities.Address;
120 import fr.paris.lutece.plugins.leaflet.modules.dansmarue.service.IAddressSuggestPOIService;
121 import fr.paris.lutece.plugins.rest.service.formatters.IFormatter;
122 import fr.paris.lutece.plugins.unittree.modules.dansmarue.business.sector.Sector;
123 import fr.paris.lutece.plugins.workflowcore.business.action.Action;
124 import fr.paris.lutece.plugins.workflowcore.business.action.ActionFilter;
125 import fr.paris.lutece.plugins.workflowcore.business.state.State;
126 import fr.paris.lutece.plugins.workflowcore.service.action.IActionService;
127 import fr.paris.lutece.plugins.workflowcore.service.state.IStateService;
128 import fr.paris.lutece.plugins.workflowcore.service.task.ITask;
129 import fr.paris.lutece.plugins.workflowcore.service.task.ITaskService;
130 import fr.paris.lutece.portal.business.user.AdminUser;
131 import fr.paris.lutece.portal.service.datastore.DatastoreService;
132 import fr.paris.lutece.portal.service.i18n.I18nService;
133 import fr.paris.lutece.portal.service.image.ImageResource;
134 import fr.paris.lutece.portal.service.spring.SpringContextService;
135 import fr.paris.lutece.portal.service.util.AppLogService;
136 import fr.paris.lutece.portal.service.util.AppPropertiesService;
137 import fr.paris.lutece.portal.service.workflow.WorkflowService;
138 import fr.paris.lutece.util.image.ImageUtil;
139 import net.sf.json.JSONArray;
140 import net.sf.json.JSONException;
141 import net.sf.json.JSONObject;
142 import net.sf.json.JSONSerializer;
143 
144 /**
145  * SignalementRestService.
146  */
147 public class SignalementRestService implements ISignalementRestService
148 {
149 
150     /** The Constant PARAMETER_NULL. */
151     private static final String PARAMETER_NULL = "null";
152 
153     /** The signalement service. */
154     // SERVICES
155     @Inject
156     private ISignalementService _signalementService;
157 
158     /** The adresse service. */
159     @Inject
160     private IAdresseService _adresseService;
161 
162     /** The arrondissement service. */
163     @Inject
164     private IArrondissementService _arrondissementService;
165 
166     /** The photo service. */
167     @Inject
168     private IPhotoService _photoService;
169 
170     /** The signaleur service. */
171     @Inject
172     private ISignaleurService _signaleurService;
173 
174     /** The signalement workflow service. */
175     @Inject
176     private IWorkflowService _signalementWorkflowService;
177 
178     /** The observation rejet service. */
179     @Inject
180     private IObservationRejetService _observationRejetService;
181 
182     /** The type signalement service. */
183     @Inject
184     private ITypeSignalementService _typeSignalementService;
185 
186     /** The priorite service. */
187     @Inject
188     private IPrioriteService _prioriteService;
189 
190     /** The manage signalement service. */
191     @Inject
192     private ManageSignalementService _manageSignalementService;
193 
194     /** The sira user service. */
195     @Inject
196     private ISiraUserService _siraUserService;
197 
198     /** The task service. */
199     @Inject
200     private ITaskService _taskService;
201 
202     /** The action service. */
203     @Inject
204     private IActionService _actionService;
205 
206     /** The state service. */
207     @Inject
208     private IStateService _stateService;
209 
210     /** The address suggest POI service. */
211     @Inject
212     private IAddressSuggestPOIService _addressSuggestPOIService;
213 
214     /** The message typologie service. */
215     @Inject
216     private IMessageTypologieService _messageTypologieService;
217 
218     /** The actualite service. */
219     @Inject
220     private IActualiteService _actualiteService;
221 
222     /** The aide service. */
223     @Inject
224     private IAideService _aideService;
225 
226     /** Feuille de tournee service. */
227     @Inject
228     private IFeuilleDeTourneeService _feuilleTourneeService;
229 
230     /** Feuille signalement export service. */
231     @Inject
232     private ISignalementExportService _signalementExportService;
233 
234     /** The date utils. */
235     // UTILS
236     @Inject
237     private IDateUtils _dateUtils;
238 
239     /** The Constant PARAMETER_WEBSERVICE_COMMENT_VALUE. */
240     private static final String PARAMETER_WEBSERVICE_COMMENT_VALUE = "webservice_comment_value";
241 
242     /** The Constant ID_STATE_ETAT_INITIAL. */
243     private static final String ID_STATE_ETAT_INITIAL = "signalement.idStateEtatInitial";
244 
245     /** The Constant PARAMETER_WEBSERVICE_CHOSEN_MESSAGE. */
246     private static final String PARAMETER_WEBSERVICE_CHOSEN_MESSAGE = "chosenMessage";
247 
248     /** The Constant PARAMETER_WEBSERVICE_EMAIL_ACTEUR. */
249     private static final String PARAMETER_WEBSERVICE_EMAIL_ACTEUR = "emailActeur";
250 
251     /** The Constant PARAMETER_WEBSERVICE_IS_MESSAGE_TYPO. */
252     private static final String PARAMETER_WEBSERVICE_IS_MESSAGE_TYPO = "isMessageTypo";
253 
254     /** The base 64. */
255     private static final String BASE_64 = ";base64,";
256 
257     /**
258      * {@inheritDoc}
259      */
260     @Override
261     public String processResquestAnswer( String strRequest, HttpServletRequest request ) throws ParseSignalementFromJSONException
262     {
263         IFormatter<ErrorSignalement> formatterJson = new ErrorSignalementFormatterJson( );
264 
265         try
266         {
267             JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( strRequest );
268             JSONObject json = jsonArray.getJSONObject( 0 );
269             String strRequestType = json.getString( SignalementRestConstants.JSON_TAG_REQUEST );
270             AppLogService.debug( "module-signalement-rest processResquestAnswer" + strRequestType );
271             String strRespons;
272 
273             if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_INCIDENT_STATS ) )
274             {
275                 strRespons = getIncidentStats( json, request );
276             }
277             else
278                 if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_INCIDENTS_BY_ID ) )
279                 {
280                     strRespons = getIncidentsById( json );
281                 }
282                 else
283                     if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_INCIDENT_BY_POSITION ) )
284                     {
285                         strRespons = getIncidentsByPosition( json );
286                     }
287                     else
288                         if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_SAVE_INCIDENT ) )
289                         {
290                             strRespons = saveIncident( json );
291                         }
292                         else
293                             if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_REPORTS ) )
294                             {
295                                 strRespons = getReports( json );
296                             }
297                             else
298                                 if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_UPDATE_INCIDENT ) )
299                                 {
300                                     strRespons = updateIncident( json, request );
301                                 }
302                                 else
303                                     if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_USER_ACTIVITIES ) )
304                                     {
305                                         strRespons = getUsersActivities( json );
306                                     }
307                                     else
308                                         if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_CHANGE_INCIDENT ) )
309                                         {
310                                             strRespons = changeIncident( json );
311                                         }
312                                         else
313                                             if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_INCIDENT_PHOTOS ) )
314                                             {
315                                                 strRespons = getIncidentPhotos( json );
316                                             }
317                                             else
318                                                 if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_CATEGORIES_LIST ) )
319                                                 {
320                                                     strRespons = getCategoriesList( json );
321                                                 }
322                                                 else
323                                                     if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_CHANGE_STATUS ) )
324                                                     {
325                                                         strRespons = changeStatus( json, request );
326                                                     }
327                                                     else
328                                                         if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_ADD_ANOMALIE ) )
329                                                         {
330                                                             strRespons = addAnomalie( json );
331                                                         }
332                                                         else
333                                                             if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_CONGRATULATE_ANOMALIE ) )
334                                                             {
335                                                                 strRespons = congratulateAnomalie( json );
336                                                             }
337                                                             else
338                                                                 if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_INCIDENT_RESOLVED ) )
339                                                                 {
340                                                                     strRespons = setIncidentResolved( json, request );
341                                                                 }
342                                                                 else
343                                                                     if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_FOLLOW ) )
344                                                                     {
345                                                                         strRespons = addFollower( json );
346                                                                     }
347                                                                     else
348                                                                         if ( strRequestType.equals( SignalementRestConstants.REQUEST_TYPE_UNFOLLOW ) )
349                                                                         {
350                                                                             strRespons = removeFollower( json );
351                                                                         }
352                                                                         else
353                                                                             if ( strRequestType
354                                                                                     .equals( SignalementRestConstants.REQUEST_TYPE_GET_INCIDENTS_BY_USER ) )
355                                                                             {
356                                                                                 strRespons = getIncidentsByUser( json );
357                                                                             }
358                                                                             else
359                                                                                 if ( strRequestType
360                                                                                         .equals( SignalementRestConstants.REQUEST_TYPE_PROCESS_WORKFLOW ) )
361                                                                                 {
362                                                                                     strRespons = processWorkflow( json );
363                                                                                 }
364                                                                                 else
365                                                                                     if ( strRequestType
366                                                                                             .equals( SignalementRestConstants.REQUEST_TYPE_CHECK_VERSION ) )
367                                                                                     {
368                                                                                         strRespons = checkVersion( );
369                                                                                     }
370                                                                                     else
371                                                                                         if ( strRequestType
372                                                                                                 .equals( SignalementRestConstants.REQUEST_TYPE_SAVE_PRECISIONS_TERRAIN ) )
373                                                                                         {
374                                                                                             strRespons = savePrecisionsTerrain( json );
375                                                                                         }
376                                                                                         else
377                                                                                             if ( strRequestType
378                                                                                                     .equals( SignalementRestConstants.REQUEST_TYPE_SAVE_INFO_APRES_TOURNEE ) )
379                                                                                             {
380                                                                                                 strRespons = saveInfoApresTournee( json );
381                                                                                             }
382                                                                                             else
383                                                                                                 {
384                                                                                                     ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
385                                                                                                     error.setErrorCode( SignalementRestConstants.ERROR_BAD_JSON_REQUEST );
386                                                                                                     error.setErrorMessage( StringUtils.EMPTY );
387 
388                                                                                                     return formatterJson.format( error );
389                                                                                                 }
390 
391             JSONArray jsonArrayRespons = new JSONArray( );
392             jsonArrayRespons.element( strRespons );
393 
394             return jsonArrayRespons.toString( );
395         }
396         catch( JSONException e )
397         {
398             AppLogService.info( request.getHeader( "host" ) );
399             AppLogService.info( request.getHeader( "user-agent" ) );
400             AppLogService.info( request.getHeader( "origin" ) );
401             AppLogService.info( strRequest );
402             AppLogService.error( e.getMessage( ), e );
403 
404             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
405             error.setErrorCode( SignalementRestConstants.ERROR_BAD_JSON_REQUEST );
406             error.setErrorMessage( e.getMessage( ) );
407 
408             return formatterJson.format( error );
409         }
410     }
411 
412     /**
413      * {@inheritDoc}
414      */
415     @Override
416     public String getIncidentStats( JSONObject jsonSrc, HttpServletRequest request )
417     {
418         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
419 
420         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
421         _signalementWorkflowService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_WORKFLOW_BEAN );
422 
423         JSONObject jsonPosition = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_POSITION );
424         String strLatitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LATITUDE );
425         String strLongitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LONGITUDE );
426         String strRadius = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_RADIUS );
427 
428         if ( StringUtils.isBlank( strLatitude ) || StringUtils.isBlank( strLongitude ) || StringUtils.isBlank( strRadius ) )
429         {
430             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
431             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_POSITION_PARAMETER );
432             error.setErrorMessage( StringUtils.EMPTY );
433 
434             return formatterJsonError.format( error );
435         }
436 
437         JSONObject jsonAnswer = new JSONObject( );
438         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_INCIDENT_STATS );
439 
440         JSONObject json = new JSONObject( );
441 
442         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
443 
444         List<Signalement> listSignalement = _signalementService.findAllSignalementInPerimeterWithInfo( Double.parseDouble( strLatitude ),
445                 Double.parseDouble( strLongitude ), Integer.valueOf( strRadius ), StringUtils.EMPTY );
446 
447         AppLogService.info( "module-signalement-rest getIncidentStats" );
448         int nOnGoingIncidents = 0;
449         int nResolvedIncidents = 0;
450         int nUpdatedIncidents = 0;
451 
452         // set the state of the signalement with the workflow
453         WorkflowService workflowService = WorkflowService.getInstance( );
454 
455         if ( workflowService.isAvailable( ) )
456         {
457             // récupération de l'identifiant du workflow
458             Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
459 
460             if ( workflowId != null )
461             {
462                 classifiedByState( listSignalement, listSignalement, listSignalement, workflowService, workflowId, listSignalement );
463             }
464         }
465 
466         json.accumulate( SignalementRestConstants.JSON_TAG_ONGOING_INCIDENTS, nOnGoingIncidents );
467         json.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_INCIDENTS, nResolvedIncidents );
468         json.accumulate( SignalementRestConstants.JSON_TAG_UPDATED_INCIDENTS, nUpdatedIncidents );
469 
470         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
471 
472         return jsonAnswer.toString( );
473     }
474 
475     private void classifiedByState( List<Signalement> listDeclaredIncidents, List<Signalement> listResolvedIncidents, List<Signalement> listUpdatedIncidents,
476             WorkflowService workflowService, Integer workflowId, List<Signalement> listSignalement )
477     {
478 
479         for ( Signalement signalement : listSignalement )
480         {
481             State state = workflowService.getState( signalement.getId( ).intValue( ), Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null );
482 
483             int nStateId = state.getId( );
484 
485             switch( nStateId )
486             {
487                 case 7:
488                     listDeclaredIncidents.add( signalement );
489 
490                     break;
491 
492                 case 8:
493                     listUpdatedIncidents.add( signalement );
494 
495                     break;
496 
497                 case 9:
498                     listUpdatedIncidents.add( signalement );
499 
500                     break;
501 
502                 case 10:
503                     listResolvedIncidents.add( signalement );
504 
505                     break;
506 
507                 case 11:
508                     break;
509 
510                 case 12:
511                     listResolvedIncidents.add( signalement );
512 
513                     break;
514 
515                 case 13:
516                     listDeclaredIncidents.add( signalement );
517 
518                     break;
519 
520                 default:
521                     break;
522             }
523         }
524 
525     }
526 
527     /**
528      * {@inheritDoc}
529      */
530     @Override
531     public String savePrecisionsTerrain( JSONObject jsonSrc ){
532 
533         Long nIdSignalement = jsonSrc.getLong( SignalementRestConstants.JSON_TAG_SIGNALEMENT_ID );
534         String strPrecisionTerrain = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_PRECISION_TERRAIN );
535 
536         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
537 
538         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
539 
540         JSONObject jsonAnswer = new JSONObject( );
541         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_SAVE_PRECISIONS_TERRAIN );
542 
543         JSONObject json = new JSONObject( );
544         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
545 
546         if ( StringUtils.isBlank( strPrecisionTerrain ) )
547         {
548             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
549             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_PRECISION_TERRAIN );
550             error.setErrorMessage( StringUtils.EMPTY );
551 
552             return formatterJsonError.format( error );
553         }
554 
555         // Récupération du signalement
556         Signalement signalement = _signalementService.loadById( nIdSignalement );
557 
558         // Aucun signalement ne correspond au numéro
559         if ( signalement == null )
560         {
561             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
562             error.setErrorCode( SignalementRestConstants.ERROR_GET_SIGNALEMENT_BY_ID );
563             error.setErrorMessage( AppPropertiesService.getProperty( SignalementRestConstants.ERROR_GET_SIG_BY_ID_NOT_FOUND ) );
564 
565             return formatterJsonError.format( error );
566         }
567 
568         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
569 
570         signalement.setPrecisionTerrain( strPrecisionTerrain );
571         _signalementService.update( signalement );
572 
573         return jsonAnswer.toString( );
574     }
575 
576     /**
577      * {@inheritDoc}
578      */
579     @Override
580     public String saveInfoApresTournee( JSONObject jsonSrc ){
581 
582         Integer nIdFdt = jsonSrc.getInt( SignalementRestConstants.JSON_TAG_FDT_ID );
583         String strInfoApresTournee = jsonSrc.getString( SignalementRestConstants.JSON_TAG_FDT_INFO_APRES_TOURNEE );
584 
585         _feuilleTourneeService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_FDT_SERVICE_BEAN );
586 
587         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
588 
589         JSONObject jsonAnswer = new JSONObject( );
590         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_SAVE_INFO_APRES_TOURNEE );
591 
592         JSONObject json = new JSONObject( );
593         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
594 
595         if ( StringUtils.isBlank( strInfoApresTournee ) )
596         {
597             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
598             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_PRECISION_TERRAIN );
599             error.setErrorMessage( StringUtils.EMPTY );
600 
601             return formatterJsonError.format( error );
602         }
603 
604         // Récupération de la feuille de tournée
605         FeuilleDeTournee feuilleDeTournee = _feuilleTourneeService.load( nIdFdt );
606 
607         // Aucune feuille de tournée ne correspond au numéro
608         if ( feuilleDeTournee == null )
609         {
610             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
611             error.setErrorCode( SignalementRestConstants.ERROR_GET_FDT_BY_ID );
612             error.setErrorMessage( AppPropertiesService.getProperty( SignalementRestConstants.ERROR_GET_FDT_BY_ID_NOT_FOUND ) );
613 
614             return formatterJsonError.format( error );
615         }
616 
617         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
618 
619         feuilleDeTournee.setInfoApresTournee( strInfoApresTournee );
620         _feuilleTourneeService.update( feuilleDeTournee );
621 
622         return jsonAnswer.toString( );
623     }
624 
625     /**
626      * {@inheritDoc}
627      */
628     @Override
629     public String getIncidentsById( JSONObject jsonSrc )
630     {
631         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
632 
633         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
634 
635         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ID );
636 
637         if ( StringUtils.isBlank( strIncidentId ) )
638         {
639             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
640             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
641             error.setErrorMessage( StringUtils.EMPTY );
642 
643             return formatterJsonError.format( error );
644         }
645 
646         String source = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_SOURCE );
647         String sourceDMR = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_INCIDENT_SOURCE_DMR );
648         String sourceRamen = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_INCIDENT_SOURCE_RAMEN );
649         if ( !StringUtils.equals( source, sourceDMR ) && !StringUtils.equals( source, sourceRamen ) )
650         {
651             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
652             error.setErrorCode( SignalementRestConstants.ERROR_BAD_SOURCE );
653             error.setErrorMessage( "Source " + source + " du signalement inconnue. " );
654             AppLogService.error( "Source " + source + " du signalement inconnue. " );
655             return formatterJsonError.format( error );
656         }
657 
658         JSONObject jsonAnswer = new JSONObject( );
659         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_INCIDENTS_BY_ID );
660 
661         JSONObject json = new JSONObject( );
662         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
663 
664         Signalement signalement = _signalementService.getSignalement( Long.parseLong( strIncidentId ) );
665 
666         if ( signalement == null )
667         {
668             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
669             error.setErrorCode( SignalementRestConstants.ERROR_BAD_INCIDENT_ID_BIS );
670             error.setErrorMessage( StringUtils.EMPTY );
671 
672             return formatterJsonError.format( error );
673         }
674 
675         // Si le signaleur n'est pas trouvé et que l'email ne finit pas par @paris.fr, cache le bouton résolu sur mobile
676         String guid = StringUtils.EMPTY;
677         try
678         {
679             guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
680         }
681         catch( Exception e )
682         {
683             AppLogService.error( e );
684         }
685 
686         SignalementFormatterJson/rest/service/formatters/SignalementFormatterJson.html#SignalementFormatterJson">SignalementFormatterJson formatterJson = new SignalementFormatterJson( );
687         if ( !StringUtils.isBlank( guid ) )
688         {
689             formatterJson.setFormatWithGuid( guid );
690         }
691 
692         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT, formatterJson.format( signalement ) );
693 
694         List<Signaleur> signaleurs = signalement.getSignaleurs( );
695 
696         boolean signaleurFound = false;
697 
698         for ( Signaleur signaleur : signaleurs )
699         {
700             if ( StringUtils.isNotBlank( guid ) && guid.equals( signaleur.getGuid( ) ) )
701             {
702                 signaleurFound = true;
703             }
704         }
705 
706         if ( !StringUtils.EMPTY.equals( guid ) )
707         {
708             json.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_AUTHORIZATION,
709                     signaleurFound || StringUtilsDmr.endsWithAny( getIdentityStoreAttributeValue( guid, "login" ).toLowerCase( ), getEmailDomainAccept( ) ) );
710         }
711         else
712         {
713             json.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_AUTHORIZATION, false );
714         }
715 
716         json.accumulate( SignalementRestConstants.JSON_TAG_MESSAGE_SF_GENERIC, getMessageServiceFaitGeneric( signalement.getId( ) ) );
717 
718         json.accumulate( SignalementRestConstants.JSON_TAG_MESSAGE_SF_TYPOLOGIE, getMessageServiceFaitTypologie( signalement.getTypeSignalement( ).getId( ) ) );
719 
720         /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
721 
722         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
723 
724         return jsonAnswer.toString( );
725     }
726 
727     /**
728      * {@inheritDoc}
729      */
730     @Override
731     @SuppressWarnings( "static-access" )
732     public String getIncidentsByPosition( JSONObject jsonSrc )
733     {
734         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
735 
736         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
737 
738         JSONObject jsonAnswer = new JSONObject( );
739         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_INCIDENT_BY_POSITION );
740 
741         JSONObject json = new JSONObject( );
742         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
743 
744         JSONObject jsonPosition = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_POSITION );
745         String strLatitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LATITUDE );
746         String strLongitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LONGITUDE );
747         String strRadius = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_RADIUS );
748         String guid = jsonSrc.has( SignalementRestConstants.JSON_TAG_GUID ) ? jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID ) : null;
749 
750         // not empty if case Android searchByNumber
751         String specificSignalementNumberSearch = jsonSrc.has( SignalementRestConstants.JSON_TAG_SEARCH_BY_NUMBER )
752                 ? jsonSrc.getString( SignalementRestConstants.JSON_TAG_SEARCH_BY_NUMBER )
753                         : StringUtils.EMPTY;
754 
755         if ( StringUtils.isBlank( strLatitude ) || StringUtils.isBlank( strLongitude ) || StringUtils.isBlank( strRadius ) )
756         {
757             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
758             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_POSITION_PARAMETER );
759             error.setErrorMessage( StringUtils.EMPTY );
760 
761             return formatterJsonError.format( error );
762         }
763 
764         List<Signalement> listSignalement = _signalementService.findAllSignalementInPerimeterWithInfo( Double.parseDouble( strLatitude ),
765                 Double.parseDouble( strLongitude ), Integer.valueOf( strRadius ), specificSignalementNumberSearch );
766 
767         List<Signalement> listSignalementSorted = getSignalementListSorted( Double.parseDouble( strLatitude ), Double.parseDouble( strLongitude ),
768                 listSignalement );
769 
770         SignalementFormatterJson/rest/service/formatters/SignalementFormatterJson.html#SignalementFormatterJson">SignalementFormatterJson formatterJson = new SignalementFormatterJson( );
771         if ( !StringUtils.isBlank( guid ) )
772         {
773             formatterJson.setFormatWithGuid( guid );
774         }
775 
776         JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( formatterJson.format( listSignalementSorted ) );
777 
778         json.accumulate( SignalementRestConstants.JSON_TAG_CLOSEST_INCIDENTS, jsonArray.toString( ) );
779 
780         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
781 
782         return jsonAnswer.toString( );
783     }
784 
785     /**
786      * Covert a json report to report Object.
787      *
788      * @param jsonSrc
789      *            the json source
790      * @param signalement
791      *            the report object
792      * @param signaleur
793      *            person who create the report
794      * @param adresse
795      *            the report address
796      * @return the report
797      *
798      * @throws ParseSignalementFromJSONException
799      *             parse exception
800      */
801     public Signalement parseSignalement( JSONObject jsonSrc, Signalement signalement, Signaleur signaleur, Adresse adresse )
802             throws ParseSignalementFromJSONException
803     {
804         IFormatter<ErrorSignalement> formatterJson = new ErrorSignalementFormatterJson( );
805         String strUDID = jsonSrc.getString( SignalementRestConstants.JSON_TAG_UDID );
806         String strEmail = StringUtils.EMPTY;
807         try
808         {
809             strEmail = jsonSrc.getString( SignalementRestConstants.JSON_TAG_EMAIL );
810         }
811         catch( Exception e )
812         {
813             AppLogService.error( e );
814             strEmail = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_DEFAULT_EMAIL, "lutece@lutece.fr" );
815         }
816 
817         String guid = StringUtils.EMPTY;
818         try
819         {
820             guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
821         }
822         catch( Exception e )
823         {
824             AppLogService.error( e );
825         }
826 
827         if ( StringUtils.isBlank( strUDID ) )
828         {
829             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
830             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
831             error.setErrorMessage( StringUtils.EMPTY );
832 
833             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
834         }
835         JSONObject jsonIncident = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_INCIDENT );
836         String strCategoryId = jsonIncident.getString( SignalementRestConstants.JSON_TAG_INCIDENT_CATEGORIE_ID );
837         String strAddress = jsonIncident.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ADDRESS );
838         String strDescriptive = jsonIncident.getString( SignalementRestConstants.JSON_TAG_INCIDENT_DESCRIPTIVE );
839         String strCommentaireAgentTerrain = getStringIfExist( jsonIncident, SignalementRestConstants.JSON_TAG_INCIDENT_COMMENTAIRE_AGENT );
840         long lIdPriorite = jsonIncident.getLong( SignalementRestConstants.JSON_TAG_INCIDENT_PRIORITE_ID );
841         AppLogService.info( "saveIncident, lIdPriorite " + lIdPriorite );
842 
843         JSONObject jsonPosition = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_POSITION );
844         String strLatitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LATITUDE );
845         String strLongitude = jsonPosition.getString( SignalementRestConstants.JSON_TAG_LONGITUDE );
846 
847         if ( StringUtils.isBlank( strLatitude ) && StringUtils.isBlank( strLongitude ) )
848         {
849             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
850             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_POSITION_PARAMETER );
851             error.setErrorMessage( StringUtils.EMPTY );
852 
853             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
854         }
855 
856         // Catégorie ou Type du signalement
857         if ( StringUtils.isBlank( strCategoryId ) )
858         {
859             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
860             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_CATEGORY_ID_PARAMETER );
861             error.setErrorMessage( StringUtils.EMPTY );
862 
863             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
864         }
865 
866         TypeSignalement typeSignalement = _typeSignalementService.findByIdTypeSignalement( Integer.parseInt( strCategoryId ) );
867 
868         if ( typeSignalement == null )
869         {
870             AppLogService.error( "saveIncident, aucune catégorie trouvé pour l'strCategoryId = " + strCategoryId );
871             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
872             error.setErrorCode( SignalementRestConstants.ERROR_BAD_CATEGORY_ID_PARAMETER );
873             error.setErrorMessage( "aucune catégorie trouvé pour l'strCategoryId = " + strCategoryId );
874 
875             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
876         }
877         AppLogService.info( "saveIncident, category found " + typeSignalement.getFormatTypeSignalement( ) );
878 
879         signalement.setTypeSignalement( typeSignalement );
880 
881         // Commentaire
882         signalement.setCommentaire( strDescriptive );
883 
884         // Commentaire agent
885         signalement.setCommentaireAgentTerrain( strCommentaireAgentTerrain );
886 
887         // Nombre de personnes ayant suivi l'incident: initialisation à 0
888         signalement.setSuivi( 0 );
889 
890         // La priorité n'est pas encore renseigner du coté de l'API android (valeur par défaut à 1)
891         Priorite priorite = _prioriteService.load( lIdPriorite );
892         if ( priorite == null )
893         {
894             AppLogService.error( "saveIncident, no priorite founded " );
895             priorite = new Priorite( );
896             priorite.setId( 1 );
897         }
898         signalement.setPriorite( priorite );
899         AppLogService.info( "saveIncident, priorite found " + priorite.getLibelle( ) );
900 
901         // Arrondissement
902         Arrondissement arrondissementByGeom = _adresseService.getArrondissementByGeom( Double.parseDouble( strLongitude ), Double.parseDouble( strLatitude ) );
903         if ( arrondissementByGeom == null )
904         {
905             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
906             error.setErrorCode( SignalementRestConstants.ERROR_BAD_POSITION_PARAMETER );
907             error.setErrorMessage( "l'arrondissement n'est pas trouvé pour cette latitude et longitude. Etes vous bien dans Paris ? lat,lng : " + strLatitude
908                     + "," + strLongitude );
909 
910             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
911         }
912         signalement.setArrondissement( arrondissementByGeom );
913         AppLogService.info( "saveIncident, arrondissementByGeom found " + arrondissementByGeom.getNumero( ) );
914 
915         // Secteur
916         Sector secteur = _adresseService.getSecteurByGeomAndTypeSignalement( Double.parseDouble( strLongitude ), Double.parseDouble( strLatitude ),
917                 Integer.parseInt( strCategoryId ) );
918         if ( secteur == null )
919         {
920             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
921             error.setErrorCode( SignalementRestConstants.ERROR_BAD_POSITION_PARAMETER );
922             error.setErrorMessage(
923                     "le secteur auquel attribuer cette anomalie n'a pas été trouvé. Si vous êtes bien dans Paris, il s'agit d'un problème de configuration du serveur. lat,lng,cat : "
924                             + strLatitude + "," + strLongitude + "," + strCategoryId );
925             AppLogService.error(
926                     "le secteur auquel attribuer ce message n'a pas été trouvé. Si vous êtes bien dans Paris, il s'agit d'un problème de configuration du serveur. lat,lng,cat : "
927                             + strLatitude + "," + strLongitude + "," + strCategoryId );
928 
929             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
930         }
931 
932         signalement.setSecteur( secteur );
933 
934         // date of creation
935         SimpleDateFormat sdfDate = new SimpleDateFormat( DateConstants.DATE_FR );
936         String strCurrentDate = sdfDate.format( Calendar.getInstance( ).getTime( ) );
937         signalement.setDateCreation( strCurrentDate );
938 
939         // récupération de l'année et la lettre correspondant au mois
940         Date dateDay = _dateUtils.getDate( signalement.getDateCreation( ), false );
941         int moisSignalement = _dateUtils.getMoisInt( dateDay );
942         String strAnnee = _dateUtils.getAnnee( Calendar.getInstance( ).getTime( ) );
943         signalement.setAnnee( Integer.parseInt( strAnnee ) );
944         signalement.setMois( _signalementService.getLetterByMonth( moisSignalement ) );
945 
946         // Préfixe signalement
947         try
948         {
949             String strOrigin = jsonIncident.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ORIGIN );
950             if ( !SignalementRestConstants.SIGNALEMENT_PREFIXES.contains( strOrigin ) )
951             {
952                 ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
953                 error.setErrorCode( SignalementRestConstants.ERROR_BAD_ORIGIN );
954                 error.setErrorMessage( "Le type d'origine " + strOrigin + " du signalement n'a pas été trouvé. " );
955                 AppLogService.error( "Le type d'origine " + strOrigin + " du signalement n'a pas été trouvé. " );
956                 throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
957             }
958             signalement.setPrefix( strOrigin );
959         }
960         catch( Exception e )
961         {
962             AppLogService.error( e );
963             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
964             error.setErrorCode( SignalementRestConstants.ERROR_BAD_ORIGIN );
965             error.setErrorMessage( "Le type d'origine est obligatoire : le webservice a été appelé a partir d'une app mobile V1" );
966             AppLogService.error( "Le type d'origine est obligatoire : le webservice a été appelé a partir d'une app mobile V1" );
967             throw new ParseSignalementFromJSONException( formatterJson.format( error ) );
968         }
969 
970         // Creation of the unique token for the signalement
971         _signalementService.affectToken( signalement );
972 
973         signaleur.setMail( strEmail );
974         signaleur.setIdTelephone( strUDID );
975         signaleur.setSignalement( signalement );
976         signaleur.setGuid( guid );
977 
978         adresse.setLat( Double.parseDouble( strLatitude ) );
979         adresse.setLng( Double.parseDouble( strLongitude ) );
980         adresse.setAdresse( strAddress );
981         signalement.getAdresses( ).add( adresse );
982 
983         adresse.setSignalement( signalement );
984 
985         return signalement;
986     }
987 
988     /**
989      * Gets the string if exist.
990      *
991      * @param jsonObject
992      *            the json object
993      * @param key
994      *            the key
995      * @return the string if exist
996      */
997     private String getStringIfExist( JSONObject jsonObject, String key )
998     {
999         String value = "";
1000         if ( jsonObject.containsKey( key ) )
1001         {
1002             value = jsonObject.getString( key );
1003         }
1004         return value;
1005     }
1006 
1007     /**
1008      * {@inheritDoc}
1009      */
1010     @Override
1011     public String saveIncident( JSONObject jsonSrc ) throws ParseSignalementFromJSONException
1012     {
1013         // Warning, before edit this method, another method can save signalement SignalementJspBean.getSignalementDataAndSave (in plugin-signalement)
1014         AppLogService.info( "saveIncident BEGINNING" );
1015 
1016         Signalement signalement = new Signalement( );
1017         Signaleur signaleur = new Signaleur( );
1018         Adresse adresse = new Adresse( );
1019         parseSignalement( jsonSrc, signalement, signaleur, adresse );
1020 
1021         // Checking token (if device)
1022         String strUserToken = StringUtils.EMPTY;
1023         if ( StringUtils.isNotBlank( signaleur.getGuid( ) ) )
1024         {
1025             try
1026             {
1027                 strUserToken = jsonSrc.getString( SignalementRestConstants.JSON_TAG_USER_TOKEN );
1028             }
1029             catch( Exception e )
1030             {
1031                 AppLogService.error( e );
1032             }
1033         }
1034 
1035         // ajout d'un signalement en base et récupération de son id
1036         Long nId = _signalementService.insert( signalement );
1037         signalement.setId( nId );
1038         AppLogService.info( "saveIncident, saved with the ID " + nId );
1039 
1040         _adresseService.insert( adresse );
1041 
1042         // ajout d'un signaleur
1043         _signaleurService.insert( signaleur );
1044 
1045         int returnCode = 0;
1046 
1047         // Création du signaleur
1048         if ( StringUtils.isNotBlank( signaleur.getGuid( ) ) )
1049         {
1050             SiraUser siraUser = new SiraUser( );
1051             siraUser.setDevice( signalement.getPrefix( ) );
1052             siraUser.setGuid( signaleur.getGuid( ) );
1053             siraUser.setToken( strUserToken );
1054             siraUser.setMail( signaleur.getMail( ) );
1055             siraUser.setUdid( signaleur.getIdTelephone( ) );
1056 
1057             _siraUserService.createUser( siraUser );
1058         }
1059 
1060         JSONObject jsonObject = new JSONObject( );
1061         JSONObject jsonAnswer = new JSONObject( );
1062         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_STATUS, returnCode );
1063         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID, nId );
1064         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1065         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_SAVE_INCIDENT );
1066 
1067         AppLogService.info( "saveIncident, OK " + signalement.getId( ) );
1068         return jsonObject.toString( );
1069     }
1070 
1071     /**
1072      * {@inheritDoc}
1073      */
1074     @Override
1075     public String getReports( JSONObject jsonSrc )
1076     {
1077         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1078         _signalementWorkflowService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_WORKFLOW_BEAN );
1079 
1080         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
1081 
1082         JSONObject jsonAnswer = new JSONObject( );
1083         String strUDID = jsonSrc.getString( SignalementRestConstants.JSON_TAG_UDID );
1084 
1085         if ( StringUtils.isNotBlank( strUDID ) )
1086         {
1087             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_REPORTS );
1088 
1089             JSONObject json = new JSONObject( );
1090 
1091             JSONObject jsonIncidents = new JSONObject( );
1092 
1093             List<Signalement> listSignalement = _signalementService.findSignalementsByIdTelephone( strUDID );
1094 
1095             List<Signalement> listDeclaredIncidents = new ArrayList<>( );
1096             List<Signalement> listResolvedIncidents = new ArrayList<>( );
1097             List<Signalement> listUpdatedIncidents = new ArrayList<>( );
1098 
1099             // set the state of the signalement with the workflow
1100             WorkflowService workflowService = WorkflowService.getInstance( );
1101 
1102             if ( workflowService.isAvailable( ) )
1103             {
1104                 // récupération de l'identifiant du workflow
1105                 Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
1106 
1107                 if ( workflowId != null )
1108                 {
1109                     classifiedByState( listDeclaredIncidents, listResolvedIncidents, listUpdatedIncidents, workflowService, workflowId, listSignalement );
1110                 }
1111             }
1112 
1113             json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1114             json.accumulate( SignalementRestConstants.JSON_TAG_DECLARED_INCIDENTS, listDeclaredIncidents.size( ) );
1115             json.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_INCIDENTS, listResolvedIncidents.size( ) );
1116             json.accumulate( SignalementRestConstants.JSON_TAG_UPDATED_INCIDENTS, listUpdatedIncidents.size( ) );
1117 
1118             IFormatter<Signalement> formatterJson = new SignalementFormatterJson( );
1119             jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_DECLARED_INCIDENTS, formatterJson.format( listDeclaredIncidents ) );
1120             jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_INCIDENTS, formatterJson.format( listResolvedIncidents ) );
1121             jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_UPDATED_INCIDENTS, formatterJson.format( listUpdatedIncidents ) );
1122 
1123             json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENTS, jsonIncidents );
1124 
1125             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1126 
1127             return jsonAnswer.toString( );
1128         }
1129         else
1130         {
1131             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
1132             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
1133             error.setErrorMessage( StringUtils.EMPTY );
1134 
1135             return formatterJsonError.format( error );
1136         }
1137     }
1138 
1139     /**
1140      * {@inheritDoc}
1141      */
1142     @Override
1143     public String updateIncident( JSONObject jsonSrc, HttpServletRequest request )
1144     {
1145         _signalementWorkflowService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_WORKFLOW_BEAN );
1146         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1147 
1148         JSONObject jsonIncidentLog = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_INCIDENT_LOG );
1149         String strIncidentId = jsonIncidentLog.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
1150         String strStatus = jsonIncidentLog.getString( SignalementRestConstants.JSON_TAG_LOG_STATUS );
1151 
1152         WorkflowService workflowService = WorkflowService.getInstance( );
1153         if ( workflowService.isAvailable( ) )
1154         {
1155             // récupération de l'identifiant du workflow
1156             Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
1157 
1158             if ( workflowId != null )
1159             {
1160                 if ( strStatus.equals( SignalementRestConstants.UPDATE_STATUS_RESOLVED ) )
1161                 {
1162                     // 18 ou 22
1163                     workflowService.doProcessAction( Integer.parseInt( strIncidentId ), Signalement.WORKFLOW_RESOURCE_TYPE, 18, null, request,
1164                             request.getLocale( ), true );
1165                 }
1166                 else
1167                     if ( strStatus.equals( SignalementRestConstants.UPDATE_STATUS_INVALID ) )
1168                     {
1169                         workflowService.doProcessAction( Integer.parseInt( strIncidentId ), Signalement.WORKFLOW_RESOURCE_TYPE, 16, null, request,
1170                                 request.getLocale( ), true );
1171                     }
1172             }
1173         }
1174 
1175         JSONObject jsonAnswer = new JSONObject( );
1176         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_UPDATE_INCIDENT );
1177 
1178         JSONObject json = new JSONObject( );
1179         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1180         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1181 
1182         return jsonAnswer.toString( );
1183     }
1184 
1185     /**
1186      * {@inheritDoc}
1187      */
1188     @Override
1189     public String getUsersActivities( JSONObject jsonSrc )
1190     {
1191         JSONObject jsonAnswer = new JSONObject( );
1192         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_USER_ACTIVITIES );
1193 
1194         JSONObject json = new JSONObject( );
1195         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1196 
1197         JSONArray jsonEmptyArray = new JSONArray( );
1198 
1199         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_LOG, jsonEmptyArray );
1200 
1201         JSONObject jsonIncidents = new JSONObject( );
1202 
1203         jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_RESOLVED_INCIDENTS, jsonEmptyArray );
1204         jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_ONGOING_INCIDENTS, jsonEmptyArray );
1205         jsonIncidents.accumulate( SignalementRestConstants.JSON_TAG_UPDATED_INCIDENTS, jsonEmptyArray );
1206 
1207         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENTS, jsonIncidents );
1208         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1209 
1210         return jsonAnswer.toString( );
1211     }
1212 
1213     /**
1214      * {@inheritDoc}
1215      */
1216     @Override
1217     public String changeIncident( JSONObject jsonSrc )
1218     {
1219         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1220         _adresseService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_ADRESSE_SERVICE_BEAN );
1221 
1222         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
1223         String strCategoryId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_CATEGORIE_ID );
1224         String strAddress = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ADDRESS );
1225 
1226         Signalement signalement = _signalementService.getSignalement( Long.parseLong( strIncidentId ) );
1227 
1228         TypeSignalement typeSignalement = new TypeSignalement( );
1229         typeSignalement.setId( Integer.parseInt( strCategoryId ) );
1230         signalement.setTypeSignalement( typeSignalement );
1231 
1232         Adresse adresse = _adresseService.loadByIdSignalement( Long.parseLong( strIncidentId ) );
1233 
1234         adresse.setAdresse( strAddress );
1235         _adresseService.update( adresse );
1236 
1237         _signalementService.update( signalement );
1238 
1239         JSONObject jsonAnswer = new JSONObject( );
1240         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_CHANGE_INCIDENT );
1241 
1242         JSONObject json = new JSONObject( );
1243         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1244         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1245 
1246         return jsonAnswer.toString( );
1247     }
1248 
1249     /**
1250      * {@inheritDoc}
1251      */
1252     @Override
1253     public String getIncidentPhotos( JSONObject jsonSrc )
1254     {
1255         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1256         _photoService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_PHOTO_SERVICE_BEAN );
1257 
1258         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
1259         Signalement signalement = _signalementService.getSignalement( Long.parseLong( strIncidentId ) );
1260 
1261         JSONObject jsonAnswer = new JSONObject( );
1262         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_INCIDENT_PHOTOS );
1263 
1264         JSONObject json = new JSONObject( );
1265         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1266 
1267         JSONArray jsonArrayPhotos = new JSONArray( );
1268         List<PhotoDMR> pPhotos = _photoService.findBySignalementId( signalement.getId( ) );
1269 
1270         if ( pPhotos != null )
1271         {
1272             Collections.reverse( pPhotos );
1273             for ( PhotoDMR photo : pPhotos )
1274             {
1275                 JSONObject jsonPhoto = new JSONObject( );
1276                 jsonPhoto.accumulate( SignalementRestConstants.JSON_TAG_PHOTO_URL,
1277                         AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_URL_PICTURE ) + photo.getId( ) );
1278                 jsonPhoto.accumulate( SignalementRestConstants.JSON_TAG_COMMENTARY, StringUtils.EMPTY );
1279                 jsonPhoto.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_DATE,
1280                         fr.paris.lutece.plugins.dansmarue.modules.rest.util.date.DateUtils.convertDate( photo.getDate( ) ) );
1281                 jsonArrayPhotos.element( jsonPhoto );
1282             }
1283         }
1284 
1285         json.accumulate( SignalementRestConstants.JSON_TAG_PHOTOS, jsonArrayPhotos );
1286         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1287 
1288         return jsonAnswer.toString( );
1289     }
1290 
1291     /**
1292      * {@inheritDoc}
1293      */
1294     @Override
1295     public String changeStatus( JSONObject jsonSrc, HttpServletRequest request )
1296     {
1297         JSONObject jsonObject = new JSONObject( );
1298         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_CHANGE_STATUS );
1299         JSONObject jsonAnswer = new JSONObject( );
1300 
1301         if ( !isGoodFormat( jsonSrc ) )
1302         {
1303             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1304                     I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_WRONG_FORMAT, request.getLocale( ) ) );
1305             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1306         }
1307         else
1308             if ( !isTypeSignalementSelectable( jsonSrc ) )
1309             {
1310                 jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1311                         I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_WRONG_TYPE, request.getLocale( ) ) );
1312                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1313             }
1314             else
1315             {
1316                 try
1317                 {
1318                     JSONObject answer = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER );
1319 
1320                     int id = answer.getInt( SignalementRestConstants.JSON_TAG_INCIDENT_ID );
1321                     String status = answer.getString( SignalementRestConstants.JSON_TAG_STATUS );
1322 
1323                     Signalement signalement;
1324 
1325                     signalement = _signalementService.getSignalement( id );
1326 
1327                     Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
1328                     WorkflowService workflowService = WorkflowService.getInstance( );
1329                     int stateid = workflowService.getState( id, Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null ).getId( );
1330 
1331 
1332                     if ( signalement == null )
1333                     {
1334                         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1335                                 I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_NO_ANOMALY_FOUND, request.getLocale( ) ) );
1336                         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1337                     }
1338                     else
1339                     {
1340 
1341                         String comment = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_COMMENT ).equals( PARAMETER_NULL ) ? null
1342                                 : answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_COMMENT );
1343                         String token = answer.getString( SignalementRestConstants.JSON_TAG_TOKEN );
1344                         String reference = answer.getString( SignalementRestConstants.JSON_TAG_REFERENCE );
1345                         String motifRejetAutre;
1346                         String strDateProgrammee;
1347                         String chosenMessage = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_CHOSEN_MESSAGE ).equals( PARAMETER_NULL ) ? null
1348                                 : answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_CHOSEN_MESSAGE );
1349                         String emailActeur = answer.containsKey( SignalementRestConstants.JSON_TAG_EMAIL )
1350                                 ? answer.getString( SignalementRestConstants.JSON_TAG_EMAIL )
1351                                         : null;
1352 
1353                         String signalementreference = _signalementService.getSignalementReference( StringUtils.EMPTY, signalement );
1354 
1355                         if ( !reference.equals( signalementreference ) )
1356                         {
1357 
1358                             // NOK la reference ne correspond pas
1359                             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1360                                     I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_NO_ANOMALY_FOUND, request.getLocale( ) ) );
1361                             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1362                         }
1363 
1364 
1365 
1366                         else if ( stateid == AppPropertiesService.getPropertyInt( ID_STATE_ETAT_INITIAL, -1 ) )
1367                         {
1368                             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1369                                     I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_INITIAL_WRONG_STATUS, request.getLocale( ) ) );
1370                             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1371                         }
1372 
1373 
1374                         else
1375                             if ( token.equals( signalement.getToken( ) ) )
1376                             {
1377                                 // OK le token correspond
1378 
1379                                 if ( controleCoherenceStatus( jsonObject, answer, jsonAnswer, request, signalement ) )
1380                                 {
1381                                     motifRejetAutre = !StringUtils.isEmpty( answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ID_REJET ) )
1382                                             ? answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ID_REJET )
1383                                                     : StringUtils.EMPTY;
1384                                     strDateProgrammee = StringUtils
1385                                             .isNotEmpty( answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_DATE_PROGRAMMATION ) )
1386                                             ? answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_DATE_PROGRAMMATION )
1387                                                     : StringUtils.EMPTY;
1388                                     long idTypeAnomalie = PARAMETER_NULL.equals( answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE ) )
1389                                             ? -1
1390                                                     : answer.getLong( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE );
1391 
1392                                     request.getSession( ).setAttribute( PARAMETER_WEBSERVICE_CHOSEN_MESSAGE, chosenMessage );
1393 
1394                                     if(StringUtils.isNotBlank( emailActeur )) {
1395                                         request.getSession( ).setAttribute( PARAMETER_WEBSERVICE_EMAIL_ACTEUR, emailActeur );
1396                                     }
1397 
1398                                     String photoSF = null;
1399                                     if ( answer.containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_PHOTO ) )
1400                                     {
1401                                         photoSF = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_PHOTO ).equals( PARAMETER_NULL ) ? null
1402                                                 : answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_PHOTO );
1403                                         AppLogService.info( photoSF );
1404                                     }
1405 
1406                                     if ( ( photoSF != null ) && SignalementRestConstants.JSON_TAG_ANOMALY_DONE.equals( status ) )
1407                                     {
1408                                         PhotoDMR photo = new PhotoDMR( );
1409 
1410                                         ImageResource image = new ImageResource( );
1411                                         String width = AppPropertiesService.getProperty( SignalementConstants.IMAGE_THUMBNAIL_RESIZE_WIDTH );
1412                                         String height = AppPropertiesService.getProperty( SignalementConstants.IMAGE_THUMBNAIL_RESIZE_HEIGHT );
1413 
1414                                         String mimeType = photoSF.substring( photoSF.indexOf( "image" ), photoSF.indexOf( BASE_64 ) );
1415 
1416                                         String [ ] array = photoSF.split( BASE_64 );
1417 
1418                                         byte [ ] photoDecode = java.util.Base64.getDecoder( ).decode( array [1] );
1419 
1420                                         byte [ ] resizeImage = ImageUtil.resizeImage( photoDecode, width, height, 1 );
1421                                         image.setImage( photoDecode );
1422                                         mimeType = mimeType.replace( "x-png", "png" );
1423                                         image.setMimeType( mimeType );
1424                                         photo.setImage( image );
1425                                         photo.setImageContent( ImgUtils.checkQuality( image.getImage( ) ) );
1426                                         photo.setImageThumbnailWithBytes( resizeImage );
1427                                         photo.setSignalement( signalement );
1428                                         photo.setVue( SignalementRestConstants.VUE_SERVICE_FAIT );
1429                                         photo.setDate( new SimpleDateFormat( DateConstants.DATE_FR ).format( Calendar.getInstance( ).getTime( ) ) );
1430 
1431                                         // creation of the image in the db linked to the signalement
1432                                         _photoService.insert( photo );
1433 
1434                                     }
1435 
1436                                     _manageSignalementService.manageStatusWithWorkflow( request, jsonObject, jsonAnswer, id, signalementreference, status, null,
1437                                             motifRejetAutre, strDateProgrammee, idTypeAnomalie, comment, emailActeur );
1438 
1439                                 }
1440 
1441                             }
1442                             else
1443                             {
1444                                 // NOK le token ne correspond pas
1445                                 jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1446                                         I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_NO_TOKEN_FOUND, request.getLocale( ) ) );
1447                                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1448                             }
1449                     }
1450                 }
1451                 catch( JSONException e )
1452                 {
1453                     AppLogService.error( e.getMessage( ), e );
1454                     jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1455                             I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_DONE_WRONG_STATUS, request.getLocale( ) ) );
1456                     jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1457                 }
1458             }
1459         return jsonObject.toString( );
1460     }
1461 
1462     /**
1463      * Check if the jsonSrc has the correct format.
1464      *
1465      * @param jsonSrc
1466      *            the json
1467      * @return the boolean result
1468      */
1469     public boolean isGoodFormat( JSONObject jsonSrc )
1470     {
1471         return jsonSrc.containsKey( SignalementRestConstants.JSON_TAG_ANSWER )
1472                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_ID )
1473                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_STATUS )
1474                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_DATE_REEL_ACTION )
1475                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_COMMENT )
1476                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_ID_REJET )
1477                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER )
1478                 .containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_DATE_PROGRAMMATION )
1479                 && jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE );
1480     }
1481 
1482     /**
1483      * Check if the jsonSrc's type signalement is selectable and also active (via type id).
1484      *
1485      * @param jsonSrc
1486      *            the json
1487      * @return the boolean result
1488      */
1489     public boolean isTypeSignalementSelectable( JSONObject jsonSrc )
1490     {
1491         String status = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER ).getString( SignalementRestConstants.JSON_TAG_STATUS );
1492         String idTypeAnomalie = jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER )
1493                 .containsKey( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE )
1494                 ? jsonSrc.getJSONObject( SignalementRestConstants.JSON_TAG_ANSWER )
1495                         .getString( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE )
1496                         : null;
1497 
1498         if ( SignalementRestConstants.JSON_TAG_ANOMALY_REQUALIFIED.equals( status ) && StringUtils.isNumeric( idTypeAnomalie ) )
1499         {
1500             TypeSignalement selectedTypeSignalement = _typeSignalementService.getByIdTypeSignalement( Integer.parseInt( idTypeAnomalie ) );
1501 
1502             return ( ( selectedTypeSignalement != null ) && selectedTypeSignalement.getActif( )
1503                     && _typeSignalementService.isTypeSignalementSelectable( selectedTypeSignalement.getId( ) ) );
1504         }
1505         else
1506         {
1507             return true;
1508         }
1509     }
1510 
1511     /**
1512      * Check the status for a change status request.
1513      *
1514      * @param jsonObject
1515      *            the jsonObject
1516      * @param answer
1517      *            the answer
1518      * @param jsonAnswer
1519      *            the json answer
1520      * @param request
1521      *            the http request
1522      * @param signalement
1523      *            the signalement
1524      * @return true if the status is correct
1525      */
1526     private boolean controleCoherenceStatus( JSONObject jsonObject, JSONObject answer, JSONObject jsonAnswer, HttpServletRequest request, Signalement signalement )
1527     {
1528         boolean result = true;
1529 
1530         String status = answer.getString( SignalementRestConstants.JSON_TAG_STATUS );
1531 
1532         if ( status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_REJECTED ) )
1533         {
1534             // Pour le rejet la raison du rejet est obigatoire
1535             String raisonDuRejet = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ID_REJET );
1536             if ( PARAMETER_NULL.equals( raisonDuRejet ) || StringUtils.isBlank( raisonDuRejet ) )
1537             {
1538 
1539                 jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1540                         I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_REJECTED_WRONG_REJECT_CAUSE_ID, request.getLocale( ) ) );
1541                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1542 
1543                 result = false;
1544             }
1545         }
1546         else
1547             if ( status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_REQUALIFIED ) )
1548             {
1549                 // pour le status requalifier le type d'anomalie est obligatoire
1550                 String idTypeAnomalie = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_TYPE_ANOMALIE );
1551                 if ( PARAMETER_NULL.equals( idTypeAnomalie ) || StringUtils.isBlank( idTypeAnomalie ) || !StringUtils.isNumeric( idTypeAnomalie )
1552                         || ( ( signalement.getTypeSignalement( ) != null ) && ( Integer.parseInt( idTypeAnomalie ) == signalement.getTypeSignalement( ).getId( ) ) ) )
1553                 {
1554 
1555                     jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1556                             I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_REQUALIFIED_WRONG_TYPE_ANOMALIE, request.getLocale( ) ) );
1557                     jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1558 
1559                     result = false;
1560                 }
1561             }
1562             else
1563                 if ( status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_PROGRAMMED ) )
1564                 {
1565                     // Pour le status programmer la date de programmation est obligatoire
1566                     String strDateProgrammee = answer.getString( SignalementRestConstants.JSON_TAG_INCIDENT_DATE_PROGRAMMATION );
1567 
1568                     try
1569                     {
1570                         DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy" );
1571                         LocalDate dateTime = LocalDate.parse( strDateProgrammee, formatter );
1572                         if ( dateTime.atStartOfDay( ).toInstant( ZoneOffset.UTC ).isBefore( Instant.now( ).truncatedTo( ChronoUnit.DAYS ) ) )
1573                         {
1574                             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR, I18nService
1575                                     .getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_PROGRAMMED_DATE_BEFORE_TODAY, request.getLocale( ) ) );
1576                             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1577 
1578                             result = false;
1579                         }
1580                     }
1581                     catch( DateTimeParseException e )
1582                     {
1583                         AppLogService.error( e.getMessage( ), e );
1584 
1585                         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1586                                 I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_PROGRAMMED_WRONG_DATE_FORMAT, request.getLocale( ) ) );
1587                         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1588 
1589                         result = false;
1590                     }
1591                 }
1592                 else
1593                     if ( !status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_DONE )
1594                             && !status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_REQUALIFIED )
1595                             && !status.equals( SignalementRestConstants.JSON_TAG_ANOMALY_A_REQUALIFIED ) )
1596                     {
1597                         // Le status n'est pas service fait ou rejeter ou programmer ou requalifier
1598                         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR,
1599                                 I18nService.getLocalizedString( SignalementRestConstants.ERROR_MESSAGE_DIFFERENT_STATUS, request.getLocale( ) ) );
1600                         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1601 
1602                         result = false;
1603                     }
1604 
1605         return result;
1606     }
1607 
1608     /**
1609      * Stub for plug the "add anomalie" WS.
1610      *
1611      * @param jsonSrc
1612      *            the json
1613      * @return the result
1614      */
1615     public String addAnomalie( JSONObject jsonSrc )
1616     {
1617         JSONObject anomalie = jsonSrc.getJSONObject( "anomalie" );
1618         int id = anomalie.getInt( SignalementRestConstants.JSON_TAG_INCIDENT_ID );
1619 
1620         JSONObject jsonObject = new JSONObject( );
1621 
1622         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_ADD_ANOMALIE );
1623 
1624         JSONObject jsonAnswer = new JSONObject( );
1625         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_ID, id );
1626 
1627         jsonObject.accumulate( "answer", jsonAnswer );
1628 
1629         return jsonObject.toString( );
1630     }
1631 
1632     /**
1633      * {@inheritDoc}
1634      */
1635     @Override
1636     public String getCategoriesList( JSONObject jsonSrc )
1637     {
1638         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
1639 
1640         double dCurVersion = jsonSrc.getDouble( SignalementRestConstants.JSON_TAG_CATEGORIES_CURVERSION );
1641 
1642         JSONObject jsonObject = new JSONObject( );
1643         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_CATEGORIES_LIST );
1644 
1645         JSONObject jsonAnswer = new JSONObject( );
1646         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1647         double dVersion = _typeSignalementService.findLastVersionTypeSignalement( );
1648         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES_VERSION, dVersion );
1649 
1650         if ( Double.compare( dVersion, dCurVersion ) != 0 )
1651         {
1652             if ( !jsonSrc.has( SignalementRestConstants.JSON_TAG_CATEGORIES_CURVERSION_MOBILE_PROD ) )
1653             {
1654                 IFormatter<TypeSignalement> formatterJson = new CategoriesFormatterJson( );
1655                 jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES,
1656                         formatterJson.format( _typeSignalementService.getAllTypeSignalementByIsAgent( false ) ) );
1657             }
1658             else
1659             {
1660                 IFormatter<TypeSignalement> formatterJson = new CategoriesFormatterJson( );
1661                 jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES, formatterJson.format( _typeSignalementService.getAll( ) ) );
1662             }
1663 
1664         }
1665         else
1666         {
1667             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES, PARAMETER_NULL );
1668         }
1669         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1670 
1671         return jsonObject.toString( );
1672     }
1673 
1674     /**
1675      * Gets the categories list xml.
1676      *
1677      * @return signalement type list XML format
1678      */
1679     public String getCategoriesListXml( )
1680     {
1681         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
1682 
1683         StringBuilder strFormatted = new StringBuilder( );
1684         strFormatted.append( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE annuaire SYSTEM \"signalement_nomenclature.dtd\"><elementList>" );
1685 
1686         for ( TypeSignalementDTO ts : _typeSignalementService.getTypeSignalementTree( true ) )
1687         {
1688             formatXml( strFormatted, ts );
1689         }
1690 
1691         strFormatted.append( "</elementList>" );
1692 
1693         return strFormatted.toString( );
1694     }
1695 
1696     /**
1697      * Gets the categories list json.
1698      *
1699      * @return signalement type list Json format
1700      */
1701     public String getCategoriesListJson( )
1702     {
1703         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
1704 
1705         List<TypeSignalementDTO> lstSignalementDTO = _typeSignalementService.getTypeSignalementTree( true );
1706 
1707         return lstSignalementDTOToString( lstSignalementDTO );
1708     }
1709 
1710     /**
1711      * Gets the categories list json for source.
1712      *
1713      * @param nIdSource
1714      *            the n id source
1715      * @return the categories list json for source
1716      */
1717     public String getCategoriesListJsonForSource( Integer nIdSource )
1718     {
1719         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
1720 
1721         List<TypeSignalementDTO> lstSignalementDTO = _typeSignalementService.getTypeSignalementTreeFromSource( nIdSource );
1722 
1723         return lstSignalementDTOToString( lstSignalementDTO );
1724     }
1725 
1726     /**
1727      * Gets the actualites list json for source.
1728      *
1729      * @param mobileVersionActualite
1730      *             new list version in mobile application
1731      * @return the actualites list json for source
1732      */
1733     public String getActualiteListJson( int mobileVersionActualite )
1734     {
1735         _actualiteService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_ACTUALITE_BEAN );
1736 
1737         int currentNewsVersion = _actualiteService.getVersionActualite( );
1738 
1739         List<Actualite> lstActualite = _actualiteService.getActualiteWithVersion( mobileVersionActualite, currentNewsVersion );
1740 
1741         JSONObject jsonObject = new JSONObject( );
1742         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_NEWS_LIST );
1743 
1744         JSONObject jsonAnswer = new JSONObject( );
1745         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1746         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES_VERSION, currentNewsVersion );
1747         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ACTUALITE, lstActualiteToString( lstActualite ) );
1748 
1749         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1750 
1751         return jsonObject.toString( );
1752     }
1753 
1754     public String getAideListJson( int versionAide )
1755     {
1756         _aideService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_AIDE_BEAN );
1757 
1758         int currentAideVersion = _aideService.getVersionAide( );
1759 
1760         List<Aide> lstAide = _aideService.getAideWithVersion( versionAide );
1761 
1762         JSONObject jsonObject = new JSONObject( );
1763         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_AIDES_LIST );
1764 
1765         JSONObject jsonAnswer = new JSONObject( );
1766         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1767         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_CATEGORIES_VERSION, currentAideVersion );
1768         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_AIDES, lstAideToString( lstAide ) );
1769 
1770         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
1771 
1772         return jsonObject.toString( );
1773     }
1774 
1775     /**
1776      * Gets the anomalie by number.
1777      *
1778      * @param number
1779      *            the number
1780      * @return the anomalie by number
1781      */
1782     public String getAnomalieByNumber( String number, String guid )
1783     {
1784         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1785 
1786         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
1787 
1788         JSONObject jsonAnswer = new JSONObject( );
1789 
1790         JSONObject json = new JSONObject( );
1791         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1792 
1793         // Récupération du signalement
1794         Signalement signalement = _signalementService.getAnomalieByNumber( number );
1795 
1796         // Aucun signalement ne correspond au numéro
1797         if ( signalement == null )
1798         {
1799             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
1800             error.setErrorCode( SignalementRestConstants.ERROR_GET_SIGNALEMENT_BY_NUMBER_NOT_FOUND );
1801             error.setErrorMessage( AppPropertiesService.getProperty( SignalementRestConstants.ERROR_GET_SIG_BY_NUMBER_NOT_FOUND ) );
1802 
1803             return formatterJsonError.format( error );
1804         }
1805 
1806         // Controle sur la date de création
1807         Integer nbJourMax = Integer.parseInt( DatastoreService.getDataValue( "sitelabels.site_property.mobile.nb.jour.recherche.ano.max", "90" ) );
1808 
1809         if ( _dateUtils.isDateMoreThanXDay( signalement.getDateCreation( ), nbJourMax ) )
1810         {
1811             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
1812             error.setErrorCode( SignalementRestConstants.ERROR_GET_SIGNALEMENT_BY_NUMBER_TOO_OLD );
1813             error.setErrorMessage( AppPropertiesService.getProperty( SignalementRestConstants.ERROR_GET_SIG_BY_NUMBER_TOO_OLD ) );
1814 
1815             return formatterJsonError.format( error );
1816         }
1817 
1818         SignalementFormatterJson/rest/service/formatters/SignalementFormatterJson.html#SignalementFormatterJson">SignalementFormatterJson formatterJson = new SignalementFormatterJson( );
1819 
1820         if ( !StringUtils.isBlank( guid ) )
1821         {
1822             formatterJson.setFormatWithGuid( guid );
1823         }
1824 
1825         List<Signalement> listSignalementRest = new ArrayList<>( );
1826         listSignalementRest.add( signalement );
1827 
1828         JSONArray jsonArray = new JSONArray( );
1829         jsonArray.add( JSONSerializer.toJSON( formatterJson.format( signalement ) ) );
1830 
1831         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT, jsonArray.toString( ) );
1832 
1833         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1834 
1835         return jsonAnswer.toString( );
1836     }
1837 
1838     /**
1839      * Gets list of anomalies belongs to the tour sheet.
1840      * @param idFDT
1841      *    id of the tour sheet
1842      * @return json response
1843      */
1844     public String getAnomaliesByIdFDT(int idFDT) {
1845 
1846         _feuilleTourneeService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_FDT_SERVICE_BEAN );
1847         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
1848 
1849         FeuilleDeTournee feuilleDeTournee = _feuilleTourneeService.load( idFDT );
1850 
1851         JSONObject jsonAnswer = new JSONObject( );
1852         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_SEARCH_INCIDENTS_BY_ID_FDT );
1853 
1854 
1855         JSONObject json = new JSONObject( );
1856         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
1857 
1858         JSONArray jsonArray = new JSONArray( );
1859 
1860 
1861         if ( feuilleDeTournee.getListSignalementIds( ) != null )
1862         {
1863             List<Signalement> listSignalementFDT = _signalementService.getAnomalieWithExtraInfoForMobilSearch(feuilleDeTournee.getListSignalementIds( ));
1864             SignalementFormatterJson/rest/service/formatters/SignalementFormatterJson.html#SignalementFormatterJson">SignalementFormatterJson formatterJson = new SignalementFormatterJson( );
1865             jsonArray = (JSONArray) JSONSerializer.toJSON( formatterJson.format( listSignalementFDT ) );
1866         } else {
1867             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_MESSAGE, AppPropertiesService.getProperty( SignalementRestConstants.ERROR_GET_ANOMALIES_FDT_BY_ID_NOT_FOUND   ) );
1868         }
1869 
1870 
1871         json.accumulate( SignalementRestConstants.JSON_TAG_ID_FDT_SERCH, idFDT );
1872         json.accumulate( SignalementRestConstants.JSON_TAG_INFO_AVANT_TOURNEE, feuilleDeTournee.getInfoAvantTournee() );
1873         json.accumulate( SignalementRestConstants.JSON_TAG_INFO_APRES_TOURNEE, feuilleDeTournee.getInfoApresTournee() );
1874         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENTS, jsonArray.toString( ) );
1875         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
1876 
1877         return jsonAnswer.toString( );
1878     }
1879 
1880     /**
1881      * Gets the infos for source.
1882      *
1883      * @param nIdSource
1884      *            the n id source
1885      * @return the infos for source
1886      */
1887     public Source getInfosForSource( Integer nIdSource )
1888     {
1889         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
1890 
1891         return _typeSignalementService.getSourceById( nIdSource );
1892     }
1893 
1894     /**
1895      * Lst signalement DTO to string.
1896      *
1897      * @param lstSignalementDTO
1898      *            the lst signalement DTO
1899      * @return the string
1900      */
1901     private String lstSignalementDTOToString( List<TypeSignalementDTO> lstSignalementDTO )
1902     {
1903         String result = "[";
1904         if ( !lstSignalementDTO.isEmpty( ) )
1905         {
1906             StringBuilder buf = new StringBuilder( );
1907             boolean first = true;
1908             for ( TypeSignalementDTO signalement : lstSignalementDTO )
1909             {
1910                 buf.append( formatJson( signalement, first ) );
1911                 first = false;
1912             }
1913             result += buf.toString( );
1914         }
1915         result += "]";
1916 
1917         return result;
1918     }
1919 
1920     private String lstActualiteToString( List<Actualite> lstActualite )
1921     {
1922         JSONArray actArr = new JSONArray();
1923 
1924         String result = "";
1925 
1926         if (!lstActualite.isEmpty( ))
1927         {
1928             for (Actualite actualite : lstActualite)
1929             {
1930                 JSONObject json = new JSONObject();
1931 
1932                 json.put("id", actualite.getId());
1933                 json.put("libelle", actualite.getLibelle( ));
1934                 json.put("texte", actualite.getTexte( ));
1935                 json.put("image_url", actualite.getImageUrl( ));
1936                 json.put("actif", actualite.getActif( ));
1937                 json.put("ordre", actualite.getOrdre( ));
1938 
1939                 actArr.add(json);
1940 
1941             }
1942         }
1943 
1944         result = actArr.toString( );
1945 
1946         return result;
1947     }
1948 
1949     private String lstAideToString( List<Aide> lstAide )
1950     {
1951         JSONArray aideArr = new JSONArray();
1952 
1953         String result = "";
1954 
1955         if (!lstAide.isEmpty( ))
1956         {
1957             for (Aide aide : lstAide)
1958             {
1959                 JSONObject json = new JSONObject();
1960 
1961                 json.accumulate("id", aide.getId());
1962                 json.accumulate("libelle", aide.getLibelle( ));
1963                 json.accumulate("hypertexte_url", aide.getHypertexteUrl( ));
1964                 json.accumulate("image_url", aide.getImageUrl( ));
1965                 json.accumulate("actif", aide.getActif( ));
1966                 json.accumulate("ordre", aide.getOrdre( ));
1967 
1968                 aideArr.add(json);
1969 
1970             }
1971         }
1972 
1973         result = aideArr.toString( );
1974 
1975         return result;
1976     }
1977 
1978 
1979 
1980     /**
1981      * Xml representation of type report.
1982      *
1983      * @param strFormatted
1984      *            XML string
1985      * @param ts
1986      *            type report
1987      */
1988     private void formatXml( StringBuilder strFormatted, TypeSignalementDTO ts )
1989     {
1990         strFormatted.append( "<element id=\"" + ts.getId( ) + "\">" );
1991         strFormatted.append( "<name>" );
1992         strFormatted.append( ts.getLibelle( ) );
1993         strFormatted.append( "</name>" );
1994 
1995         List<TypeSignalementDTO> lts = ts.getListChild( );
1996 
1997         if ( ( lts != null ) && ( !lts.isEmpty( ) ) )
1998         {
1999             strFormatted.append( "<elements>" );
2000 
2001             for ( TypeSignalementDTO ts2 : lts )
2002             {
2003                 formatXml( strFormatted, ts2 );
2004             }
2005 
2006             strFormatted.append( "</elements>" );
2007         }
2008         else
2009         {
2010             strFormatted.append( "<to id=\"16\">DPE</to>" );
2011         }
2012 
2013         strFormatted.append( "</element>" );
2014     }
2015 
2016     /**
2017      * Format type report in json.
2018      *
2019      * @param ts
2020      *            type report
2021      * @param firstElement
2022      *            true if is a top type
2023      * @return Json string
2024      */
2025     private String formatJson( TypeSignalementDTO ts, boolean firstElement )
2026     {
2027 
2028         StringBuilder sb = new StringBuilder( );
2029         if ( !firstElement )
2030         {
2031             sb.append( "," );
2032         }
2033         sb.append( "{\"id\": " + ts.getId( ) + "," );
2034         sb.append( "\"libelle\": \"" + ts.getLibelle( ).replace( "\"", "" ) + "\"," );
2035         sb.append( "\"imageUrl\": \"" + getImageBase64( ts.getImage( ) ) + "\"," );
2036         sb.append( "\"isAgent\": \"" + ts.getIsAgent( ) + "\"," );
2037         sb.append( "\"entite\": \"" + ( ts.getUnit( ) != null ? ts.getUnit( ).getLabel( ) : "" ) + "\"" );
2038         if ( ts.getTypeSignalementParent( ) != null )
2039         {
2040             sb.append( ", \"typeSignalementParent\":{\"id\":" + ts.getTypeSignalementParent( ).getId( ) + "}" );
2041         }
2042         if ( !ts.getListChild( ).isEmpty( ) )
2043         {
2044             sb.append( ",\"listChild\": [" );
2045             boolean first = true;
2046             for ( TypeSignalementDTO child : ts.getListChild( ) )
2047             {
2048                 sb.append( formatJson( child, first ) );
2049                 first = false;
2050             }
2051 
2052             sb.append( "]" );
2053         }
2054 
2055         sb.append( "}" );
2056 
2057         return sb.toString( );
2058     }
2059 
2060     /**
2061      * {@inheritDoc}
2062      */
2063     @Override
2064     public String updatePictureIncident( HttpServletRequest request, InputStream requestBodyStream )
2065     {
2066 
2067         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2068         _photoService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_PHOTO_SERVICE_BEAN );
2069 
2070         IFormatter<ErrorSignalement> formatterJson = new ErrorSignalementFormatterJson( );
2071 
2072         String strIdIncident = request.getHeader( SignalementRestConstants.PARAMETERS_HEADER_INCIDENT_ID );
2073         String strPhotoVue = request.getHeader( SignalementRestConstants.PARAMETERS_HEADER_TYPE );
2074         Signalement signalement = _signalementService.getSignalement( Long.parseLong( strIdIncident ) );
2075 
2076         try
2077         {
2078             ByteArrayOutputStream out = new ByteArrayOutputStream( );
2079             IOUtils.copy( requestBodyStream, out );
2080 
2081             if ( out.size( ) == 0 )
2082             {
2083                 ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2084                 error.setErrorCode( SignalementRestConstants.ERROR_IMPOSSIBLE_READ_PICTURE );
2085                 error.setErrorMessage( StringUtils.EMPTY );
2086 
2087                 return formatterJson.format( error );
2088             }
2089 
2090             ImageResource image = new ImageResource( );
2091             image.setImage( out.toByteArray( ) );
2092             image.setMimeType( request.getContentType( ) );
2093 
2094             String width = AppPropertiesService.getProperty( SignalementConstants.IMAGE_THUMBNAIL_RESIZE_WIDTH );
2095             String height = AppPropertiesService.getProperty( SignalementConstants.IMAGE_THUMBNAIL_RESIZE_HEIGHT );
2096             byte [ ] resizeImage = ImageUtil.resizeImage( out.toByteArray( ), width, height, 1 );
2097 
2098             PhotoDMR photoSignalement = new PhotoDMR( );
2099             photoSignalement.setImage( image );
2100             photoSignalement.setImageContent( ImgUtils.checkQuality( image.getImage( ) ) );
2101             photoSignalement.setImageThumbnailWithBytes( resizeImage );
2102             photoSignalement.setMimeType( request.getContentType( ) );
2103             photoSignalement.setSignalement( signalement );
2104 
2105             if ( StringUtils.isNotBlank( strPhotoVue ) )
2106             {
2107                 if ( SignalementRestConstants.PICTURE_FAR.equals( strPhotoVue ) )
2108                 {
2109                     photoSignalement.setVue( SignalementRestConstants.VUE_ENSEMBLE );
2110                 }
2111                 else
2112                     if ( SignalementRestConstants.PICTURE_CLOSE.equals( strPhotoVue ) )
2113                     {
2114                         photoSignalement.setVue( SignalementRestConstants.VUE_PRES );
2115                     }
2116                     else
2117                         if ( SignalementRestConstants.PICTURE_DONE.equals( strPhotoVue ) )
2118                         {
2119                             photoSignalement.setVue( SignalementRestConstants.VUE_SERVICE_FAIT );
2120                         }
2121             }
2122 
2123             // date of creation
2124             SimpleDateFormat sdfDate = new SimpleDateFormat( DateConstants.DATE_FR );
2125             photoSignalement.setDate( sdfDate.format( Calendar.getInstance( ).getTime( ) ) );
2126 
2127             Optional<PhotoDMR> existPhoto = _photoService.findBySignalementId( signalement.getId( ) ).stream( )
2128                     .filter( photo -> photo.getVue( ).intValue( ) == photoSignalement.getVue( ).intValue( ) ).findFirst( );
2129 
2130             if ( existPhoto.isPresent( ) )
2131             {
2132                 PhotoDMR photoDMR = existPhoto.get( );
2133                 _photoService.remove( photoDMR.getId( ) );
2134             }
2135             _photoService.insert( photoSignalement );
2136 
2137             out.close( );
2138         }
2139 
2140         catch( Exception e )
2141         {
2142 
2143             AppLogService.error( e.getMessage( ), e );
2144 
2145             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2146             error.setErrorCode( SignalementRestConstants.ERROR_BAD_PICTURE );
2147             error.setErrorMessage( e.getMessage( ) );
2148 
2149             AppLogService.info( "java.awt.headless  to true" );
2150             System.setProperty( "java.awt.headless", "true" );
2151 
2152             return formatterJson.format( error );
2153         }
2154 
2155         JSONObject jsonAnswer = new JSONObject( );
2156         JSONObject json = new JSONObject( );
2157         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2158         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2159 
2160         return jsonAnswer.toString( );
2161     }
2162 
2163 
2164 
2165     /**
2166      * POJO for report.
2167      *
2168      * @param listeSignalements
2169      *            list of report.
2170      * @return pojo
2171      */
2172     private SignalementsPOJO buildPOJO( List<Signalement> listeSignalements )
2173     {
2174         List<SignalementPOJO> signalements = new ArrayList<>( );
2175 
2176         for ( Signalement signalement : listeSignalements )
2177         {
2178             SignalementPOJOins/dansmarue/modules/rest/pojo/SignalementPOJO.html#SignalementPOJO">SignalementPOJO e = new SignalementPOJO( );
2179             e.setId( signalement.getId( ) );
2180             signalements.add( e );
2181         }
2182 
2183         SignalementsPOJO/dansmarue/modules/rest/pojo/SignalementsPOJO.html#SignalementsPOJO">SignalementsPOJO ret = new SignalementsPOJO( );
2184         ret.setSignalements( signalements );
2185 
2186         return ret;
2187     }
2188 
2189     /**
2190      * {@inheritDoc}
2191      */
2192     @Override
2193     public SignalementsPOJO signalementAArchiverRejete( )
2194     {
2195         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2196 
2197         List<Signalement> listeSignalements = _signalementService.getSignalementByStatusId( 11 );
2198 
2199         return buildPOJO( listeSignalements );
2200     }
2201 
2202     /**
2203      * {@inheritDoc}
2204      */
2205     @Override
2206     public SignalementsPOJO signalementAArchiverServiceFait( )
2207     {
2208         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2209 
2210         List<Signalement> listeSignalements = _signalementService.getSignalementByStatusId( 10 );
2211 
2212         return buildPOJO( listeSignalements );
2213     }
2214 
2215     /**
2216      * Methode to sort the signalement list.
2217      *
2218      * @param lat1
2219      *            lat coordinate
2220      * @param lng1
2221      *            lng coordinate
2222      *
2223      * @param listSignalement
2224      *            list of report
2225      * @return list sorted
2226      */
2227     private List<Signalement> getSignalementListSorted( double lat1, double lng1, List<Signalement> listSignalement )
2228     {
2229         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2230 
2231         // tri des signalements pas rapport à leur distance la plus prochaine de l'utilisateur
2232         List<SignalementGeoLoc> listSignalementGeoLoc = new ArrayList<>( );
2233         for ( Signalement signalement : listSignalement )
2234         {
2235             Adresse adresse = signalement.getAdresses( ).get( 0 );
2236             if ( adresse != null )
2237             {
2238                 Integer distance = _signalementService.getDistanceBetweenSignalement( lat1, lng1, adresse.getLat( ), adresse.getLng( ) );
2239                 SignalementGeoLoc signalementGeoLoc = new SignalementGeoLoc( );
2240                 signalementGeoLoc.setSignalement( signalement );
2241                 signalementGeoLoc.setDistance( distance );
2242                 listSignalementGeoLoc.add( signalementGeoLoc );
2243             }
2244         }
2245         Collections.sort( listSignalementGeoLoc );
2246 
2247         List<Signalement> listSignalementSorted = new ArrayList<>( );
2248         for ( SignalementGeoLoc signalementGeoLoc : listSignalementGeoLoc )
2249         {
2250             listSignalementSorted.add( signalementGeoLoc.getSignalement( ) );
2251         }
2252         return listSignalementSorted;
2253     }
2254 
2255     /**
2256      * Updates the congratulation count of an anomalie.
2257      *
2258      * @param jsonSrc
2259      *            json src.
2260      * @return the answer
2261      */
2262     public String congratulateAnomalie( JSONObject jsonSrc )
2263     {
2264         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2265         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
2266         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2267 
2268         if ( StringUtils.isBlank( strIncidentId ) )
2269         {
2270             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2271             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2272             error.setErrorMessage( StringUtils.EMPTY );
2273             return formatterJsonError.format( error );
2274         }
2275 
2276         _signalementService.incrementFelicitationsByIdSignalement( Integer.valueOf( strIncidentId ) );
2277 
2278         JSONObject jsonAnswer = new JSONObject( );
2279         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_CONGRATULATE_ANOMALIE );
2280 
2281         JSONObject json = new JSONObject( );
2282         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2283         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2284 
2285         return jsonAnswer.toString( );
2286     }
2287 
2288     /**
2289      * service to past report to done status.
2290      *
2291      * @param signalement
2292      *            the report
2293      * @param request
2294      *            the http request
2295      * @return true if is validate
2296      */
2297     public boolean validateServiceFaitSignalement( Signalement signalement, HttpServletRequest request )
2298     {
2299 
2300         boolean response = false;
2301 
2302         JSONObject jObject = new JSONObject( );
2303         jObject.accumulate( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID, signalement.getId( ).toString( ) );
2304         jObject.accumulate( SignalementRestConstants.JSON_TAG_GUID, signalement.getSignaleurs( ).get( 0 ).getGuid( ) );
2305         jObject.accumulate( SignalementRestConstants.JSON_TAG_EMAIL, signalement.getSignaleurs( ).get( 0 ).getMail( ) );
2306 
2307         String resolved = setIncidentResolved( jObject, request );
2308 
2309         if ( !resolved.isEmpty( ) && !resolved.contains( "error" ) )
2310         {
2311             response = true;
2312         }
2313 
2314         return response;
2315     }
2316 
2317     /**
2318      * Sets the incident as resolved.
2319      *
2320      * @param jsonSrc
2321      *            json source
2322      * @param request
2323      *            the http request
2324      * @return the answer
2325      */
2326     public String setIncidentResolved( JSONObject jsonSrc, HttpServletRequest request )
2327     {
2328 
2329         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2330 
2331         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
2332 
2333         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2334         if ( StringUtils.isBlank( strIncidentId ) )
2335         {
2336             AppLogService.error( "Error id incident empty or null !! " );
2337             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2338             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2339             error.setErrorMessage( StringUtils.EMPTY );
2340             return formatterJsonError.format( error );
2341         }
2342         String guid = StringUtils.EMPTY;
2343         try
2344         {
2345             guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
2346         }
2347         catch( Exception e )
2348         {
2349             AppLogService.error( e );
2350         }
2351 
2352         String strUDID = StringUtils.EMPTY;
2353         try
2354         {
2355             strUDID = jsonSrc.getString( SignalementRestConstants.JSON_TAG_UDID );
2356         }
2357         catch( Exception e )
2358         {
2359             AppLogService.error( e );
2360         }
2361 
2362         String email = StringUtils.EMPTY;
2363         try
2364         {
2365             email = jsonSrc.getString( SignalementRestConstants.JSON_TAG_EMAIL );
2366         }
2367         catch( Exception e )
2368         {
2369             AppLogService.error( e );
2370         }
2371 
2372         if ( StringUtils.isBlank( guid ) && StringUtils.isBlank( strUDID ) )
2373         {
2374             AppLogService.error( "Error guid and strUDIDempty or null !! " );
2375             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2376             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
2377             error.setErrorMessage( StringUtils.EMPTY );
2378             return formatterJsonError.format( error );
2379         }
2380 
2381         Signalement signalement = _signalementService.getSignalement( Integer.parseInt( strIncidentId ) );
2382 
2383         if ( signalement == null )
2384         {
2385             AppLogService.error( "signalement not found !! " );
2386             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2387             error.setErrorCode( SignalementRestConstants.ERROR_BAD_INCIDENT_ID_BIS );
2388             error.setErrorMessage( StringUtils.EMPTY );
2389 
2390             return formatterJsonError.format( error );
2391         }
2392 
2393         List<Signaleur> signaleurs = signalement.getSignaleurs( );
2394 
2395         boolean signaleurFound = false;
2396 
2397         for ( Signaleur signaleur : signaleurs )
2398         {
2399             if ( ( StringUtils.isNotBlank( guid ) && guid.equals( signaleur.getGuid( ) ) )
2400                     || ( StringUtils.isNotBlank( email ) && email.equals( signaleur.getMail( ) ) ) )
2401             {
2402                 signaleurFound = true;
2403             }
2404         }
2405 
2406         // Si le signaleur n'est pas trouvé et que l'email ne finit pas par @paris.fr, remonte une erreur
2407         if ( !signaleurFound && !StringUtilsDmr.endsWithAny( getIdentityStoreAttributeValue( guid, "email" ).toLowerCase( ), getEmailDomainAccept( ) ) )
2408         {
2409             AppLogService.error( "signaleur not found and bad domain email !! " );
2410             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2411             error.setErrorCode( SignalementRestConstants.ERROR_BAD_OWNER );
2412             error.setErrorMessage( StringUtils.EMPTY );
2413             return formatterJsonError.format( error );
2414         }
2415 
2416         String comment = StringUtils.EMPTY;
2417         try
2418         {
2419             comment = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_COMMENT );
2420         }
2421         catch( Exception e )
2422         {
2423             AppLogService.error( e );
2424         }
2425 
2426         // recuperation numero message service fait
2427         if ( jsonSrc.containsKey( SignalementRestConstants.JSON_TAG_NUMERO_MESSAGE_SERVICE_FAIT )
2428                 && jsonSrc.containsKey( SignalementRestConstants.JSON_TAG_TYPE_MESSAGE_SERVICE_FAIT ) )
2429         {
2430             request.getSession( ).setAttribute( PARAMETER_WEBSERVICE_CHOSEN_MESSAGE,
2431                     jsonSrc.getInt( SignalementRestConstants.JSON_TAG_NUMERO_MESSAGE_SERVICE_FAIT ) );
2432             request.getSession( ).setAttribute( PARAMETER_WEBSERVICE_IS_MESSAGE_TYPO,
2433                     !jsonSrc.getBoolean( SignalementRestConstants.JSON_TAG_TYPE_MESSAGE_SERVICE_FAIT ) );
2434         }
2435 
2436         // récupération de l'identifiant du workflow
2437         Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
2438 
2439         int idIncident = Integer.parseInt( strIncidentId );
2440 
2441         WorkflowService workflowService = WorkflowService.getInstance( );
2442 
2443         int stateid = workflowService.getState( idIncident, Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null ).getId( );
2444 
2445         int idStatutServiceFait = AppPropertiesService.getPropertyInt( SignalementRestConstants.PROPERTY_ID_STATE_SERVICE_FAIT, -1 );
2446 
2447         int idActionServiceFait = _signalementWorkflowService.selectIdActionByStates( stateid, idStatutServiceFait );
2448 
2449         JSONObject jsonAnswer = new JSONObject( );
2450         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_INCIDENT_RESOLVED );
2451 
2452         JSONObject json = new JSONObject( );
2453 
2454         AppLogService.debug( "Incident resolved id action Service Fait : "  + idActionServiceFait);
2455         if ( idActionServiceFait > -1 )
2456         {
2457             if (StringUtils.isNotBlank( comment ) ) {
2458                 request.getSession( ).setAttribute( PARAMETER_WEBSERVICE_COMMENT_VALUE, comment );
2459             }
2460 
2461             workflowService.doProcessAction( idIncident, Signalement.WORKFLOW_RESOURCE_TYPE, idActionServiceFait, null, request, request.getLocale( ), true );
2462             AppLogService.debug( "Incident resolved workflow process action termine");
2463             if ( StringUtils.isNotEmpty( email ) )
2464             {
2465                 AppLogService.debug( "Incident resolved mise a jour user_access_code avec le mail : " + email);
2466                 _signalementWorkflowService.setUserAccessCodeHistoryResource( email, signalement.getId( ).intValue( ), idActionServiceFait );
2467                 AppLogService.debug( "Incident resolved mise a jour user_access_code effectuée");
2468 
2469             }
2470         }
2471         else
2472         {
2473             AppLogService.error( "idActionServiceFait not found !! " );
2474 
2475             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ERROR_ERROR, SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2476             json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, -1 );
2477             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2478             return jsonAnswer.toString( );
2479         }
2480 
2481         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2482         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2483 
2484         return jsonAnswer.toString( );
2485 
2486     }
2487 
2488     /**
2489      * Method to get user information from identity store based on guid param and attribute name param.
2490      *
2491      * @param guid
2492      * @param attributeName
2493      * @return the value of attribute
2494      */
2495     public String getIdentityStoreAttributeValue( String guid, String attributeName )
2496     {
2497         IdentityService identityStore = SpringContextService.getBean( "identitystoremyluteceprovider.identitystore.identityService" );
2498         IdentityDto identityDTO = null;
2499         try
2500         {
2501             identityDTO = identityStore.getIdentityByConnectionId( guid,
2502                     AppPropertiesService.getProperty( "identitystoremyluteceprovider.identityStoreApplicationCode" ) );
2503         }
2504         catch( IdentityNotFoundException | IdentityStoreException e )
2505         {
2506             AppLogService.error( e );
2507             return StringUtils.EMPTY;
2508         }
2509 
2510         return identityDTO.getAttributes( ).get( attributeName ) != null ? identityDTO.getAttributes( ).get( attributeName ).getValue( ) : "";
2511     }
2512 
2513     /**
2514      * Adds a follower to a report.
2515      *
2516      * @param jsonSrc
2517      *            the json src
2518      * @return answer
2519      */
2520     public String addFollower( JSONObject jsonSrc )
2521     {
2522         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2523         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
2524         if ( StringUtils.isBlank( strIncidentId ) )
2525         {
2526             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2527             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2528             error.setErrorMessage( StringUtils.EMPTY );
2529             return formatterJsonError.format( error );
2530         }
2531         String guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
2532         if ( StringUtils.isBlank( guid ) )
2533         {
2534             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2535             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
2536             error.setErrorMessage( StringUtils.EMPTY );
2537             return formatterJsonError.format( error );
2538         }
2539 
2540         String strUDID = jsonSrc.getString( SignalementRestConstants.JSON_TAG_UDID );
2541         if ( StringUtils.isBlank( strUDID ) )
2542         {
2543             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2544             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
2545             error.setErrorMessage( StringUtils.EMPTY );
2546             return formatterJsonError.format( error );
2547         }
2548 
2549         String email = jsonSrc.getString( SignalementRestConstants.JSON_TAG_EMAIL );
2550         if ( StringUtils.isBlank( email ) )
2551         {
2552             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2553             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_EMAIL );
2554             error.setErrorMessage( StringUtils.EMPTY );
2555             return formatterJsonError.format( error );
2556         }
2557 
2558         String device = jsonSrc.getString( SignalementRestConstants.JSON_TAG_DEVICE );
2559         if ( StringUtils.isBlank( device ) || ( !device.equals( SignalementRestConstants.SIGNALEMENT_PREFIX_IOS )
2560                 && !device.equals( SignalementRestConstants.SIGNALEMENT_PREFIX_ANDROID ) ) )
2561         {
2562             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2563             error.setErrorCode( SignalementRestConstants.ERROR_BAD_DEVICE );
2564             error.setErrorMessage( StringUtils.EMPTY );
2565             return formatterJsonError.format( error );
2566         }
2567 
2568         String userToken = jsonSrc.getString( SignalementRestConstants.JSON_TAG_USER_TOKEN );
2569         if ( StringUtils.isBlank( userToken ) )
2570         {
2571             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2572             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_TOKEN );
2573             error.setErrorMessage( StringUtils.EMPTY );
2574             return formatterJsonError.format( error );
2575         }
2576 
2577         int returnCode = 0;
2578 
2579         // Appel du service pour suivi de l'anomalie
2580         try
2581         {
2582             _signalementService.addFollower( Long.parseLong( strIncidentId ), guid, strUDID, email, device, userToken, true );
2583         }
2584         catch( AlreadyFollowedException e )
2585         {
2586             AppLogService.error( e );
2587             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2588             error.setErrorCode( SignalementRestConstants.ERROR_ALREADY_FOLLOWED );
2589             error.setErrorMessage( e.getMessage( ) );
2590             return formatterJsonError.format( error );
2591         }
2592         catch( InvalidStateActionException e )
2593         {
2594             AppLogService.error( e );
2595             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2596             error.setErrorCode( SignalementRestConstants.ERROR_INVALID_STATE_ACTION );
2597             error.setErrorMessage( e.getMessage( ) );
2598             return formatterJsonError.format( error );
2599         }
2600 
2601         JSONObject jsonAnswer = new JSONObject( );
2602         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_FOLLOW );
2603 
2604         JSONObject json = new JSONObject( );
2605         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, returnCode );
2606         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2607 
2608         return jsonAnswer.toString( );
2609     }
2610 
2611     /**
2612      * Removes a follower from an incident.
2613      *
2614      * @param jsonSrc
2615      *            jsonSrc
2616      * @return answer
2617      */
2618     public String removeFollower( JSONObject jsonSrc )
2619     {
2620         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2621         String strIncidentId = jsonSrc.getString( SignalementRestConstants.JSON_TAG_LOG_INCIDENT_ID );
2622         if ( StringUtils.isBlank( strIncidentId ) )
2623         {
2624             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2625             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2626             error.setErrorMessage( StringUtils.EMPTY );
2627             return formatterJsonError.format( error );
2628         }
2629         String guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
2630         if ( StringUtils.isBlank( guid ) )
2631         {
2632             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2633             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
2634             error.setErrorMessage( StringUtils.EMPTY );
2635             return formatterJsonError.format( error );
2636         }
2637 
2638         try
2639         {
2640             _signalementService.removeFollower( Long.parseLong( strIncidentId ), guid );
2641         }
2642         catch( NonExistentFollowItem e )
2643         {
2644             AppLogService.error( e );
2645             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2646             error.setErrorCode( SignalementRestConstants.ERROR_NON_EXISTENT_FOLLOW_ITEM );
2647             error.setErrorMessage( e.getMessage( ) );
2648             return formatterJsonError.format( error );
2649         }
2650 
2651         JSONObject jsonAnswer = new JSONObject( );
2652         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_UNFOLLOW );
2653 
2654         JSONObject json = new JSONObject( );
2655         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2656         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2657 
2658         return jsonAnswer.toString( );
2659     }
2660 
2661     /**
2662      * Gets all signalements which are followed by this user.
2663      *
2664      * @param jsonSrc
2665      *            the jspo src
2666      * @return list of report
2667      */
2668     public String getIncidentsByUser( JSONObject jsonSrc )
2669     {
2670 
2671         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2672 
2673         String guid = jsonSrc.getString( SignalementRestConstants.JSON_TAG_GUID );
2674         if ( StringUtils.isBlank( guid ) )
2675         {
2676             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2677             error.setErrorCode( SignalementRestConstants.ERROR_BAD_USER_ID );
2678             error.setErrorMessage( StringUtils.EMPTY );
2679             return formatterJsonError.format( error );
2680         }
2681 
2682         boolean filterOnResolved = SignalementRestConstants.MOBILE_STATE_RESOLVED
2683                 .equals( jsonSrc.getString( SignalementRestConstants.JSON_TAG_FILTER_INCIDENT_STATUS ) );
2684 
2685         List<Signalement> listSignalement = _signalementService.getSignalementsByGuid( guid, filterOnResolved );
2686         List<SignalementRestDTO> listSignalementRestDTO = new ArrayList<>( );
2687         for ( Signalement signalement : listSignalement )
2688         {
2689             SignalementRestDTOs/rest/dto/SignalementRestDTO.html#SignalementRestDTO">SignalementRestDTO signalementRestDTO = new SignalementRestDTO( );
2690             signalementRestDTO.setSignalement( signalement );
2691             signalementRestDTO.setFollowedByUser( true );
2692             listSignalementRestDTO.add( signalementRestDTO );
2693         }
2694 
2695         IFormatter<SignalementRestDTO> formatterJson = new SignalementRestDTOFormatterJson( );
2696 
2697         JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( formatterJson.format( listSignalementRestDTO ) );
2698 
2699         JSONObject json = new JSONObject( );
2700 
2701         json.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2702         json.accumulate( SignalementRestConstants.JSON_TAG_INCIDENTS, jsonArray.toString( ) );
2703 
2704         JSONObject jsonAnswer = new JSONObject( );
2705         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_GET_INCIDENTS_BY_USER );
2706 
2707         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, json );
2708 
2709         return jsonAnswer.toString( );
2710     }
2711 
2712     /**
2713      * Triggers the workflow process for a given signalement. Only for the initial state.
2714      *
2715      * @param jsonSrc
2716      *            the json src
2717      * @return answer
2718      */
2719     public String processWorkflow( JSONObject jsonSrc )
2720     {
2721         IFormatter<ErrorSignalement> formatterJsonError = new ErrorSignalementFormatterJson( );
2722 
2723         String idSignalement = jsonSrc.getString( SignalementRestConstants.JSON_TAG_INCIDENT_ID );
2724 
2725         if ( StringUtils.isBlank( idSignalement ) )
2726         {
2727             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2728             error.setErrorCode( SignalementRestConstants.ERROR_EMPTY_INCIDENT_ID_BIS );
2729             error.setErrorMessage( StringUtils.EMPTY );
2730 
2731             return formatterJsonError.format( error );
2732         }
2733 
2734         Signalement signalement = new Signalement( );
2735         signalement.setId( Long.parseLong( idSignalement ) );
2736 
2737         // ajout du workflow
2738         // set the state of the signalement with the workflow
2739         WorkflowService workflowService = WorkflowService.getInstance( );
2740 
2741         if ( workflowService.isAvailable( ) )
2742         {
2743             // récupération de l'identifiant du workflow
2744             Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
2745 
2746             if ( workflowId != null )
2747             {
2748                 State state = workflowService.getState( signalement.getId( ).intValue( ), Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null );
2749 
2750                 int etatInitialId = AppPropertiesService.getPropertyInt( ID_STATE_ETAT_INITIAL, -1 );
2751 
2752                 // A exécuter uniquement lorsque état initial
2753                 if ( ( state == null ) || ( state.getId( ) == etatInitialId ) )
2754                 {
2755                     // création de l'état initial et exécution des tâches automatiques
2756                     workflowService.executeActionAutomatic( signalement.getId( ).intValue( ), Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null );
2757                 }
2758                 else
2759                 {
2760                     ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2761                     error.setErrorCode( SignalementRestConstants.ERROR_INVALID_STATE_ACTION );
2762                     error.setErrorMessage( "Le statut de l'anomalie ne permet pas cette action" );
2763                     return formatterJsonError.format( error );
2764                 }
2765             }
2766             else
2767             {
2768                 ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2769                 error.setErrorCode( SignalementRestConstants.ERROR_NO_WORKFLOW_SELECTED );
2770                 error.setErrorMessage( "No workflow selected" );
2771                 return formatterJsonError.format( error );
2772             }
2773         }
2774         else
2775         {
2776             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2777             error.setErrorCode( SignalementRestConstants.ERROR_NO_WORKFLOW_AVAILABLE );
2778             error.setErrorMessage( "Workflow not available" );
2779             return formatterJsonError.format( error );
2780         }
2781 
2782         Signaleur signaleur = _signaleurService.loadByIdSignalement( Long.parseLong( idSignalement ) );
2783 
2784         // Ajout du suivi si guid renseigné
2785         try
2786         {
2787             if ( ( null != signaleur ) && StringUtils.isNotBlank( signaleur.getGuid( ) ) )
2788             {
2789                 _signalementService.addFollower( Long.parseLong( idSignalement ), signaleur.getGuid( ), signaleur.getIdTelephone( ), signaleur.getMail( ),
2790                         signalement.getPrefix( ), null, false );
2791             }
2792         }
2793         catch( AlreadyFollowedException e )
2794         {
2795             AppLogService.error( e );
2796             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2797             error.setErrorCode( SignalementRestConstants.ERROR_ALREADY_FOLLOWED );
2798             error.setErrorMessage( e.getMessage( ) );
2799             return formatterJsonError.format( error );
2800         }
2801         catch( InvalidStateActionException e )
2802         {
2803             AppLogService.error( e );
2804             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
2805             error.setErrorCode( SignalementRestConstants.ERROR_INVALID_STATE_ACTION );
2806             error.setErrorMessage( e.getMessage( ) );
2807             return formatterJsonError.format( error );
2808         }
2809 
2810         JSONObject jsonObject = new JSONObject( );
2811         JSONObject jsonAnswer = new JSONObject( );
2812         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
2813         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonAnswer );
2814         jsonObject.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_PROCESS_WORKFLOW );
2815 
2816         AppLogService.info( "processWorkflow, OK " + signalement.getId( ) );
2817 
2818         return jsonObject.toString( );
2819     }
2820 
2821     /**
2822      * Check version.
2823      *
2824      * @return the string
2825      */
2826     public String checkVersion( )
2827     {
2828         JSONObject jsonAnswer = new JSONObject( );
2829 
2830         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_REQUEST, SignalementRestConstants.REQUEST_TYPE_CHECK_VERSION );
2831 
2832         JSONObject jsonObject = new JSONObject( );
2833         jsonObject.accumulate( "androidVersionStore", DatastoreService.getDataValue( "sitelabels.site_property.android.version.store", null ) );
2834         jsonObject.accumulate( "androidMajObligatoire", DatastoreService.getDataValue( "sitelabels.site_property.android.maj.obligatoire", null ) );
2835         jsonObject.accumulate( "derniereVersionObligatoire",
2836                 DatastoreService.getDataValue( "sitelabels.site_property.android.derniere.version.obligatoire", null ) );
2837         jsonObject.accumulate( "iosMajObligatoire", DatastoreService.getDataValue( "sitelabels.site_property.ios.maj.obligatoire", null ) );
2838         jsonObject.accumulate( "iosDerniereVersionObligatoire",
2839                 DatastoreService.getDataValue( "sitelabels.site_property.ios.derniere.version.obligatoire", null ) );
2840 
2841         jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonObject );
2842 
2843         return jsonAnswer.toString( );
2844 
2845     }
2846 
2847     /**
2848      * All report type.
2849      *
2850      * @param typeSignalementId
2851      *            the id of type report
2852      * @param listeTypeSignalement
2853      *            list type of report
2854      * @return the all sous type signalement cascade
2855      */
2856     public void getAllSousTypeSignalementCascade( Integer typeSignalementId, List<TypeSignalement> listeTypeSignalement )
2857     {
2858         _typeSignalementService.getAllSousTypeSignalementCascade( typeSignalementId, listeTypeSignalement );
2859     }
2860 
2861     /**
2862      * Get report by id.
2863      *
2864      * @param lIdSignalement
2865      *            the report id
2866      * @return the report
2867      */
2868     public Signalement getSignalementByID( Long lIdSignalement )
2869     {
2870         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2871         return _signalementService.getSignalement( lIdSignalement );
2872     }
2873 
2874     /**
2875      * Get report pictures.
2876      *
2877      * @param lIdSignalement
2878      *            the report id
2879      * @return list of picture
2880      */
2881     public List<Photo> getPhotosBySignalementId( Long lIdSignalement )
2882     {
2883         _photoService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_PHOTO_SERVICE_BEAN );
2884         List<PhotoDMR> photosDMR = _photoService.findWithFullPhotoBySignalementId( lIdSignalement );
2885         List<Photo> photos = new ArrayList<>( );
2886         for ( PhotoDMR photoDMR : photosDMR )
2887         {
2888             Photo photo = new Photo( photoDMR.getId( ), null, photoDMR.getImageThumbnail( ), photoDMR.getDate( ), photoDMR.getVue( ) );
2889             photo.setImageThumbnailUrl( getImageBase64( photo.getImageThumbnail( ) ) );
2890             photos.add( photo );
2891         }
2892 
2893         return photos;
2894     }
2895 
2896     /**
2897      * Get report address.
2898      *
2899      * @param lIdSignalement
2900      *            the id report
2901      * @return report address
2902      */
2903     public String getAdresseBySignalementId( Long lIdSignalement )
2904     {
2905         _adresseService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_ADRESSE_SERVICE_BEAN );
2906         return _adresseService.loadByIdSignalement( lIdSignalement ).getAdresse( );
2907     }
2908 
2909     /**
2910      * Get Type of report.
2911      *
2912      * @param nIdSignalement
2913      *            the id report
2914      * @return type of report
2915      */
2916     public TypeSignalement getTypeSignalement( Integer nIdSignalement )
2917     {
2918         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
2919         return _typeSignalementService.getTypeSignalement( nIdSignalement );
2920     }
2921 
2922     /**
2923      * Find type by ID.
2924      *
2925      * @param nIdSignalement
2926      *            the id report
2927      * @return type of report
2928      */
2929     public TypeSignalement findByIdTypeSignalement( Integer nIdSignalement )
2930     {
2931         _typeSignalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_TYPE_SIGNALEMENT_BEAN );
2932         return _typeSignalementService.findByIdTypeSignalement( nIdSignalement );
2933     }
2934 
2935     /**
2936      * {@inheritDoc}
2937      */
2938     @Override
2939     public List<Address> getAddressItem( String address )
2940     {
2941         _addressSuggestPOIService = SpringContextService.getBean( "addressSuggestPOIService" );
2942         return _addressSuggestPOIService.getAddressItem( address );
2943     }
2944 
2945     /**
2946      * {@inheritDoc}
2947      */
2948     @Override
2949     public Double [ ] getGeomFromLambertToWgs84( Double dLatLambert, Double dLngLambert )
2950     {
2951         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2952         return _signalementService.getGeomFromLambertToWgs84( dLatLambert, dLngLambert );
2953     }
2954 
2955     /**
2956      * {@inheritDoc}
2957      */
2958     @Override
2959     public Double [ ] getGeomFromLambert93ToWgs84( Double dLatLambert, Double dLngLambert )
2960     {
2961         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2962         return _signalementService.getGeomFromLambert93ToWgs84( dLatLambert, dLngLambert );
2963     }
2964 
2965     /**
2966      * {@inheritDoc}
2967      */
2968     @Override
2969     public List<DossierSignalementDTO> findAllSignalementInPerimeterWithDTO( Double lat, Double lng, Integer radius )
2970     {
2971         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2972         return _signalementService.findAllSignalementInPerimeterWithDTO( lat, lng, radius );
2973     }
2974 
2975     /**
2976      * {@inheritDoc}
2977      */
2978     @Override
2979     public Integer getDistanceBetweenSignalement( double lat1, double lng1, double lat2, double lng2 )
2980     {
2981         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2982         return _signalementService.getDistanceBetweenSignalement( lat1, lng1, lat2, lng2 );
2983     }
2984 
2985     /**
2986      * {@inheritDoc}
2987      */
2988     @Override
2989     public boolean isSignalementFollowableAndisSignalementFollowedByUser( int nIdSignalement, String userGuid )
2990     {
2991         _signalementService = SpringContextService.getBean( SignalementRestConstants.PARAMETER_SIGNALEMENT_SERVICE_BEAN );
2992 
2993         boolean isSignalementFollowedByUser = false;
2994         if ( userGuid != null )
2995         {
2996             isSignalementFollowedByUser = _signalementService.isSignalementFollowedByUser( nIdSignalement, userGuid );
2997         }
2998 
2999         return !_signalementService.isSignalementFollowable( nIdSignalement ) || isSignalementFollowedByUser;
3000     }
3001 
3002     /**
3003      * {@inheritDoc}
3004      */
3005     @Override
3006     public List<Priorite> getAllPriorite( )
3007     {
3008         return _prioriteService.getAllPriorite( );
3009     }
3010 
3011     /**
3012      * {@inheritDoc}
3013      */
3014     @Override
3015     public Priorite loadPrioriteById( long lId )
3016     {
3017         return _prioriteService.load( lId );
3018     }
3019 
3020     /**
3021      * {@inheritDoc}
3022      */
3023     @Override
3024     public Arrondissement getArrondissementByGeom( double lng, double lat )
3025     {
3026         return _arrondissementService.getArrondissementByGeom( lng, lat );
3027     }
3028 
3029     /**
3030      * {@inheritDoc}
3031      */
3032     @Override
3033     public void addFollower( Long signalementId, String guid, String strUDID, String email, String device, String userToken, boolean createUser )
3034     {
3035         _signalementService.addFollower( signalementId, guid, strUDID, email, device, userToken, createUser );
3036     }
3037 
3038     /**
3039      * {@inheritDoc}
3040      */
3041     @Override
3042     public String getDossiersCourrantsByGeomWithLimit( Double longitude, Double latitude )
3043     {
3044         RamenClientService ramenClientService = SpringContextService.getBean( "signalement-rest.ramenClientService" );
3045 
3046         return ramenClientService.getDossiersCourrantsByGeommWithLimit( longitude, latitude );
3047 
3048     }
3049 
3050     /**
3051      * {@inheritDoc}
3052      */
3053     @Override
3054     public JSONObject sauvegarderSignalement( Signalement demandeSignalement, String userName, String userMail )
3055     {
3056         SignalementOutputPrcessor signalementProcessor = new SignalementOutputPrcessor( );
3057         return signalementProcessor.sauvegarderSignalementFromWS( demandeSignalement, userName, userMail );
3058     }
3059 
3060     /**
3061      * {@inheritDoc}
3062      */
3063     @Override
3064     public Collection<Action> getListActionsByIdSignalementAndUser( int nIdSignalement, AdminUser user )
3065     {
3066         return _signalementService.getListActionsByIdSignalementAndUser( nIdSignalement, _signalementWorkflowService.getSignalementWorkflowId( ), user );
3067     }
3068 
3069     /**
3070      * Gets the image base 64.
3071      *
3072      * @param image
3073      *            the image
3074      * @return the image base 64
3075      */
3076     public String getImageBase64( ImageResource image )
3077     {
3078         String dataImg = "";
3079         if ( ( image != null ) && ( image.getImage( ) != null ) )
3080         {
3081             Base64 codec = new Base64( );
3082             String data = new String( codec.encode( image.getImage( ) ) );
3083             String mimeType = ( image.getMimeType( ) == null ) ? "data:image/jpg;base64," : ( "data:" + image.getMimeType( ) + BASE_64 );
3084             dataImg = mimeType + data;
3085         }
3086 
3087         return dataImg;
3088     }
3089 
3090     /**
3091      * Valid email domain.
3092      *
3093      * @return array of valid domain
3094      */
3095     private String [ ] getEmailDomainAccept( )
3096     {
3097         String property = AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_LIST_DOMAIN_EMAIL );
3098         String [ ] listDomainArr = null;
3099         if ( StringUtils.isNotBlank( property ) )
3100         {
3101 
3102             if ( property.contains( "," ) )
3103             {
3104                 listDomainArr = property.split( "," );
3105             }
3106             else
3107             {
3108                 listDomainArr = new String [ 1];
3109                 listDomainArr [0] = property;
3110             }
3111 
3112             // Fix pb de case
3113             for ( int i = 0; i < listDomainArr.length; ++i )
3114             {
3115                 listDomainArr [i] = listDomainArr [i].toLowerCase( );
3116             }
3117         }
3118         return listDomainArr;
3119     }
3120 
3121     /**
3122      * Find a report with token.
3123      *
3124      * @param token
3125      *            report token
3126      * @return a report
3127      */
3128     public Signalement getSignalementByToken( String token )
3129     {
3130         return _signalementService.getSignalementByToken( token );
3131     }
3132 
3133     /**
3134      * Find history for a report.
3135      *
3136      * @param idSignalement
3137      *            id report.
3138      * @param request
3139      *            the http request
3140      * @return history in json format
3141      */
3142     public JSONObject getHistorySignalement( Integer idSignalement, HttpServletRequest request )
3143     {
3144         return _signalementService.getHistorySignalement( idSignalement, request );
3145     }
3146 
3147     /**
3148      * Gets the message service fait generic.
3149      *
3150      * @param idSignalement
3151      *            the id signalement
3152      * @return the message service fait generic
3153      */
3154     public JSONArray getMessageServiceFaitGeneric( Long idSignalement )
3155     {
3156 
3157         WorkflowService workflowService = WorkflowService.getInstance( );
3158         // récupération de l'identifiant du workflow
3159         Integer workflowId = _signalementWorkflowService.getSignalementWorkflowId( );
3160         // current state signalement
3161         int stateSignalement = workflowService.getState( idSignalement.intValue( ), Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null ).getId( );
3162 
3163         ActionFilter filter = new ActionFilter( );
3164         filter.setIdStateBefore( stateSignalement );
3165         filter.setIdStateAfter( AppPropertiesService.getPropertyInt( SignalementRestConstants.PROPERTY_ID_STATE_SERVICE_FAIT, -1 ) );
3166         List<Action> actions = _actionService.getListActionByFilter( filter );
3167         List<NotificationSignalementUserMultiContents> lstMessages = new ArrayList<>( );
3168         for ( Action action : actions )
3169         {
3170             List<ITask> tasks = _taskService.getListTaskByIdAction( action.getId( ), Locale.FRENCH );
3171             lstMessages.addAll( _signalementWorkflowService.getMessagesServiceFait( tasks ) );
3172         }
3173 
3174         JSONArray messages = new JSONArray( );
3175         for ( NotificationSignalementUserMultiContents message : lstMessages )
3176         {
3177             JSONObject jsonmessage = new JSONObject( );
3178             jsonmessage.accumulate( SignalementRestConstants.JSON_TAG_NUMERO_MESSAGE, message.getIdMessage( ) );
3179             jsonmessage.accumulate( SignalementRestConstants.JSON_TAG_MESSAGE, message.getTitle( ) );
3180 
3181             messages.add( jsonmessage );
3182         }
3183 
3184         return messages;
3185 
3186     }
3187 
3188     /**
3189      * Gets the message service fait by typologie.
3190      *
3191      * @param idTypeSignalement
3192      *            the id type signalement
3193      * @return the message service fait typologie
3194      */
3195     public JSONArray getMessageServiceFaitTypologie( Integer idTypeSignalement )
3196     {
3197         List<MessageTypologie> listMessageTypologie = _messageTypologieService.loadAllMessageActifByIdType( idTypeSignalement );
3198 
3199         JSONArray messages = new JSONArray( );
3200         for ( MessageTypologie message : listMessageTypologie )
3201         {
3202             JSONObject jsonmessage = new JSONObject( );
3203             jsonmessage.accumulate( SignalementRestConstants.JSON_TAG_NUMERO_MESSAGE, message.getId( ) );
3204             jsonmessage.accumulate( SignalementRestConstants.JSON_TAG_MESSAGE, message.getTypeMessage( ) );
3205 
3206             messages.add( jsonmessage );
3207         }
3208 
3209         return messages;
3210     }
3211 
3212     /**
3213      * Select message for service done.
3214      *
3215      * @return all the message
3216      */
3217     public JSONObject selectMessageServiceFaitPresta( )
3218     {
3219         JSONObject jsonAnswer = new JSONObject( );
3220         JSONArray jsonArray = new JSONArray( );
3221 
3222         Map<Integer, List<NotificationSignalementUserMultiContents>> listMessages = _signalementWorkflowService.selectMessageServiceFaitPresta( null );
3223 
3224         // Création des blocs message
3225         for ( Map.Entry<Integer, List<NotificationSignalementUserMultiContents>> entry : listMessages.entrySet( ) )
3226         {
3227             JSONObject statesMessages = new JSONObject( );
3228 
3229             JSONArray messages = new JSONArray( );
3230 
3231             ITask task = _taskService.findByPrimaryKey( entry.getKey( ), Locale.FRENCH );
3232             Action action = _actionService.findByPrimaryKey( task.getAction( ).getId( ) );
3233             State state = _stateService.findByPrimaryKey( action.getStateBefore( ).getId( ) );
3234 
3235             for ( NotificationSignalementUserMultiContents mess : entry.getValue( ) )
3236             {
3237                 JSONObject message = new JSONObject( );
3238                 message.accumulate( SignalementRestConstants.JSON_TAG_NUMERO_MESSAGE, mess.getIdMessage( ) );
3239                 message.accumulate( SignalementRestConstants.JSON_TAG_MESSAGE, mess.getTitle( ) );
3240 
3241                 messages.add( message );
3242             }
3243 
3244             statesMessages.accumulate( "statut_anomalie", state.getName( ) );
3245             statesMessages.accumulate( "messages", messages );
3246 
3247             jsonArray.add( statesMessages );
3248         }
3249         jsonAnswer.accumulate( "messages_sf", jsonArray );
3250 
3251         return jsonAnswer;
3252     }
3253 
3254     /**
3255      * Gets the raison rejet.
3256      *
3257      * @return the raison rejet
3258      */
3259     public List<ObservationRejet> getRaisonRejet( )
3260     {
3261         return _observationRejetService.getAllObservationRejetActif( );
3262     }
3263 
3264     /**
3265      * Method to get user information from identity store based on guid param request.
3266      *
3267      * @param strRequest
3268      *            the json stream sended by request
3269      * @return the answer to request
3270      */
3271     public String processIdentityStore( String strRequest )
3272     {
3273         IFormatter<ErrorSignalement> formatterJson = new ErrorSignalementFormatterJson( );
3274         try
3275         {
3276             JSONObject json = (JSONObject) JSONSerializer.toJSON( strRequest );
3277             String guid = json.getString( SignalementRestConstants.JSON_TAG_GUID );
3278             String name = getIdentityStoreAttributeValue( guid, "family_name" );
3279             if ( null == name )
3280             {
3281                 name = StringUtils.EMPTY;
3282             }
3283             String firstname = getIdentityStoreAttributeValue( guid, "first_name" );
3284             String mail = getIdentityStoreAttributeValue( guid, "login" );
3285             JSONObject userJson = new JSONObject( );
3286             userJson.accumulate( SignalementRestConstants.JSON_TAG_NAME, name );
3287             userJson.accumulate( SignalementRestConstants.JSON_TAG_FIRSTNAME, firstname );
3288             userJson.accumulate( SignalementRestConstants.JSON_TAG_MAIL, mail );
3289             userJson.accumulate( SignalementRestConstants.JSON_TAG_IS_AGENT, StringUtilsDmr.endsWithAny( mail.toLowerCase( ), getEmailDomainAccept( ) ) );
3290 
3291             JSONObject jsonAnswer = new JSONObject( );
3292             JSONObject jsonData = new JSONObject( );
3293             jsonData.accumulate( SignalementRestConstants.JSON_TAG_STATUS, 0 );
3294             jsonData.accumulate( SignalementRestConstants.JSON_TAG_USER, userJson );
3295             jsonAnswer.accumulate( SignalementRestConstants.JSON_TAG_ANSWER, jsonData );
3296             return jsonAnswer.toString( );
3297         }
3298         catch( JSONException e )
3299         {
3300             AppLogService.error( e.getMessage( ), e );
3301             ErrorSignalementansmarue/modules/rest/pojo/ErrorSignalement.html#ErrorSignalement">ErrorSignalement error = new ErrorSignalement( );
3302             error.setErrorCode( SignalementRestConstants.ERROR_BAD_JSON_REQUEST );
3303             error.setErrorMessage( e.getMessage( ) );
3304             return formatterJson.format( error );
3305         }
3306     }
3307 }