StockBilletterieApp.java
/*
* Copyright (c) 2002-2018, Mairie de Paris
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice
* and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* License 1.0
*/
package fr.paris.lutece.plugins.stock.modules.billetterie.web;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.mahout.cf.taste.common.TasteException;
import fr.paris.lutece.plugins.stock.business.offer.OfferFilter;
import fr.paris.lutece.plugins.stock.business.purchase.PurchaseFilter;
import fr.paris.lutece.plugins.stock.commons.exception.FunctionnalException;
import fr.paris.lutece.plugins.stock.commons.exception.TechnicalException;
import fr.paris.lutece.plugins.stock.modules.billetterie.business.district.District;
import fr.paris.lutece.plugins.stock.modules.billetterie.service.district.DistrictService;
import fr.paris.lutece.plugins.stock.modules.recommendation.business.RecommendedProduct;
import fr.paris.lutece.plugins.stock.modules.recommendation.service.StockRecommendationService;
import fr.paris.lutece.plugins.stock.modules.tickets.business.PartnerDTO;
import fr.paris.lutece.plugins.stock.modules.tickets.business.ReservationDTO;
import fr.paris.lutece.plugins.stock.modules.tickets.business.SeanceDTO;
import fr.paris.lutece.plugins.stock.modules.tickets.business.SeanceFilter;
import fr.paris.lutece.plugins.stock.modules.tickets.business.ShowDTO;
import fr.paris.lutece.plugins.stock.modules.tickets.service.IProviderService;
import fr.paris.lutece.plugins.stock.modules.tickets.service.IPurchaseService;
import fr.paris.lutece.plugins.stock.modules.tickets.service.ISeanceService;
import fr.paris.lutece.plugins.stock.modules.tickets.service.IShowService;
import fr.paris.lutece.plugins.stock.modules.tickets.utils.constants.TicketsConstants;
import fr.paris.lutece.plugins.stock.service.IPurchaseSessionManager;
import fr.paris.lutece.plugins.stock.utils.DateUtils;
import fr.paris.lutece.plugins.userban.bean.user.User;
import fr.paris.lutece.plugins.userban.service.user.IUserService;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.message.SiteMessageException;
import fr.paris.lutece.portal.service.plugin.Plugin;
import fr.paris.lutece.portal.service.security.LuteceUser;
import fr.paris.lutece.portal.service.security.UserNotSignedException;
import fr.paris.lutece.portal.service.spring.SpringContextService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.web.xpages.XPage;
import fr.paris.lutece.portal.web.xpages.XPageApplication;
import fr.paris.lutece.util.html.HtmlTemplate;
/**
* Pages for billetterie front
*
*/
public class StockBilletterieApp extends AbstractXPageApp implements XPageApplication
{
private static final long serialVersionUID = -4553179819252666450L;
// Beans
private static final String BEAN_STOCK_TICKETS_SEANCE_SERVICE = "stock-tickets.seanceService";
private static final String BEAN_STOCK_TICKETS_SHOW_SERVICE = "stock-tickets.showService";
private static final String BEAN_USER_SERVICE = "userban.userService";
// Templates
private static final String TEMPLATE_DIR = "skin/plugins/stock/modules/billetterie/";
private static final String TEMPLATE_BOOKING_BLOC = "booking_bloc.html";
private static final String TEMPLATE_LIST_SHOW_PAGE = "list_show_page.html";
private static final String TEMPLATE_SHOW_PAGE = "show_page.html";
// Parameters
private static final String PARAMETER_DATE_SEANCE = "date_seance";
private static final String PARAMETER_PRODUCT_ID = "product_id";
private static final String PARAMETER_ACTION = "action";
private static final String PARAMETER_SUBSCRIBE = "subscribe";
private static final String PARAMETER_PURCHASE_ID = "purchase_id";
// Marks
private static final String MARK_TYPE_LIST = "type_list";
private static final String MARK_SHOW_LIST = "show_list";
private static final String MARK_SEANCE_DATE = "seance_date";
private static final String MARK_SEANCE_LIST = "seanceList";
private static final String MARK_NB_PLACE_SELECTED = "nbSelected";
private static final String MARK_S_SEANCE_DATE = "sSeanceDate";
private static final String MARK_IS_MODIFY = "ismodify";
private static final String MARK_BLOC_RESERVATION = "bloc_reservation";
private static final String MARK_USER = "user";
private static final String MARK_SEANCE_DATE_LIST = "seance_date_list";
private static final String MARK_BOOKING_OPENED = "booking_opened";
private static final String MARK_URL_POSTER = "url_poster";
private static final String MARK_URL_REAL_POSTER = "url_real_poster";
private static final String MARK_PARTNER = "partner";
private static final String MARK_SHOW = "show";
private static final String MARK_SUBSCRIBE = "subscribe";
private static final String MARK_USER_EMAIL = "user_email";
private static final String MARK_DISTRICT = "district";
private static final String MARK_MESSAGE_USER_BAN = "messageUserBan";
public static final String MARK_PRODUCTS_LIST = "products_list";
// Actions
private static final String ACTION_SHOW_PAGE = "fiche-spectacle";
private static final String ACTION_CURRENT_SHOW_LIST = "a-laffiche";
private static final String ACTION_COME_SHOW_LIST = "a-venir";
// Messages
private static final String MESSAGE_ERROR_PARSING_SHOW_DATE = "Erreur lors du parsing de la date de séance";
private static final String MESSAGE_MESSAGE_USER_BAN = "module.stock.billetterie.message.user.ban.libelle";
// Properties
private static final String PROPERTY_POSTER_PATH = "stock-billetterie.poster.path";
private static final String PROPERTY_POSTER_TB_PATH = "stock-billetterie.poster.tb.path";
private static final String PROPERTY_POSTER_RIMG_PATH = "stock-billetterie.poster.rimg.path";
// Order filters
private static final String ORDER_FILTER_DATE = "date";
private static final String ORDER_FILTER_DATE_END = "dateEnd";
private static final String ORDER_FILTER_DATE_START = "dateStart";
// Constants
private static final String TITLE_CURRENT_SHOW_LIST = "module.stock.billetterie.show_list.aLaffiche.title";
private static final String TITLE_COME_SHOW_LIST = "module.stock.billetterie.show_list.aVenir.title";
private static final String STRING_TRUE = "true";
private static final int BOOKING_OPENED = 0;
private static final int BOOKING_TO_COME = 1;
private static final int BOOKING_PASSED = -1;
private static final String TYPE_A_VENIR = "aVenir";
private static final String TYPE_A_LAFFICHE = "aLaffiche";
private IShowService _showService = (IShowService) SpringContextService.getContext( ).getBean( BEAN_STOCK_TICKETS_SHOW_SERVICE );
private IProviderService _providerService = SpringContextService.getContext( ).getBean( IProviderService.class );
// private ISubscriptionProductService _subscriptionProductService = SpringContextService.getContext( ).getBean(
// ISubscriptionProductService.class );
private ISeanceService _offerService = (ISeanceService) SpringContextService.getContext( ).getBean( BEAN_STOCK_TICKETS_SEANCE_SERVICE );
private final IPurchaseSessionManager _purchaseSessionManager = SpringContextService.getContext( ).getBean( IPurchaseSessionManager.class );
private DistrictService _districtService = SpringContextService.getContext( ).getBean( DistrictService.class );
private final IUserService _serviceUser = SpringContextService.getBean( BEAN_USER_SERVICE );
private final IPurchaseService _purchaseService = SpringContextService.getContext( ).getBean( IPurchaseService.class );
/**
* {@inheritDoc}
*/
@Override
public XPage getPage( HttpServletRequest request, int nMode, Plugin plugin ) throws UserNotSignedException, SiteMessageException
{
XPage page = new XPage( );
Locale locale = request.getLocale( );
String strAction = request.getParameter( PARAMETER_ACTION );
if ( ACTION_SHOW_PAGE.equals( strAction ) )
{
page = getShowPage( page, request, locale );
}
if ( ACTION_CURRENT_SHOW_LIST.equals( strAction ) )
{
page = getCurrentListShowPage( page, request, locale );
}
if ( ACTION_COME_SHOW_LIST.equals( strAction ) )
{
page = getComeListShowPage( page, request, locale );
}
return page;
}
/**
* Page for the show
*
* @param page
* xpage
* @param request
* http request
* @param locale
* locale
* @return xpage
*/
public XPage getShowPage( XPage page, HttpServletRequest request, Locale locale ) throws SiteMessageException {
// Get the user
LuteceUser currentUser = getLuteceUserAuthentication( request );
String sIdShow = request.getParameter( PARAMETER_PRODUCT_ID );
Integer idShow = -1;
if ( StringUtils.isNotEmpty( sIdShow ) && StringUtils.isNumeric( sIdShow ) )
{
idShow = Integer.valueOf( sIdShow );
}
String sSeanceDate = request.getParameter( PARAMETER_DATE_SEANCE );
String strSubscribe = request.getParameter( PARAMETER_SUBSCRIBE );
String strPurchaseId = request.getParameter( PARAMETER_PURCHASE_ID );
request.getSession( ).setAttribute( PARAMETER_PURCHASE_ID, strPurchaseId );
Integer idPurchase = -1;
Map<String, Object> model = new HashMap<String, Object>( );
Map<Integer, String> nbPlaceBookMap = new HashMap<>( );
List<String> purchaseList = new ArrayList<>( );
if ( StringUtils.isNotEmpty( strPurchaseId ) && StringUtils.isNumeric( strPurchaseId ) )
{
idPurchase = Integer.valueOf( strPurchaseId );
purchaseList.add( strPurchaseId );
ReservationDTO booking = _purchaseService.findById( idPurchase );
if ( booking != null )
{
final DateFormat sdfComboSeance = new SimpleDateFormat( TicketsConstants.FORMAT_COMBO_DATE_SEANCE, locale );
Date today = new Date( );
SeanceDTO seance = booking.getOffer( );
nbPlaceBookMap.put( seance.getId( ), String.valueOf( booking.getQuantity( ) ) );
String sDateHour = sdfComboSeance.format( seance.getDateHour( ) );
if ( seance.getStatut( ).equals( TicketsConstants.OFFER_STATUT_OPEN ) && seance.getDateHour( ).after( today ) )
{
if ( seance.getQuantity( ) == 0 )
{
sSeanceDate = sDateHour + " - COMPLET";
}
else
{
sSeanceDate = sDateHour;
}
}
// Get other bookings for same show
PurchaseFilter filter = new PurchaseFilter( );
filter.setIdProduct( idShow );
filter.setUserName( Optional.ofNullable( currentUser ).map( LuteceUser::getName ).orElse( null ) );
List<ReservationDTO> bookings = _purchaseService.findByFilter( filter );
for ( ReservationDTO book : bookings )
{
if ( book.getId( ).equals( booking.getId( ) ) )
{
continue;
}
SeanceDTO otherSeance = book.getOffer( );
if ( otherSeance.getDate( ).equals( seance.getDate( ) ) && otherSeance.getHour( ).equals( seance.getHour( ) ) )
{
nbPlaceBookMap.put( otherSeance.getId( ), String.valueOf( book.getQuantity( ) ) );
purchaseList.add( String.valueOf( book.getId( ) ) );
}
}
}
request.getSession( ).setAttribute( PARAMETER_PURCHASE_ID, purchaseList );
model.put( MARK_IS_MODIFY, idPurchase );
}
// Get the show
ShowDTO show = _showService.getProduct( idShow );
// Generates template
FunctionnalException fe = getErrorOnce( request );
if ( fe != null )
{
model.put( TicketsConstants.PARAMETER_ERROR, getHtmlError( fe, request ) );
}
// check the type of available offers
OfferFilter offerFilter = new OfferFilter( );
offerFilter.setProductId( idShow );
List<SeanceDTO> offerList = _offerService.findByFilter( offerFilter, null ).stream( )
.filter( e -> convertStringToTimestamp( e.getDate( ) + " " + e.getHour( ) ) ).collect( Collectors.toList( ) );
List<SeanceDTO> offerListFinal = new ArrayList<>( );
for ( SeanceDTO seanceDTO : offerList )
{
if ( !( "annule" ).equals( seanceDTO.getStatut( ) ) )
{
offerListFinal.add( seanceDTO );
}
}
boolean availableInvitation = false;
boolean availableChildInvitation = false;
boolean availableReducedPrice = false;
for ( SeanceDTO dto : offerListFinal )
{
if ( dto.getQuantity( ) > 0 )
{
switch( dto.getIdGenre( ) )
{
case 1:
availableReducedPrice = true;
break;
case 2:
availableInvitation = true;
break;
case 3:
availableChildInvitation = true;
break;
default:
break;
}
}
}
show.setAvailableChildInvitation( availableChildInvitation );
show.setAvailableInvitation( availableInvitation );
show.setAvailableReducedPrice( availableReducedPrice );
model.put( MARK_SHOW, show );
PartnerDTO partner = _providerService.findByIdWithProducts( show.getIdProvider( ) );
if ( ( partner != null ) && ( partner.getDistrict( ) != null ) )
{
District district = _districtService.findById( partner.getDistrict( ) );
model.put( MARK_DISTRICT, district );
}
model.put( MARK_PARTNER, partner );
model.put( MARK_URL_POSTER, AppPropertiesService.getProperty( PROPERTY_POSTER_PATH ) );
model.put( MARK_URL_REAL_POSTER, AppPropertiesService.getProperty( PROPERTY_POSTER_RIMG_PATH ) );
// Calculate if show is open to book
model.put( MARK_BOOKING_OPENED, caculateBookingOpened( show ) );
// Get seance list
SeanceFilter filter = new SeanceFilter( );
filter.setOrderAsc( false );
List<String> orderList = new ArrayList<String>( );
orderList.add( ORDER_FILTER_DATE );
// Get recommended Product
List<RecommendedProduct> listProducts = null;
try
{
listProducts = StockRecommendationService.instance( ).getRecommendedProducts( currentUser.getName( ) );
}
catch( TasteException ex )
{
// User not found
// addError( "User not found" );
AppLogService.info( "Recommendation error : " + ex.getMessage( ) );
}
model.put( MARK_PRODUCTS_LIST, listProducts );
filter.setOrders( orderList );
model.put( MARK_SEANCE_DATE_LIST, _offerService.findSeanceByShow( show.getId( ), filter, locale ) );
// check if the user is not ban, don't check for unregistred user
if ( currentUser != null )
{
String strEmailHome = currentUser.getUserInfo( LuteceUser.HOME_INFO_ONLINE_EMAIL );
String strEmailBusiness = currentUser.getUserInfo( LuteceUser.BUSINESS_INFO_ONLINE_EMAIL );
String strEmail = !strEmailHome.equals( "" ) ? strEmailHome : strEmailBusiness;
User userBan = _serviceUser.findByPrimaryKey( strEmail );
if ( userBan != null )
{
String banMessage = I18nService.getLocalizedString( MESSAGE_MESSAGE_USER_BAN, new String [ ] {
userBan.getMotif( )
}, locale );
model.put( MARK_MESSAGE_USER_BAN, banMessage );
}
}
// If user authenticated, display booking bloc
model.put( MARK_USER, currentUser );
model.put( MARK_BLOC_RESERVATION, getBookingBloc( show, sSeanceDate, locale, nbPlaceBookMap ) );
model.put( MARK_S_SEANCE_DATE, sSeanceDate );
// if the user wants to subscribe to the show (get an email if a new representation is added)
if ( currentUser != null )
{
String strEmailHome = currentUser.getUserInfo( LuteceUser.HOME_INFO_ONLINE_EMAIL );
String strEmailBusiness = currentUser.getUserInfo( LuteceUser.BUSINESS_INFO_ONLINE_EMAIL );
String strEmail = !strEmailHome.equals( "" ) ? strEmailHome : strEmailBusiness;
SubscriptionProductJspBean jspBean = new SubscriptionProductJspBean( );
boolean isSubscribe = false;
// if user want to subscribe or unsubscribe to the product
if ( strSubscribe != null )
{
if ( strSubscribe.equals( STRING_TRUE ) )
{
jspBean.doSubscribeToProduct( request, currentUser );
isSubscribe = true;
model.put( MARK_USER_EMAIL, strEmail );
}
else
{
jspBean.doUnsubscribeToProduct( request, currentUser );
}
}
else
{
isSubscribe = jspBean.isSubscribeToProduct( request, currentUser );
}
if ( !isSubscribe )
{
model.put( MARK_SUBSCRIBE, STRING_TRUE );
}
else
{
model.put( MARK_USER_EMAIL, strEmail );
}
}
HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_DIR + TEMPLATE_SHOW_PAGE, locale, model );
page.setContent( template.getHtml( ) );
page.setPathLabel( show.getName( ) );
page.setTitle( show.getName( ) );
return page;
}
/**
* Calculate if show is open to book.
*
* @param show
* the show
* @return 0 open, 1 to come, -1 passed
*/
private int caculateBookingOpened( ShowDTO show )
{
Date startDate = DateUtils.getDate( show.getStartDate( ), true );
Date endDate = DateUtils.getDate( show.getEndDate( ), false );
Date today = new Date( );
int seanceOpened;
if ( today.before( startDate ) )
{
seanceOpened = BOOKING_TO_COME;
}
else
if ( today.after( endDate ) )
{
seanceOpened = BOOKING_PASSED;
}
else
{
seanceOpened = BOOKING_OPENED;
}
return seanceOpened;
}
/**
* Return html for booking bloc into show page.
*
* @param show
* the show
* @param sDateSeance
* the s date seance
* @param locale
* locale
* @return xpage
*/
private String getBookingBloc( ShowDTO show, String sDateSeance, Locale locale, Map<Integer, String> nbPlaceBookMap )
{
if ( sDateSeance == null )
{
return StringUtils.EMPTY;
}
DateFormat sdfComboSeance = new SimpleDateFormat( TicketsConstants.FORMAT_COMBO_DATE_SEANCE, locale == null ? Locale.getDefault( ) : locale );
Date dateSeance;
try
{
dateSeance = sdfComboSeance.parse( sDateSeance );
}
catch( ParseException e )
{
throw new TechnicalException( MESSAGE_ERROR_PARSING_SHOW_DATE, e );
}
List<SeanceDTO> seanceList = _offerService.findSeanceByDate( show.getId( ), dateSeance );
for ( SeanceDTO seance : seanceList )
{
// Update quantity with quantity in session for this offer
seance.setQuantity( _purchaseSessionManager.updateQuantityWithSession( seance.getQuantity( ), seance.getId( ) ) );
}
// Generates template
Map<String, Object> model = new HashMap<String, Object>( );
model.put( MARK_SEANCE_LIST, seanceList );
for ( Integer key : nbPlaceBookMap.keySet( ) )
{
model.put( MARK_NB_PLACE_SELECTED + key, nbPlaceBookMap.get( key ) );
}
model.put( MARK_SEANCE_DATE, sDateSeance );
model.put( MARK_SHOW, show );
HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_DIR + TEMPLATE_BOOKING_BLOC, locale, model );
return template.getHtml( );
}
/**
* Gets the current list show page.
*
* @param page
* the page
* @param request
* the request
* @param locale
* the locale
* @return the current list show page
* @throws UserNotSignedException
*/
private XPage getCurrentListShowPage( XPage page, HttpServletRequest request, Locale locale ) throws SiteMessageException
{
LuteceUser user = getLuteceUserAuthentication( request );
List<RecommendedProduct> listProducts = null;
try
{
listProducts = StockRecommendationService.instance( ).getRecommendedProducts( user.getName() );
}
catch( TasteException ex )
{
// User not found
// addError( "User not found" );
AppLogService.info( "Recommendation error : " + ex.getMessage( ) );
}
List<String> orderList = new ArrayList<String>( );
orderList.add( ORDER_FILTER_DATE_END );
List<ShowDTO> currentListShow = _showService.getCurrentProduct( orderList, null );
Map<String, Object> model = new HashMap<String, Object>( );
model.put( MARK_SHOW_LIST, currentListShow );
model.put( MARK_TYPE_LIST, TYPE_A_LAFFICHE );
model.put( MARK_URL_POSTER, AppPropertiesService.getProperty( PROPERTY_POSTER_TB_PATH ) );
model.put( MARK_PRODUCTS_LIST, listProducts );
HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_DIR + TEMPLATE_LIST_SHOW_PAGE, locale, model );
page.setContent( template.getHtml( ) );
String title = getMessage( TITLE_CURRENT_SHOW_LIST, request );
page.setPathLabel( title );
page.setTitle( title );
return page;
}
/**
* Gets the come list show page.
*
* @param page
* the page
* @param request
* the request
* @param locale
* the locale
* @return the come list show page
*/
private XPage getComeListShowPage( XPage page, HttpServletRequest request, Locale locale )
{
List<String> orderList = new ArrayList<String>( );
orderList.add( ORDER_FILTER_DATE_START );
List<ShowDTO> comeListShow = _showService.getComeProduct( orderList, null );
Map<String, Object> model = new HashMap<String, Object>( );
model.put( MARK_SHOW_LIST, comeListShow );
model.put( MARK_TYPE_LIST, TYPE_A_VENIR );
model.put( MARK_URL_POSTER, AppPropertiesService.getProperty( PROPERTY_POSTER_TB_PATH ) );
HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_DIR + TEMPLATE_LIST_SHOW_PAGE, locale, model );
page.setContent( template.getHtml( ) );
String title = getMessage( TITLE_COME_SHOW_LIST, request );
page.setPathLabel( title );
page.setTitle( title );
return page;
}
/**
* Gets the user name
*
* @param request
* The HTTP request
* @return the user name
* @throws UserNotSignedException
*/
public static boolean convertStringToTimestamp( String strDate )
{
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm" );
LocalDateTime ldt = LocalDateTime.parse( strDate, dateTimeFormatter );
boolean gtDateNow = true;
if ( Timestamp.valueOf( ldt ).getTime( ) < Timestamp.valueOf( LocalDateTime.now( ) ).getTime( ) )
{
gtDateNow = false;
}
return gtDateNow;
}
}