Multi thread sample
From Logic Wiki
Imports System.Data
Imports System.Data.SqlClient
Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.IO
Imports System.Web
Imports System.Web.HttpContext
Imports System.Web.Services.Protocols
Imports System.Configuration
Imports System.Xml
Imports NetMarketeers.TravelServer.DB
Imports NetMarketeers.Utility.Data
Imports System.Threading
Namespace NetMarketeers.TravelServer.Engine
<Serializable()> Public Class BedBankSupplier : Implements IAsyncSupplier
Private inAgentId As Integer
Private inAffiliateId As Integer
Private stWebSessionId As String
Private RatingCodes As String = String.Empty
Private DestinationCodesGloballyExcluded() As String, ResortCodesGloballyExcluded() As String
Private _LoadLocal As Boolean
Protected ServerApplicationState As HttpApplicationState
Protected Session As SessionState.HttpSessionState
' Live Web Service:
Protected bbc As BedbankWebService.BedBankContext
Private iasBB As IAsyncResult
Private _AllowSearch As Boolean = True
Public ReadOnly Property AllowSearch() As Boolean Implements IAsyncSupplier.AllowSearch
Get
Return _AllowSearch
End Get
End Property
#Region "Constructors"
Public Sub New(ByVal inNewAgentId As Integer, ByVal inNewAffiliateId As Integer, _
ByVal stNewWebSessionId As String)
inAgentId = inNewAgentId
inAffiliateId = inNewAffiliateId
stWebSessionId = stNewWebSessionId
End Sub
Public Sub New(ByVal inNewAgentId As Integer, ByVal inNewAffiliateId As Integer, _
ByVal stNewWebSessionId As String, ByRef Session As SessionState.HttpSessionState, _
ByRef Application As HttpApplicationState, ByRef excludedDestinationCodes() As String, _
ByRef excludedResortCodes() As String)
inAgentId = inNewAgentId
inAffiliateId = inNewAffiliateId
stWebSessionId = stNewWebSessionId
Me.Session = Session
Me.ServerApplicationState = Application
Me.DestinationCodesGloballyExcluded = excludedDestinationCodes
Me.ResortCodesGloballyExcluded = excludedResortCodes
End Sub
Public Sub New(ByRef Session As SessionState.HttpSessionState, ByRef Application As HttpApplicationState, _
ByVal stNewWebSessionId As String)
Me.ServerApplicationState = Application
Me.Session = Session
stWebSessionId = stNewWebSessionId
Me._LoadLocal = Application("RUN_LOCAL")
End Sub
#End Region
#Region " Search "
Public DBConnStr As String
Public CacheConnStr As String
Private Function GetRoomsAvailable(ByVal dteArrivalDate As DateTime, _
ByVal dteDepartureDate As DateTime, ByVal intDestinationID As Integer, _
ByVal intResortID As Object, ByVal intBoardTypeID As Object, _
ByVal intPassengers As Integer) As DataTable
Dim strConn As String = Current.Application.Get("SearchCacheConnectionString")
Dim sqlConn As New SqlConnection(strConn)
'SQLRun("INSERT INTO AliLog (LogTxt) VALUES ( 'GetRoomsAvailable Function Entered " & Now.ToLongTimeString & " " & Now.Millisecond & "')")
Dim strSQL As String = "" & _
"SELECT gra.* FROM tblGetRoomsAvailableCache grac " & _
"LEFT JOIN tblGetRoomsAvailable gra ON gra.CacheID = grac.CacheID " & _
"WHERE grac.CacheIsInvalidated = 'N' " & _
"AND grac.FromDate = @FromDate AND grac.ToDate = @ToDate " & _
"AND grac.DestinationID = @DestinationID "
If IsNumeric(intResortID) Then
strSQL &= "AND grac.ResortID = @ResortID "
End If
If IsNumeric(intBoardTypeID) Then
strSQL &= "AND grac.BoardTypeID = @BoardTypeID "
End If
strSQL &= "AND grac.OccupancyID = @Passengers;"
Dim sqlComm As New SqlCommand(strSQL, sqlConn)
sqlComm.Parameters.Add("@FromDate", SqlDbType.DateTime).Value = dteArrivalDate
sqlComm.Parameters.Add("@ToDate", SqlDbType.DateTime).Value = dteDepartureDate
sqlComm.Parameters.Add("@DestinationID", SqlDbType.BigInt).Value = intDestinationID
If IsNumeric(intResortID) Then
sqlComm.Parameters.Add("@ResortID", SqlDbType.BigInt).Value = intResortID
End If
If IsNumeric(intBoardTypeID) Then
sqlComm.Parameters.Add("@BoardTypeID", SqlDbType.Int).Value = intBoardTypeID
End If
sqlComm.Parameters.Add("@Passengers", SqlDbType.Int).Value = intPassengers
Dim sqlDA As New SqlDataAdapter(sqlComm)
Dim dt As New DataTable
sqlDA.Fill(dt)
'SQLRun("INSERT INTO AliLog (LogTxt) VALUES ( 'GetRoomsAvailable Function Finished dt.rows.count : " & dt.Rows.Count & " - " & Now.ToLongTimeString & " " & Now.Millisecond & "')")
sqlDA = Nothing
If sqlConn.State = ConnectionState.Open Then
sqlConn.Close()
End If
sqlComm = Nothing
sqlConn = Nothing
'For i As Integer = 0 To dt.Rows.Count - 1
' DBTools.SQLRun("INSERT INTO AliLog (LogTxt) VALUES ('Loop " & dt.Rows(i).Item("RoomID") & " Infant : " & dt.Rows(i).Item("Infant") & "')")
'Next
Return dt
End Function
Private Sub UpdateCacheHit(ByVal strCacheID As String)
Dim strConn As String = Current.Application.Get("SearchCacheConnectionString")
Dim sqlConn As New SqlConnection(strConn)
Dim strSQL As String = "" & _
"UPDATE tblGetRoomsAvailableCache SET " & _
"CacheHitCount = CacheHitCount + 1 WHERE CacheID = @CacheID;"
Dim sqlComm As New SqlCommand(strSQL, sqlConn)
sqlComm.Parameters.Add("@CacheID", SqlDbType.VarChar, 36).Value = strCacheID
sqlConn.Open()
Try
sqlComm.ExecuteNonQuery()
Finally
sqlConn.Close()
End Try
sqlComm = Nothing
sqlConn = Nothing
End Sub
''' <summary>
''' Multi Thread search uses this sub for waiting the threads.
''' Other methods of waiting multi thread failed. This tricky sub works fine
''' </summary>
''' <param name="waitHandles"></param>
''' <remarks></remarks>
Sub WaitAll(ByVal waitHandles() As WaitHandle)
If Thread.CurrentThread.GetApartmentState() = ApartmentState.STA Then
For Each waitHandle As WaitHandle In waitHandles
waitHandle.WaitAny(New WaitHandle() {waitHandle})
Next
Else
WaitHandle.WaitAll(waitHandles)
End If
End Sub
''' <summary>
''' This Delegate is for Multithread search.
''' </summary>
''' <param name="CP">This parameter is a class holding parameters for Calculation </param>
''' <remarks></remarks>
Delegate Sub CalcHandler(CP As CalcParam)
' -----------------------------
' START: Standard search method
' -----------------------------
Public Function Search(ByRef sc As SearchCriteria, ByVal blnWebServiceRequest As Boolean) As RoomList
Dim SearchStartTime As DateTime = DateTime.Now
Dim Timings As String = ""
DBConnStr = Current.Application.Get("ConnectionString")
CacheConnStr = Current.Application.Get("SearchCacheConnectionString")
Dim Infant As Integer = 0
If Not IsNothing(Session("InfantQty")) Then
'ALI
Infant = CInt(Session("InfantQty"))
End If
SqlConnection.ClearAllPools()
'##############################################
' MultiThread Parameters
'##############################################
Dim RoomsPerThread As Integer = 50
Dim MultiThreadEnabled As Boolean = True
'##############################################
Dim RetVal As String = ""
' Check search parameters
Dim LogStr As String = ""
LogStr &= "Search Started : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
If sc.DestinationID.Length = 0 Then
' Do not start the search if the destination has not been specified
Me._AllowSearch = False
Return Nothing
ElseIf Not Me.DestinationCodesGloballyExcluded Is Nothing Then
' Do not start the search if the specified destination is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.DestinationCodesGloballyExcluded)
If LCase(Me.DestinationCodesGloballyExcluded(intIndex)).Equals(LCase(sc.DestinationID)) Then
Me._AllowSearch = False
Return Nothing
End If
Next
End If
If sc.ResortID.Length > 0 Then
If Not Me.ResortCodesGloballyExcluded Is Nothing Then
' Do not start the search if the specified resort is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.ResortCodesGloballyExcluded)
If LCase(Me.ResortCodesGloballyExcluded(intIndex)).Equals(LCase(sc.ResortID)) Then
Me._AllowSearch = False
Return Nothing
End If
Next
End If
End If
If Not sc.RatingType Is Nothing AndAlso IsNumeric(sc.RatingType) AndAlso CInt(sc.RatingType) <> 0 Then
Dim params() As Object = {Convert.ToInt32(sc.RatingType)}
Dim DS As DataSet = SqlHelper.ExecuteDataset(ServerApplicationState("SearchConnectionString"), "usp_Engine_Bedbank_GetRatingCodes_NEW", params)
Me.RatingCodes = String.Empty
If Not DS Is Nothing AndAlso Not DS.Tables Is Nothing AndAlso DS.Tables.Count > 0 Then
If Not DS.Tables(0) Is Nothing AndAlso Not DS.Tables(0).Rows Is Nothing AndAlso DS.Tables(0).Rows.Count > 0 Then
If Not DS.Tables(0).Rows(0)("BedbankCodes") Is Nothing Then
Me.RatingCodes = Convert.ToString(DS.Tables(0).Rows(0)("BedbankCodes"))
End If
End If
End If
If Me.RatingCodes.Length = 0 Then
Me._AllowSearch = False
Return Nothing
End If
Else
Me.RatingCodes = "ALL"
End If
Dim oList As New RoomList
Dim intDestinationID As Integer = CInt(sc.DestinationID)
' Resort ID is optional
Dim intResortID As Object = Convert.DBNull
If sc.ResortID.Length > 0 Then
intResortID = CInt(sc.ResortID)
End If
' Board type ID is optional
Dim intBoardTypeID As Object = Convert.DBNull
If sc.BoardType.Length > 0 Then
intBoardTypeID = CInt(sc.BoardType)
End If
' Log search parameters
Dim dteSearchDate As DateTime = Now()
Try
Dim strOutput As String = "" & dteSearchDate.ToString() & "," & Me.stWebSessionId & "," & _
sc.AgentID & "," & sc.ArrivalDate.ToString() & "," & sc.DepartureDate.ToString() & "," & sc.CountryID & "," & _
intDestinationID & "," & intResortID & ",'" & sc.AccommodationIDList & "'," & intBoardTypeID & "," & sc.PassengerString
Dim strLogFilePath As String = Current.Application.Get("SEARCH_LOG_FILE_DIR") & "Engine_" & dteSearchDate.Year & "_" & dteSearchDate.Month & "_" & dteSearchDate.Day & "_" & dteSearchDate.Hour & ".csv"
Dim fs As New System.IO.FileStream(strLogFilePath, System.IO.FileMode.Append)
Dim sw As New System.IO.StreamWriter(fs)
sw.WriteLine(strOutput)
sw.Close()
fs.Close()
sw = Nothing
fs = Nothing
Catch
End Try
LogStr &= "Validation and Log Phase completed : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Dim tblRooms As DataTable = Nothing
Dim blnUseSearchCacheMode As Boolean = False
If Not IsNothing(Current.Application.Get("CACHE_SEARCH_MODE_ON")) _
AndAlso CBool(Current.Application.Get("CACHE_SEARCH_MODE_ON")) Then
blnUseSearchCacheMode = True
End If
If blnUseSearchCacheMode Then
'SQLRun("INSERT INTO AliLog (LogTxt) VALUES ( 'CACHE MODE Line 260 " & Now.ToLongTimeString & " " & Now.Millisecond & "')")
' CACHE SEARCH RESULTS
' Start availability search by querying cached table
tblRooms = GetRoomsAvailable(sc.ArrivalDate, sc.DepartureDate, _
intDestinationID, intResortID, intBoardTypeID, CInt(sc.PassengerString))
LogStr &= "Get Rooms Available Completed: " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
LogStr &= "Available Rooms (" & tblRooms.Rows.Count & ") " & vbCrLf
If tblRooms.Rows.Count > 0 And Infant = 0 Then ' if there is an infant, cached results will always be wrong. A fresh search is needed.
' If a cache record can be found, update its hit count
UpdateCacheHit(tblRooms.Rows(0).Item("CacheID").ToString())
LogStr &= "Cache Hit Completed : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Else
' If the cached table returns no rooms, call the cached availability stored procedure
Dim sqlConn As New SqlConnection(Current.Application.Get("ConnectionString"))
Dim sqlComm As New SqlCommand("usp_GetRoomsAvailableUseCache_NEWPRICING", sqlConn)
If blnWebServiceRequest Then
sqlComm.CommandTimeout = 12 ' XML requests should return within 12 seconds
End If
sc.PassengerString = CStr(CInt(sc.PassengerString) + Infant)
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.Parameters.Add("@FromDate", SqlDbType.DateTime).Value = sc.ArrivalDate
sqlComm.Parameters.Add("@ToDate", SqlDbType.DateTime).Value = sc.DepartureDate
sqlComm.Parameters.Add("@DestinationID", SqlDbType.BigInt).Value = intDestinationID
sqlComm.Parameters.Add("@ResortID", SqlDbType.BigInt).Value = intResortID
sqlComm.Parameters.Add("@BoardTypeID", SqlDbType.Int).Value = intBoardTypeID
sqlComm.Parameters.Add("@Passengers", SqlDbType.Int).Value = CInt(sc.PassengerString)
sqlComm.Parameters.Add("@DoTotalPricing", SqlDbType.Int).Value = 1
sqlComm.Parameters.Add("@ValuateRoomID", SqlDbType.BigInt).Value = Convert.DBNull
sqlComm.Parameters.Add("@RetCacheID", SqlDbType.Char, 50)
sqlComm.Parameters("@RetCacheID").Direction = ParameterDirection.Output
sqlConn.Open()
Try
sqlComm.ExecuteNonQuery()
RetVal = sqlComm.Parameters("@RetCacheID").Value
Finally
sqlConn.Close()
End Try
Timings &= "|CS:" & DateTime.Now.Subtract(SearchStartTime).ToString
LogStr &= "Stored Procedure Run Completed : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
'############################################################
' PLACE FOR PRICING
'############################################################
If MultiThreadEnabled Then
If RetVal.Trim.Length > 0 Then
Dim strConn1 As String = Current.Application.Get("SearchCacheConnectionString")
Dim sqlConn1 As New SqlConnection(strConn1)
sqlConn1.Open()
Dim strSQL1 As String = "" & _
"SELECT * FROM tblGetRoomsAvailable WHERE CacheID = '" & RetVal & "'"
Dim sqlComm1 As New SqlCommand(strSQL1, sqlConn1)
Dim sqlDA1 As New SqlDataAdapter(sqlComm1)
Dim dt1 As New DataTable
sqlDA1.Fill(dt1)
sqlConn1.Close()
Dim TotalRowCount As Integer
TotalRowCount = dt1.Rows.Count
Dim Divider As Integer
Divider = Int(TotalRowCount / RoomsPerThread)
' Here I divide the search results into 50 (parameter is in the begining of this function)
' Each thread will handle 50 calculations and begin simultaneously.
' After For Next Loop, "WaitAll" waits for all these threads to finish their work and
' Function will continue as single thread again.
' +----------------------------------+
' | Available Rooms Returned |
' +----------------------------------+
' / | \
' Price Calc Price Calc Price Calc
' \ | /
' \ | /
' +----------------------------------+
' | Calculated Result Set |
' +----------------------------------+
Dim waitHandles As List(Of WaitHandle) = New List(Of WaitHandle)()
Dim caller As CalcHandler = New CalcHandler(AddressOf Calc)
For j As Integer = 0 To Divider + 1
Dim CP As New CalcParam
CP.DTBl = dt1
CP.StartingRow = j * RoomsPerThread
CP.CacheID = RetVal
Dim results As IAsyncResult = caller.BeginInvoke(CP, Nothing, Nothing)
waitHandles.Add(results.AsyncWaitHandle)
Next
WaitAll(waitHandles.ToArray())
Timings &= "|PC(" & TotalRowCount & "):" & DateTime.Now.Subtract(SearchStartTime).ToString
End If
Else
If RetVal.Trim.Length > 0 Then
Dim MyPrice As New PriceCalculationDLL.Price
Dim strConn1 As String = Current.Application.Get("SearchCacheConnectionString")
Dim sqlConn1 As New SqlConnection(strConn1)
sqlConn1.Open()
Dim strSQL1 As String = "" & _
"SELECT * FROM tblGetRoomsAvailable WHERE CacheID = '" & RetVal & "'"
Dim sqlComm1 As New SqlCommand(strSQL1, sqlConn1)
Dim sqlDA1 As New SqlDataAdapter(sqlComm1)
Dim dt1 As New DataTable
sqlDA1.Fill(dt1)
' sqlConn1.Close()
For z As Integer = 0 To dt1.Rows.Count - 1
Dim TotalAdultDisc As Decimal = 0
Dim TotalChildDisc As Decimal = 0
Dim TotalAdultPrice As Decimal = 0
Dim TotalChildPrice As Decimal = 0
Dim TotalHandlingFee As Decimal = 0
For y As Integer = 1 To 5
If CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) > 0 Then
Dim MyDS As New Data.DataSet
MyPrice.Connection = New SqlConnection(Current.Application.Get("ConnectionString"))
MyDS = MyPrice.GetPrice(dt1.Rows(z).Item("RoomID"), Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10), CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) - (Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10) * 10), CDate(dt1.Rows(z).Item("FromDate")), CDate(dt1.Rows(z).Item("ToDate")), dt1.Rows(z).Item("BoardTypeID"), Now.Date)
Dim ResTotal As New PriceCalculationDLL.Price.PriceTotals
ResTotal = PriceCalculationDLL.Price.GetTotals(MyDS, True, False)
TotalAdultPrice += ResTotal.TotalAdult
TotalChildPrice += ResTotal.TotalChild
TotalAdultDisc += ResTotal.DiscountTotal
TotalChildDisc += 0
TotalHandlingFee += ResTotal.HandlingFee
End If
Next
Dim GrandTotal As Decimal = (TotalAdultPrice + TotalChildPrice + TotalHandlingFee + CDec(dt1.Rows(z).Item("TotalMandatoryAdultSupplement")) + CDec(dt1.Rows(z).Item("TotalMandatoryChildSupplement"))) - TotalAdultDisc
'Dim NetOTBLtdPrice As Decimal
'NetOTBLtdPrice = GrandTotal / 0.99
Dim SQLUpdate As String = "UPDATE tblGetRoomsAvailable SET HandlingFee = '" & TotalHandlingFee & "' , TotalAdultPrice = '" & TotalAdultPrice & "', TotalChildPrice = '" & TotalChildPrice & "', TotalAdultDiscount = '" & TotalAdultDisc & "', TotalChildDiscount = '" & TotalChildDisc & "', Total = '" & GrandTotal & "' WHERE CacheID = '" & RetVal & "' AND RoomID = " & dt1.Rows(z).Item("RoomID") & " AND BoardTypeID = " & dt1.Rows(z).Item("BoardTypeID")
Dim sqlCommUpd As New SqlCommand(SQLUpdate, sqlConn1)
sqlCommUpd.ExecuteNonQuery()
sqlCommUpd = Nothing
Next
If sqlConn1.State = ConnectionState.Open Then
sqlConn1.Close()
End If
End If
End If
LogStr &= "Pricing Completed: " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
sqlComm = Nothing
If sqlConn.State = ConnectionState.Open Then
sqlConn.Close()
End If
sqlConn = Nothing
' Now query the cached table again
tblRooms = GetRoomsAvailable(sc.ArrivalDate, sc.DepartureDate, intDestinationID, _
intResortID, intBoardTypeID, CInt(sc.PassengerString))
End If
Else
End If
' Process availability
Try
Dim blnAllowed As Boolean = True
If blnAllowed Then
Dim strAccommodationIDs(-1) As String
If Not IsNothing(sc.AccommodationIDList) Then
strAccommodationIDs = sc.AccommodationIDList.Split(",")
End If
For i As Integer = 0 To tblRooms.Rows.Count - 1
blnAllowed = True
' Check prices have been returned
If Not IsDBNull(tblRooms.Rows(i).Item("Total")) Then
' -------------------------------------------
' START: Addition by Cyber Media (15/05/2007)
' -------------------------------------------
Dim accommID As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("SupplierAccommodationCode"))
Dim resortID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("ResortID"))
Dim boardTypeID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("BoardTypeID"))
Dim ratingCode As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("AccommodationCategoryName"))
If blnAllowed AndAlso Not Me.ResortCodesGloballyExcluded Is Nothing Then
' Do not allow the room if the located resort is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.ResortCodesGloballyExcluded)
If Me.ResortCodesGloballyExcluded(intIndex).Equals(Convert.ToString(resortID)) Then
blnAllowed = False
Exit For
End If
Next
End If
' If accommodation IDs have been specified in the search, see if they match the ID of the current hotel
If blnAllowed AndAlso Not IsNothing(sc.AccommodationIDList) AndAlso sc.AccommodationIDList.Length > 0 Then
Dim intAccommodationID As Integer = CInt(tblRooms.Rows(i).Item("AccommodationID"))
blnAllowed = False
For intIndex As Integer = 0 To UBound(strAccommodationIDs)
If IsNumeric(strAccommodationIDs(intIndex)) AndAlso CInt(strAccommodationIDs(intIndex)) = intAccommodationID Then
' The specified accommodation ID matches the ID of the current hotel
blnAllowed = True
End If
Next
End If
' If accommodation names have been specified in the search, see if they match the name of the current hotel
If blnAllowed AndAlso sc.AccommodationNames.Count > 0 Then
Dim blnMatchName As Boolean = False
Dim strHotelName As String = LCase(Trim(SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Name"))))
For Each strAccName As String In sc.AccommodationNames
strAccName = LCase(Trim(strAccName))
If strHotelName.Equals(strAccName) Then
' The specified accommodation name matches the title of the current hotel exactly
blnMatchName = True
ElseIf strHotelName.IndexOf(strAccName) > -1 Then
' The specified accommodation name is contained within the title of the current hotel
blnMatchName = True
Else
' Check if each keyword in the specified accommodation name is contained within the title of the current hotel
Dim intKeywordMatchCount As Integer = 0
Dim strAccNameKeywords() As String = strAccName.Split(" ")
Dim intAccNameKeywordCount As Integer = strAccNameKeywords.Length
For idx As Integer = 0 To UBound(strAccNameKeywords)
If strHotelName.IndexOf(strAccNameKeywords(idx)) > -1 Then
intKeywordMatchCount += 1
End If
Next
If intAccNameKeywordCount > 0 AndAlso intKeywordMatchCount = intAccNameKeywordCount Then
' Each keyword in the specified accommodation name is contained within the title of the current hotel
blnMatchName = True
End If
End If
Next
If Not blnMatchName Then
' The current room should not be added to the list of available rooms
' as the name of the hotel does not match any of the accommodation names specified in the search
blnAllowed = False
End If
End If
' Check the accommodation rating matches the accommodation rating selected by the user in the search form
If blnAllowed AndAlso Not Me.RatingCodes Is Nothing AndAlso Me.RatingCodes <> "ALL" _
AndAlso Not ratingCode Is Nothing AndAlso ratingCode <> String.Empty Then
blnAllowed = False
Dim rCodes() As String = Me.RatingCodes.Split(",")
For index As Integer = 0 To UBound(rCodes)
If Not rCodes(index) Is Nothing AndAlso rCodes(index).ToUpper().Equals(ratingCode.ToUpper()) Then
blnAllowed = True
End If
Next
End If
' ----------------------------
' END: Addition by Cyber Media
' ----------------------------
If blnAllowed Then
Dim oRoom As New BedBankRoom
With oRoom
.Board = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("BoardTypeDescription"))
.BoardCode = boardTypeID
.BoardDescription = .Board ' this was in the original!
.HotelName = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Name"))
.Resort = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Resort"))
.DestinationCode = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("DestinationID"))
.ResortCode = resortID
.RoomCode = tblRooms.Rows(i).Item("RoomID")
.RoomDescription = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("RoomDescription"))
.RoomType = .RoomDescription ' this was in the original!
.FromDate = sc.ArrivalDate
.ToDate = sc.DepartureDate
.CategoryDescription = ratingCode
.EDICode = accommID
Dim intNumRooms As Integer = CInt(tblRooms.Rows(i).Item("NumRooms"))
Dim intOccupancyID As Integer = CInt(SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyID")))
Dim intRoomAdults As Integer = CInt(Math.Floor(intOccupancyID / 10))
Dim intRoomChildren As Integer = intOccupancyID - (10 * intRoomAdults)
.OccupancyID = intOccupancyID
.OccupancyPublic = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyPublicText"))
.OccupancyBackOffice = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyBackOfficeText"))
.RoomAdults = intRoomAdults
.RoomChildren = intRoomChildren
.RoomQuantity = intNumRooms
.IsSelected = False
Dim intPriceTypeID As String = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("PriceTypeID"))
Dim intSpecialOffer As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("SpecialOffer"))
Dim intHotPick As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("HotPick"))
Dim intRequestOnly As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("RequestOnly"))
Dim intCostTypeID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("CostTypeID"))
If intPriceTypeID = 0 Then
' sale price
.AllowMarkups = False
Else
' cost price (markups will apply)
.AllowMarkups = True
End If
If intSpecialOffer = 1 Then
.IsSpecialOffer = True
Else
.IsSpecialOffer = False
End If
If intHotPick = 1 Then
.IsHotPick = True
Else
.IsHotPick = False
End If
If intRequestOnly = 1 Then
.IsRequestOnly = True
Else
.IsRequestOnly = False
End If
' Total is inclusive of handling fee, discounts and supplements
Dim dblTotalPrice As Double = SqlCommandWrapper.HandleDBNullFloat(tblRooms.Rows(i).Item("TOTAL"))
Dim supplierCurrencyCode As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Currency"))
' Prices should be returned in the native currency, as is
.SupplierPriceCurrency = supplierCurrencyCode
.SupplierTotalPriceCurrency = supplierCurrencyCode
.SupplierPrice = dblTotalPrice / sc.GetDurationOfStay()
.SupplierTotalPrice = dblTotalPrice
.HandlingFee = SqlCommandWrapper.HandleDBNullFloat(tblRooms.Rows(i).Item("HandlingFee"))
If intCostTypeID = 1 OrElse intCostTypeID = 3 Then
.PriceType = Enumerations.RoomPriceType.PerPerson
ElseIf intCostTypeID = 2 OrElse intCostTypeID = 4 Then
.PriceType = Enumerations.RoomPriceType.PerUnit
Else
.PriceType = Enumerations.RoomPriceType.UnSpecified
End If
End With
oList.Add(oRoom)
End If
End If
Next i
End If
Catch ex As Exception
End Try
If Infant > 0 Then
'INVALIDATE CACHE
Dim strSQL As String = "" & _
"UPDATE tblGetRoomsAvailableCache SET " & _
"CacheIsInvalidated = 'Y', CacheEndDate = GETDATE() " & _
"WHERE CacheID = '" & RetVal & "'"
Dim CacheConn As New SqlConnection(CacheConnStr)
CacheConn.Open()
Dim sqlCommUpd As New SqlCommand(strSQL, CacheConn)
sqlCommUpd.ExecuteNonQuery()
sqlCommUpd = Nothing
CacheConn.Close()
CacheConn.Dispose()
CacheConn = Nothing
End If
If RetVal.Trim.Length > 0 Then
Timings &= "|SC:" & DateTime.Now.Subtract(SearchStartTime).ToString
DBTools.SQLRuninCache("UPDATE tblGetRoomsAvailableCache SET SearchDuration = '" & DateTime.Now.Subtract(SearchStartTime).ToString & "', SearchLog='" & Timings & "' WHERE CacheID ='" & RetVal & "'")
End If
LogStr &= "Search Completed : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
'DBTools.SQLRun("INSERT INTO AliLog (LogTxt) VALUES ('" & LogStr & "')")
' Return availability
Return oList
End Function
Public Class CalcParam
Public DTBl As Data.DataTable
Public StartingRow As Integer
Public CacheID As String
End Class
Private Sub Calc(IncomingParam As CalcParam)
Dim RoomsPerTread As Integer = 50
Dim dt1 As Data.DataTable
dt1 = IncomingParam.DTBl
Dim StartingRow As Integer
StartingRow = IncomingParam.StartingRow
Dim Retval As String = IncomingParam.CacheID
'SQLRun("INSERT INTO AliLog (LogTxt) VALUES ( ' Calc Started " & Now.ToLongTimeString & " " & Now.Millisecond & "')")
Dim Infant As Integer = 0
For z As Integer = StartingRow To dt1.Rows.Count - 1
If z = StartingRow + RoomsPerTread Then
Exit For
End If
Dim TotalAdultDisc As Decimal = 0
Dim TotalChildDisc As Decimal = 0
Dim TotalAdultPrice As Decimal = 0
Dim TotalChildPrice As Decimal = 0
Dim TotalHandlingFee As Decimal = 0
If Not IsNothing(Session("InfantQty")) Then
'ALI
Infant = CInt(Session("InfantQty"))
End If
Dim ConvertedChildren As Integer = 0
ConvertedChildren = (Int(CInt(dt1.Rows(z).Item("Room1Occupancy")) / 10) + Int(CInt(dt1.Rows(z).Item("Room2Occupancy")) / 10) + Int(CInt(dt1.Rows(z).Item("Room3Occupancy")) / 10) + Int(CInt(dt1.Rows(z).Item("Room4Occupancy")) / 10) + Int(CInt(dt1.Rows(z).Item("Room5Occupancy")) / 10)) - Int(CInt(dt1.Rows(z).Item("OccupancyID")) / 10)
If Infant > 0 Then
Infant = Infant + ConvertedChildren
End If
For y As Integer = 1 To 5
If CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) > 0 Then
Dim MyDS As New Data.DataSet
Dim MyPrice As New PriceCalculationDLL.Price
Dim DBConn As New SqlConnection(DBConnStr) ' New Data.SqlClient.SqlConnection(Current.Application.Get("ConnectionString"))
'If DBConn.State <> ConnectionState.Open Then
' DBConn.Open()
'End If
MyPrice.Connection = DBConn
If Infant > 0 Then
If CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) - (Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10) * 10) >= Infant Then
dt1.Rows(z).Item("Room" & y & "Occupancy") = CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) - Infant
Infant = 0
Else
Dim RoomChild As Integer
RoomChild = (CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) - (Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10) * 10))
dt1.Rows(z).Item("Room" & y & "Occupancy") = Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10) * 10
Infant = Infant - RoomChild
End If
End If
MyDS = MyPrice.GetPrice(dt1.Rows(z).Item("RoomID"), Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10), CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) - (Int(CInt(dt1.Rows(z).Item("Room" & y & "Occupancy")) / 10) * 10), CDate(dt1.Rows(z).Item("FromDate")), CDate(dt1.Rows(z).Item("ToDate")), dt1.Rows(z).Item("BoardTypeID"), Now.Date)
Dim ResTotal As New PriceCalculationDLL.Price.PriceTotals
ResTotal = PriceCalculationDLL.Price.GetTotals(MyDS, True, False)
TotalAdultPrice += ResTotal.TotalAdult
TotalChildPrice += ResTotal.TotalChild
TotalAdultDisc += ResTotal.DiscountTotal
TotalChildDisc += 0
TotalHandlingFee += ResTotal.HandlingFee
MyPrice = Nothing
' DBConn.Close()
End If
Next
Dim GrandTotal As Decimal = (TotalAdultPrice + TotalChildPrice + TotalHandlingFee + CDec(dt1.Rows(z).Item("TotalMandatoryAdultSupplement")) + CDec(dt1.Rows(z).Item("TotalMandatoryChildSupplement"))) - TotalAdultDisc
'Dim NetOTBLtdPrice As Decimal
'NetOTBLtdPrice = GrandTotal / 0.99
Dim CacheConn As New SqlConnection(CacheConnStr)
CacheConn.Open()
Dim SQLUpdate As String = "UPDATE tblGetRoomsAvailable SET HandlingFee = '" & TotalHandlingFee & "' , TotalAdultPrice = '" & TotalAdultPrice & "', TotalChildPrice = '" & TotalChildPrice & "', TotalAdultDiscount = '" & TotalAdultDisc & "', TotalChildDiscount = '" & TotalChildDisc & "', Total = '" & GrandTotal & "' WHERE CacheID = '" & Retval & "' AND RoomID = " & dt1.Rows(z).Item("RoomID") & " AND BoardTypeID = " & dt1.Rows(z).Item("BoardTypeID")
Dim sqlCommUpd As New SqlCommand(SQLUpdate, CacheConn)
sqlCommUpd.ExecuteNonQuery()
sqlCommUpd = Nothing
CacheConn.Close()
CacheConn.Dispose()
CacheConn = Nothing
'SQLRun("INSERT INTO AliLog (LogTxt) VALUES ( 'Calc End " & Now.ToLongTimeString & " " & Now.Millisecond & "')")
Next
End Sub
' ---------------------------
' END: Standard search method
' ---------------------------
' ----------------------------------
' START: Asynchronous search methods
' ----------------------------------
Public Sub StartSearch(ByRef sc As SearchCriteria) Implements IAsyncSupplier.StartSearch
If sc.DestinationID.Length = 0 Then
' Do not start the search if the destination has not been specified
Me._AllowSearch = False
Exit Sub
ElseIf Not Me.DestinationCodesGloballyExcluded Is Nothing Then
' Do not start the search if the specified destination is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.DestinationCodesGloballyExcluded)
If LCase(Me.DestinationCodesGloballyExcluded(intIndex)).Equals(LCase(sc.DestinationID)) Then
Me._AllowSearch = False
Exit Sub
End If
Next
End If
If sc.ResortID.Length > 0 Then
If Not Me.ResortCodesGloballyExcluded Is Nothing Then
' Do not start the search if the specified resort is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.ResortCodesGloballyExcluded)
If LCase(Me.ResortCodesGloballyExcluded(intIndex)).Equals(LCase(sc.ResortID)) Then
Me._AllowSearch = False
Exit Sub
End If
Next
End If
End If
If Not sc.RatingType Is Nothing AndAlso IsNumeric(sc.RatingType) AndAlso CInt(sc.RatingType) <> 0 Then
Dim params() As Object = {Convert.ToInt32(sc.RatingType)}
Dim DS As DataSet = SqlHelper.ExecuteDataset(ServerApplicationState("SearchConnectionString"), "usp_Engine_Bedbank_GetRatingCodes_NEW", params)
Me.RatingCodes = String.Empty
If Not DS Is Nothing AndAlso Not DS.Tables Is Nothing AndAlso DS.Tables.Count > 0 Then
If Not DS.Tables(0) Is Nothing AndAlso Not DS.Tables(0).Rows Is Nothing AndAlso DS.Tables(0).Rows.Count > 0 Then
If Not DS.Tables(0).Rows(0)("BedbankCodes") Is Nothing Then
Me.RatingCodes = Convert.ToString(DS.Tables(0).Rows(0)("BedbankCodes"))
End If
End If
End If
If Me.RatingCodes.Length = 0 Then
Me._AllowSearch = False
Exit Sub
End If
Else
Me.RatingCodes = "ALL"
End If
' async web service
bbc = New BedbankWebService.BedBankContext
bbc.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim req As New BedbankWebService.SearchRequest
With req
.intTimeOut = Convert.ToInt32(ConfigurationManager.AppSettings("Engine_Bedbank_Timeout"))
.intSupplierId = Enumerations.Supplier.BedBank
.intWebSiteId = ConfigurationManager.AppSettings("WEBSITE_ID")
.strSessionId = stWebSessionId
.dteArrivalDate = sc.ArrivalDate
.dteDepartureDate = sc.DepartureDate
.strDestinationId = sc.DestinationID
.strResortId = sc.ResortID
.strBoardTypeId = sc.BoardType
.intPassengerString = sc.PassengerString
End With
Me.iasBB = bbc.BeginSearch(req, Nothing, Nothing)
End Sub
Public Function EndSearch(ByRef sc As SearchCriteria) As RoomList Implements IAsyncSupplier.EndSearch
Dim SearchStartTime As DateTime = DateTime.Now
Dim ds As New DataSet
Dim oList As New RoomList
Dim Timings As String = ""
Try
Dim res As BedbankWebService.SearchResponse = bbc.EndSearch(iasBB)
If IsNothing(res) OrElse IsNothing(res.xdResponse) Then
Return oList
End If
Dim nr As New XmlNodeReader(res.xdResponse)
ds.ReadXml(nr)
' Obtain the destination ID specified in the search
Dim destID As Integer = -1
If Not sc.DestinationID Is Nothing AndAlso IsNumeric(sc.DestinationID) Then
destID = Convert.ToInt32(sc.DestinationID)
End If
Dim blnAllowed As Boolean = True
Dim tblRooms As DataTable = ds.Tables(0)
If blnAllowed Then
Dim strAccommodationIDs(-1) As String
If Not IsNothing(sc.AccommodationIDList) Then
strAccommodationIDs = sc.AccommodationIDList.Split(",")
End If
For i As Integer = 0 To tblRooms.Rows.Count - 1
blnAllowed = True
' -------------------------------------------
' START: Addition by Cyber Media (15/05/2007)
' -------------------------------------------
Dim accommID As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("SupplierAccommodationCode"))
Dim resortID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("ResortID"))
Dim boardTypeID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("BoardTypeID"))
Dim ratingCode As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("AccommodationCategoryName"))
If blnAllowed AndAlso Not Me.ResortCodesGloballyExcluded Is Nothing Then
' Do not allow the room if the located resort is excluded at a global level
For intIndex As Integer = 0 To UBound(Me.ResortCodesGloballyExcluded)
If Me.ResortCodesGloballyExcluded(intIndex).Equals(Convert.ToString(resortID)) Then
blnAllowed = False
Exit For
End If
Next
End If
' If accommodation IDs have been specified in the search, see if they match the ID of the current hotel
If blnAllowed AndAlso Not IsNothing(sc.AccommodationIDList) AndAlso sc.AccommodationIDList.Length > 0 Then
Dim intAccommodationID As Integer = CInt(tblRooms.Rows(i).Item("AccommodationID"))
blnAllowed = False
For intIndex As Integer = 0 To UBound(strAccommodationIDs)
If IsNumeric(strAccommodationIDs(intIndex)) AndAlso CInt(strAccommodationIDs(intIndex)) = intAccommodationID Then
' The specified accommodation ID matches the ID of the current hotel
blnAllowed = True
End If
Next
End If
' If accommodation names have been specified in the search, see if they match the name of the current hotel
If blnAllowed AndAlso sc.AccommodationNames.Count > 0 Then
Dim blnMatchName As Boolean = False
Dim strHotelName As String = LCase(Trim(SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Name"))))
For Each strAccName As String In sc.AccommodationNames
strAccName = LCase(Trim(strAccName))
If strHotelName.Equals(strAccName) Then
' The specified accommodation name matches the title of the current hotel exactly
blnMatchName = True
ElseIf strHotelName.IndexOf(strAccName) > -1 Then
' The specified accommodation name is contained within the title of the current hotel
blnMatchName = True
Else
' Check if each keyword in the specified accommodation name is contained within the title of the current hotel
Dim intKeywordMatchCount As Integer = 0
Dim strAccNameKeywords() As String = strAccName.Split(" ")
Dim intAccNameKeywordCount As Integer = strAccNameKeywords.Length
For idx As Integer = 0 To UBound(strAccNameKeywords)
If strHotelName.IndexOf(strAccNameKeywords(idx)) > -1 Then
intKeywordMatchCount += 1
End If
Next
If intAccNameKeywordCount > 0 AndAlso intKeywordMatchCount = intAccNameKeywordCount Then
' Each keyword in the specified accommodation name is contained within the title of the current hotel
blnMatchName = True
End If
End If
Next
If Not blnMatchName Then
' The current room should not be added to the list of available rooms
' as the name of the hotel does not match any of the accommodation names specified in the search
blnAllowed = False
End If
End If
' Check the accommodation rating matches the accommodation rating selected by the user in the search form
If blnAllowed AndAlso Not Me.RatingCodes Is Nothing AndAlso Me.RatingCodes <> "ALL" _
AndAlso Not ratingCode Is Nothing AndAlso ratingCode <> String.Empty Then
blnAllowed = False
Dim rCodes() As String = Me.RatingCodes.Split(",")
For index As Integer = 0 To UBound(rCodes)
If Not rCodes(index) Is Nothing AndAlso rCodes(index).ToUpper().Equals(ratingCode.ToUpper()) Then
blnAllowed = True
End If
Next
End If
' ----------------------------
' END: Addition by Cyber Media
' ----------------------------
If blnAllowed Then
Dim oRoom As New BedBankRoom
With oRoom
.Board = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("BoardTypeDescription"))
.BoardCode = boardTypeID
.BoardDescription = .Board ' this was in the original!
.HotelName = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Name"))
.Resort = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Resort"))
.DestinationCode = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("DestinationID"))
.ResortCode = resortID
.RoomCode = tblRooms.Rows(i).Item("RoomID")
.RoomDescription = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("RoomDescription"))
.RoomType = .RoomDescription ' this was in the original!
.FromDate = sc.ArrivalDate
.ToDate = sc.DepartureDate
.CategoryDescription = ratingCode
.EDICode = accommID
Dim intNumRooms As Integer = CInt(tblRooms.Rows(i).Item("NumRooms"))
Dim intOccupancyID As Integer = CInt(SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyID")))
Dim intRoomAdults As Integer = CInt(Math.Floor(intOccupancyID / 10))
Dim intRoomChildren As Integer = intOccupancyID - (10 * intRoomAdults)
.OccupancyID = intOccupancyID
.OccupancyPublic = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyPublicText"))
.OccupancyBackOffice = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("OccupancyBackOfficeText"))
.RoomAdults = intRoomAdults
.RoomChildren = intRoomChildren
.RoomQuantity = intNumRooms
.IsSelected = False
Dim intPriceTypeID As String = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("PriceTypeID"))
Dim intSpecialOffer As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("SpecialOffer"))
Dim intHotPick As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("HotPick"))
Dim intRequestOnly As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("RequestOnly"))
Dim intCostTypeID As Integer = SqlCommandWrapper.HandleDBNullInt(tblRooms.Rows(i).Item("CostTypeID"))
If intPriceTypeID = 0 Then
' sale price
.AllowMarkups = False
Else
' cost price (markups will apply)
.AllowMarkups = True
End If
If intSpecialOffer = 1 Then
.IsSpecialOffer = True
Else
.IsSpecialOffer = False
End If
If intHotPick = 1 Then
.IsHotPick = True
Else
.IsHotPick = False
End If
If intRequestOnly = 1 Then
.IsRequestOnly = True
Else
.IsRequestOnly = False
End If
' Total is inclusive of handling fee, discounts and supplements
Dim dblTotalPrice As Double = SqlCommandWrapper.HandleDBNullFloat(tblRooms.Rows(i).Item("TOTAL"))
Dim supplierCurrencyCode As String = SqlCommandWrapper.HandleDBNullString(tblRooms.Rows(i).Item("Currency"))
' Prices should be returned in the native currency, as is
.SupplierPriceCurrency = supplierCurrencyCode
.SupplierTotalPriceCurrency = supplierCurrencyCode
.SupplierPrice = dblTotalPrice / sc.GetDurationOfStay()
.SupplierTotalPrice = dblTotalPrice
.HandlingFee = SqlCommandWrapper.HandleDBNullFloat(tblRooms.Rows(i).Item("HandlingFee"))
If intCostTypeID = 1 OrElse intCostTypeID = 3 Then
.PriceType = Enumerations.RoomPriceType.PerPerson
ElseIf intCostTypeID = 2 OrElse intCostTypeID = 4 Then
.PriceType = Enumerations.RoomPriceType.PerUnit
Else
.PriceType = Enumerations.RoomPriceType.UnSpecified
End If
End With
oList.Add(oRoom)
End If
Next i
End If
Catch ex As Exception
End Try
Return oList
End Function
' --------------------------------
' END: Asynchronous search methods
' --------------------------------
Private Function GetBedbankRatingCodesFromID(ByVal ratingID As Integer) As String()
Dim strRatingCodes(-1) As String
Dim params() As Object = {ratingID}
Dim obj As Object = SqlHelper.ExecuteScalar(ServerApplicationState("ConnectionString"), "usp_Engine_Bedbank_GetRatingCodes_NEW", params)
If Not obj Is Nothing Then
Try
Dim strRatingCodeList As String = CType(obj, String)
strRatingCodeList = strRatingCodeList.Trim()
If strRatingCodeList.EndsWith(",") Then
strRatingCodeList = strRatingCodeList.Substring(0, Len(strRatingCodeList) - 1)
End If
If Len(strRatingCodeList) > 0 Then
strRatingCodes = strRatingCodeList.Split(",")
End If
Catch ex As Exception
End Try
End If
Return strRatingCodes
End Function
#End Region
#Region " Valuate "
Public Function ValuateRoom(ByRef sc As SearchCriteria, ByVal intResortID As Integer, _
ByVal intRoomID As Integer, ByVal intBoardTypeID As Integer) As BaseRoom Implements IAsyncSupplier.ValuateRoom
Dim strConn As String = Current.Application.Get("ConnectionString")
' Cyber Media Edit (08/08/2011): The new usp_GetRoomsAvailable stored procedure is capable of working out
' how many rooms are required based on the number of adults and children specified
Dim sqlConn As New SqlConnection(strConn)
Dim sqlComm As New SqlCommand
sqlComm.Connection = sqlConn
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.CommandText = "usp_GetRoomsAvailable"
sqlComm.Parameters.Add("@FromDate", SqlDbType.DateTime).Value = sc.ArrivalDate
sqlComm.Parameters.Add("@ToDate", SqlDbType.DateTime).Value = sc.DepartureDate
sqlComm.Parameters.Add("@DestinationID", SqlDbType.Int).Value = sc.DestinationID
sqlComm.Parameters.Add("@ResortID", SqlDbType.Int).Value = intResortID
sqlComm.Parameters.Add("@BoardTypeID", SqlDbType.Int).Value = intBoardTypeID
Dim infant As Integer = 0
If Not IsNothing(Session("InfantQty")) Then
'ALI
infant = Session("InfantQty")
End If
sc.PassengerString = CStr(CInt(sc.PassengerString) - infant)
sqlComm.Parameters.Add("@Passengers", SqlDbType.Int).Value = sc.PassengerString
sqlComm.Parameters.Add("@DoTotalPricing", SqlDbType.Int).Value = 1
sqlComm.Parameters.Add("@ValuateRoomID", SqlDbType.BigInt).Value = intRoomID
Dim sqlDA As New SqlDataAdapter(sqlComm)
Dim dtRoom As New DataTable
sqlDA.Fill(dtRoom)
sqlDA = Nothing
sqlComm = Nothing
If sqlConn.State = ConnectionState.Open Then
sqlConn.Close()
End If
sqlConn = Nothing
' if the room to valuate is not available (often due to choosing more than 1 of it)
' return an unbookable room
If dtRoom.Rows.Count = 0 Then
Return New BedBankRoom(True, False)
End If
Dim dr As DataRow = dtRoom.Rows(0)
If (CInt(dr.Item("QtyAvailable")) - CInt(dr.Item("NumRooms"))) < 0 Then
Return New BedBankRoom(True, False)
End If
Dim intNumNights As Integer = CInt(dr.Item("NumNights"))
Dim strCurrencyCode As String = CStr(dr.Item("Currency"))
Dim intCurrencyID As Integer = -1
Select Case strCurrencyCode
Case "GBP"
intCurrencyID = CurrencyConverter.Currency.GBP
Case "EUR"
intCurrencyID = CurrencyConverter.Currency.EUR
Case "USD"
intCurrencyID = CurrencyConverter.Currency.USD
End Select
Dim intAdultDiscountFirstMatchID As Integer = -1
If Not IsDBNull(dr.Item("AdultDiscountFirstMatchID")) Then
intAdultDiscountFirstMatchID = CInt(dr.Item("AdultDiscountFirstMatchID"))
End If
Dim intChildDiscountFirstMatchID As Integer = -1
If Not IsDBNull(dr.Item("ChildDiscountFirstMatchID")) Then
intChildDiscountFirstMatchID = CInt(dr.Item("ChildDiscountFirstMatchID"))
End If
Dim intNumRooms As Integer = CInt(dr.Item("NumRooms"))
Dim dblNetCostTotal As Double = CDbl(dr.Item("Total"))
'-- TOTAL
Dim MyPrice As New PriceCalculationDLL.Price
' Cyber Media Edit (08/08/2011): The new usp_GetRoomsAvailable stored procedure is capable of working out
' how many rooms are required based on the number of adults and children specified
Dim TotalAdultDisc As Decimal = 0
Dim TotalChildDisc As Decimal = 0
Dim TotalAdultPrice As Decimal = 0
Dim TotalChildPrice As Decimal = 0
Dim TotalHandlingFee As Decimal = 0
MyPrice.Connection = New SqlConnection(Current.Application.Get("ConnectionString"))
For y As Integer = 1 To 5
If CInt(dr.Item("Room" & y & "Occupancy")) > 0 Then
Dim MyDS As New Data.DataSet
MyPrice.Connection = New SqlConnection(Current.Application.Get("ConnectionString"))
MyDS = MyPrice.GetPrice(dr.Item("RoomID"), Int(CInt(dr.Item("Room" & y & "Occupancy")) / 10), CInt(dr.Item("Room" & y & "Occupancy")) - (Int(CInt(dr.Item("Room" & y & "Occupancy")) / 10) * 10), CDate(sc.ArrivalDate), CDate(sc.DepartureDate), intBoardTypeID, Now.Date)
Dim ResTotal As New PriceCalculationDLL.Price.PriceTotals
ResTotal = PriceCalculationDLL.Price.GetTotals(MyDS, True, True)
TotalAdultPrice += ResTotal.TotalAdult
TotalChildPrice += ResTotal.TotalChild
TotalAdultDisc += ResTotal.DiscountTotal
TotalChildDisc += 0
TotalHandlingFee += ResTotal.HandlingFee
End If
Next
Dim GrandTotal As Decimal = (TotalAdultPrice + TotalChildPrice + TotalHandlingFee + CDec(dr.Item("TotalMandatoryAdultSupplement")) + CDec(dr.Item("TotalMandatoryChildSupplement"))) - TotalAdultDisc
'Dim MyDS As New Data.DataSet
'MyDS = MyPrice.GetPrice(intRoomID, Int(CInt(sc.PassengerString) / 10), CInt(sc.PassengerString) - (Int(CInt(sc.PassengerString) / 10) * 10), sc.ArrivalDate, sc.DepartureDate, intBoardTypeID, Now.Date)
'dblNetCostTotal = PriceCalculationDLL.Price.GetTotals(MyDS, True, True).GrandTotal + CDbl(dr.Item("TotalMandatoryAdultSupplement")) + CDbl(dr.Item("TotalMandatoryChildSupplement"))
dblNetCostTotal = GrandTotal
' ----------------------------------------------------
' START: Cache availability (used at point of booking)
' ----------------------------------------------------
Dim intAvailabilityCacheID As Integer = AvailabilityCache.InsertAvailability(CDbl(dr.Item("HandlingFee")), _
CDbl(dr.Item("TotalAdultPrice")), CDbl(dr.Item("TotalChildPrice")), _
CDbl(dr.Item("TotalAdultDiscount")), CDbl(dr.Item("TotalChildDiscount")), _
CDbl(dr.Item("TotalMandatoryAdultSupplement")), CDbl(dr.Item("TotalMandatoryChildSupplement")), _
dblNetCostTotal, intCurrencyID, intAdultDiscountFirstMatchID, intChildDiscountFirstMatchID)
sc.AvailabilityCacheID = intAvailabilityCacheID
' --------------------------------------------------
' END: Cache availability (used at point of booking)
' --------------------------------------------------
Dim oBBRoom As New BedBankRoom(True, True)
oBBRoom.Board = SqlCommandWrapper.HandleDBNullString(dr.Item("BoardTypeDescription"))
oBBRoom.BoardCode = CInt(dr.Item("BoardTypeID"))
oBBRoom.BoardDescription = oBBRoom.Board ' this was in the original!
oBBRoom.HotelName = SqlCommandWrapper.HandleDBNullString(dr.Item("Name"))
oBBRoom.Resort = SqlCommandWrapper.HandleDBNullString(dr.Item("Resort"))
oBBRoom.DestinationCode = SqlCommandWrapper.HandleDBNullInt(dr.Item("DestinationID"))
oBBRoom.ResortCode = SqlCommandWrapper.HandleDBNullInt(dr.Item("ResortID"))
oBBRoom.RoomCode = dr.Item("RoomID")
oBBRoom.RoomDescription = SqlCommandWrapper.HandleDBNullString(dr.Item("RoomDescription"))
oBBRoom.RoomType = oBBRoom.RoomDescription ' this was in the original!
oBBRoom.FromDate = sc.ArrivalDate
oBBRoom.ToDate = sc.DepartureDate
oBBRoom.Category = SqlCommandWrapper.HandleDBNullString(dr.Item("AccommodationCategoryID"))
oBBRoom.CategoryDescription = SqlCommandWrapper.HandleDBNullString(dr.Item("AccommodationCategoryName"))
oBBRoom.EDICode = dr.Item("AccommodationID")
Dim intOccupancyID As Integer = CInt(SqlCommandWrapper.HandleDBNullString(dr.Item("OccupancyID")))
Dim intRoomAdults As Integer = CInt(Math.Floor(intOccupancyID / 10))
Dim intRoomChildren As Integer = intOccupancyID - (10 * intRoomAdults)
oBBRoom.OccupancyID = CStr(dr.Item("OccupancyID"))
oBBRoom.OccupancyPublic = CStr(dr.Item("OccupancyPublicText"))
oBBRoom.OccupancyBackOffice = CStr(dr.Item("OccupancyBackOfficeText"))
oBBRoom.RoomAdults = intRoomAdults
oBBRoom.RoomChildren = intRoomChildren
oBBRoom.RoomQuantity = intNumRooms
oBBRoom.IsSelected = False
Dim intPriceTypeID As String = SqlCommandWrapper.HandleDBNullInt(dr.Item("PriceTypeID"))
Dim intSpecialOffer As Integer = SqlCommandWrapper.HandleDBNullInt(dr.Item("SpecialOffer"))
Dim intHotPick As Integer = SqlCommandWrapper.HandleDBNullInt(dr.Item("HotPick"))
Dim intRequestOnly As Integer = SqlCommandWrapper.HandleDBNullInt(dr.Item("RequestOnly"))
Dim intCostTypeID As Integer = SqlCommandWrapper.HandleDBNullInt(dr.Item("CostTypeID"))
If intPriceTypeID = 0 Then
' sale price
oBBRoom.AllowMarkups = False
Else
' cost price (markups will apply)
oBBRoom.AllowMarkups = True
End If
If intSpecialOffer = 1 Then
oBBRoom.IsSpecialOffer = True
Else
oBBRoom.IsSpecialOffer = False
End If
If intHotPick = 1 Then
oBBRoom.IsHotPick = True
Else
oBBRoom.IsHotPick = False
End If
If intRequestOnly = 1 Then
oBBRoom.IsRequestOnly = True
Else
oBBRoom.IsRequestOnly = False
End If
' Total is inclusive of handling fee, discounts and supplements
Dim dblTotalPrice As Double = SqlCommandWrapper.HandleDBNullFloat(dr.Item("TOTAL"))
Dim supplierCurrencyCode As String = SqlCommandWrapper.HandleDBNullString(dr.Item("Currency"))
' Prices should be returned in the native currency, as is
oBBRoom.SupplierPriceCurrency = strCurrencyCode
oBBRoom.SupplierTotalPriceCurrency = strCurrencyCode
oBBRoom.SupplierPrice = dblNetCostTotal / sc.GetDurationOfStay()
oBBRoom.SupplierTotalPrice = dblNetCostTotal
oBBRoom.HandlingFee = SqlCommandWrapper.HandleDBNullFloat(dr.Item("HandlingFee"))
If intCostTypeID = 1 OrElse intCostTypeID = 3 Then
oBBRoom.PriceType = Enumerations.RoomPriceType.PerPerson
ElseIf intCostTypeID = 2 OrElse intCostTypeID = 4 Then
oBBRoom.PriceType = Enumerations.RoomPriceType.PerUnit
Else
oBBRoom.PriceType = Enumerations.RoomPriceType.UnSpecified
End If
' now lets stuff on optional supplements if needed
Dim s() As Supplement = Supplement.GetOptionalSupplements(oBBRoom.RoomCode, oBBRoom.BoardCode, sc.ArrivalDate, sc.DepartureDate)
If Not s Is Nothing AndAlso s.Length > 0 Then
ReDim oBBRoom.OptionalSupplements(s.Length - 1)
For i As Integer = 0 To s.Length - 1
oBBRoom.OptionalSupplements(i) = GetOptionalSupplement(oBBRoom, s(i))
Next
End If
Return oBBRoom
End Function 'ValuateRoom
Private Function GetOptionalSupplement(ByVal r As BaseRoom, ByVal s As Supplement) As OptionalSupplement
Dim bbbs As New BedBankBaseSupplement(SettingReader.GetConnectionString(), r, s)
Dim decSupplementPriceEUR As Decimal = bbbs.GetSupplementPrice()
Dim decSupplementPriceGBP As Decimal = decSupplementPriceEUR * CurrencyConverter.GetCurrencyMultiplier(SettingReader.GetConnectionString(), 2, 1, r.FromDate)
Dim os As OptionalSupplement = New OptionalSupplement(Enumerations.Supplier.BedBank, decSupplementPriceEUR, decSupplementPriceGBP, s.SuppDesc)
os("supplementID") = s.SupplementID
Return os
End Function
#End Region
#Region " Book "
Private Function GetRoomOccupancies(ByVal intOccupancyID As Integer) As DataTable
Dim strSQL As String = "" & _
"SELECT Room1Occupancy, Room2Occupancy, Room3Occupancy, " & _
"Room4Occupancy, Room5Occupancy FROM tblOccupancyNEW " & _
"WHERE OccupancyID = @OccupancyID;"
Dim sqlConn As New SqlConnection(Current.Application.Get("ConnectionString"))
Dim sqlComm As New SqlCommand(strSQL, sqlConn)
sqlComm.Parameters.Add("@OccupancyID", SqlDbType.Int).Value = intOccupancyID
Dim sqlDA As New SqlDataAdapter(sqlComm)
Dim dtOccupancies As New DataTable
sqlDA.Fill(dtOccupancies)
sqlDA = Nothing
sqlComm = Nothing
If sqlConn.State = ConnectionState.Open Then
sqlConn.Close()
End If
sqlConn = Nothing
Return dtOccupancies
End Function
Public Function BookRooms(ByRef sc As SearchCriteria, ByVal wc As WebCustomer, ByVal brStandard As BaseRoom) As BookRoomDetailsList Implements IAsyncSupplier.BookRooms
Dim LogStr As String = ""
LogStr &= "BookRooms Start : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Dim intDestinationID As Integer = -1
Dim brdListForBooking As New BookRoomDetailsList(wc)
Dim sqlConn As New SqlConnection(Generic.GetConnectionString())
sqlConn.Open()
Dim sqlTrans As SqlTransaction = sqlConn.BeginTransaction()
Dim oCmd As SqlCommandWrapper
LogStr &= "BookRooms 1 : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Try
Dim brCurrent As BaseRoom
Dim intRoomBookingID As Integer
Dim intRoomOccupancyID As Integer
Dim dteStart As DateTime = brStandard.FromDate
Dim dteEnd As DateTime = brStandard.ToDate
intDestinationID = Convert.ToInt32(brStandard.DestinationCode)
Dim intRoomID As Integer = Convert.ToInt32(brStandard.RoomCode)
Dim intBoardTypeID As Integer = Convert.ToInt32(brStandard.BoardCode)
Dim intNumRooms As Integer = brStandard.RoomQuantity
Dim intOccupancyID As Integer = (10 * brStandard.RoomAdults) + brStandard.RoomChildren
'Dim infant As Integer = 0
'If Not IsNothing(Session("InfantQty")) Then
' infant = Session("InfantQty")
'End If
'intOccupancyID = intOccupancyID - infant
Dim dtRoomOccupancies As DataTable = GetRoomOccupancies(intOccupancyID)
' Divide by the total price by the number of rooms required, so we get a price per room
Dim decRoomPriceTotal As Decimal = Strings.FormatNumber(Convert.ToDecimal(brStandard.SupplierTotalPrice) / intNumRooms, 2)
' Loop through each room required according to the total occupancy
For intRoomNum As Integer = 1 To intNumRooms
oCmd = New SqlCommandWrapper("spMakeNewBookingPrice", sqlTrans)
oCmd.AddSqlOutputParameter("@roomBookingId", SqlDbType.Int)
oCmd.AddSqlParameter("@roomId", SqlDbType.Int, intRoomID)
oCmd.AddSqlParameter("@boardTypeId", SqlDbType.Int, intBoardTypeID)
oCmd.AddSqlParameter("@occupancyId", SqlDbType.Int, intOccupancyID) ' Not actually used
oCmd.AddSqlParameter("@agentId", SqlDbType.Int, inAgentId)
oCmd.AddSqlParameter("@start", SqlDbType.DateTime, dteStart)
oCmd.AddSqlParameter("@end", SqlDbType.DateTime, dteEnd)
oCmd.AddSqlParameter("@total", SqlDbType.Money, 4, 4, decRoomPriceTotal)
oCmd.AddSqlParameter("@sessionId", SqlDbType.VarChar, 250, stWebSessionId)
oCmd.ExecuteNonQuery()
intRoomBookingID = CInt(oCmd.GetIntParameterValue("@roomBookingId"))
LogStr &= "BookRooms SP Executed " & intRoomNum & " : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
' As the standard room object passed to this method contains the total price for all rooms required,
' and the total number of adults and children across all rooms, we should create individual objects
' for each room required so we can store the specific number of adults and children who will occupy each room
brCurrent = New BedBankRoom(True, True)
BedBankRoom.Copy(brStandard, brCurrent)
' If more than one room is required,
' obtain the number of adults and children who may occupy the current room
If intNumRooms > 1 Then
intRoomOccupancyID = CInt(dtRoomOccupancies.Rows(0).Item("Room" & intRoomNum & "Occupancy"))
If intRoomOccupancyID <> 0 Then
brCurrent.RoomAdults = CInt(Math.Floor(intRoomOccupancyID / 10))
brCurrent.RoomChildren = intRoomOccupancyID - (10 * brCurrent.RoomAdults)
Else
brCurrent.RoomAdults = 0
brCurrent.RoomChildren = 0
End If
End If
' As we're creating individual objects for each room required, the room quantity
' for each room will always be 1
brCurrent.RoomQuantity = 1
If intRoomNum <> 1 Then
' If it's not the first room, set the room price to be zero
brCurrent.SupplierTotalPrice = 0
brCurrent.SupplierPrice = 0
End If
' Add each room required to a booking list object
brdListForBooking.Add(New BookRoomDetails(brCurrent, intRoomBookingID, "", ""))
' now lets check for optional supplements
If brCurrent.HasOptionalSupplements Then
For Each os As OptionalSupplement In brCurrent.OptionalSupplements
If os.Status = OptionalSupplement.SupplementStatus.Selected Then
oCmd = New SqlCommandWrapper("spInsertBookingSupplement", sqlTrans)
oCmd.AddSqlOutputParameter("@BookingSupplementID", SqlDbType.Int)
oCmd.AddSqlParameter("@RoomBookingID", SqlDbType.Int, intRoomBookingID)
oCmd.AddSqlParameter("@SupplementID", SqlDbType.Int, os("supplementID"))
oCmd.AddSqlParameter("@AgentID", SqlDbType.Int, inAgentId)
oCmd.AddSqlParameter("@DateFrom", SqlDbType.DateTime, dteStart)
oCmd.AddSqlParameter("@DateTo", SqlDbType.DateTime, dteEnd)
oCmd.AddSqlParameter("@TotalPrice", SqlDbType.Money, os.Price)
oCmd.AddSqlParameter("@SessionID", SqlDbType.VarChar, 250, stWebSessionId)
oCmd.ExecuteNonQuery()
End If
Next
End If
LogStr &= "BookRooms SpInsertBookingSupplement Executed " & intRoomNum & " : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Next
sqlTrans.Commit()
Catch ex As Exception
sqlTrans.Rollback()
brdListForBooking.Clear()
Dim objMailer As New System.Net.Mail.SmtpClient(Current.Application.Get("SMTP_SERVER"))
objMailer.Send(CStr(Current.Application.Get("ADMIN_EMAIL_FROM_ADDRESS")), "Ali.Iybar@onthebeach.co.uk", "BedBankSupplier - BookRooms Error", ex.ToString())
End Try
sqlConn.Close()
sqlTrans = Nothing
LogStr &= "BookRooms Before Cache Update : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
If intDestinationID <> -1 Then
' Invalidate the room availability cache record (if one exists)
sqlConn = New SqlConnection(Current.Application.Get("SearchCacheConnectionString"))
Dim dteStart As DateTime = brStandard.FromDate
Dim dteEnd As DateTime = brStandard.ToDate
Dim intOccupancyID As Integer = (10 * brStandard.RoomAdults) + brStandard.RoomChildren
Dim strSQL As String = "" & _
"UPDATE tblGetRoomsAvailableCache SET " & _
"CacheIsInvalidated = 'Y', CacheEndDate = GETDATE() " & _
"WHERE DestinationID = @DestinationID " & _
"AND FromDate = @DateFrom " & _
"AND ToDate = @DateTo " & _
"AND OccupancyID =@occupancyId ;"
Dim sqlComm As New SqlCommand(strSQL, sqlConn)
sqlComm.Parameters.Add("@DestinationID", SqlDbType.Int).Value = intDestinationID
sqlComm.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = dteStart
sqlComm.Parameters.Add("@DateTo", SqlDbType.DateTime).Value = dteEnd
sqlComm.Parameters.Add("@occupancyId", SqlDbType.Int).Value = intOccupancyID
sqlConn.Open()
Try
sqlComm.ExecuteNonQuery()
LogStr &= "BookRooms After Cache Update : " & Now.ToLongTimeString & " " & Now.Millisecond & vbCrLf
Finally
sqlConn.Close()
sqlComm = Nothing
End Try
End If
'Dim objMailer1 As New System.Net.Mail.SmtpClient(Current.Application.Get("SMTP_SERVER"))
'objMailer1.Send(CStr(Current.Application.Get("ADMIN_EMAIL_FROM_ADDRESS")), "Ali.Iybar@onthebeach.co.uk", "BedBankSupplier Measure", LogStr)
sqlConn = Nothing
Return brdListForBooking
End Function
Private Function isRoomStillAvailable(ByVal dtStart As DateTime, ByVal dtEnd As DateTime, ByVal inBoardTypeId As Integer, _
ByVal stResortId As String, ByVal inDestinationId As Integer, ByVal inOccupancyId As Integer, _
ByVal inRoomId As Integer, ByVal inRoomQty As Integer) As Boolean
'spGetAvailabilityOfARoom
Dim oResortId As Object
If IsNumeric(stResortId) Then
oResortId = Convert.ToInt32(stResortId)
Else
oResortId = Convert.DBNull
End If
Dim oCmd As New SqlCommandWrapper("spGetAvailabilityOfARoom")
oCmd.AddSqlParameter("@start", SqlDbType.DateTime, dtStart)
oCmd.AddSqlParameter("@end", SqlDbType.DateTime, dtEnd)
oCmd.AddSqlParameter("@boardId", SqlDbType.Int, inBoardTypeId)
oCmd.AddSqlParameter("@resortId", SqlDbType.Int, oResortId)
oCmd.AddSqlParameter("@destinationId", SqlDbType.Int, inDestinationId)
oCmd.AddSqlParameter("@occupancyIds", SqlDbType.Int, inOccupancyId)
oCmd.AddSqlParameter("@roomId", SqlDbType.Int, inRoomId)
oCmd.AddSqlOutputParameter("@numAvailable", SqlDbType.Int)
oCmd.ExecuteNonQuery()
Dim blNl As Boolean
Dim inQty = oCmd.GetIntParameterValue("@numAvailable", blNl)
If (inQty >= inRoomQty) Then
Return True
Else
Return False
End If
End Function
#End Region
#Region " Hotel Info "
Public Function GetHotelInfo(ByRef sc As SearchCriteria, ByVal HotelCode As String) As HotelDetails
Dim intAccommID As Integer = CInt(HotelCode)
Dim localImageURL As String = "http://www.apartmentsabroad.co.uk/"
If Not ServerApplicationState("LocalImageUrl") Is Nothing _
AndAlso Convert.ToString(ServerApplicationState("LocalImageUrl")) <> String.Empty Then
localImageURL = Convert.ToString(ServerApplicationState("LocalImageUrl"))
End If
Dim hd As New HotelDetails
Dim accomm As Accommodation = Accommodation.GetAccommodation(intAccommID)
If Accommodation.UseExtDescriptionsForAccommodation(intAccommID) Then
' ------------------------------------------------------------------------------
' Populate the hotel details object with the extended Bedbank accommodation data
' ------------------------------------------------------------------------------
hd.LongDescription = accomm.Ext_GeneralInfo
hd.LocationDescription = accomm.Ext_LocationInfo
hd.AccommodationDescription = accomm.Ext_AccommodationInfo
' Populate the hotel photos
Dim photos() As String = accomm.GetAccommodationImages_Ext()
If Not photos Is Nothing Then
For index As Integer = 0 To UBound(photos)
If Not photos(index) Is Nothing AndAlso photos(index).Trim() <> String.Empty Then
Dim photoURL As String = photos(index).Trim().Replace("\", "/")
If Not photoURL.StartsWith(localImageURL) Then
If localImageURL.EndsWith("/") AndAlso photoURL.StartsWith("/") Then
photoURL = Right(photoURL, Len(photoURL) - 1)
End If
photoURL = localImageURL & photoURL
End If
hd.AddHotelPhoto(photoURL)
End If
Next
End If
' Populate the hotel facilities
Dim hotelFacilities() As String = accomm.GetAccommodationFacilityDescriptions_Ext(200)
If Not hotelFacilities Is Nothing Then
For index As Integer = 0 To UBound(hotelFacilities)
If Not hotelFacilities(index) Is Nothing AndAlso hotelFacilities(index).Trim() <> String.Empty Then
hd.AddHotelFacility(hotelFacilities(index))
End If
Next
End If
' Populate the room facilities
Dim roomFacilities() As String = accomm.GetAccommodationFacilityDescriptions_Ext(100)
If Not roomFacilities Is Nothing Then
For index As Integer = 0 To UBound(roomFacilities)
If Not roomFacilities(index) Is Nothing AndAlso roomFacilities(index).Trim() <> String.Empty Then
hd.AddRoomFacility(roomFacilities(index))
End If
Next
End If
Else
' ------------------------------------------------------------------------------
' Populate the hotel details object with the standard Bedbank accommodation data
' ------------------------------------------------------------------------------
hd.LongDescription = accomm.Description
hd.LocationDescription = String.Empty
hd.AccommodationDescription = String.Empty
' Populate the hotel photos
Dim photos() As String = accomm.GetAccommodationImages()
If Not photos Is Nothing Then
For index As Integer = 0 To UBound(photos)
If Not photos(index) Is Nothing AndAlso photos(index).Trim() <> String.Empty Then
Dim photoURL As String = photos(index).Trim().Replace("\", "/")
If Not photoURL.StartsWith(localImageURL) Then
If localImageURL.EndsWith("/") AndAlso photoURL.StartsWith("/") Then
photoURL = Right(photoURL, Len(photoURL) - 1)
End If
photoURL = localImageURL & photoURL
End If
hd.AddHotelPhoto(photoURL)
End If
Next
End If
' Populate the hotel facilities
Dim sFacility_Hotel() As String = accomm.GetAccommodationFacilityDescriptions(200)
For index As Integer = 0 To UBound(sFacility_Hotel)
hd.AddHotelFacility(sFacility_Hotel(index))
Next
' Populate the room facilities
Dim sFacility_Room() As String = accomm.GetAccommodationFacilityDescriptions(100)
For index As Integer = 0 To UBound(sFacility_Room)
hd.AddRoomFacility(sFacility_Room(index))
Next
End If
' Obtain the thumbnail image
Dim thumbnailPhotoURL As String = String.Empty
Dim thumbnailPhotos() As String = accomm.GetAccommodationThumbnailImages()
If Not thumbnailPhotos Is Nothing AndAlso thumbnailPhotos.Length > 0 _
AndAlso Not thumbnailPhotos(0) Is Nothing AndAlso thumbnailPhotos(0).Trim() <> String.Empty Then
thumbnailPhotoURL = thumbnailPhotos(0).Trim().Replace("\", "/")
If Not thumbnailPhotoURL.StartsWith(localImageURL) Then
If localImageURL.EndsWith("/") AndAlso thumbnailPhotoURL.StartsWith("/") Then
thumbnailPhotoURL = Right(thumbnailPhotoURL, Len(thumbnailPhotoURL) - 1)
End If
thumbnailPhotoURL = localImageURL & thumbnailPhotoURL
End If
End If
' Populate the common accommodation details
hd.ThumbnailImage = thumbnailPhotoURL
hd.HotelName = accomm.Name
hd.Address = accomm.Address
hd.CategoryDescription = accomm.CategoryName
hd.Destination = accomm.DestinationName
hd.Resort = accomm.ResortName
hd.MinimumNights = accomm.MinimumNights
hd.ChangeOver = accomm.ChangOver
' EDICode is used as the main identifier of an accommodation
hd.EDICode = accomm.SupplierAccommodationCode
' ExternalCode is used to show a Bedbank description if available for a Barcelo property
hd.ExternalCode = "" 'Needs to be connected to acccode which is not available in the Accommodation object
' InternalCode is used to internally reference a Bedbank property
hd.InternalCode = accomm.AccommodationCode
Return hd
End Function
Function RCIFacilities(ByVal Code As String) As String
Code = UCase(Code)
Select Case Code
Case "A"
Return "All Units"
Case "N"
Return "Nearby (less than 1/2 mile or 1k)"
Case "X"
Return "On site"
Case "XE"
Return "On site, equipment available"
Case "*"
Return "Indoor pool on-site"
Case "X*"
Return "Indoor and outdoor pools on-site"
Case "D"
Return String.Empty
End Select
Return Nothing
End Function
#End Region
End Class
End Namespace