1 /*
2 * Copyright (c) 2002-2018, Mairie de 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.appointment.modules.resource.service;
35
36 import fr.paris.lutece.plugins.appointment.business.appointment.Appointment;
37 import fr.paris.lutece.plugins.appointment.business.slot.Slot;
38 import fr.paris.lutece.plugins.appointment.modules.resource.business.AppointmentResource;
39 import fr.paris.lutece.plugins.appointment.modules.resource.business.AppointmentResourceHome;
40 import fr.paris.lutece.plugins.appointment.service.SlotService;
41 import fr.paris.lutece.plugins.appointment.web.dto.AppointmentDTO;
42 import fr.paris.lutece.portal.service.spring.SpringContextService;
43
44 import java.sql.Timestamp;
45
46 import org.apache.commons.lang.StringUtils;
47
48 /**
49 * Service to manage appointment resources
50 */
51 public class AppointmentResourceService
52 {
53 private static final String BEAN_NAME = "appointment-resource.appointmentResourceService";
54 private static volatile AppointmentResourceService _instance;
55
56 /**
57 * Get the instance of the service
58 *
59 * @return The instance of the service
60 */
61 public static AppointmentResourceService getInstance( )
62 {
63 if ( _instance == null )
64 {
65 _instance = SpringContextService.getBean( BEAN_NAME );
66 }
67
68 return _instance;
69 }
70
71 /**
72 * Check if the resource is available for a given appointment
73 *
74 * @param strIdResource
75 * The id of the resource
76 * @param strResourceTypeName
77 * The resource type
78 * @param nIdFormResourceType
79 * The id of the form resource type
80 * @param appointment
81 * The appointment
82 * @return true if the resource is available for the given appointment, false if it is already associated with another resource during the time of the
83 * appointment
84 */
85 public boolean isResourceAvailableForAppointment( String strIdResource, String strResourceTypeName, int nIdFormResourceType, AppointmentDTO appointment )
86 {
87 AppointmentResource appResource = AppointmentResourceHome.findByPrimaryKey( appointment.getIdAppointment( ), nIdFormResourceType );
88
89 if ( ( appResource != null ) && ( !appointment.getIsCancelled( ) ) && StringUtils.equals( appResource.getIdResource( ), strIdResource ) )
90 {
91 // The resource is already associated with this appointment for this form RT, so we allow it to be re-associated
92 return true;
93 }
94
95 // We now have to check that the resource is not associated to another appointment during the time of this one
96 return AppointmentResourceHome
97 .isResourceAvailable( strIdResource, strResourceTypeName, Timestamp.valueOf( appointment.getStartingDateTime( )), Timestamp.valueOf( appointment.getEndingDateTime( )));
98 }
99 }