001-partners-init.xml 4.91 KB
<?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>