spazio-solazzo/lib/spazio_solazzo/booking_system/booking/email.ex
Víctor Martínez 69f992f8f6
feat: new booking system + admin dashboard (#12)
feat: implement a new booking system and admin dashboard
2026-02-07 19:08:39 +01:00

180 lines
5.3 KiB
Elixir

defmodule SpazioSolazzo.BookingSystem.Booking.Email do
@moduledoc """
Sends booking confirmation emails to the customer and admin
"""
use Phoenix.Swoosh,
view: SpazioSolazzoWeb.EmailView,
layout: {SpazioSolazzoWeb.EmailView, :layout}
import Swoosh.Email
use SpazioSolazzoWeb, :verified_routes
alias SpazioSolazzo.BookingSystem.Booking.Token
def user_booking_request_confirmation(%{
booking_id: booking_id,
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
customer_comment: customer_comment,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time
}) do
cancel_token = Token.generate_customer_cancel_token(booking_id)
cancel_url = url(~p"/bookings/cancel?token=#{cancel_token}")
assigns = %{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
customer_comment: customer_comment,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
cancel_url: cancel_url,
front_office_phone_number: front_office_phone_number(),
subject: "Request Received: #{date}"
}
new()
|> to({customer_name, customer_email})
|> from({"Spazio Solazzo", spazio_solazzo_email()})
|> subject(assigns.subject)
|> render_body("user_booking_request_confirmation.html", assigns)
end
def admin_incoming_booking_request(%{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
customer_comment: customer_comment,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
admin_email: admin_email
}) do
dashboard_url = url(~p"/admin/bookings")
assigns = %{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
customer_comment: customer_comment,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
dashboard_url: dashboard_url,
subject: "New Booking Request: #{customer_name}"
}
new()
|> to(admin_email)
|> from({"Spazio Solazzo", spazio_solazzo_email()})
|> subject(assigns.subject)
|> render_body("admin_incoming_booking_request.html", assigns)
end
def booking_cancelled(%{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
cancellation_reason: cancellation_reason,
admin_email: admin_email
}) do
assigns = %{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
cancellation_reason: cancellation_reason,
subject: "Booking Cancelled: #{customer_name}"
}
new()
|> to(admin_email)
|> from({"Spazio Solazzo", spazio_solazzo_email()})
|> subject(assigns.subject)
|> render_body("booking_cancelled.html", assigns)
end
def booking_request_approved(%{
booking_id: booking_id,
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time
}) do
cancel_token = Token.generate_customer_cancel_token(booking_id)
cancel_url = url(~p"/bookings/cancel?token=#{cancel_token}")
assigns = %{
customer_name: customer_name,
customer_email: customer_email,
customer_phone: customer_phone,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
cancel_url: cancel_url,
front_office_phone_number: front_office_phone_number(),
subject: "Booking Approved: #{date}"
}
new()
|> to({customer_name, customer_email})
|> from({"Spazio Solazzo", spazio_solazzo_email()})
|> subject(assigns.subject)
|> render_body("booking_request_approved.html", assigns)
end
def booking_request_rejected(%{
customer_name: customer_name,
customer_email: customer_email,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
rejection_reason: rejection_reason
}) do
assigns = %{
customer_name: customer_name,
customer_email: customer_email,
space_name: space_name,
date: date,
start_time: start_time,
end_time: end_time,
rejection_reason: rejection_reason,
front_office_phone_number: front_office_phone_number(),
subject: "Booking Request Update: #{date}"
}
new()
|> to({customer_name, customer_email})
|> from({"Spazio Solazzo", spazio_solazzo_email()})
|> subject(assigns.subject)
|> render_body("booking_request_rejected.html", assigns)
end
defp spazio_solazzo_email do
Application.get_env(:spazio_solazzo, :spazio_solazzo_email)
end
defp front_office_phone_number do
Application.get_env(:spazio_solazzo, :front_office_phone_number)
end
end