/
CSMART Scheduler - GuestLine Integration (Hotel) Issues

The CSMART Scheduler integrates into a 3rd party hotel software provider GuestLine. The Scheduler pushes room reservation information for Scheduler event participants if they get assigned check-in and check-out dates on their participant assignment. The integration is able to create new room reservations, update existing room reservations and is able to cancel a room reservation in GuestLine.

An occasional issue with GuestLine’s API (e.g. not accessible) may stop the integration from processing pending room reservations. If an issue arises, the Scheduler retries issuing requests to GuestLine 5 times (Ext.CSMART.GuestLine.OperationItem.MaxErrors) before it gives up and ask for a manual interaction from a human.

All operations (room reservation API requests) must be executed in the order they have been created. This means if one request fails, any more recent pending operations can’t be processed and the system bulds up a backlog of not (yet) processed operation items.

Any issues calling the API or otherwise will send an error email to operations@marinels.com (see Error Emails example below).

Communication with CSMART Hotel and GuestLine

Please keep the guys at CSMART Hotel (Mirjam and Christel) upraised if there is any issues with the integration so they know that e.g. no reservation are currently pushed into GuestLine. Contacts can be found here.

If there is an issue with the GuestLine API, the contacts for the external service providers should be able to help and can be found here.

DB Structure

The Ext Service DB contains a table OperationItems. This table records any request/response and errors (incl. error count).

View operation items ordered from latest to oldest. Usually, the IsProcessed=0 (=false) and ErrorCount>0 if there is an issue and the system is stuck on a particular operation if ErrorCount=Ext.CSMART.GuestLine.OperationItem.MaxErrors (usually 5).

1select * from OperationItems order by DateAdded desc

The columns ServiceRequest and ServiceResponse have details about the request object and/or error returned by the API.

Manually Restart Operation Item Processing

If an operation item has reached the max. ErrorCount the system doesn't issue any further API requests because it thinks it is broken and needs manual investigation. To restart the system - re-issue requests to the API - set the ErrorCount to 1 for the operation item with the max. ErrorCount and IsProcessed=0 (=false) using the following SQL.

1update OperationItems set ErrorCount=1 where id='[add OperationItem Id]'

If an operation item has reached the max. ErrorCount never set the ErrorCount to 0. This way we have a history of operation items which had an issue in the past.

To get any operation items which had issues in the past use SQL:

select * from OperationItems where ErrorCount > 0 order by DateAdded desc

Error Emails

Example Email Subject

1Ext-Service-Live_MarineLMS Service ERROR:

Example Email Body

12022-09-06 03:17:37,928 [ERROR] {OperationItem Manager Thread} |CSmart.Service.GuestLineServiceAccessor| *Ext-Service-Live_MarineLMS* Service - CSMART Extensions - GuestLine - OperationItem.Id='f9b2da5c-2dcc-11ed-8198-0cc47a025d51': MakeOrUpdateReservation (executed operation: 'New') Updating/Creating the reservation failed for ParticipantAssignment Id 'be8dcf1a-1cba-11ed-8197-0cc47a025d51: 2 System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'uk5.roomlynx.net'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel. 3 at System.Net.HttpWebRequest.GetResponse() 4 at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 5 --- End of inner exception stack trace --- 6 7Server stack trace: 8 at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 9 at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 10 at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 11 at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 12 at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 13 at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 14 at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 15 16Exception rethrown at [0]: 17 at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 18 at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 19 at MarineLMSExtensions.Service.Impl.GuestLine.RoomLynxAPIPortType.MakeReservation(MakeReservation request) 20 at MarineLMSExtensions.Service.Impl.CSmart.Service.GuestLineServiceAccessor.MakeOrUpdateReservation(IRepositoryFinder repoFinder, IParticipantOperationItem paOpItem)'. 212022-09-06 03:17:37,928 [ERROR] {OperationItem Manager Thread} |CSmart.Model.OperationItemHelper| *Ext-Service-Live_MarineLMS* Service - <<ExecuteParticipantOperationItem>>: Error occurred while processing OperationItem (Id: 'f9b2da5c-2dcc-11ed-8198-0cc47a025d51'). System will automatically retry. Current error count: 1/5.Error: 22ServiceRequest: {"TimestampSpecified":false,"VersionSpecified":false,"Lang":null,"DebugSpecified":false,"HotelRef":{"Code":"CSMART","Name":null,"MarketSourceCode":null},"ReservationType1":"New","BookingDateSpecified":false,"CRSConfirmationNumber":null,"CRSConfirmationNumber2":"be8dcf1a-1cba-11ed-8197-0cc47a025d51","PromotionalCode":null,"UseKeyCodesSpecified":false,"RoomStays":[{"RoomRates":[{"Rates":[{"Base":{"AmountAfterTax":91.96,"AmountAfterTaxWithoutLosRuleSpecified":false,"AmountBeforeTaxSpecified":false,"CurrencyCode":null},"From":"2022-09-11T12:00:00","To":"2022-09-16T12:00:00","NumberOfNights":null}],"RatePlanCode":"CARN_FULLB","RoomCode":"DOUBLE","PromotionalCode":null,"SpecialOfferID":null,"TotalAmountAfterTaxSpecified":false}],"Upsells":null,"GuestCounts":[{"AgeQualifyingCode":"10","Count":"1"}],"Total":null,"TotalCostOfStay":null,"ResGuestRPHs":[{"ProfileRPH":"0"}],"Notes":null,"Deposit":null,"RoomNumber":null,"Company":{"CompanyRef":"PCL","Name":null,"ABTA":null,"ATOL":null,"IATA":null},"AllocateRoomNumber":null,"ResDiaryReferences":null,"IndexNumber":"0"}],"Profiles":[{"NamePrefix":null,"Firstname":"Mate","Lastname":"Sljaka","ProfileType1":null,"Address":null,"ContactDetails":{"TelephoneNumbers":["+385 914 515 499"],"FaxNumber":null,"Email":"msljaka@gmail.com"},"MailListEnrolmentSpecified":false,"Company":null,"Attributes":[{"Key":"RANK2","Value":"SEO"},{"Key":"NATIONALITY","Value":"Croatia [HR]"}],"AgeGroup":null,"StudentID":null,"VipLevelSpecified":false,"PrfRef":null,"Password":null,"ProfileRPH":"0"}],"BookerRPH":{"ProfileRPH":"0"},"PaymentStatus":null,"Guarantee":null,"Notes":null,"CreditCardSurchargeSpecified":false,"RoomBlockCode":null,"TicketItem":null} 23ServiceResponse: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'uk5.roomlynx.net'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel. 24 at System.Net.HttpWebRequest.GetResponse() 25 at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 26 --- End of inner exception stack trace --- 27 28Server stack trace: 29 at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 30 at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 31 at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 32 at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 33 at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 34 at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 35 at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 36 37Exception rethrown at [0]: 38 at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 39 at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 40 at MarineLMSExtensions.Service.Impl.GuestLine.RoomLynxAPIPortType.MakeReservation(MakeReservation request) 41 at MarineLMSExtensions.Service.Impl.CSmart.Service.GuestLineServiceAccessor.MakeOrUpdateReservation(IRepositoryFinder repoFinder, IParticipantOperationItem paOpItem)

GuestLine Configuration in Ext Service

The GuestLine API configuration can be found in the Ext Service’s app.config. The GuestLine related configuration keys all start with Ext.CSMART.GuestLine.

Main app configuration keys (restart the Ext Service if any configuration has been changed to take effect!):

  • Ext.CSMART.GuestLine.OperationItem.MaxErrors: Number of retries before the integration gives up and issues an USER INTERVENTION REQUIRED error email message.

  • Ext.CSMART.GuestLine.Service.EndPoint: GuestLine API endpoint to send requests

  • Ext.CSMART.GuestLine.Service.Auth.Password: The password must be url encoded - e.g. ; is &amp;

  • Ext.CSMART.GuestLine.Service.Integration.Enabled: Enable/disable the integration via true/false.