Packages
phoenix_kit
1.7.43
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
Current section
Files
lib/modules/shop/schemas/import_log.ex
defmodule PhoenixKit.Modules.Shop.ImportLog do
@moduledoc """
ImportLog schema for tracking CSV import history.
## Fields
- `filename` - Original filename (required)
- `file_path` - Server path to uploaded file
- `status` - pending | processing | completed | failed
- `total_rows` - Total rows in CSV
- `processed_rows` - Rows processed so far
- `imported_count` - New products created
- `updated_count` - Existing products updated
- `skipped_count` - Products skipped (filtered)
- `error_count` - Products with errors
- `options` - Import options (JSONB)
- `error_details` - List of error objects
- `started_at` - Processing start time
- `completed_at` - Processing end time
- `user_id` - User who initiated import
"""
use Ecto.Schema
import Ecto.Changeset
alias PhoenixKit.Users.Auth.User
@statuses ["pending", "processing", "completed", "failed"]
@primary_key {:uuid, UUIDv7, autogenerate: true}
schema "phoenix_kit_shop_import_logs" do
field :id, :integer, read_after_writes: true
field :filename, :string
field :file_path, :string
field :status, :string, default: "pending"
# Statistics
field :total_rows, :integer, default: 0
field :processed_rows, :integer, default: 0
field :imported_count, :integer, default: 0
field :updated_count, :integer, default: 0
field :skipped_count, :integer, default: 0
field :error_count, :integer, default: 0
# Metadata
field :options, :map, default: %{}
field :error_details, {:array, :map}, default: []
field :product_ids, {:array, :integer}, default: []
# Timing
field :started_at, :utc_datetime
field :completed_at, :utc_datetime
# Associations
# legacy
field :user_id, :integer
belongs_to :user, User, foreign_key: :user_uuid, references: :uuid, type: UUIDv7
timestamps(type: :utc_datetime)
end
@doc """
Changeset for creating a new import log.
"""
def create_changeset(import_log \\ %__MODULE__{}, attrs) do
import_log
|> cast(attrs, [:filename, :file_path, :options, :user_id, :user_uuid])
|> validate_required([:filename])
end
@doc """
Changeset for updating import log status and stats.
"""
def update_changeset(import_log, attrs) do
import_log
|> cast(attrs, [
:status,
:total_rows,
:processed_rows,
:imported_count,
:updated_count,
:skipped_count,
:error_count,
:error_details,
:started_at,
:completed_at
])
|> validate_inclusion(:status, @statuses)
end
@doc """
Mark import as started.
"""
def start_changeset(import_log, total_rows) do
import_log
|> change(%{
status: "processing",
total_rows: total_rows,
started_at: DateTime.utc_now() |> DateTime.truncate(:second)
})
end
@doc """
Update progress during import.
"""
def progress_changeset(import_log, attrs) do
import_log
|> cast(attrs, [
:processed_rows,
:imported_count,
:updated_count,
:skipped_count,
:error_count
])
end
@doc """
Mark import as completed.
"""
def complete_changeset(import_log, stats) do
import_log
|> cast(stats, [
:imported_count,
:updated_count,
:skipped_count,
:error_count,
:error_details,
:product_ids
])
|> change(%{
status: "completed",
processed_rows: import_log.total_rows,
completed_at: DateTime.utc_now() |> DateTime.truncate(:second)
})
end
@doc """
Mark import as failed.
"""
def fail_changeset(import_log, error) do
error_details = [%{"error" => inspect(error), "timestamp" => DateTime.utc_now()}]
import_log
|> change(%{
status: "failed",
error_details: error_details,
completed_at: DateTime.utc_now() |> DateTime.truncate(:second)
})
end
@doc """
Returns the percentage of completion.
"""
def progress_percent(%__MODULE__{total_rows: 0}), do: 0
def progress_percent(%__MODULE__{processed_rows: processed, total_rows: total}) do
trunc(processed / total * 100)
end
@doc """
Check if import is in progress.
"""
def in_progress?(%__MODULE__{status: "processing"}), do: true
def in_progress?(_), do: false
@doc """
Check if import is finished (completed or failed).
"""
def finished?(%__MODULE__{status: status}) when status in ["completed", "failed"], do: true
def finished?(_), do: false
end