Packages
phoenix_kit
1.7.207
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/phoenix_kit/migrations/postgres/v149.ex
defmodule PhoenixKit.Migrations.Postgres.V149 do
@moduledoc """
V149: Catalogue item-supplier sourcing info + CRM cross-refs.
Two additive changes that let the `phoenix_kit_catalogue` plugin carry
per-supplier sourcing detail per item and, later, federate those
suppliers against CRM — without changing anything warehouse depends on.
The item's scalar `primary_supplier_uuid` is **not** created here — it
ships upstream in V146 (a hard FK to `phoenix_kit_cat_suppliers`). This
junction is the richer, per-supplier pricing layer alongside it.
## phoenix_kit_cat_item_supplier_info
New junction table: one item can be sourced from several suppliers, each
with its own SKU, unit cost/currency, lead time, and MOQ. `supplier_uuid`
is a **soft ref** (no FK) — it resolves to a CRM party or a local
`cat_supplier`; this is where CRM federation actually lands. There is no
"primary" among these rows — the item's default supplier is the V146
`primary_supplier_uuid` scalar (a hard FK to `cat_suppliers`); this table
is purely the per-supplier pricing layer alongside it.
## `phoenix_kit_cat_suppliers.crm_company_uuid`
Nullable UUID **soft** cross-module xref from a local supplier record to a
CRM company, letting a supplier be gradually federated into CRM without
losing its catalogue-local identity.
All operations are idempotent.
"""
use Ecto.Migration
def up(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
# ── Item ↔ supplier sourcing info (CRM federation lands here) ───────
execute("""
CREATE TABLE IF NOT EXISTS #{p}phoenix_kit_cat_item_supplier_info (
uuid UUID PRIMARY KEY DEFAULT #{p}uuid_generate_v7(),
item_uuid UUID NOT NULL REFERENCES #{p}phoenix_kit_cat_items(uuid) ON DELETE CASCADE,
supplier_uuid UUID NOT NULL,
supplier_sku VARCHAR(100),
supplier_name_snapshot VARCHAR(255),
unit_cost NUMERIC(14,4),
currency VARCHAR(3),
lead_time_days INTEGER,
min_order_qty NUMERIC(14,4),
valid_from DATE,
valid_to DATE,
position INTEGER NOT NULL DEFAULT 0,
metadata JSONB NOT NULL DEFAULT '{}',
inserted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)
""")
execute("""
CREATE INDEX IF NOT EXISTS phoenix_kit_cat_item_supplier_info_item_index
ON #{p}phoenix_kit_cat_item_supplier_info (item_uuid)
""")
execute("""
CREATE INDEX IF NOT EXISTS phoenix_kit_cat_item_supplier_info_supplier_index
ON #{p}phoenix_kit_cat_item_supplier_info (supplier_uuid)
""")
# ── Soft CRM xref on local suppliers ─────────────────────────────────
execute("""
ALTER TABLE #{p}phoenix_kit_cat_suppliers
ADD COLUMN IF NOT EXISTS crm_company_uuid UUID
""")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '149'")
end
@doc """
Rolls V149 back by dropping the item-supplier-info table and the supplier
CRM xref column, in reverse order.
**Lossy rollback:** all per-supplier item sourcing info (cost, SKU, lead
time, CRM links) is lost. Items, suppliers, and the V146 scalar
`primary_supplier_uuid` are untouched.
"""
def down(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
execute("DROP TABLE IF EXISTS #{p}phoenix_kit_cat_item_supplier_info CASCADE")
execute("""
ALTER TABLE #{p}phoenix_kit_cat_suppliers
DROP COLUMN IF EXISTS crm_company_uuid
""")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '148'")
end
defp prefix_str("public"), do: "public."
defp prefix_str(prefix), do: "#{prefix}."
end