Packages

phoenix_kit

1.7.21
1.7.210 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 tickets ticket_status_history.ex
Raw

lib/modules/tickets/ticket_status_history.ex

defmodule PhoenixKit.Modules.Tickets.TicketStatusHistory do
@moduledoc """
Schema for ticket status change audit trail.
Records every status transition for a ticket, including who made
the change and an optional reason. Used for auditing and tracking
ticket lifecycle.
## Fields
- `ticket_id` - Reference to the ticket
- `changed_by_id` - User who made the status change
- `from_status` - Previous status (nil for initial creation)
- `to_status` - New status
- `reason` - Optional explanation for the change
## Examples
# Ticket created
%TicketStatusHistory{
ticket_id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
changed_by_id: 42,
from_status: nil,
to_status: "open",
reason: nil
}
# Ticket assigned and moved to in_progress
%TicketStatusHistory{
ticket_id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
changed_by_id: 5,
from_status: "open",
to_status: "in_progress",
reason: "Assigned to support team"
}
# Ticket resolved
%TicketStatusHistory{
ticket_id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
changed_by_id: 5,
from_status: "in_progress",
to_status: "resolved",
reason: "Issue fixed in version 2.0.1"
}
# Ticket reopened
%TicketStatusHistory{
ticket_id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
changed_by_id: 42,
from_status: "resolved",
to_status: "open",
reason: "Issue still occurring after update"
}
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, UUIDv7, autogenerate: true}
@type t :: %__MODULE__{
id: UUIDv7.t() | nil,
ticket_id: UUIDv7.t(),
changed_by_id: integer(),
from_status: String.t() | nil,
to_status: String.t(),
reason: String.t() | nil,
ticket: PhoenixKit.Modules.Tickets.Ticket.t() | Ecto.Association.NotLoaded.t(),
changed_by: PhoenixKit.Users.Auth.User.t() | Ecto.Association.NotLoaded.t(),
inserted_at: NaiveDateTime.t() | nil
}
schema "phoenix_kit_ticket_status_history" do
field :from_status, :string
field :to_status, :string
field :reason, :string
belongs_to :ticket, PhoenixKit.Modules.Tickets.Ticket, type: UUIDv7
belongs_to :changed_by, PhoenixKit.Users.Auth.User, type: :integer
timestamps(type: :naive_datetime, updated_at: false)
end
@doc """
Changeset for creating a status history entry.
## Required Fields
- `ticket_id` - Reference to ticket
- `changed_by_id` - User who made the change
- `to_status` - New status
Note: `from_status` is optional (nil for ticket creation).
"""
def changeset(history, attrs) do
history
|> cast(attrs, [:ticket_id, :changed_by_id, :from_status, :to_status, :reason])
|> validate_required([:ticket_id, :changed_by_id, :to_status])
|> validate_length(:reason, max: 1000)
|> foreign_key_constraint(:ticket_id)
|> foreign_key_constraint(:changed_by_id)
end
@doc """
Check if this is the initial creation record.
"""
def creation?(%__MODULE__{from_status: nil}), do: true
def creation?(_), do: false
@doc """
Check if this is a reopen transition.
"""
def reopen?(%__MODULE__{to_status: "open", from_status: from})
when from in ["resolved", "closed"],
do: true
def reopen?(_), do: false
@doc """
Check if this is a resolution transition.
"""
def resolution?(%__MODULE__{to_status: "resolved"}), do: true
def resolution?(_), do: false
@doc """
Check if this is a close transition.
"""
def close?(%__MODULE__{to_status: "closed"}), do: true
def close?(_), do: false
end