Current section

Files

Jump to
ex_vertical_booking lib request ota_hotel_rate_amount_notif.ex
Raw

lib/request/ota_hotel_rate_amount_notif.ex

defmodule ExVerticalBooking.Request.OtaHotelRateAmountNotif do
alias ExVerticalBooking.Meta
alias ExVerticalBooking.Request
alias ExVerticalBooking.Request.{Document, Helpers}
@action "OTA_HotelRateAmountNotif"
@type credentials :: %{user: String.t(), password: String.t(), endpoint: String.t()}
@type t ::
%{
hotel_code: String.t(),
rate_amount_messages: [
%{
status_application_control: %{
start: String.t(),
end: String.t(),
rate_plan_code: String.t(),
inv_type_code: String.t()
},
rates: [
%{
base_by_guest_amts: [
%{
currency_code: String.t(),
amount_after_tax: integer,
number_of_guests: integer,
age_qualifying_code: integer
}
]
}
]
}
]
}
@doc """
This method is used to update rates (per room prices).
"""
@spec execute(t, credentials, Meta.t()) :: {:ok, struct(), Meta.t()} | {:error, any(), Meta.t()}
def execute(%{hotel_code: _, rate_amount_messages: _} = params, credentials, meta) do
params
|> build_hotel_rate_amount_notif(meta)
|> Document.build(@action, credentials)
|> Request.send(credentials)
end
@spec build_hotel_rate_amount_notif(t, Meta.t()) :: {{atom(), map | nil, list | nil}, Meta.t()}
def build_hotel_rate_amount_notif(%{hotel_code: _, rate_amount_messages: []} = payload, meta) do
{:error, payload, meta |> Map.put(:success, false) |> Map.put(:errors, [:empty_payload])}
end
def build_hotel_rate_amount_notif(
%{
hotel_code: hotel_code,
rate_amount_messages: rate_amount_messages
},
meta
) do
rate_amount_messages_elements =
rate_amount_messages
|> Enum.map(fn %{
status_application_control: status_application_control,
rates: rates
} ->
{:"ns1:RateAmountMessage", nil,
[
Helpers.build_status_application_control(status_application_control, nil, [
{:RatePlanCode, status_application_control.rate_plan_code}
]),
build_rates(rates)
]}
end)
{{:"ns1:RateAmountMessages", %{HotelCode: "#{hotel_code}"}, rate_amount_messages_elements},
meta}
end
def build_rates(rates) do
{:"ns1:Rates", nil,
Enum.map(rates, fn %{base_by_guest_amts: base_by_guest_amts} ->
{:"ns1:Rate", nil, [build_base_by_guest_amts(base_by_guest_amts)]}
end)}
end
def build_base_by_guest_amts(base_by_guest_amts) do
{:"ns1:BaseByGuestAmts", nil,
Enum.map(base_by_guest_amts, fn base_by_guest_amt ->
{:"ns1:BaseByGuestAmt", map_for_room_or_person(base_by_guest_amt), nil}
end)}
end
defp map_for_room_or_person(%{
currency_code: currency_code,
amount_after_tax: amount_after_tax,
number_of_guests: nil,
age_qualifying_code: nil
}) do
%{
AmountAfterTax: amount_after_tax,
CurrencyCode: currency_code
}
end
defp map_for_room_or_person(%{
currency_code: currency_code,
amount_after_tax: amount_after_tax,
number_of_guests: number_of_guests,
age_qualifying_code: age_qualifying_code
}) do
%{
AmountAfterTax: amount_after_tax,
CurrencyCode: currency_code,
NumberOfGuests: number_of_guests,
AgeQualifyingCode: age_qualifying_code
}
end
end