Packages
phoenix_kit
1.7.64
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
Current section
Files
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