66 lines
1.7 KiB
Ruby
66 lines
1.7 KiB
Ruby
class Captain::WebhookSenderService
|
|
def initialize(reservation)
|
|
@reservation = reservation
|
|
@unit = reservation.unit
|
|
end
|
|
|
|
def perform
|
|
return if @unit&.webhook_url.blank?
|
|
|
|
payload = build_payload
|
|
send_webhook(payload)
|
|
end
|
|
|
|
private
|
|
|
|
def build_payload
|
|
contact = @reservation.contact
|
|
brand = @reservation.brand
|
|
|
|
{
|
|
event: 'reservation_update',
|
|
timestamp: Time.current.iso8601,
|
|
reservation: {
|
|
id: @reservation.id,
|
|
suite: @reservation.suite_identifier,
|
|
status: @reservation.status,
|
|
payment_status: @reservation.payment_status,
|
|
check_in: @reservation.check_in_at&.iso8601,
|
|
check_out: @reservation.check_out_at&.iso8601,
|
|
created_at: @reservation.created_at&.iso8601
|
|
},
|
|
financial: {
|
|
total_amount: @reservation.total_amount,
|
|
paid_amount: @reservation.active? ? (@reservation.total_amount * 0.5) : 0.0,
|
|
currency: 'BRL'
|
|
},
|
|
customer: {
|
|
name: contact&.name,
|
|
email: contact&.email,
|
|
phone: contact&.phone_number
|
|
},
|
|
unit: {
|
|
name: @unit.name,
|
|
brand: brand&.name
|
|
},
|
|
metadata: @reservation.metadata
|
|
}
|
|
end
|
|
|
|
def send_webhook(payload)
|
|
uri = URI.parse(@unit.webhook_url)
|
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
http.use_ssl = (uri.scheme == 'https')
|
|
|
|
request = Net::HTTP::Post.new(uri.path, { 'Content-Type' => 'application/json' })
|
|
request.body = payload.to_json
|
|
|
|
begin
|
|
response = http.request(request)
|
|
Rails.logger.info "[Captain::WebhookSender] Sent to #{@unit.webhook_url} | Status: #{response.code}"
|
|
rescue StandardError => e
|
|
Rails.logger.error "[Captain::WebhookSender] Failed to send: #{e.message}"
|
|
end
|
|
end
|
|
end
|