001-partners-init.xml
4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd">
<!--
pbc-partners initial schema.
Owns: partners__partner, partners__address, partners__contact.
vibe_erp is single-tenant per instance — there are no tenant_id
columns and no Row-Level Security policies on these tables.
Conventions enforced for every business table in vibe_erp:
• UUID primary key
• Audit columns: created_at, created_by, updated_at, updated_by
• Optimistic-locking version column
• ext jsonb NOT NULL DEFAULT '{}' for key-user custom fields
(on the aggregate root only — Partner — not on children)
• GIN index on ext for fast custom-field queries
-->
<changeSet id="partners-init-001" author="vibe_erp">
<comment>Create partners__partner table</comment>
<sql>
CREATE TABLE partners__partner (
id uuid PRIMARY KEY,
code varchar(64) NOT NULL,
name varchar(256) NOT NULL,
type varchar(16) NOT NULL,
tax_id varchar(64),
website varchar(256),
email varchar(256),
phone varchar(64),
active boolean NOT NULL DEFAULT true,
ext jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL,
created_by varchar(128) NOT NULL,
updated_at timestamptz NOT NULL,
updated_by varchar(128) NOT NULL,
version bigint NOT NULL DEFAULT 0
);
CREATE UNIQUE INDEX partners__partner_code_uk ON partners__partner (code);
CREATE INDEX partners__partner_type_idx ON partners__partner (type);
CREATE INDEX partners__partner_active_idx ON partners__partner (active);
CREATE INDEX partners__partner_ext_gin ON partners__partner USING GIN (ext jsonb_path_ops);
</sql>
<rollback>
DROP TABLE partners__partner;
</rollback>
</changeSet>
<changeSet id="partners-init-002" author="vibe_erp">
<comment>Create partners__address table (FK to partners__partner)</comment>
<sql>
CREATE TABLE partners__address (
id uuid PRIMARY KEY,
partner_id uuid NOT NULL REFERENCES partners__partner(id),
address_type varchar(16) NOT NULL,
line1 varchar(256) NOT NULL,
line2 varchar(256),
city varchar(128) NOT NULL,
region varchar(128),
postal_code varchar(32),
country_code varchar(2) NOT NULL,
is_primary boolean NOT NULL DEFAULT false,
created_at timestamptz NOT NULL,
created_by varchar(128) NOT NULL,
updated_at timestamptz NOT NULL,
updated_by varchar(128) NOT NULL,
version bigint NOT NULL DEFAULT 0
);
CREATE INDEX partners__address_partner_idx ON partners__address (partner_id);
CREATE INDEX partners__address_country_idx ON partners__address (country_code);
</sql>
<rollback>
DROP TABLE partners__address;
</rollback>
</changeSet>
<changeSet id="partners-init-003" author="vibe_erp">
<comment>Create partners__contact table (FK to partners__partner, PII-tagged)</comment>
<sql>
CREATE TABLE partners__contact (
id uuid PRIMARY KEY,
partner_id uuid NOT NULL REFERENCES partners__partner(id),
full_name varchar(256) NOT NULL,
role varchar(128),
email varchar(256),
phone varchar(64),
active boolean NOT NULL DEFAULT true,
created_at timestamptz NOT NULL,
created_by varchar(128) NOT NULL,
updated_at timestamptz NOT NULL,
updated_by varchar(128) NOT NULL,
version bigint NOT NULL DEFAULT 0
);
CREATE INDEX partners__contact_partner_idx ON partners__contact (partner_id);
CREATE INDEX partners__contact_active_idx ON partners__contact (active);
</sql>
<rollback>
DROP TABLE partners__contact;
</rollback>
</changeSet>
</databaseChangeLog>