Packages

phoenix_kit

1.7.66
1.7.209 1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules billing web order_detail.ex
Raw

lib/modules/billing/web/order_detail.ex

defmodule PhoenixKit.Modules.Billing.Web.OrderDetail do
@moduledoc """
Order detail LiveView for the billing module.
Displays complete order information and provides actions for order management.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Billing
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(%{"id" => id}, _session, socket) do
if Billing.enabled?() do
case Billing.get_order(id, preload: [:user, :billing_profile]) do
nil ->
{:ok,
socket
|> put_flash(:error, "Order not found")
|> push_navigate(to: Routes.path("/admin/billing/orders"))}
order ->
project_title = Settings.get_project_title()
invoices = Billing.list_invoices_for_order(order.uuid)
socket =
socket
|> assign(:page_title, "Order #{order.order_number}")
|> assign(:project_title, project_title)
|> assign(:url_path, Routes.path("/admin/billing/orders/#{order.uuid}"))
|> assign(:order, order)
|> assign(:invoices, invoices)
|> assign(:show_status_modal, false)
|> assign(:show_invoice_modal, false)
{:ok, socket}
end
else
{:ok,
socket
|> put_flash(:error, "Billing module is not enabled")
|> push_navigate(to: Routes.path("/admin"))}
end
end
@impl true
def handle_params(_params, _url, socket) do
{:noreply, socket}
end
@impl true
def handle_event("confirm_order", _params, socket) do
case Billing.confirm_order(socket.assigns.order) do
{:ok, order} ->
{:noreply,
socket
|> assign(:order, order)
|> put_flash(:info, "Order confirmed successfully")}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to confirm order: #{reason}")}
end
end
@impl true
def handle_event("mark_paid", _params, socket) do
case Billing.mark_order_paid(socket.assigns.order) do
{:ok, order} ->
{:noreply,
socket
|> assign(:order, order)
|> put_flash(:info, "Order marked as paid")}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to mark as paid: #{reason}")}
end
end
@impl true
def handle_event("cancel_order", _params, socket) do
case Billing.cancel_order(socket.assigns.order) do
{:ok, order} ->
{:noreply,
socket
|> assign(:order, order)
|> put_flash(:info, "Order cancelled")}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to cancel order: #{reason}")}
end
end
@impl true
def handle_event("generate_invoice", _params, socket) do
case Billing.create_invoice_from_order(socket.assigns.order) do
{:ok, invoice} ->
invoices = Billing.list_invoices_for_order(socket.assigns.order.uuid)
{:noreply,
socket
|> assign(:invoices, invoices)
|> put_flash(:info, "Invoice #{invoice.invoice_number} created")}
{:error, changeset} ->
errors = format_changeset_errors(changeset)
{:noreply, put_flash(socket, :error, "Failed to create invoice: #{errors}")}
end
end
@impl true
def handle_event("view_invoice", %{"uuid" => uuid}, socket) do
{:noreply, push_navigate(socket, to: Routes.path("/admin/billing/invoices/#{uuid}"))}
end
defp format_changeset_errors(changeset) do
changeset
|> Ecto.Changeset.traverse_errors(fn {msg, opts} ->
Enum.reduce(opts, msg, fn {key, value}, acc ->
String.replace(acc, "%{#{key}}", to_string(value))
end)
end)
|> Enum.map_join("; ", fn {k, v} -> "#{k}: #{Enum.join(v, ", ")}" end)
end
end