001-orders-purchase-init.xml 4.38 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-orders-purchase initial schema (P5.6).

        Owns: orders_purchase__purchase_order, orders_purchase__purchase_order_line.

        Mirror of pbc-orders-sales — same shape, same conventions.

        NEITHER table has a foreign key to:
          • partners__partner (cross-PBC reference enforced by PartnersApi)
          • catalog__item     (cross-PBC reference enforced by CatalogApi)
        A database FK across PBCs would couple their schemas at the
        storage level, defeating the bounded-context rule.
    -->

    <changeSet id="orders-purchase-init-001" author="vibe_erp">
        <comment>Create orders_purchase__purchase_order table (header)</comment>
        <sql>
            CREATE TABLE orders_purchase__purchase_order (
                id              uuid PRIMARY KEY,
                code            varchar(64)   NOT NULL,
                partner_code    varchar(64)   NOT NULL,
                status          varchar(16)   NOT NULL,
                order_date      date          NOT NULL,
                expected_date   date,
                currency_code   varchar(3)    NOT NULL,
                total_amount    numeric(18,4) NOT NULL DEFAULT 0,
                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 orders_purchase__purchase_order_code_uk
                ON orders_purchase__purchase_order (code);
            CREATE INDEX orders_purchase__purchase_order_partner_idx
                ON orders_purchase__purchase_order (partner_code);
            CREATE INDEX orders_purchase__purchase_order_status_idx
                ON orders_purchase__purchase_order (status);
            CREATE INDEX orders_purchase__purchase_order_date_idx
                ON orders_purchase__purchase_order (order_date);
            CREATE INDEX orders_purchase__purchase_order_ext_gin
                ON orders_purchase__purchase_order USING GIN (ext jsonb_path_ops);
        </sql>
        <rollback>
            DROP TABLE orders_purchase__purchase_order;
        </rollback>
    </changeSet>

    <changeSet id="orders-purchase-init-002" author="vibe_erp">
        <comment>Create orders_purchase__purchase_order_line table (FK to header, no FK to catalog__item)</comment>
        <sql>
            CREATE TABLE orders_purchase__purchase_order_line (
                id                  uuid PRIMARY KEY,
                purchase_order_id   uuid          NOT NULL REFERENCES orders_purchase__purchase_order(id) ON DELETE CASCADE,
                line_no             integer       NOT NULL,
                item_code           varchar(64)   NOT NULL,
                quantity            numeric(18,4) NOT NULL,
                unit_price          numeric(18,4) NOT NULL,
                currency_code       varchar(3)    NOT NULL,
                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,
                CONSTRAINT orders_purchase__purchase_order_line_qty_pos CHECK (quantity &gt; 0),
                CONSTRAINT orders_purchase__purchase_order_line_price_nonneg CHECK (unit_price &gt;= 0)
            );
            CREATE UNIQUE INDEX orders_purchase__purchase_order_line_order_lineno_uk
                ON orders_purchase__purchase_order_line (purchase_order_id, line_no);
            CREATE INDEX orders_purchase__purchase_order_line_item_idx
                ON orders_purchase__purchase_order_line (item_code);
        </sql>
        <rollback>
            DROP TABLE orders_purchase__purchase_order_line;
        </rollback>
    </changeSet>

</databaseChangeLog>