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.formatters;
35  
36  import java.util.List;
37  
38  import org.apache.commons.collections.CollectionUtils;
39  import org.apache.commons.lang.StringUtils;
40  
41  import fr.paris.lutece.plugins.dansmarue.business.entities.Adresse;
42  import fr.paris.lutece.plugins.dansmarue.business.entities.PhotoDMR;
43  import fr.paris.lutece.plugins.dansmarue.business.entities.Signalement;
44  import fr.paris.lutece.plugins.dansmarue.business.entities.Signaleur;
45  import fr.paris.lutece.plugins.dansmarue.modules.rest.util.constants.SignalementRestConstants;
46  import fr.paris.lutece.plugins.dansmarue.modules.rest.util.date.DateUtils;
47  import fr.paris.lutece.plugins.dansmarue.service.IPhotoService;
48  import fr.paris.lutece.plugins.dansmarue.service.ISignalementSuiviService;
49  import fr.paris.lutece.plugins.dansmarue.service.ITypeSignalementService;
50  import fr.paris.lutece.plugins.dansmarue.service.IWorkflowService;
51  import fr.paris.lutece.plugins.rest.service.formatters.IFormatter;
52  import fr.paris.lutece.plugins.rest.util.json.JSONUtil;
53  import fr.paris.lutece.plugins.workflowcore.business.state.State;
54  import fr.paris.lutece.portal.service.spring.SpringContextService;
55  import fr.paris.lutece.portal.service.util.AppPropertiesService;
56  import fr.paris.lutece.portal.service.workflow.WorkflowService;
57  import net.sf.json.JSONArray;
58  import net.sf.json.JSONObject;
59  
60  /**
61   * SignalementFormatterJson.
62   */
63  public class SignalementFormatterJson implements IFormatter<Signalement>
64  {
65  
66      /** The Constant PHOTO_SERVICE_BEAN_NAME. */
67      public static final String PHOTO_SERVICE_BEAN_NAME = "photoService";
68  
69      /**
70       * guid transmit par les applications mobiles Permet d'identifier l'utilisateur de l'application.
71       */
72      private String _formatWithGuid = null;
73  
74      /**
75       * {@inheritDoc}
76       */
77      @Override
78      public String format( Signalement signalement )
79      {
80          JSONObject jsonObject = formatSignalement( signalement );
81  
82          if ( ( _formatWithGuid != null ) && ( signalement != null ) )
83          {
84              ISignalementSuiviService signalementSuiviService = SpringContextService.getBean( "signalementSuiviService" );
85  
86              boolean isFallowByUser = signalementSuiviService.findByIdSignalementAndGuid( signalement.getId( ), _formatWithGuid ) != -1;
87              jsonObject.accumulate( SignalementRestConstants.JSON_TAG_IS_INCIDENT_FOLLOWED_BY_USER, isFallowByUser );
88          }
89  
90          return jsonObject.toString( );
91      }
92  
93      /**
94       * {@inheritDoc}
95       */
96      @Override
97      public String format( List<Signalement> listSignalement )
98      {
99          JSONArray jsonArray = new JSONArray( );
100 
101         for ( Signalement signalement : listSignalement )
102         {
103             jsonArray.element( format( signalement ) );
104         }
105 
106         // ajouter les dossiers
107         return jsonArray.toString( );
108     }
109 
110     /**
111      * {@inheritDoc}
112      */
113     @Override
114     public String formatError( String strCode, String strMessage )
115     {
116         if ( StringUtils.isNumeric( strCode ) )
117         {
118             return JSONUtil.formatError( strMessage, Integer.parseInt( strCode ) );
119         }
120         else
121         {
122             return JSONUtil.formatError( strMessage, -1 );
123         }
124     }
125 
126     /**
127      * Transform a signalement object to a signalement JSONObject.
128      *
129      * @param signalement
130      *            The signalement to format to JSON object
131      * @return The signalement as JSON Object for mobile devices
132      */
133     public static JSONObject formatSignalement( Signalement signalement )
134     {
135         IPhotoService photoService = SpringContextService.getBean( PHOTO_SERVICE_BEAN_NAME );
136         IWorkflowService signalementWorkflowService = SpringContextService.getBean( "signalement.workflowService" );
137         ITypeSignalementService typeSignalementService = SpringContextService.getBean( "typeSignalementService" );
138         ISignalementSuiviService signalementSuiviService = SpringContextService.getBean( "signalementSuiviService" );
139 
140         JSONObject jsonObject = new JSONObject( );
141 
142         if ( signalement != null )
143         {
144             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_ID, signalement.getId( ) );
145 
146             int idCategory = typeSignalementService.getCategoryFromTypeId( signalement.getTypeSignalement( ).getId( ) );
147 
148             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_CATEGORIE_ID, idCategory );
149 
150             int nbFollowers = signalementSuiviService.getNbFollowersByIdSignalement( signalement.getId( ).intValue( ) );
151             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_FOLLOWERS, nbFollowers );
152 
153             if ( CollectionUtils.isNotEmpty( signalement.getSignaleurs( ) ) )
154             {
155                 Signaleur signaleur = signalement.getSignaleurs( ).get( 0 );
156                 if ( StringUtils.isNotBlank( signaleur.getGuid( ) ) )
157                 {
158                     jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_REPORTER_GUID, signaleur.getGuid( ) );
159                 }
160 
161                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_IS_INCIDENT_ANONYME, StringUtils.isBlank( signaleur.getMail( ) )
162                         && signalementSuiviService.findUsersMailByIdSignalement( signalement.getId( ) ).isEmpty( ) );
163             }
164 
165             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_CONGRATULATIONS, signalement.getFelicitations( ) );
166 
167             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_ALIAS, signalement.getTypeSignalement( ).getAliasMobileDefault( ) );
168             String strStatus = "O";
169             int nStateId = 0;
170             String stateName="";
171 
172 
173             // set the state of the signalement with the workflow
174             WorkflowService workflowService = WorkflowService.getInstance( );
175 
176             if ( workflowService.isAvailable( ) )
177             {
178                 // récupération de l'identifiant du workflow
179                 Integer workflowId = signalementWorkflowService.getSignalementWorkflowId( );
180 
181                 if ( workflowId != null )
182                 {
183                     if(( signalement.getStateName( ) == null ) && ( signalement.getIdState( ) <= 0 )) {
184                         State state = workflowService.getState( signalement.getId( ).intValue( ), Signalement.WORKFLOW_RESOURCE_TYPE, workflowId, null );
185                         stateName = state.getName( );
186                         nStateId = state.getId( );
187                     } else {
188                         stateName = signalement.getStateName( );
189                         nStateId = signalement.getIdState( );
190                     }
191 
192                     // strStatus = O (Ouvert)
193                     // strStatus = R (Résolu)
194                     // strStatus = U (Update traitement différé)
195                     // strStatus = ONR (Ouver mais le statut ne permet pas la résolution)
196                     // strStatus = T (Anomalie chez un tiers avec Webservice)
197                     if ( ( nStateId == 7 ) || ( nStateId == 13 ) || ( ( nStateId == 18 ) && !signalement.getIsSendWS( ) ) )
198                     {
199                         strStatus = "O";
200                     }
201                     else
202                         if ( ( ( nStateId == 8 ) || ( nStateId == 9 ) ) || ( ( nStateId == 21 ) && !signalement.getIsSendWS( ) ) )
203                         {
204                             strStatus = "U";
205                         }
206                         else
207                             if ( ( nStateId == 10 ) || ( nStateId == 11 ) || ( nStateId == 12 ) || ( nStateId == 22 ) )
208                             {
209                                 strStatus = "R";
210                             }
211                             else
212                                 if ( ( nStateId == 15 ) || ( nStateId == 20 ) || ( nStateId == 12 ) )
213                                 {
214                                     strStatus = "ONR";
215                                 }
216                                 else
217                                     if ( ( ( nStateId == 18 ) || ( nStateId == 21 ) ) && signalement.getIsSendWS( ) )
218                                     {
219                                         strStatus = "T";
220                                     }
221                 }
222             }
223 
224             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_STATE, strStatus );
225             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_STATE_ID, nStateId );
226             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_STATE_NAME, stateName );
227 
228 
229             for ( Adresse adresse : signalement.getAdresses( ) )
230             {
231                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_ADDRESS, adresse.getAdresse( ) );
232                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_LAT, adresse.getLat( ) );
233                 jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_LNG, adresse.getLng( ) );
234             }
235 
236             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_DESCRIPTIVE, signalement.getCommentaire( ) );
237             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_COMMENTAIRE_AGENT, signalement.getCommentaireAgentTerrain( ) );
238             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_DATE, DateUtils.convertDate( signalement.getDateCreation( ) ) );
239             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_HOUR, DateUtils.convertHour( signalement.getHeureCreation( ) ) );
240             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_PRECISION_TERRAIN, signalement.getPrecisionTerrain( ) );
241 
242             JSONObject jsonObjectPictures = new JSONObject( );
243 
244             List<PhotoDMR> listPhotos = photoService.findBySignalementId( signalement.getId( ) );
245             JSONArray jsonPictureFar = new JSONArray( );
246             JSONArray jsonPictureClose = new JSONArray( );
247             JSONArray jsonPictureDone = new JSONArray( );
248 
249             for ( PhotoDMR photo : listPhotos )
250             {
251                 String token = "";
252                 if(StringUtils.isNotBlank( photo.getCheminPhoto( ) )) {
253                     token = "_"+photo.getCheminPhoto( ).split("_")[0];
254                 }
255 
256                 if ( photo.getVue( ).equals( SignalementRestConstants.VUE_PRES ) )
257                 {
258                     jsonPictureClose.element( AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_URL_PICTURE ) + photo.getId( )+token );
259                 }
260                 else
261                     if ( photo.getVue( ).equals( SignalementRestConstants.VUE_ENSEMBLE ) )
262                     {
263                         jsonPictureFar.element( AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_URL_PICTURE ) + photo.getId( )+token );
264                     }
265                     else
266                         if ( photo.getVue( ).equals( SignalementRestConstants.VUE_SERVICE_FAIT ) )
267                         {
268                             jsonPictureDone.element( AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_URL_PICTURE ) + photo.getId( )+token );
269                         }
270             }
271 
272             jsonObjectPictures.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_CLOSE, jsonPictureClose );
273             jsonObjectPictures.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_FAR, jsonPictureFar );
274             jsonObjectPictures.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_DONE, jsonPictureDone );
275 
276             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_PICTURES, jsonObjectPictures );
277 
278             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_CONFIRMS, signalement.getSuivi( ) );
279 
280             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_PRIORITE_ID, signalement.getPriorite( ).getId( ) );
281 
282             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_INVALIDATIONS, 0 );
283 
284             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_SOURCE,
285                     AppPropertiesService.getProperty( SignalementRestConstants.PROPERTY_INCIDENT_SOURCE_DMR ) );
286 
287             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_NUEMERO, signalement.getNumeroSignalement( ) );
288             jsonObject.accumulate( SignalementRestConstants.JSON_TAG_INCIDENT_TOKEN, signalement.getToken( ) );
289 
290         }
291 
292         return jsonObject;
293     }
294 
295     /**
296      * Sets the format with guid.
297      *
298      * @param formatWithGuid
299      *            the new format with guid
300      */
301     public void setFormatWithGuid( String formatWithGuid )
302     {
303         _formatWithGuid = formatWithGuid;
304     }
305 
306 }