-- 000001_baseline.sql — consolidated schema baseline.
--
-- Squashed from migrations 000002..000148 (pre-2026-09 history). Generated by
-- pg_dump --schema-only --no-owner --no-privileges against a fresh migrate-up,
-- then de-qualified (no schema prefix) so it still applies inside the
-- throwaway schema the integration tests use. Privileges live in the app-role
-- migration; reference data lives in 000002_seed.

-- Function bodies below are dumped in definition order and may reference tables
-- created later in this file; keep validation off while the baseline loads.
-- SET LOCAL: scoped to the migration runner's transaction only.
SET LOCAL check_function_bodies = false;

--
--

--
-- Name: btree_gist; Type: EXTENSION; Schema: -; Owner: -
--

-- Extensions are database-wide, so keep this one out of the caller's
-- search_path. Integration tests migrate throwaway schemas and drop them during
-- cleanup; owning the extension from such a schema makes concurrent migrations
-- race with that cleanup.
CREATE EXTENSION IF NOT EXISTS btree_gist WITH SCHEMA public;

--
-- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON EXTENSION btree_gist IS 'support for indexing common datatypes in GiST';

--
-- Name: company_entity_type; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE company_entity_type AS ENUM (
    'LEGAL_ENTITY',
    'SOLE_PROPRIETOR'
);

--
-- Name: custom_field_type; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE custom_field_type AS ENUM (
    'TEXT',
    'NUMBER',
    'DATE',
    'BOOLEAN',
    'SELECT'
);

--
-- Name: duplicate_tax_number_policy; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE duplicate_tax_number_policy AS ENUM (
    'ALLOW',
    'WARN',
    'BLOCK'
);

--
-- Name: party_kind; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE party_kind AS ENUM (
    'PERSON',
    'ORGANIZATION'
);

--
-- Name: party_risk_policy; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE party_risk_policy AS ENUM (
    'ALLOW',
    'WARN',
    'BLOCK'
);

--
-- Name: product_kind; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE product_kind AS ENUM (
    'PHYSICAL',
    'SERVICE'
);

--
-- Name: allocate_commercial_document_number(uuid, text, integer); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION allocate_commercial_document_number(p_company_id uuid, p_document_type_code text, p_sequence_year integer) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
    allocated bigint;
    prefix text;
BEGIN
    IF p_sequence_year < 2000 OR p_sequence_year > 9999 THEN
        RAISE EXCEPTION 'commercial document sequence year is invalid' USING ERRCODE = '22023';
    END IF;
    INSERT INTO commercial_document_sequences(company_id, document_type_code, sequence_year)
    VALUES (p_company_id, p_document_type_code, p_sequence_year)
    ON CONFLICT (company_id, document_type_code, sequence_year) DO NOTHING;
    UPDATE commercial_document_sequences
       SET next_value = next_value + 1, updated_at = now()
     WHERE company_id = p_company_id
       AND document_type_code = p_document_type_code
       AND sequence_year = p_sequence_year
    RETURNING next_value - 1 INTO allocated;
    prefix := CASE p_document_type_code
        WHEN 'SALES_QUOTE' THEN 'TKL'
        WHEN 'SALES_ORDER' THEN 'SIP'
        WHEN 'SALES_DELIVERY' THEN 'IRS'
        WHEN 'SALES_INVOICE' THEN 'FTR'
        WHEN 'SALES_RETURN_INVOICE' THEN 'IAD'
        WHEN 'PURCHASE_ORDER' THEN 'ASIP'
        WHEN 'PURCHASE_DELIVERY' THEN 'AIRS'
        WHEN 'PURCHASE_INVOICE' THEN 'AFTR'
        WHEN 'PURCHASE_RETURN_INVOICE' THEN 'AIAD'
        ELSE 'BEL'
    END;
    RETURN prefix || '-' || p_sequence_year::text || '-' || lpad(allocated::text, 6, '0');
END;
$$;

--
-- Name: allocate_document_number(uuid, text); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION allocate_document_number(p_company_id uuid, p_document_type_code text) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE
    allocated bigint;
BEGIN
    INSERT INTO document_sequences(company_id, document_type_code, next_number)
    VALUES (p_company_id, p_document_type_code, 2)
    ON CONFLICT (company_id, document_type_code)
    DO UPDATE SET next_number = document_sequences.next_number + 1,
                  updated_at = now()
    RETURNING next_number - 1 INTO allocated;
    RETURN allocated;
END;
$$;

--
-- Name: apply_inventory_serial_movement(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION apply_inventory_serial_movement() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    old_status text;
BEGIN
    IF NEW.serial_id IS NULL THEN
        RETURN NEW;
    END IF;
    SELECT status INTO old_status FROM serial_numbers
     WHERE company_id = NEW.company_id AND id = NEW.serial_id FOR UPDATE;
    IF NEW.direction = 'IN' THEN
        UPDATE serial_numbers
           SET status = 'IN_STOCK', active_warehouse_id = NEW.warehouse_id,
               active_location_id = NEW.location_id, updated_at = now()
         WHERE company_id = NEW.company_id AND id = NEW.serial_id;
    ELSE
        UPDATE serial_numbers
           SET status = 'DISPATCHED', active_warehouse_id = NULL,
               active_location_id = NULL, updated_at = now()
         WHERE company_id = NEW.company_id AND id = NEW.serial_id;
    END IF;
    INSERT INTO serial_number_events(
        id, company_id, serial_id, movement_id, from_status, to_status,
        from_warehouse_id, to_warehouse_id, occurred_at)
    SELECT NEW.id, NEW.company_id, NEW.serial_id, NEW.id,
           old_status,
           CASE WHEN NEW.direction = 'IN' THEN 'IN_STOCK' ELSE 'DISPATCHED' END,
           CASE WHEN NEW.direction = 'OUT' THEN NEW.warehouse_id ELSE NULL END,
           CASE WHEN NEW.direction = 'IN' THEN NEW.warehouse_id ELSE NULL END,
           NEW.posted_at;
    RETURN NEW;
END;
$$;

--
-- Name: apply_inventory_stock_projection(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION apply_inventory_stock_projection() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    projection_id uuid;
    current_quantity numeric(24,8);
    reserved numeric(24,8);
    policy text;
    delta numeric(24,8) := NEW.quantity_delta;
    lock_key text := NEW.company_id::text || ':' || NEW.warehouse_id::text || ':' ||
        NEW.product_id::text || ':' || COALESCE(NEW.variant_id::text, '-') || ':' ||
        COALESCE(NEW.location_id::text, '-') || ':' || COALESCE(NEW.lot_id::text, '-') || ':' ||
        COALESCE(NEW.serial_id::text, '-');
BEGIN
    PERFORM pg_advisory_xact_lock(hashtextextended(lock_key, 731));
    SELECT id, physical_quantity, reserved_quantity
      INTO projection_id, current_quantity, reserved
      FROM stock_positions
     WHERE company_id = NEW.company_id AND warehouse_id = NEW.warehouse_id
       AND product_id = NEW.product_id
       AND variant_id IS NOT DISTINCT FROM NEW.variant_id
       AND location_id IS NOT DISTINCT FROM NEW.location_id
       AND lot_id IS NOT DISTINCT FROM NEW.lot_id
       AND serial_id IS NOT DISTINCT FROM NEW.serial_id
     FOR UPDATE;
    IF projection_id IS NULL THEN
        current_quantity := 0;
        reserved := 0;
    END IF;
    SELECT COALESCE(negative_stock_policy, 'BLOCK') INTO policy
      FROM inventory_company_policies WHERE company_id = NEW.company_id;
    IF current_quantity + delta < 0 AND COALESCE(policy, 'BLOCK') = 'BLOCK' THEN
        RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
    END IF;
    IF projection_id IS NULL THEN
        INSERT INTO stock_positions(
            id, company_id, warehouse_id, location_id, product_id, variant_id,
            lot_id, serial_id, physical_quantity, reserved_quantity)
        VALUES (md5(lock_key || NEW.id::text)::uuid, NEW.company_id, NEW.warehouse_id, NEW.location_id,
                NEW.product_id, NEW.variant_id, NEW.lot_id, NEW.serial_id,
                delta, 0);
    ELSE
        UPDATE stock_positions
           SET physical_quantity = physical_quantity + delta, updated_at = now()
         WHERE company_id = NEW.company_id AND id = projection_id;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: apply_stock_cost_layer(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION apply_stock_cost_layer() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    remaining numeric(24,8) := NEW.quantity;
    layer record;
    consumed numeric(24,8);
    layer_id uuid;
    company_base_currency char(3);
    resolved_base_cost numeric(24,8);
BEGIN
    IF NEW.direction = 'IN' THEN
        SELECT base_currency INTO company_base_currency FROM companies WHERE id = NEW.company_id;
        layer_id := md5(NEW.company_id::text || ':' || NEW.id::text)::uuid;

        IF NEW.unit_cost IS NOT NULL AND NEW.currency IS NOT NULL THEN
            IF NEW.currency = company_base_currency THEN
                resolved_base_cost := NEW.unit_cost;
            ELSE
                resolved_base_cost := NEW.unit_cost / NEW.exchange_rate_snapshot;
            END IF;
            INSERT INTO stock_cost_layers(
                id, company_id, warehouse_id, product_id, variant_id, lot_id,
                source_movement_id, quantity, remaining_quantity, unit_cost, currency,
                is_provisional, base_unit_cost, base_currency)
            VALUES (
                layer_id, NEW.company_id, NEW.warehouse_id, NEW.product_id,
                NEW.variant_id, NEW.lot_id, NEW.id, NEW.quantity, NEW.quantity,
                NEW.unit_cost, NEW.currency, false, resolved_base_cost, company_base_currency)
            ON CONFLICT (company_id, source_movement_id) DO NOTHING;
        ELSE
            -- A movement without a cost is still valid stock; it must still
            -- open a layer (zero-valued, provisional) so the layer total
            -- never falls behind the physical ledger, and it must leave a
            -- record that valuation is incomplete for this position.
            INSERT INTO stock_cost_layers(
                id, company_id, warehouse_id, product_id, variant_id, lot_id,
                source_movement_id, quantity, remaining_quantity, unit_cost, currency,
                is_provisional, base_unit_cost, base_currency)
            VALUES (
                layer_id, NEW.company_id, NEW.warehouse_id, NEW.product_id,
                NEW.variant_id, NEW.lot_id, NEW.id, NEW.quantity, NEW.quantity,
                0, company_base_currency, true, 0, company_base_currency)
            ON CONFLICT (company_id, source_movement_id) DO NOTHING;
            INSERT INTO stock_cost_unpriced_events(id, company_id, event_type, movement_id, layer_id, quantity)
            VALUES (md5(NEW.company_id::text || ':' || NEW.id::text || ':unpriced')::uuid,
                    NEW.company_id, 'UNPRICED_RECEIPT', NEW.id, layer_id, NEW.quantity);
        END IF;
        RETURN NEW;
    END IF;

    -- Match the lot when the outbound movement is lot-specific.  For a
    -- lot-agnostic dispatch, consume all lots in FIFO order.
    FOR layer IN
        SELECT id, remaining_quantity, unit_cost, currency, base_unit_cost, base_currency
          FROM stock_cost_layers
         WHERE company_id = NEW.company_id
           AND warehouse_id = NEW.warehouse_id
           AND product_id = NEW.product_id
           AND variant_id IS NOT DISTINCT FROM NEW.variant_id
           AND (NEW.lot_id IS NULL OR lot_id IS NOT DISTINCT FROM NEW.lot_id)
           AND remaining_quantity > 0
         ORDER BY created_at, id
         FOR UPDATE
    LOOP
        EXIT WHEN remaining <= 0;
        consumed := LEAST(remaining, layer.remaining_quantity);
        IF consumed <= 0 THEN
            CONTINUE;
        END IF;
        UPDATE stock_cost_layers
           SET remaining_quantity = remaining_quantity - consumed
         WHERE company_id = NEW.company_id AND id = layer.id;
        INSERT INTO stock_cost_consumptions(
            id, company_id, movement_id, layer_id, quantity, unit_cost, currency,
            base_unit_cost, base_currency)
        VALUES (
            md5(NEW.company_id::text || ':' || NEW.id::text || ':' || layer.id::text)::uuid,
            NEW.company_id, NEW.id, layer.id, consumed, layer.unit_cost,
            layer.currency, layer.base_unit_cost, layer.base_currency);
        remaining := remaining - consumed;
    END LOOP;

    IF remaining > 0 THEN
        -- The physical ledger allowed this dispatch but the cost-layer
        -- projection could not find enough remaining quantity to match it.
        -- This must never happen once every IN movement opens a layer (see
        -- above), but it is recorded rather than silently dropped so a
        -- pre-existing divergence stays visible and reconcilable.
        INSERT INTO stock_cost_unpriced_events(id, company_id, event_type, movement_id, layer_id, quantity)
        VALUES (md5(NEW.company_id::text || ':' || NEW.id::text || ':shortfall')::uuid,
                NEW.company_id, 'UNPRICED_CONSUMPTION', NEW.id, NULL, remaining);
    END IF;

    RETURN NEW;
END;
$$;

--
-- Name: enforce_asset_assignment_history(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_asset_assignment_history() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP='DELETE' THEN
        RAISE EXCEPTION 'asset assignments are never deleted' USING ERRCODE='55000',CONSTRAINT='asset_assignments_no_delete';
    END IF;
    IF OLD.returned_at IS NOT NULL THEN
        RAISE EXCEPTION 'returned asset assignments are immutable' USING ERRCODE='55000',CONSTRAINT='asset_assignments_returned_immutable';
    END IF;
    IF NEW.company_id<>OLD.company_id OR NEW.id<>OLD.id OR NEW.asset_id<>OLD.asset_id OR
       NEW.employee_id<>OLD.employee_id OR NEW.assigned_at<>OLD.assigned_at OR
       NEW.assigned_by<>OLD.assigned_by OR NEW.actor_snapshot<>OLD.actor_snapshot OR
       NEW.assignment_note<>OLD.assignment_note THEN
        RAISE EXCEPTION 'only an asset return may update an active assignment' USING ERRCODE='55000',CONSTRAINT='asset_assignments_return_only';
    END IF;
    RETURN NEW;
END; $$;

--
-- Name: enforce_commercial_allocation_capacity(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_commercial_allocation_capacity() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    source_base numeric;
    already_allocated numeric;
BEGIN
    -- Only a CONSUMED allocation binds the source line. A RESERVED row (draft
    -- target) is advisory and never blocks another document.
    IF NEW.status <> 'CONSUMED' THEN
        RETURN NEW;
    END IF;

    SELECT base_quantity INTO source_base
      FROM commercial_line_registry
     WHERE company_id = NEW.company_id AND line_id = NEW.source_line_id;
    IF source_base IS NULL THEN
        RETURN NEW;
    END IF;

    SELECT COALESCE(SUM(base_quantity), 0) INTO already_allocated
      FROM commercial_line_allocations
     WHERE company_id = NEW.company_id
       AND source_line_id = NEW.source_line_id
       AND allocation_type = NEW.allocation_type
       AND status = 'CONSUMED'
       AND (TG_OP = 'INSERT' OR id <> NEW.id);

    IF already_allocated + NEW.base_quantity > source_base + 1e-9 THEN
        RAISE EXCEPTION 'commercial allocation exceeds source line capacity (% + % > %)',
            already_allocated, NEW.base_quantity, source_base
            USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_commercial_header_immutability(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_commercial_header_immutability() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    allowed boolean := false;
BEGIN
    IF TG_OP = 'DELETE' THEN
        IF OLD.status <> 'DRAFT' THEN
            RAISE EXCEPTION 'posted commercial documents are immutable' USING ERRCODE = '55000';
        END IF;
        RETURN OLD;
    END IF;

    IF OLD.status = 'DRAFT' THEN
        IF TG_TABLE_NAME = 'sales_quotes' THEN
            allowed := NEW.status IN ('DRAFT', 'SENT');
        ELSIF TG_TABLE_NAME = 'sales_orders' THEN
            allowed := NEW.status IN ('DRAFT', 'CONFIRMED');
        ELSIF TG_TABLE_NAME IN ('sales_dispatches', 'sales_invoices', 'sales_returns') THEN
            allowed := NEW.status IN ('DRAFT', 'POSTED');
        END IF;
        IF NOT allowed THEN
            RAISE EXCEPTION 'invalid commercial document state transition' USING ERRCODE = '55000';
        END IF;
        IF NEW.status = 'POSTED' AND NEW.posted_at IS NULL THEN
            RAISE EXCEPTION 'posted commercial documents require posted_at' USING ERRCODE = '23514';
        END IF;
        IF NEW.status <> 'POSTED' AND NEW.posted_at IS NOT NULL THEN
            RAISE EXCEPTION 'unposted commercial documents cannot have posted_at' USING ERRCODE = '23514';
        END IF;
        IF NEW.status <> 'CANCELLED' AND
           (NEW.cancelled_at IS NOT NULL OR NULLIF(btrim(COALESCE(NEW.cancellation_reason, '')), '') IS NOT NULL) THEN
            RAISE EXCEPTION 'cancellation details require a cancelled document' USING ERRCODE = '23514';
        END IF;
        RETURN NEW;
    END IF;

    IF OLD.status = 'CANCELLED' THEN
        RAISE EXCEPTION 'cancelled commercial documents are immutable' USING ERRCODE = '55000';
    END IF;

    IF NEW.company_id <> OLD.company_id OR NEW.document_id <> OLD.document_id OR
       NEW.document_no <> OLD.document_no OR NEW.branch_id <> OLD.branch_id OR
       NEW.default_warehouse_id IS DISTINCT FROM OLD.default_warehouse_id OR
       NEW.party_id <> OLD.party_id OR NEW.document_date <> OLD.document_date OR
       NEW.due_date IS DISTINCT FROM OLD.due_date OR NEW.valid_until IS DISTINCT FROM OLD.valid_until OR
       NEW.currency_code <> OLD.currency_code OR NEW.exchange_rate <> OLD.exchange_rate OR
       NEW.notes <> OLD.notes OR NEW.source_kind <> OLD.source_kind OR
       NEW.source_document_id IS DISTINCT FROM OLD.source_document_id OR
       NEW.subtotal <> OLD.subtotal OR NEW.discount_total <> OLD.discount_total OR
       NEW.tax_total <> OLD.tax_total OR NEW.withholding_total <> OLD.withholding_total OR
       NEW.grand_total <> OLD.grand_total OR NEW.payable_total <> OLD.payable_total OR
       NEW.created_by <> OLD.created_by OR NEW.created_at <> OLD.created_at OR
       NEW.finance_posting_id IS DISTINCT FROM OLD.finance_posting_id OR
       NEW.post_idempotency_key IS DISTINCT FROM OLD.post_idempotency_key OR
       NEW.posted_at IS DISTINCT FROM OLD.posted_at OR
       NEW.version <> OLD.version + 1 THEN
        RAISE EXCEPTION 'posted commercial documents are immutable; only a state transition is allowed' USING ERRCODE = '55000';
    END IF;

    IF TG_TABLE_NAME = 'sales_quotes' THEN
        allowed := NEW.status = OLD.status OR
            (OLD.status = 'SENT' AND NEW.status IN ('ACCEPTED', 'REJECTED'));
    ELSIF TG_TABLE_NAME = 'sales_orders' THEN
        -- Fulfillment projection may move in either direction while OPEN.
        allowed := NEW.status IN ('CONFIRMED', 'PARTIALLY_FULFILLED', 'FULFILLED', 'CANCELLED');
    ELSE
        allowed := NEW.status = OLD.status OR
            (OLD.status = 'POSTED' AND NEW.status = 'CANCELLED');
    END IF;
    IF NOT allowed THEN
        RAISE EXCEPTION 'invalid commercial document state transition' USING ERRCODE = '55000';
    END IF;

    IF NEW.status = 'POSTED' AND NEW.posted_at IS NULL THEN
        RAISE EXCEPTION 'posted commercial documents require posted_at' USING ERRCODE = '23514';
    END IF;
    IF NEW.status = 'CANCELLED' THEN
        IF NEW.cancelled_at IS NULL OR btrim(COALESCE(NEW.cancellation_reason, '')) = '' THEN
            RAISE EXCEPTION 'cancelled commercial documents require a reason' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.cancelled_at IS DISTINCT FROM OLD.cancelled_at OR
          NEW.cancellation_reason IS DISTINCT FROM OLD.cancellation_reason THEN
        RAISE EXCEPTION 'cancellation details are immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_document_transition(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_document_transition() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.status = 'DRAFT' AND NEW.status IN ('DRAFT', 'POSTED') THEN
        RETURN NEW;
    END IF;
    IF OLD.status = 'POSTED' AND NEW.status = 'CANCELLED' THEN
        IF NEW.document_type_code <> OLD.document_type_code OR
           NEW.document_no <> OLD.document_no OR NEW.company_id <> OLD.company_id OR
           NEW.branch_id <> OLD.branch_id OR NEW.warehouse_id IS DISTINCT FROM OLD.warehouse_id OR
           NEW.party_id <> OLD.party_id OR NEW.document_date <> OLD.document_date OR
           NEW.due_date IS DISTINCT FROM OLD.due_date OR NEW.currency_code <> OLD.currency_code OR
           NEW.exchange_rate <> OLD.exchange_rate OR NEW.notes <> OLD.notes OR
           NEW.subtotal <> OLD.subtotal OR NEW.discount_total <> OLD.discount_total OR
           NEW.tax_total <> OLD.tax_total OR NEW.grand_total <> OLD.grand_total OR
           NEW.posted_at <> OLD.posted_at OR NEW.version <> OLD.version + 1 THEN
            RAISE EXCEPTION 'posted documents are immutable; cancel is the only allowed transition' USING ERRCODE = '55000';
        END IF;
        RETURN NEW;
    END IF;
    RAISE EXCEPTION 'invalid document status transition' USING ERRCODE = '55000';
END;
$$;

--
-- Name: enforce_finance_account_identity(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_finance_account_identity() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.account_type IS DISTINCT FROM OLD.account_type OR
       NEW.currency IS DISTINCT FROM OLD.currency THEN
        RAISE EXCEPTION 'finance account type and currency are immutable'
            USING ERRCODE = '23514', CONSTRAINT = 'finance_account_identity_immutable';
    END IF;
    IF NEW.branch_id IS DISTINCT FROM OLD.branch_id AND EXISTS (
        SELECT 1 FROM finance_account_movements m
        WHERE m.company_id = OLD.company_id AND m.account_id = OLD.id
    ) THEN
        RAISE EXCEPTION 'finance account branch is immutable after first movement'
            USING ERRCODE = '23514', CONSTRAINT = 'finance_account_branch_after_movement';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_finance_payment_movement_account(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_finance_payment_movement_account() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    movement_ok boolean;
BEGIN
    IF NEW.account_id IS NULL AND NEW.movement_id IS NULL THEN
        RETURN NEW;
    END IF;
    SELECT EXISTS(
        SELECT 1 FROM finance_account_movements m
        JOIN finance_accounts a
          ON a.company_id = m.company_id AND a.id = m.account_id
        WHERE m.company_id = NEW.company_id AND m.id = NEW.movement_id
          AND m.account_id = NEW.account_id AND m.currency = NEW.currency
          AND a.account_type = NEW.payment_method
    ) INTO movement_ok;
    IF NOT movement_ok THEN
        RAISE EXCEPTION 'finance payment movement/account relationship is invalid'
            USING ERRCODE = '23514', CONSTRAINT = 'finance_payment_movement_account';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_finance_transfer_movement_pair(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_finance_transfer_movement_pair() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    out_ok boolean;
    in_ok boolean;
BEGIN
    SELECT EXISTS(
        SELECT 1 FROM finance_account_movements m
        WHERE m.company_id = NEW.company_id AND m.id = NEW.out_movement_id
          AND m.account_id = NEW.from_account_id AND m.currency = NEW.currency
          AND m.direction = 'OUT' AND m.movement_kind = 'TRANSFER'
          AND m.source_type = 'finance_transfer' AND m.source_id = NEW.id
    ) INTO out_ok;
    SELECT EXISTS(
        SELECT 1 FROM finance_account_movements m
        WHERE m.company_id = NEW.company_id AND m.id = NEW.in_movement_id
          AND m.account_id = NEW.to_account_id AND m.currency = NEW.currency
          AND m.direction = 'IN' AND m.movement_kind = 'TRANSFER'
          AND m.source_type = 'finance_transfer' AND m.source_id = NEW.id
    ) INTO in_ok;
    IF NOT out_ok OR NOT in_ok THEN
        RAISE EXCEPTION 'finance transfer movement pair is invalid'
            USING ERRCODE = '23514', CONSTRAINT = 'finance_transfer_movement_pair';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_legislation_pack_lifecycle(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_legislation_pack_lifecycle() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
 IF OLD.status IN ('ACTIVE','SUPERSEDED') THEN
   IF OLD.status='ACTIVE' AND NEW.status='SUPERSEDED' AND
      ROW(NEW.company_id,NEW.id,NEW.country_code,NEW.code,NEW.version,NEW.effective_from,NEW.effective_to,
          NEW.minimum_monthly_gross,NEW.sgk_daily_floor,NEW.sgk_daily_ceiling,NEW.stamp_tax_rate,NEW.source_metadata,
          NEW.supersedes_pack_id,NEW.change_reason,NEW.activated_at,NEW.created_by,NEW.created_at)
      IS NOT DISTINCT FROM
      ROW(OLD.company_id,OLD.id,OLD.country_code,OLD.code,OLD.version,OLD.effective_from,OLD.effective_to,
          OLD.minimum_monthly_gross,OLD.sgk_daily_floor,OLD.sgk_daily_ceiling,OLD.stamp_tax_rate,OLD.source_metadata,
          OLD.supersedes_pack_id,OLD.change_reason,OLD.activated_at,OLD.created_by,OLD.created_at) THEN RETURN NEW; END IF;
   RAISE EXCEPTION 'active or superseded legislation pack is immutable' USING ERRCODE='55000',CONSTRAINT='payroll_legislation_pack_immutable';
 END IF;
 RETURN NEW;
END; $$;

--
-- Name: enforce_manual_reversal_provenance(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_manual_reversal_provenance() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    original_type text;
    original_source text;
    original_source_id uuid;
    original_reversal_of uuid;
BEGIN
    IF NEW.reversal_of_id IS NULL OR NEW.source_type <> 'STOCK_MOVEMENT_REVERSAL' THEN
        RETURN NEW;
    END IF;

    SELECT movement_type, source_type, source_id, reversal_of_id
      INTO original_type, original_source, original_source_id, original_reversal_of
      FROM stock_movements
     WHERE company_id = NEW.company_id AND id = NEW.reversal_of_id;

    IF original_type IS NULL THEN
        -- The foreign key rejects a genuinely missing original.
        RETURN NEW;
    END IF;

    -- Genuinely manual movements are always reversible here.
    IF original_type = 'MANUAL_ADJUSTMENT' OR original_source = 'STOCK_MOVEMENT_OPERATION' THEN
        RETURN NEW;
    END IF;

    -- A reversal entry cannot itself be reversed.
    IF original_reversal_of IS NOT NULL OR original_source LIKE '%\_REVERSAL' ESCAPE '\' THEN
        RAISE EXCEPTION 'stock movement % is a reversal entry and cannot be reversed again', NEW.reversal_of_id
            USING ERRCODE = '23514';
    END IF;

    -- A movement tied to a commercial document must be undone by cancelling it.
    IF original_source_id IS NOT NULL
       AND EXISTS (SELECT 1 FROM documents d WHERE d.company_id = NEW.company_id AND d.id = original_source_id) THEN
        RAISE EXCEPTION 'document-origin stock movement % cannot be manually reversed (movement_type=%, source_type=%)',
            NEW.reversal_of_id, original_type, original_source
            USING ERRCODE = '23514';
    END IF;

    -- Otherwise (opening stock import, warehouse transfer, stock count): allow.
    RETURN NEW;
END;
$$;

--
-- Name: enforce_product_media_variant(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_product_media_variant() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.variant_id IS NOT NULL AND NOT EXISTS (
        SELECT 1 FROM product_variants pv
        WHERE pv.company_id = NEW.company_id
          AND pv.id = NEW.variant_id
          AND pv.product_id = NEW.product_id
    ) THEN
        RAISE EXCEPTION 'media variant does not belong to product' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_purchase_order_header_immutability(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_purchase_order_header_immutability() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' THEN
        IF OLD.status <> 'DRAFT' THEN
            RAISE EXCEPTION 'non-draft purchase orders are immutable' USING ERRCODE = '55000';
        END IF;
        RETURN OLD;
    END IF;

    IF OLD.status = 'DRAFT' THEN
        RETURN NEW;
    END IF;

    IF NEW.company_id <> OLD.company_id OR
       NEW.order_no <> OLD.order_no OR
       NEW.supplier_id <> OLD.supplier_id OR
       NEW.branch_id <> OLD.branch_id OR
       NEW.warehouse_id <> OLD.warehouse_id OR
       NEW.order_date <> OLD.order_date OR
       NEW.currency <> OLD.currency OR
       NEW.over_delivery_policy <> OLD.over_delivery_policy OR
       NEW.notes <> OLD.notes OR
       NEW.total <> OLD.total OR
       NEW.created_by <> OLD.created_by OR
       NEW.created_at <> OLD.created_at OR
       NEW.version <> OLD.version + 1 OR
       (OLD.confirmed_at IS NOT NULL AND NEW.confirmed_at IS DISTINCT FROM OLD.confirmed_at) OR
       (OLD.cancelled_at IS NOT NULL AND NEW.cancelled_at IS DISTINCT FROM OLD.cancelled_at) OR
       (OLD.cancellation_reason IS NOT NULL AND NEW.cancellation_reason IS DISTINCT FROM OLD.cancellation_reason) THEN
        RAISE EXCEPTION 'confirmed purchase-order content is immutable' USING ERRCODE = '55000';
    END IF;

    -- Fulfillment projection may move in either direction while the order
    -- stays OPEN; DRAFT is never re-entered and CANCELLED is terminal.
    IF NEW.status = 'DRAFT' OR
       NEW.status NOT IN ('CONFIRMED', 'PARTIALLY_FULFILLED', 'FULFILLED', 'CANCELLED') OR
       (OLD.status = 'CANCELLED' AND NEW.status <> 'CANCELLED') THEN
        RAISE EXCEPTION 'invalid purchase-order state transition' USING ERRCODE = '55000';
    END IF;

    IF NEW.status = 'CANCELLED' AND btrim(COALESCE(NEW.cancellation_reason, '')) = '' THEN
        RAISE EXCEPTION 'cancelled purchase orders require a reason' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_purchase_order_line_immutability(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_purchase_order_line_immutability() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    order_status text;
BEGIN
    SELECT status INTO order_status
      FROM purchase_orders
     WHERE company_id = COALESCE(OLD.company_id, NEW.company_id)
       AND id = COALESCE(OLD.order_id, NEW.order_id);
    IF order_status IS NULL THEN
        RAISE EXCEPTION 'purchase-order parent is required' USING ERRCODE = '23503';
    END IF;
    IF order_status = 'DRAFT' THEN
        RETURN COALESCE(NEW, OLD);
    END IF;
    IF TG_OP = 'INSERT' OR TG_OP = 'DELETE' THEN
        RAISE EXCEPTION 'non-draft purchase-order lines are immutable' USING ERRCODE = '55000';
    END IF;
    IF NEW.company_id <> OLD.company_id OR
       NEW.order_id <> OLD.order_id OR
       NEW.line_no <> OLD.line_no OR
       NEW.line_type IS DISTINCT FROM OLD.line_type OR
       NEW.product_id <> OLD.product_id OR
       NEW.variant_id IS DISTINCT FROM OLD.variant_id OR
       NEW.warehouse_id IS DISTINCT FROM OLD.warehouse_id OR
       NEW.supplier_product_code_snapshot <> OLD.supplier_product_code_snapshot OR
       NEW.product_code_snapshot <> OLD.product_code_snapshot OR
       NEW.product_name_snapshot <> OLD.product_name_snapshot OR
       NEW.unit_code <> OLD.unit_code OR
       NEW.ordered_quantity <> OLD.ordered_quantity OR
       NEW.base_quantity <> OLD.base_quantity OR
       NEW.conversion_factor <> OLD.conversion_factor OR
       NEW.unit_price <> OLD.unit_price OR
       NEW.currency <> OLD.currency OR
       NEW.tax_snapshot IS DISTINCT FROM OLD.tax_snapshot OR
       NEW.received_quantity < 0 OR
       NEW.invoiced_quantity < 0 OR
       (NEW.line_type = 'SERVICE' AND NEW.invoiced_quantity > NEW.ordered_quantity) OR
       (NEW.line_type = 'PRODUCT' AND NEW.invoiced_quantity > NEW.received_quantity) THEN
        RAISE EXCEPTION 'confirmed purchase-order line content is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_purchase_posted_header_immutability(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_purchase_posted_header_immutability() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    old_content jsonb;
    new_content jsonb;
BEGIN
    IF TG_OP = 'DELETE' THEN
        IF OLD.status <> 'DRAFT' THEN
            RAISE EXCEPTION 'posted purchase documents are immutable' USING ERRCODE = '55000';
        END IF;
        RETURN OLD;
    END IF;

    IF OLD.status = 'CANCELLED' THEN
        RAISE EXCEPTION 'cancelled purchase documents are immutable' USING ERRCODE = '55000';
    END IF;

    IF NEW.version <> OLD.version + 1 THEN
        RAISE EXCEPTION 'purchase document version must advance exactly once' USING ERRCODE = '55000';
    END IF;

    old_content := to_jsonb(OLD) - ARRAY['status','version','cancelled_at','cancellation_reason'];
    new_content := to_jsonb(NEW) - ARRAY['status','version','cancelled_at','cancellation_reason'];
    IF OLD.status <> 'DRAFT' AND new_content IS DISTINCT FROM old_content THEN
        RAISE EXCEPTION 'posted purchase document content is immutable' USING ERRCODE = '55000';
    END IF;

    IF OLD.status = 'DRAFT' THEN
        IF NEW.status NOT IN ('DRAFT','POSTED') THEN
            RAISE EXCEPTION 'invalid purchase document state transition' USING ERRCODE = '55000';
        END IF;
        IF NEW.status = 'DRAFT' AND NEW.posted_at IS NOT NULL THEN
            RAISE EXCEPTION 'draft purchase documents cannot have posted_at' USING ERRCODE = '23514';
        END IF;
        IF NEW.status = 'POSTED' AND NEW.posted_at IS NULL THEN
            RAISE EXCEPTION 'posted purchase documents require posted_at' USING ERRCODE = '23514';
        END IF;
        IF NEW.cancelled_at IS NOT NULL OR NULLIF(btrim(COALESCE(NEW.cancellation_reason,'')), '') IS NOT NULL THEN
            RAISE EXCEPTION 'cancellation details require a cancelled document' USING ERRCODE = '23514';
        END IF;
        RETURN NEW;
    END IF;

    IF OLD.status = 'POSTED' AND NEW.status NOT IN ('POSTED','CANCELLED') THEN
        RAISE EXCEPTION 'invalid purchase document state transition' USING ERRCODE = '55000';
    END IF;
    IF NEW.status = 'POSTED' AND NEW.posted_at IS NULL THEN
        RAISE EXCEPTION 'posted purchase documents require posted_at' USING ERRCODE = '23514';
    END IF;
    IF NEW.status = 'CANCELLED' THEN
        IF NEW.cancelled_at IS NULL OR NULLIF(btrim(COALESCE(NEW.cancellation_reason,'')), '') IS NULL THEN
            RAISE EXCEPTION 'cancelled purchase documents require a reason' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.cancelled_at IS DISTINCT FROM OLD.cancelled_at OR
          NEW.cancellation_reason IS DISTINCT FROM OLD.cancellation_reason THEN
        RAISE EXCEPTION 'cancellation details are immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_sales_return_reason_immutability(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_sales_return_reason_immutability() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.status <> 'DRAFT' AND NEW.reason IS DISTINCT FROM OLD.reason THEN
        RAISE EXCEPTION 'posted sales return reason is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: enforce_stock_count_transition(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_stock_count_transition() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.state = NEW.state THEN
        RETURN NEW;
    END IF;
    IF (OLD.state = 'DRAFT' AND NEW.state = 'IN_PROGRESS') OR
       (OLD.state = 'IN_PROGRESS' AND NEW.state IN ('COUNTED', 'REVIEW', 'CANCELLED')) OR
       (OLD.state = 'COUNTED' AND NEW.state IN ('REVIEW', 'POSTED', 'CANCELLED')) OR
       (OLD.state = 'REVIEW' AND NEW.state IN ('POSTED', 'CANCELLED')) THEN
        RETURN NEW;
    END IF;
    RAISE EXCEPTION 'invalid stock count state transition' USING ERRCODE = '55000';
END;
$$;

--
-- Name: enforce_transfer_state_transition(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION enforce_transfer_state_transition() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.state = NEW.state THEN
        RETURN NEW;
    END IF;
    IF (OLD.state = 'DRAFT' AND NEW.state IN ('REQUESTED', 'APPROVED', 'CANCELLED')) OR
       (OLD.state = 'REQUESTED' AND NEW.state IN ('APPROVED', 'CANCELLED')) OR
       (OLD.state = 'APPROVED' AND NEW.state IN ('IN_TRANSIT', 'CANCELLED')) OR
       (OLD.state = 'IN_TRANSIT' AND NEW.state IN ('PARTIALLY_RECEIVED', 'RECEIVED', 'CANCELLED')) OR
       (OLD.state = 'PARTIALLY_RECEIVED' AND NEW.state IN ('RECEIVED', 'CANCELLED')) THEN
        RETURN NEW;
    END IF;
    RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
END;
$$;

--
-- Name: ensure_company_has_system_admin(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION ensure_company_has_system_admin() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    target_company uuid := COALESCE(NEW.company_id, OLD.company_id);
BEGIN
    IF EXISTS (SELECT 1 FROM roles WHERE company_id=target_company AND is_system)
       AND NOT EXISTS (
           SELECT 1
           FROM membership_roles mr
           JOIN roles r ON r.company_id=mr.company_id AND r.id=mr.role_id AND r.is_system
           JOIN company_memberships m ON m.company_id=mr.company_id AND m.user_id=mr.user_id AND m.is_active
           WHERE mr.company_id=target_company
       ) THEN
        RAISE EXCEPTION 'company must retain an active system administrator' USING ERRCODE = '23514';
    END IF;
    IF TG_OP = 'DELETE' THEN
        RETURN OLD;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_active_component_treatment_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_active_component_treatment_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE pack_status text;
BEGIN
    SELECT p.status INTO pack_status
    FROM payroll_component_definitions c
    JOIN payroll_legislation_packs p ON p.company_id=c.company_id AND p.id=c.pack_id
    WHERE c.company_id=OLD.company_id AND c.id=OLD.component_definition_id;
    IF pack_status IN ('ACTIVE','SUPERSEDED') THEN
        RAISE EXCEPTION 'active or superseded legislation treatment is immutable'
            USING ERRCODE='55000',CONSTRAINT='payroll_component_treatment_immutable';
    END IF;
    RETURN COALESCE(NEW,OLD);
END; $$;

--
-- Name: guard_active_legislation_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_active_legislation_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE pack_status text;
BEGIN
    IF TG_TABLE_NAME='payroll_legislation_packs' THEN pack_status:=OLD.status;
    ELSE SELECT status INTO pack_status FROM payroll_legislation_packs
         WHERE company_id=OLD.company_id AND id=OLD.pack_id; END IF;
    IF TG_OP='DELETE' OR pack_status IN ('ACTIVE','SUPERSEDED') THEN
        RAISE EXCEPTION 'active or superseded legislation is immutable' USING ERRCODE='55000',CONSTRAINT='payroll_legislation_immutable';
    END IF;
    RETURN NEW;
END; $$;

--
-- Name: guard_product_variant_identity(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_product_variant_identity() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF (NEW.variant_code IS DISTINCT FROM OLD.variant_code
        OR NEW.variant_signature IS DISTINCT FROM OLD.variant_signature)
       AND EXISTS (SELECT 1 FROM stock_movements WHERE company_id = OLD.company_id AND variant_id = OLD.id) THEN
        RAISE EXCEPTION 'VARIANT_IDENTITY_LOCKED' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_product_variant_mode(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_product_variant_mode() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.variants_enabled IS DISTINCT FROM OLD.variants_enabled THEN
        IF NEW.variants_enabled AND NEW.kind::text <> 'PHYSICAL' THEN
            RAISE EXCEPTION 'VARIANT_PRODUCT_MUST_BE_PHYSICAL' USING ERRCODE = '23514';
        END IF;
        IF EXISTS (
            SELECT 1 FROM stock_movements
             WHERE company_id = NEW.company_id AND product_id = NEW.id
        ) OR EXISTS (
            SELECT 1 FROM stock_positions
             WHERE company_id = NEW.company_id AND product_id = NEW.id
               AND (physical_quantity <> 0 OR reserved_quantity <> 0)
        ) THEN
            RAISE EXCEPTION 'VARIANT_MODE_REQUIRES_EMPTY_STOCK_HISTORY' USING ERRCODE = '55000';
        END IF;
        IF NOT NEW.variants_enabled AND EXISTS (
            SELECT 1 FROM product_variants
             WHERE company_id = NEW.company_id AND product_id = NEW.id
        ) THEN
            RAISE EXCEPTION 'VARIANT_MODE_CANNOT_BE_DISABLED' USING ERRCODE = '55000';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_stock_count_engine_header(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_stock_count_engine_header() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.state IN ('POSTED', 'CANCELLED') AND (
        NEW.company_id IS DISTINCT FROM OLD.company_id OR NEW.id IS DISTINCT FROM OLD.id OR
        NEW.warehouse_id IS DISTINCT FROM OLD.warehouse_id OR NEW.movement_policy IS DISTINCT FROM OLD.movement_policy OR
        NEW.blind_count IS DISTINCT FROM OLD.blind_count OR NEW.scope_mode IS DISTINCT FROM OLD.scope_mode OR
        NEW.snapshot_at IS DISTINCT FROM OLD.snapshot_at OR
        NEW.start_idempotency_key IS DISTINCT FROM OLD.start_idempotency_key
    ) THEN
        RAISE EXCEPTION 'posted or cancelled stock count engine is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_stock_count_engine_metadata(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_stock_count_engine_metadata() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.state IN ('POSTED', 'CANCELLED') AND (
        NEW.count_no IS DISTINCT FROM OLD.count_no OR
        NEW.description IS DISTINCT FROM OLD.description
    ) THEN
        RAISE EXCEPTION 'posted or cancelled stock count metadata is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_system_transit_warehouse(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_system_transit_warehouse() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' THEN
        IF OLD.is_system AND OLD.is_transit THEN
            RAISE EXCEPTION 'WAREHOUSE_SYSTEM' USING ERRCODE = '55000';
        END IF;
        RETURN OLD;
    END IF;

    IF TG_OP = 'UPDATE' AND OLD.is_system AND OLD.is_transit THEN
        RAISE EXCEPTION 'WAREHOUSE_SYSTEM' USING ERRCODE = '55000';
    END IF;

    IF NEW.warehouse_type = 'TRANSIT' OR NEW.is_transit OR NEW.is_system THEN
        IF COALESCE(current_setting('varyaone.allow_system_transit', true), '') <> 'on' THEN
            RAISE EXCEPTION 'WAREHOUSE_SYSTEM' USING ERRCODE = '55000';
        END IF;
        NEW.warehouse_type := 'TRANSIT';
        NEW.is_transit := true;
        NEW.is_system := true;
        NEW.is_active := true;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: guard_transfer_reservation_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION guard_transfer_reservation_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF COALESCE(current_setting('varyaone.allow_transfer_reservation_change', true), '') <> 'on' THEN
        RAISE EXCEPTION 'TRANSFER_RESERVATION_IMMUTABLE' USING ERRCODE = '55000';
    END IF;
    IF TG_OP = 'DELETE' THEN
        RAISE EXCEPTION 'TRANSFER_RESERVATION_IMMUTABLE' USING ERRCODE = '55000';
    END IF;
    IF TG_OP = 'UPDATE' THEN
        IF NEW.company_id IS DISTINCT FROM OLD.company_id
           OR NEW.transfer_id IS DISTINCT FROM OLD.transfer_id
           OR NEW.transfer_line_id IS DISTINCT FROM OLD.transfer_line_id
           OR NEW.warehouse_id IS DISTINCT FROM OLD.warehouse_id
           OR NEW.product_id IS DISTINCT FROM OLD.product_id
           OR NEW.variant_id IS DISTINCT FROM OLD.variant_id
           OR NEW.location_id IS DISTINCT FROM OLD.location_id
           OR NEW.lot_id IS DISTINCT FROM OLD.lot_id
           OR NEW.serial_id IS DISTINCT FROM OLD.serial_id
           OR NEW.quantity IS DISTINCT FROM OLD.quantity
           OR OLD.state <> 'ACTIVE'
           OR NEW.state NOT IN ('CONSUMED', 'RELEASED')
           OR (NEW.state = 'CONSUMED' AND NEW.released_at IS NOT NULL)
           OR (NEW.state = 'RELEASED' AND NEW.consumed_at IS NOT NULL) THEN
            RAISE EXCEPTION 'TRANSFER_RESERVATION_IMMUTABLE' USING ERRCODE = '55000';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: keep_system_transit_unavailable(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION keep_system_transit_unavailable() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    transit boolean;
BEGIN
    SELECT is_transit AND is_system INTO transit
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.warehouse_id;
    IF COALESCE(transit, false) THEN
        NEW.reserved_quantity := NEW.physical_quantity;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: normalize_party_search_text(text); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION normalize_party_search_text(value text) RETURNS text
    LANGUAGE sql IMMUTABLE PARALLEL SAFE
    AS $$
    SELECT regexp_replace(
        translate(
            translate(
                translate(
                    lower(replace(coalesce(value,''),'İ','I')),
                    'ığiüşöçâäàáãåéèëêîïìíñóòôõúùûýÿ',
                    'igiusocaaaaaaeeeeiiiinoooouuuyy'
                ),
                'čćďđłňńøřśšťţžźż',
                'ccddlnnorssttzzz'
            ),
            'āēīōūăĕĭŏŭæœß',
            'aeiouaeiouaos'
        ),
        '[^[:alnum:]]+',
        ' ',
        'g'
    )
$$;

--
-- Name: party_search_detail_trigger(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION party_search_detail_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF COALESCE(current_setting('varyaone.party_search_suppressed', true), '') = 'on' THEN
        RETURN NULL;
    END IF;
    PERFORM refresh_party_search_document(
        COALESCE(NEW.company_id, OLD.company_id),
        COALESCE(NEW.party_id, OLD.party_id)
    );
    RETURN NULL;
END;
$$;

--
-- Name: party_search_ledger_trigger(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION party_search_ledger_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM refresh_party_search_balance(
        COALESCE(NEW.company_id, OLD.company_id),
        COALESCE(NEW.party_id, OLD.party_id)
    );
    RETURN NULL;
END;
$$;

--
-- Name: party_search_party_trigger(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION party_search_party_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF COALESCE(current_setting('varyaone.party_search_suppressed', true), '') = 'on' THEN
        RETURN NULL;
    END IF;
    PERFORM refresh_party_search_document(NEW.company_id, NEW.id);
    RETURN NULL;
END;
$$;

--
-- Name: party_search_related_definition_trigger(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION party_search_related_definition_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    related_id uuid := COALESCE(NEW.id, OLD.id);
    related_company_id uuid;
    item record;
BEGIN
    IF TG_TABLE_NAME = 'party_groups' THEN
        related_company_id := COALESCE(NEW.company_id, OLD.company_id);
        FOR item IN SELECT company_id, party_id FROM party_group_memberships WHERE company_id=related_company_id AND group_id=related_id LOOP
            PERFORM refresh_party_search_document(item.company_id, item.party_id);
        END LOOP;
    ELSIF TG_TABLE_NAME = 'party_tags' THEN
        related_company_id := COALESCE(NEW.company_id, OLD.company_id);
        FOR item IN SELECT company_id, party_id FROM party_tag_assignments WHERE company_id=related_company_id AND tag_id=related_id LOOP
            PERFORM refresh_party_search_document(item.company_id, item.party_id);
        END LOOP;
    ELSIF TG_TABLE_NAME = 'party_custom_field_definitions' THEN
        related_company_id := COALESCE(NEW.company_id, OLD.company_id);
        FOR item IN SELECT company_id, party_id FROM party_custom_field_values WHERE company_id=related_company_id AND definition_id=related_id LOOP
            PERFORM refresh_party_search_document(item.company_id, item.party_id);
        END LOOP;
    ELSIF TG_TABLE_NAME = 'payment_terms' THEN
        related_company_id := COALESCE(NEW.company_id, OLD.company_id);
        FOR item IN SELECT company_id, id AS party_id FROM parties WHERE company_id=related_company_id AND payment_term_id=related_id LOOP
            PERFORM refresh_party_search_document(item.company_id, item.party_id);
        END LOOP;
    ELSIF TG_TABLE_NAME = 'users' THEN
        FOR item IN SELECT company_id, id AS party_id FROM parties WHERE sales_rep_user_id=related_id LOOP
            PERFORM refresh_party_search_document(item.company_id, item.party_id);
        END LOOP;
    END IF;
    RETURN NULL;
END;
$$;

--
-- Name: populate_party_ledger_currency_snapshot(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION populate_party_ledger_currency_snapshot() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    company_currency char(3);
BEGIN
    SELECT c.base_currency INTO company_currency
      FROM companies c
     WHERE c.id = NEW.company_id;
    NEW.base_currency := company_currency;
    NEW.base_amount := ROUND((NEW.debit + NEW.credit) * NEW.exchange_rate, 4);
    RETURN NEW;
END;
$$;

--
-- Name: prevent_used_timesheet_reopen(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION prevent_used_timesheet_reopen() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.status='FINALIZED' AND NEW.status='DRAFT' AND EXISTS (
        SELECT 1 FROM payroll_runs r WHERE r.company_id=OLD.company_id
          AND r.timesheet_period_id=OLD.id AND r.status='FINALIZED') THEN
        RAISE EXCEPTION 'timesheet is used by finalized payroll' USING ERRCODE='55000',CONSTRAINT='timesheet_used_by_finalized_payroll';
    END IF;
    RETURN NEW;
END; $$;

--
-- Name: pricing_seed_default_currencies(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION pricing_seed_default_currencies() RETURNS trigger
    LANGUAGE plpgsql
    AS $_$
BEGIN
    INSERT INTO pricing_currencies(company_id,code,name,symbol,minor_unit,is_custom,source)
    VALUES
        (NEW.id,'TRY','Türk lirası','₺',2,false,'ISO_4217_BASELINE'),
        (NEW.id,'USD','ABD doları','$',2,false,'ISO_4217_BASELINE'),
        (NEW.id,'EUR','Euro','€',2,false,'ISO_4217_BASELINE'),
        (NEW.id,'GBP','İngiliz sterlini','£',2,false,'ISO_4217_BASELINE'),
        (NEW.id,NEW.base_currency,NEW.base_currency,'',2,NEW.base_currency NOT IN ('TRY','USD','EUR','GBP'),'COMPANY_BASE_CURRENCY')
    ON CONFLICT (company_id,code) DO NOTHING;
    RETURN NEW;
END;
$_$;

--
-- Name: refresh_document_search_vector(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION refresh_document_search_vector() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.search_vector :=
        setweight(to_tsvector('simple', coalesce(NEW.document_no, '')), 'A') ||
        setweight(to_tsvector('simple', coalesce(NEW.notes, '')), 'C');
    RETURN NEW;
END;
$$;

--
-- Name: refresh_party_search_balance(uuid, uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION refresh_party_search_balance(target_company_id uuid, target_party_id uuid) RETURNS void
    LANGUAGE sql
    AS $$
    UPDATE party_search_documents d
    SET balance_search=normalize_party_search_text(COALESCE((
        SELECT SUM(e.base_signed_amount)::text
        FROM party_ledger_balance_effects e
        WHERE e.company_id=target_company_id AND e.party_id=target_party_id
    ), '0'))
    WHERE d.company_id=target_company_id AND d.party_id=target_party_id;
$$;

--
-- Name: refresh_party_search_balance_after_document_change(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION refresh_party_search_balance_after_document_change() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM refresh_party_search_balance(NEW.company_id, NEW.party_id);
    RETURN NULL;
END;
$$;

--
-- Name: refresh_party_search_balance_after_party_change(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION refresh_party_search_balance_after_party_change() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM refresh_party_search_balance(NEW.company_id, NEW.id);
    RETURN NULL;
END;
$$;

--
-- Name: refresh_party_search_document(uuid, uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION refresh_party_search_document(target_company_id uuid, target_party_id uuid) RETURNS void
    LANGUAGE plpgsql
    AS $$
BEGIN
    INSERT INTO party_search_documents(company_id, party_id, search_text, balance_search)
    SELECT
        p.company_id,
        p.id,
        normalize_party_search_text(concat_ws(' ',
            to_jsonb(p)::text,
            -- Index both compact and separated code forms.  This lets a
            -- search for CR-000001 find an automatically generated CR000001.
            regexp_replace(
                regexp_replace(coalesce(p.code,''), '([[:alpha:]])([[:digit:]])', '\1 \2', 'g'),
                '([[:digit:]])([[:alpha:]])', '\1 \2', 'g'
            ),
            CASE WHEN p.is_customer THEN 'müşteri' ELSE '' END,
            CASE WHEN p.is_supplier THEN 'tedarikçi' ELSE '' END,
            CASE WHEN p.kind::text = 'PERSON' THEN 'kişi' ELSE 'kurum' END,
            CASE WHEN p.is_active THEN 'aktif' ELSE 'pasif' END,
            CASE WHEN p.payment_term_id IS NULL THEN 'peşin' ELSE '' END,
            COALESCE((SELECT concat_ws(' ',pt.code,pt.name,pt.due_days::text,pt.due_days::text || ' gün')
                FROM payment_terms pt
                WHERE pt.company_id=p.company_id AND pt.id=p.payment_term_id), ''),
            COALESCE((SELECT u.display_name
                FROM users u
                WHERE u.id=p.sales_rep_user_id), ''),
            COALESCE((SELECT string_agg(to_jsonb(a)::text, ' ' ORDER BY a.id)
                FROM party_addresses a
                WHERE a.company_id=p.company_id AND a.party_id=p.id), ''),
            COALESCE((SELECT string_agg(to_jsonb(c)::text, ' ' ORDER BY c.is_primary DESC, c.id)
                FROM party_contacts c
                WHERE c.company_id=p.company_id AND c.party_id=p.id), ''),
            COALESCE((SELECT string_agg(to_jsonb(pg)::text, ' ' ORDER BY pg.id)
                FROM party_group_memberships pgm
                JOIN party_groups pg ON pg.company_id=pgm.company_id AND pg.id=pgm.group_id
                WHERE pgm.company_id=p.company_id AND pgm.party_id=p.id), ''),
            COALESCE((SELECT string_agg(to_jsonb(pt)::text, ' ' ORDER BY pt.id)
                FROM party_tag_assignments pta
                JOIN party_tags pt ON pt.company_id=pta.company_id AND pt.id=pta.tag_id
                WHERE pta.company_id=p.company_id AND pta.party_id=p.id), ''),
            COALESCE((SELECT string_agg(concat_ws(' ', to_jsonb(pd)::text, to_jsonb(pv)::text), ' ' ORDER BY pd.id)
                FROM party_custom_field_values pv
                JOIN party_custom_field_definitions pd ON pd.company_id=pv.company_id AND pd.id=pv.definition_id
                WHERE pv.company_id=p.company_id AND pv.party_id=p.id), '')
        )),
        normalize_party_search_text(COALESCE((SELECT (sum(l.debit)-sum(l.credit))::text
            FROM party_ledger_entries l
            WHERE l.company_id=p.company_id AND l.party_id=p.id AND l.currency=p.default_currency), '0'))
    FROM parties p
    WHERE p.company_id=target_company_id AND p.id=target_party_id
    ON CONFLICT (company_id, party_id) DO UPDATE
        SET search_text=excluded.search_text, balance_search=excluded.balance_search;

    DELETE FROM party_search_documents d
    WHERE d.company_id=target_company_id
      AND d.party_id=target_party_id
      AND NOT EXISTS (
          SELECT 1 FROM parties p WHERE p.company_id=d.company_id AND p.id=d.party_id
      );
END;
$$;

--
-- Name: reject_company_base_currency_change(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_company_base_currency_change() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.base_currency IS DISTINCT FROM OLD.base_currency AND (
        EXISTS (SELECT 1 FROM party_ledger_entries WHERE company_id = OLD.id)
        OR EXISTS (SELECT 1 FROM finance_account_movements WHERE company_id = OLD.id)
        OR EXISTS (SELECT 1 FROM stock_movements WHERE company_id = OLD.id)
        OR EXISTS (SELECT 1 FROM documents WHERE company_id = OLD.id AND posted_at IS NOT NULL)
    ) THEN
        RAISE EXCEPTION 'company base currency is locked after posted history'
            USING ERRCODE = '55000', CONSTRAINT = 'company_base_currency_locked';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_completed_idempotency_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_completed_idempotency_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' AND OLD.status = 'COMPLETED' THEN
        RAISE EXCEPTION 'completed idempotency records are immutable' USING ERRCODE = '55000';
    END IF;
    IF TG_OP = 'DELETE' THEN
        RETURN OLD;
    END IF;
    IF OLD.status = 'COMPLETED' AND (
        NEW.company_id <> OLD.company_id OR
        NEW.idempotency_key <> OLD.idempotency_key OR
        NEW.command_name <> OLD.command_name OR
        NEW.payload_sha256 <> OLD.payload_sha256 OR
        NEW.status <> OLD.status OR
        NEW.response_status IS DISTINCT FROM OLD.response_status OR
        NEW.response_body IS DISTINCT FROM OLD.response_body OR
        NEW.response_headers IS DISTINCT FROM OLD.response_headers OR
        NEW.completed_at IS DISTINCT FROM OLD.completed_at OR
        NEW.actor_user_id IS DISTINCT FROM OLD.actor_user_id OR
        NEW.trace_id IS DISTINCT FROM OLD.trace_id OR
        NEW.created_at IS DISTINCT FROM OLD.created_at
    ) THEN
        RAISE EXCEPTION 'completed idempotency records are immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_edocument_event_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_edocument_event_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'e-document events are append-only' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_employee_advance_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_employee_advance_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
 RAISE EXCEPTION 'posted employee advances are immutable' USING ERRCODE='55000',CONSTRAINT='employee_advances_immutable';
END $$;

--
-- Name: reject_finalized_payroll_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_finalized_payroll_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE target_company uuid; target_run uuid; locked boolean;
BEGIN
    target_company:=COALESCE(NEW.company_id,OLD.company_id);
    IF TG_TABLE_NAME='payroll_runs' THEN target_run:=COALESCE(NEW.id,OLD.id);
    ELSIF TG_TABLE_NAME='payroll_calculation_generations' THEN target_run:=COALESCE(NEW.payroll_run_id,OLD.payroll_run_id);
    ELSIF TG_TABLE_NAME='employee_payrolls' THEN target_run:=COALESCE(NEW.payroll_run_id,OLD.payroll_run_id);
    ELSE SELECT payroll_run_id INTO target_run FROM employee_payrolls
         WHERE company_id=target_company AND id=COALESCE(NEW.employee_payroll_id,OLD.employee_payroll_id); END IF;
    SELECT status='FINALIZED' INTO locked FROM payroll_runs WHERE company_id=target_company AND id=target_run;
    IF locked THEN RAISE EXCEPTION 'finalized payroll is immutable' USING ERRCODE='55000',CONSTRAINT='payroll_finalized_immutable'; END IF;
    RETURN COALESCE(NEW,OLD);
END; $$;

--
-- Name: reject_finalized_timesheet_day_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_finalized_timesheet_day_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE target_company uuid; target_period uuid; locked boolean;
BEGIN
    target_company:=COALESCE(NEW.company_id,OLD.company_id); target_period:=COALESCE(NEW.period_id,OLD.period_id);
    SELECT status='FINALIZED' INTO locked FROM timesheet_periods WHERE company_id=target_company AND id=target_period;
    IF locked THEN RAISE EXCEPTION 'finalized timesheet is immutable' USING ERRCODE='55000',CONSTRAINT='timesheet_days_finalized_immutable'; END IF;
    RETURN COALESCE(NEW,OLD);
END; $$;

--
-- Name: reject_finance_account_delete(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_finance_account_delete() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'finance accounts are deactivated instead of deleted'
        USING ERRCODE = '55000', CONSTRAINT = 'finance_accounts_no_delete';
END;
$$;

--
-- Name: reject_finance_completion_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_finance_completion_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'posted finance records are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_finance_posted_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_finance_posted_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'posted finance records are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_inventory_movement_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_inventory_movement_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'posted stock movements are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_inventory_projection_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_inventory_projection_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' THEN
        RAISE EXCEPTION 'stock position projection cannot be deleted' USING ERRCODE = '55000';
    END IF;
    IF NEW.company_id <> OLD.company_id OR NEW.warehouse_id <> OLD.warehouse_id OR
       NEW.product_id <> OLD.product_id OR NEW.variant_id IS DISTINCT FROM OLD.variant_id OR
       NEW.location_id IS DISTINCT FROM OLD.location_id OR NEW.lot_id IS DISTINCT FROM OLD.lot_id OR
       NEW.serial_id IS DISTINCT FROM OLD.serial_id THEN
        RAISE EXCEPTION 'stock position identity is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_party_ledger_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_party_ledger_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'party ledger entries are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_payroll_artifact_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_payroll_artifact_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'payroll artifacts are immutable' USING ERRCODE='55000',CONSTRAINT='payroll_artifacts_immutable';
END; $$;

--
-- Name: reject_payroll_payment_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_payroll_payment_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
 IF TG_OP = 'DELETE' THEN
  RAISE EXCEPTION 'bordro ödemeleri silinemez' USING ERRCODE='55000',CONSTRAINT='payroll_payments_immutable';
 END IF;
 -- Yalnızca geri alma (PAID -> REVERSED) güncellemesine izin verilir.
 IF OLD.status <> 'PAID' OR NEW.status <> 'REVERSED'
    OR NEW.company_id <> OLD.company_id OR NEW.id <> OLD.id
    OR NEW.payroll_run_id <> OLD.payroll_run_id OR NEW.account_id <> OLD.account_id
    OR NEW.amount <> OLD.amount OR NEW.payment_date <> OLD.payment_date
    OR NEW.finance_movement_id <> OLD.finance_movement_id
    OR NEW.idempotency_key <> OLD.idempotency_key OR NEW.created_by <> OLD.created_by THEN
  RAISE EXCEPTION 'kaydedilmiş bordro ödemesi yalnızca geri alınabilir' USING ERRCODE='55000',CONSTRAINT='payroll_payments_reverse_only';
 END IF;
 RETURN NEW;
END $$;

--
-- Name: reject_posted_commercial_line_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_commercial_line_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $_$
DECLARE
    parent_table text := CASE TG_TABLE_NAME
        WHEN 'sales_quote_lines' THEN 'sales_quotes'
        WHEN 'sales_order_lines' THEN 'sales_orders'
        WHEN 'sales_dispatch_lines' THEN 'sales_dispatches'
        WHEN 'sales_invoice_lines' THEN 'sales_invoices'
        WHEN 'sales_return_lines' THEN 'sales_returns'
        ELSE ''
    END;
    parent_status text;
    document_key uuid;
BEGIN
    IF parent_table = '' THEN
        RAISE EXCEPTION 'unsupported commercial line table';
    END IF;
    document_key := COALESCE(OLD.document_id, NEW.document_id);
    EXECUTE format('SELECT status FROM %I WHERE company_id=$1 AND id=$2', parent_table)
       INTO parent_status USING COALESCE(OLD.company_id, NEW.company_id), document_key;
    IF parent_status IS NULL OR parent_status <> 'DRAFT' THEN
        RAISE EXCEPTION 'only draft commercial document lines can be changed' USING ERRCODE = '55000';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$_$;

--
-- Name: reject_posted_count_header_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_count_header_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' OR (OLD.state IN ('POSTED', 'CANCELLED') AND NEW.state = OLD.state) THEN
        RAISE EXCEPTION 'posted stock count is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_posted_count_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_count_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    count_state text;
    target_company uuid;
    target_count uuid;
BEGIN
    IF TG_OP = 'DELETE' THEN
        target_company := OLD.company_id;
        target_count := OLD.count_id;
    ELSE
        target_company := NEW.company_id;
        target_count := NEW.count_id;
    END IF;
    SELECT state INTO count_state FROM stock_counts
     WHERE company_id = target_company AND id = target_count;
    IF count_state IN ('POSTED', 'CANCELLED') THEN
        RAISE EXCEPTION 'posted stock count is immutable' USING ERRCODE = '55000';
    END IF;
    IF TG_OP = 'DELETE' THEN
        RETURN OLD;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_posted_document_line_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_document_line_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    current_status text;
BEGIN
    SELECT status INTO current_status
    FROM documents
    WHERE company_id = COALESCE(OLD.company_id, NEW.company_id)
      AND id = COALESCE(OLD.document_id, NEW.document_id);
    IF current_status IS NULL OR current_status <> 'DRAFT' THEN
        RAISE EXCEPTION 'only draft document lines can be changed' USING ERRCODE = '55000';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$$;

--
-- Name: reject_posted_document_update(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_document_update() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.status IN ('POSTED', 'CANCELLED') AND NEW.status = OLD.status THEN
        RAISE EXCEPTION 'posted or cancelled documents are immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_posted_landed_cost_line_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_landed_cost_line_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    parent_status text;
BEGIN
    SELECT status INTO parent_status FROM purchase_landed_costs
     WHERE company_id = COALESCE(NEW.company_id, OLD.company_id) AND id = COALESCE(NEW.landed_cost_id, OLD.landed_cost_id);
    IF parent_status IS NULL OR parent_status <> 'DRAFT' THEN
        RAISE EXCEPTION 'only draft landed cost lines can be changed' USING ERRCODE = '55000';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$$;

--
-- Name: reject_posted_landed_cost_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_landed_cost_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.status <> 'DRAFT' THEN
        IF TG_OP = 'DELETE' THEN
            RAISE EXCEPTION 'only a draft landed cost can be deleted' USING ERRCODE = '55000';
        END IF;
        IF NEW.status = 'CANCELLED' AND OLD.status = 'POSTED' AND
           NEW.id = OLD.id AND NEW.amount = OLD.amount AND NEW.goods_receipt_id = OLD.goods_receipt_id THEN
            RETURN NEW; -- cancellation is the only allowed transition off POSTED
        END IF;
        RAISE EXCEPTION 'only a draft landed cost can be changed' USING ERRCODE = '55000';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$$;

--
-- Name: reject_posted_purchase_line_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_purchase_line_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $_$
DECLARE
    parent_table text;
    parent_key text;
    company_key text;
    parent_status text;
BEGIN
    parent_table := CASE TG_TABLE_NAME
        WHEN 'goods_receipt_lines' THEN 'goods_receipts'
        WHEN 'purchase_invoice_lines' THEN 'purchase_invoices'
        WHEN 'purchase_return_lines' THEN 'purchase_returns'
        ELSE ''
    END;
    IF parent_table = '' THEN
        RAISE EXCEPTION 'unsupported purchase line table';
    END IF;
    company_key := COALESCE(to_jsonb(OLD)->>'company_id', to_jsonb(NEW)->>'company_id');
    parent_key := COALESCE(
        to_jsonb(OLD)->>CASE TG_TABLE_NAME
            WHEN 'goods_receipt_lines' THEN 'receipt_id'
            WHEN 'purchase_invoice_lines' THEN 'invoice_id'
            ELSE 'return_id'
        END,
        to_jsonb(NEW)->>CASE TG_TABLE_NAME
            WHEN 'goods_receipt_lines' THEN 'receipt_id'
            WHEN 'purchase_invoice_lines' THEN 'invoice_id'
            ELSE 'return_id'
        END
    );
    EXECUTE format('SELECT status FROM %I WHERE company_id=$1 AND id=$2::uuid', parent_table)
       INTO parent_status USING company_key::uuid, parent_key;
    IF parent_status IS NULL OR parent_status <> 'DRAFT' THEN
        RAISE EXCEPTION 'only draft purchase document lines can be changed' USING ERRCODE = '55000';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$_$;

--
-- Name: reject_posted_purchasing_line_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_purchasing_line_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'posted purchasing lines are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_posted_purchasing_update(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_posted_purchasing_update() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF TG_OP = 'DELETE' THEN
        RAISE EXCEPTION 'posted purchasing records are immutable' USING ERRCODE = '55000';
    END IF;
    IF OLD.status IN ('POSTED','CANCELLED') AND NEW.status = OLD.status THEN
        RAISE EXCEPTION 'posted purchasing records are immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_security_audit_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_security_audit_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'security audit events are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_serial_event_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_serial_event_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'serial number events are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_stock_cost_adjustment_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_cost_adjustment_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'stock cost adjustments are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_stock_cost_consumption_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_cost_consumption_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'stock cost consumptions are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_stock_cost_unpriced_event_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_cost_unpriced_event_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'stock cost unpriced events are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_stock_count_engine_append_only_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_count_engine_append_only_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'stock count engine append-only record is immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_stock_movement_in_locked_count_scope(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_movement_in_locked_count_scope() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.source_type = 'STOCK_COUNT_ENGINE' THEN
        RETURN NEW;
    END IF;
    IF EXISTS (
        SELECT 1
          FROM stock_count_engine_counts c
          JOIN stock_count_engine_scopes s
            ON s.company_id = c.company_id AND s.count_id = c.id
         WHERE c.company_id = NEW.company_id
           AND c.warehouse_id = NEW.warehouse_id
           AND c.state IN ('IN_PROGRESS', 'REVIEW')
           AND c.movement_policy = 'LOCK_SCOPE'
           AND s.product_id = NEW.product_id
           AND s.variant_id IS NOT DISTINCT FROM NEW.variant_id
           AND s.warehouse_id = NEW.warehouse_id
           AND s.location_id IS NOT DISTINCT FROM NEW.location_id
           AND s.lot_id IS NOT DISTINCT FROM NEW.lot_id
           AND s.serial_id IS NOT DISTINCT FROM NEW.serial_id
    ) THEN
        RAISE EXCEPTION 'STOCK_COUNT_SCOPE_LOCKED' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_stock_movement_operation_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_stock_movement_operation_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'posted stock movement operations are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_transfer_discrepancy_resolution_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_transfer_discrepancy_resolution_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'transfer discrepancy resolutions are immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_transfer_header_reroute_after_draft(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_transfer_header_reroute_after_draft() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF OLD.state <> 'DRAFT' AND (
        NEW.company_id IS DISTINCT FROM OLD.company_id OR
        NEW.transfer_type IS DISTINCT FROM OLD.transfer_type OR
        NEW.source_warehouse_id IS DISTINCT FROM OLD.source_warehouse_id OR
        NEW.destination_warehouse_id IS DISTINCT FROM OLD.destination_warehouse_id OR
        NEW.transit_warehouse_id IS DISTINCT FROM OLD.transit_warehouse_id
    ) THEN
        RAISE EXCEPTION 'posted transfer routing is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_transfer_line_mutation_after_request(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_transfer_line_mutation_after_request() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    transfer_state text;
    target_company uuid;
    target_transfer uuid;
BEGIN
    IF TG_OP = 'DELETE' THEN
        target_company := OLD.company_id;
        target_transfer := OLD.transfer_id;
    ELSE
        target_company := NEW.company_id;
        target_transfer := NEW.transfer_id;
    END IF;
    SELECT state INTO transfer_state FROM warehouse_transfers
     WHERE company_id = target_company AND id = target_transfer;
    IF transfer_state IN ('RECEIVED', 'CANCELLED') THEN
        RAISE EXCEPTION 'posted transfer lines are immutable' USING ERRCODE = '55000';
    END IF;
    IF TG_OP = 'DELETE' THEN
        IF transfer_state <> 'DRAFT' THEN
            RAISE EXCEPTION 'posted transfer lines are immutable' USING ERRCODE = '55000';
        END IF;
        RETURN OLD;
    END IF;
    IF transfer_state <> 'DRAFT' AND (
        NEW.company_id IS DISTINCT FROM OLD.company_id OR
        NEW.transfer_id IS DISTINCT FROM OLD.transfer_id OR
        NEW.line_no IS DISTINCT FROM OLD.line_no OR
        NEW.product_id IS DISTINCT FROM OLD.product_id OR
        NEW.variant_id IS DISTINCT FROM OLD.variant_id OR
        NEW.lot_id IS DISTINCT FROM OLD.lot_id OR
        NEW.serial_id IS DISTINCT FROM OLD.serial_id OR
        NEW.source_location_id IS DISTINCT FROM OLD.source_location_id OR
        NEW.destination_location_id IS DISTINCT FROM OLD.destination_location_id OR
        NEW.quantity IS DISTINCT FROM OLD.quantity
    ) THEN
        RAISE EXCEPTION 'posted transfer line identity is immutable' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: reject_transfer_line_snapshot_mutation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_transfer_line_snapshot_mutation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.product_code_snapshot IS NOT DISTINCT FROM OLD.product_code_snapshot
       AND NEW.product_name_snapshot IS NOT DISTINCT FROM OLD.product_name_snapshot
       AND NEW.variant_code_snapshot IS NOT DISTINCT FROM OLD.variant_code_snapshot
       AND NEW.variant_description_snapshot IS NOT DISTINCT FROM OLD.variant_description_snapshot THEN
        RETURN NEW;
    END IF;

    RAISE EXCEPTION 'transfer line display identity is immutable' USING ERRCODE = '55000';
END;
$$;

--
-- Name: reject_uncontrolled_system_transit_movement(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION reject_uncontrolled_system_transit_movement() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    system_transit boolean;
BEGIN
    SELECT is_transit AND is_system INTO system_transit
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.warehouse_id;
    IF COALESCE(system_transit, false)
       AND NOT (
           NEW.source_type = 'WAREHOUSE_TRANSFER'
           AND NEW.movement_type IN ('TRANSFER_IN', 'TRANSFER_OUT', 'WASTE')
       ) THEN
        RAISE EXCEPTION 'WAREHOUSE_SYSTEM' USING ERRCODE = '55000';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: require_active_variant_for_stock_row(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION require_active_variant_for_stock_row() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    variants_enabled boolean;
    product_kind text;
    variant_product uuid;
    variant_active boolean;
BEGIN
    SELECT p.variants_enabled, p.kind::text
      INTO variants_enabled, product_kind
      FROM products p
     WHERE p.company_id = NEW.company_id AND p.id = NEW.product_id;
    IF product_kind = 'PHYSICAL' AND variants_enabled THEN
        IF NEW.variant_id IS NULL THEN
            RAISE EXCEPTION 'VARIANT_REQUIRED' USING ERRCODE = '23514';
        END IF;
        SELECT product_id, is_active INTO variant_product, variant_active
          FROM product_variants
         WHERE company_id = NEW.company_id AND id = NEW.variant_id;
        IF variant_product IS NULL OR variant_product <> NEW.product_id THEN
            RAISE EXCEPTION 'variant does not belong to product' USING ERRCODE = '23514';
        END IF;
        IF NOT variant_active THEN
            RAISE EXCEPTION 'VARIANT_INACTIVE' USING ERRCODE = '23514';
        END IF;
    ELSIF product_kind = 'PHYSICAL' AND NOT variants_enabled AND NEW.variant_id IS NOT NULL THEN
        RAISE EXCEPTION 'variant is not enabled for product' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: seed_company_default_email_templates(uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_email_templates(target_company uuid) RETURNS void
    LANGUAGE sql
    AS $$
    INSERT INTO email_templates(company_id, code, name, scope, subject, body, description, is_system) VALUES
        (target_company, 'PAYSLIP_DEFAULT', 'Ücret hesap pusulası', 'PAYROLL_PAYSLIP',
         '{{donem}} Ücret Hesap Pusulanız',
         E'Sayın {{ad_soyad}},\n\n{{donem}} dönemine ait ücret hesap pusulanız ekte yer almaktadır.\n\nİyi çalışmalar,\n{{firma}}',
         'Bordro ekranından ücret pusulası gönderirken kullanılır.', true),
        (target_company, 'GENEL_BILGILENDIRME', 'Genel bilgilendirme', 'GENERIC',
         '{{firma}} - Bilgilendirme',
         E'Sayın {{ad_soyad}},\n\n\n\nSaygılarımızla,\n{{firma}}',
         'Serbest kullanım için boş bilgilendirme taslağı.', true)
    ON CONFLICT (company_id, code) DO NOTHING;
$$;

--
-- Name: seed_company_default_email_templates_on_membership(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_email_templates_on_membership() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM seed_company_default_email_templates(NEW.company_id);
    RETURN NEW;
END; $$;

--
-- Name: seed_company_default_fixed_asset_categories(uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_fixed_asset_categories(target_company uuid) RETURNS void
    LANGUAGE sql
    AS $$
    INSERT INTO fixed_asset_categories(company_id,code,name,is_system) VALUES
        (target_company,'BILGISAYAR','Bilgisayar / Dizüstü',true),
        (target_company,'TELEFON','Cep Telefonu',true),
        (target_company,'MONITOR','Monitör / Ekran',true),
        (target_company,'MOBILYA','Mobilya',true),
        (target_company,'ARAC','Taşıt / Araç',true),
        (target_company,'MAKINE','Makine ve Teçhizat',true),
        (target_company,'DEMIRBAS','Demirbaş',true),
        (target_company,'YAZILIM','Yazılım Lisansı',true),
        (target_company,'DIGER','Diğer',true)
    ON CONFLICT (company_id,code) DO NOTHING;
$$;

--
-- Name: seed_company_default_fixed_asset_categories_on_membership(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_fixed_asset_categories_on_membership() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM seed_company_default_fixed_asset_categories(NEW.company_id);
    RETURN NEW;
END; $$;

--
-- Name: seed_company_default_leave_types(uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_leave_types(target_company uuid) RETURNS void
    LANGUAGE sql
    AS $$
    INSERT INTO leave_types(id,company_id,code,name,payroll_treatment) VALUES
        (gen_random_uuid(),target_company,'YILLIK','Yıllık ücretli izin','PAID'),
        (gen_random_uuid(),target_company,'MAZERET','Mazeret izni','PAID'),
        (gen_random_uuid(),target_company,'HASTALIK','Hastalık / rapor','SICK_REQUIRES_REVIEW'),
        (gen_random_uuid(),target_company,'UCRETSIZ','Ücretsiz izin','UNPAID'),
        (gen_random_uuid(),target_company,'EVLILIK','Evlilik izni','PAID'),
        (gen_random_uuid(),target_company,'DOGUM','Doğum izni','PAID'),
        (gen_random_uuid(),target_company,'BABALIK','Babalık izni','PAID'),
        (gen_random_uuid(),target_company,'VEFAT','Vefat izni','PAID')
    ON CONFLICT (company_id,code) DO NOTHING;
$$;

--
-- Name: seed_company_default_leave_types_on_membership(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_default_leave_types_on_membership() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM seed_company_default_leave_types(NEW.company_id);
    RETURN NEW;
END; $$;

--
-- Name: seed_company_hr_2026_on_membership(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION seed_company_hr_2026_on_membership() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE calendar_uuid uuid; pack_uuid uuid;
BEGIN
 IF NOT EXISTS(SELECT 1 FROM public_holiday_calendars WHERE company_id=NEW.company_id AND country_code='TR' AND calendar_year=2026) THEN
  calendar_uuid:=gen_random_uuid();
  INSERT INTO public_holiday_calendars(id,company_id,country_code,calendar_year,version,status,source_name,source_url,published_on,activated_at)
  VALUES(calendar_uuid,NEW.company_id,'TR',2026,1,'ACTIVE','T.C. resmî tatil takvimi','https://www.resmigazete.gov.tr/',DATE '2025-12-31',now());
  INSERT INTO public_holidays(id,company_id,calendar_id,calendar_year,holiday_date,name,duration) VALUES
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-01-01','Yılbaşı','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-03-19','Ramazan Bayramı Arifesi','HALF_DAY_AFTERNOON'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-03-20','Ramazan Bayramı 1. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-03-21','Ramazan Bayramı 2. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-03-22','Ramazan Bayramı 3. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-04-23','Ulusal Egemenlik ve Çocuk Bayramı','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-01','Emek ve Dayanışma Günü','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-19','Atatürk''ü Anma, Gençlik ve Spor Bayramı','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-26','Kurban Bayramı Arifesi','HALF_DAY_AFTERNOON'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-27','Kurban Bayramı 1. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-28','Kurban Bayramı 2. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-29','Kurban Bayramı 3. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-05-30','Kurban Bayramı 4. Gün','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-07-15','Demokrasi ve Millî Birlik Günü','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-08-30','Zafer Bayramı','FULL_DAY'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-10-28','Cumhuriyet Bayramı Arifesi','HALF_DAY_AFTERNOON'),
   (gen_random_uuid(),NEW.company_id,calendar_uuid,2026,DATE '2026-10-29','Cumhuriyet Bayramı','FULL_DAY');
 END IF;
 IF NOT EXISTS(SELECT 1 FROM payroll_legislation_packs WHERE company_id=NEW.company_id AND country_code='TR' AND code='TR-2026') THEN
  pack_uuid:=gen_random_uuid();
  INSERT INTO payroll_legislation_packs(id,company_id,country_code,code,version,status,effective_from,effective_to,minimum_monthly_gross,sgk_daily_floor,sgk_daily_ceiling,stamp_tax_rate,source_metadata,activated_at,created_by)
  VALUES(pack_uuid,NEW.company_id,'TR','TR-2026',1,'ACTIVE',DATE '2026-01-01',DATE '2026-12-31',33030.00,1101.00,9909.00,0.00759,
   jsonb_build_object('minimum_wage','https://www.csgb.gov.tr/Media/gm2fekds/asgari-%C3%BCcret-2026.pdf','sgk','https://www.sgk.gov.tr/Content/Post/2e0c9e1a-2cfe-4456-af10-49d3de0c58ba/Prime-Esas-Kazanc-Miktarlari-2026-01-14-10-35-39','income_tax','GİB 332 Seri No.lu Tebliğ','stamp_tax','GİB 71 Seri No.lu Tebliğ'),now(),NEW.user_id);
  INSERT INTO payroll_income_tax_brackets(company_id,pack_id,country_code,sequence,upper_bound,rate) VALUES
   (NEW.company_id,pack_uuid,'TR',1,190000,0.15),(NEW.company_id,pack_uuid,'TR',2,400000,0.20),(NEW.company_id,pack_uuid,'TR',3,1500000,0.27),(NEW.company_id,pack_uuid,'TR',4,5300000,0.35),(NEW.company_id,pack_uuid,'TR',5,NULL,0.40);
  INSERT INTO payroll_contribution_schemes(id,company_id,pack_id,code,name,employee_sgk_rate,employee_unemployment_rate,employer_sgk_rate,employer_unemployment_rate) VALUES
   (gen_random_uuid(),NEW.company_id,pack_uuid,'NO_DISCOUNT','İndirimsiz',0.14,0.01,0.2175,0.02),(gen_random_uuid(),NEW.company_id,pack_uuid,'OTHER_SECTOR','Diğer sektör 2 puan indirim',0.14,0.01,0.1975,0.02),(gen_random_uuid(),NEW.company_id,pack_uuid,'MANUFACTURING','İmalat 5 puan indirim',0.14,0.01,0.1675,0.02);
  INSERT INTO payroll_component_definitions(id,company_id,pack_id,code,name,ownership,component_kind,payment_form) VALUES
   (gen_random_uuid(),NEW.company_id,pack_uuid,'BASE_WAGE','Asıl ücret','SYSTEM','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'OVERTIME','Fazla çalışma','SYSTEM','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'WEEK_REST','Hafta tatili','SYSTEM','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'PUBLIC_HOLIDAY','Genel tatil','SYSTEM','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'BONUS','İkramiye','MANUAL','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'PREMIUM','Prim','MANUAL','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'MEAL','Yemek yardımı','MANUAL','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'TRANSPORT','Ulaşım yardımı','MANUAL','EARNING','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'ADVANCE','Avans','MANUAL','DEDUCTION','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'OTHER_DEDUCTION','Diğer kesinti','MANUAL','DEDUCTION','CASH'),(gen_random_uuid(),NEW.company_id,pack_uuid,'ROUNDING_ADJUSTMENT','Yuvarlama farkı','SYSTEM','DEDUCTION','CASH');
 END IF;
 RETURN NEW;
END; $$;

--
-- Name: set_stock_movement_operation_id(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION set_stock_movement_operation_id() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.source_type = 'STOCK_MOVEMENT_OPERATION' THEN
        NEW.operation_id := NEW.source_id;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: set_transfer_line_identity_snapshots(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION set_transfer_line_identity_snapshots() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    product_code_value text;
    product_name_value text;
    variant_code_value text;
    variant_description_value text;
BEGIN
    SELECT p.code, p.name
      INTO product_code_value, product_name_value
      FROM products p
     WHERE p.company_id = NEW.company_id
       AND p.id = NEW.product_id;
    IF product_code_value IS NULL OR product_name_value IS NULL THEN
        RAISE EXCEPTION 'transfer line product does not exist' USING ERRCODE = '23514';
    END IF;

    NEW.product_code_snapshot := product_code_value;
    NEW.product_name_snapshot := product_name_value;
    NEW.variant_code_snapshot := '';
    NEW.variant_description_snapshot := '';

    IF NEW.variant_id IS NOT NULL THEN
        SELECT pv.variant_code,
               COALESCE(
                   NULLIF(string_agg(o.name, ' / ' ORDER BY COALESCE(pvd.position, 32767), vv.definition_id), ''),
                   pv.variant_code
               )
          INTO variant_code_value, variant_description_value
          FROM product_variants pv
          LEFT JOIN product_variant_values vv
            ON vv.company_id = pv.company_id
           AND vv.variant_id = pv.id
          LEFT JOIN variant_definition_options o
            ON o.company_id = vv.company_id
           AND o.definition_id = vv.definition_id
           AND o.id = vv.option_id
          LEFT JOIN product_variant_definitions pvd
            ON pvd.company_id = pv.company_id
           AND pvd.product_id = pv.product_id
           AND pvd.definition_id = vv.definition_id
         WHERE pv.company_id = NEW.company_id
           AND pv.id = NEW.variant_id
         GROUP BY pv.variant_code;
        IF variant_code_value IS NULL THEN
            RAISE EXCEPTION 'transfer line variant does not exist' USING ERRCODE = '23514';
        END IF;
        NEW.variant_code_snapshot := variant_code_value;
        NEW.variant_description_snapshot := COALESCE(variant_description_value, variant_code_value);
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: tax_seed_turkey_simple_tax_definitions(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION tax_seed_turkey_simple_tax_definitions() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM tax_seed_turkey_simple_tax_definitions_for_company(NEW.id);
    RETURN NEW;
END;
$$;

--
-- Name: tax_seed_turkey_simple_tax_definitions_for_company(uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION tax_seed_turkey_simple_tax_definitions_for_company(company_uuid uuid) RETURNS void
    LANGUAGE plpgsql
    AS $$
DECLARE
    item record;
    definition_id uuid;
BEGIN
    FOR item IN SELECT * FROM (VALUES
        ('BSMV',   'BSMV',          NULL::numeric),
        ('DAMGA',  'Damga Vergisi', NULL::numeric),
        ('DIGER',  'Diğer Vergi',   NULL::numeric),
        ('KDV_0',  'KDV %0',        0::numeric),
        ('KDV_1',  'KDV %1',        1::numeric),
        ('KDV_10', 'KDV %10',      10::numeric),
        ('KDV_20', 'KDV %20',      20::numeric),
        ('OIV',    'ÖİV',           NULL::numeric),
        ('OTV',    'ÖTV',           NULL::numeric)
    ) AS defaults(code, name, default_rate)
    LOOP
        INSERT INTO tax_definitions(id, company_id, code, name, description, source, source_reference, source_version)
        VALUES (
            gen_random_uuid(), company_uuid, item.code, item.name,
            CASE WHEN item.code LIKE 'KDV_%' THEN 'Türkiye KDV tanımı' ELSE 'Türkiye ek vergi tanımı' END,
            'TR_TAX_LOCALIZATION', 'Varya temel vergi kataloğu', '2026-01'
        )
        ON CONFLICT (company_id, code) DO NOTHING;

        IF item.default_rate IS NOT NULL THEN
            SELECT id INTO definition_id
            FROM tax_definitions
            WHERE company_id = company_uuid AND code = item.code;

            INSERT INTO tax_rates(
                id, company_id, tax_definition_id, rate, calculation_type,
                valid_from, source, source_reference, source_version
            )
            SELECT gen_random_uuid(), company_uuid, definition_id, item.default_rate, 'PERCENTAGE',
                   DATE '2023-07-10', 'TR_TAX_LOCALIZATION', 'Varya temel vergi kataloğu', '2026-01'
            WHERE NOT EXISTS (
                SELECT 1 FROM tax_rates
                WHERE company_id = company_uuid
                  AND tax_definition_id = definition_id
                  AND valid_from = DATE '2023-07-10'
            );
        END IF;
    END LOOP;
END;
$$;

--
-- Name: tax_seed_turkey_vat_catalog(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION tax_seed_turkey_vat_catalog() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    PERFORM tax_seed_turkey_vat_catalog_for_company(NEW.id);
    RETURN NEW;
END;
$$;

--
-- Name: tax_seed_turkey_vat_catalog_for_company(uuid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION tax_seed_turkey_vat_catalog_for_company(company_uuid uuid) RETURNS void
    LANGUAGE plpgsql
    AS $$
DECLARE
    definition_id uuid;
    item record;
BEGIN
    FOR item IN SELECT * FROM (VALUES
        ('KDV_0', 'KDV %0', '0'),
        ('KDV_1', 'KDV %1', '1'),
        ('KDV_10', 'KDV %10', '10'),
        ('KDV_20', 'KDV %20', '20')
    ) AS defaults(code, name, rate)
    LOOP
        INSERT INTO tax_definitions(id, company_id, code, name, description, source, source_reference, source_version)
        VALUES (gen_random_uuid(), company_uuid, item.code, item.name,
                'Türkiye KDV varsayılanı', 'TR_TAX_LOCALIZATION', 'GİB KDV oranları', '2026-01')
        ON CONFLICT (company_id, code) DO NOTHING;

        SELECT id INTO definition_id FROM tax_definitions
        WHERE company_id = company_uuid AND code = item.code;
        IF NOT EXISTS (
            SELECT 1 FROM tax_rates
            WHERE company_id = company_uuid AND tax_definition_id = definition_id
              AND valid_from = DATE '2023-07-10'
        ) THEN
            INSERT INTO tax_rates(id, company_id, tax_definition_id, rate, valid_from, source, source_reference, source_version)
            VALUES (gen_random_uuid(), company_uuid, definition_id, item.rate::numeric, DATE '2023-07-10',
                    'TR_TAX_LOCALIZATION', 'GİB KDV oranları', '2026-01');
        END IF;
    END LOOP;
END;
$$;

--
-- Name: update_party_search_vector(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION update_party_search_vector() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.search_vector := to_tsvector('simple'::regconfig, concat_ws(' ', NEW.search_text, NEW.balance_search));
    RETURN NEW;
END;
$$;

--
-- Name: validate_commercial_line_product(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_commercial_line_product() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    product_kind text;
    variant_product uuid;
BEGIN
    IF NEW.product_id IS NOT NULL THEN
        SELECT kind::text INTO product_kind FROM products
         WHERE company_id=NEW.company_id AND id=NEW.product_id AND is_active;
        IF product_kind IS NULL OR
           (NEW.line_type = 'PRODUCT' AND product_kind <> 'PHYSICAL') OR
           (NEW.line_type = 'SERVICE' AND product_kind <> 'SERVICE') THEN
            RAISE EXCEPTION 'commercial line product kind does not match line type' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.line_type <> 'SERVICE' THEN
        RAISE EXCEPTION 'product line requires a product' USING ERRCODE = '23514';
    END IF;
    IF NEW.variant_id IS NOT NULL THEN
        SELECT product_id INTO variant_product FROM product_variants
         WHERE company_id=NEW.company_id AND id=NEW.variant_id AND is_active;
        IF variant_product IS NULL OR variant_product <> NEW.product_id THEN
            RAISE EXCEPTION 'commercial line variant does not belong to product' USING ERRCODE = '23514';
        END IF;
    END IF;
    IF NEW.line_type = 'PRODUCT' AND NEW.warehouse_id IS NULL THEN
        RAISE EXCEPTION 'product commercial line requires a warehouse' USING ERRCODE = '23514';
    END IF;
    IF NEW.line_type = 'SERVICE' AND NEW.warehouse_id IS NOT NULL THEN
        RAISE EXCEPTION 'service commercial line cannot have a warehouse' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_document_line_variant(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_document_line_variant() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    enabled boolean;
    kind text;
    variant_product uuid;
    variant_active boolean;
    stock_effect text;
BEGIN
    SELECT p.variants_enabled, p.kind::text INTO enabled, kind
      FROM products p
     WHERE p.company_id = NEW.company_id AND p.id = NEW.product_id;
    IF NEW.variant_id IS NOT NULL THEN
        SELECT product_id, is_active INTO variant_product, variant_active
          FROM product_variants
         WHERE company_id = NEW.company_id AND id = NEW.variant_id;
        IF variant_product IS NULL OR variant_product <> NEW.product_id THEN
            RAISE EXCEPTION 'variant does not belong to product' USING ERRCODE = '23514';
        END IF;
        IF NOT COALESCE(enabled, false) OR NOT COALESCE(variant_active, false) THEN
            RAISE EXCEPTION 'document line variant is inactive or not enabled' USING ERRCODE = '23514';
        END IF;
    ELSIF COALESCE(enabled, false) AND kind = 'PHYSICAL' THEN
        SELECT dt.stock_effect INTO stock_effect
          FROM documents d JOIN document_types dt ON dt.code = d.document_type_code
         WHERE d.company_id = NEW.company_id AND d.id = NEW.document_id;
        IF stock_effect IN ('IN', 'OUT') THEN
            RAISE EXCEPTION 'VARIANT_REQUIRED' USING ERRCODE = '23514';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_inventory_location(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_inventory_location() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    warehouse_active boolean;
    warehouse_uses_locations boolean;
    parent_active boolean;
BEGIN
    SELECT is_active, uses_locations
      INTO warehouse_active, warehouse_uses_locations
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.warehouse_id;
    IF NOT COALESCE(warehouse_active, false) THEN
        RAISE EXCEPTION 'warehouse is inactive' USING ERRCODE = '23514';
    END IF;
    IF NOT COALESCE(warehouse_uses_locations, false) THEN
        RAISE EXCEPTION 'warehouse does not use locations' USING ERRCODE = '23514';
    END IF;
    IF NEW.parent_id IS NOT NULL THEN
        SELECT is_active INTO parent_active
          FROM locations
         WHERE company_id = NEW.company_id
           AND warehouse_id = NEW.warehouse_id
           AND id = NEW.parent_id;
        IF NOT COALESCE(parent_active, false) THEN
            RAISE EXCEPTION 'location parent is inactive or missing' USING ERRCODE = '23514';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_inventory_movement(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_inventory_movement() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    product_kind text;
    variant_product uuid;
    lot_product uuid;
    serial_product uuid;
    serial_status text;
    serial_warehouse uuid;
    lot_expiry date;
    expiry_policy text;
    location_warehouse uuid;
BEGIN
    SELECT kind::text INTO product_kind FROM products
     WHERE company_id = NEW.company_id AND id = NEW.product_id;
    IF product_kind IS NULL OR product_kind <> 'PHYSICAL' THEN
        RAISE EXCEPTION 'stock movement requires a physical product' USING ERRCODE = '23514';
    END IF;
    IF NEW.variant_id IS NOT NULL THEN
        SELECT product_id INTO variant_product FROM product_variants
         WHERE company_id = NEW.company_id AND id = NEW.variant_id;
        IF variant_product IS NULL OR variant_product <> NEW.product_id THEN
            RAISE EXCEPTION 'variant does not belong to product' USING ERRCODE = '23514';
        END IF;
    END IF;
    IF NEW.location_id IS NOT NULL THEN
        SELECT warehouse_id INTO location_warehouse FROM locations
         WHERE company_id = NEW.company_id AND id = NEW.location_id AND is_active;
        IF location_warehouse IS NULL OR location_warehouse <> NEW.warehouse_id THEN
            RAISE EXCEPTION 'location does not belong to warehouse' USING ERRCODE = '23514';
        END IF;
    END IF;
    IF NEW.reason_code = 'OTHER' AND btrim(NEW.reason_description) = '' THEN
        RAISE EXCEPTION 'OTHER movement reason requires a description' USING ERRCODE = '23514';
    END IF;
    IF NEW.movement_type IN ('MANUAL_ADJUSTMENT', 'DAMAGE', 'WASTE')
       AND (btrim(NEW.reason_code) = '' OR NEW.reason_code = 'SYSTEM') THEN
        RAISE EXCEPTION 'manual stock movement requires a reason code' USING ERRCODE = '23514';
    END IF;
    IF NEW.lot_id IS NOT NULL THEN
        SELECT product_id, expires_at INTO lot_product, lot_expiry FROM lots
         WHERE company_id = NEW.company_id AND id = NEW.lot_id;
        IF lot_product IS NULL OR lot_product <> NEW.product_id THEN
            RAISE EXCEPTION 'lot does not belong to product' USING ERRCODE = '23514';
        END IF;
        SELECT COALESCE(expired_lot_policy, 'BLOCK') INTO expiry_policy
          FROM inventory_company_policies WHERE company_id = NEW.company_id;
        IF lot_expiry IS NOT NULL AND lot_expiry < NEW.posted_at::date
           AND COALESCE(expiry_policy, 'BLOCK') = 'BLOCK'
           AND NOT NEW.expiry_override THEN
            RAISE EXCEPTION 'LOT_EXPIRED' USING ERRCODE = '23514';
        END IF;
        IF NEW.expiry_override AND btrim(NEW.expiry_override_reason) = '' THEN
            RAISE EXCEPTION 'expired lot override requires a reason' USING ERRCODE = '23514';
        END IF;
    END IF;
    IF NEW.serial_id IS NOT NULL THEN
        IF NEW.quantity <> 1 THEN
            RAISE EXCEPTION 'serial movement quantity must be one' USING ERRCODE = '23514';
        END IF;
        SELECT product_id, status, active_warehouse_id
          INTO serial_product, serial_status, serial_warehouse
          FROM serial_numbers
         WHERE company_id = NEW.company_id AND id = NEW.serial_id
         FOR UPDATE;
        IF serial_product IS NULL OR serial_product <> NEW.product_id THEN
            RAISE EXCEPTION 'serial does not belong to product' USING ERRCODE = '23514';
        END IF;
        IF NEW.direction = 'OUT' AND (serial_warehouse IS NULL OR serial_warehouse <> NEW.warehouse_id) THEN
            RAISE EXCEPTION 'SERIAL_NOT_AVAILABLE' USING ERRCODE = '23514';
        END IF;
        IF NEW.direction = 'IN' AND serial_warehouse IS NOT NULL THEN
            RAISE EXCEPTION 'SERIAL_ALREADY_IN_STOCK' USING ERRCODE = '23514';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_price_entry_variant_target(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_price_entry_variant_target() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    variant_product uuid;
BEGIN
    IF NEW.variant_id IS NULL THEN
        RETURN NEW;
    END IF;
    SELECT product_id INTO variant_product
      FROM product_variants
     WHERE company_id = NEW.company_id AND id = NEW.variant_id;
    IF variant_product IS NULL OR variant_product <> NEW.item_id THEN
        RAISE EXCEPTION 'price entry variant does not belong to item' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_product_barcode_target(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_product_barcode_target() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    variants_enabled boolean;
    product_kind text;
    variant_product uuid;
BEGIN
    SELECT p.variants_enabled, p.kind::text
      INTO variants_enabled, product_kind
      FROM products p
     WHERE p.company_id = NEW.company_id AND p.id = NEW.product_id;
    IF product_kind IS NULL THEN
        RAISE EXCEPTION 'product barcode product does not exist' USING ERRCODE = '23514';
    END IF;
    IF NEW.variant_id IS NOT NULL THEN
        SELECT product_id INTO variant_product
          FROM product_variants
         WHERE company_id = NEW.company_id AND id = NEW.variant_id;
        IF variant_product IS NULL OR variant_product <> NEW.product_id OR NOT variants_enabled THEN
            RAISE EXCEPTION 'variant barcode target is invalid' USING ERRCODE = '23514';
        END IF;
    ELSIF variants_enabled THEN
        RAISE EXCEPTION 'variant barcode requires a variant' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_product_variant_values(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_product_variant_values() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    v_company_id uuid;
    v_variant_id uuid;
    v_product_id uuid;
    v_variants_enabled boolean;
    v_definition_count integer;
    v_value_count integer;
    v_invalid_option boolean;
BEGIN
    v_company_id := COALESCE(NEW.company_id, OLD.company_id);
    v_variant_id := COALESCE(NEW.variant_id, OLD.variant_id);

    SELECT pv.product_id, p.variants_enabled
      INTO v_product_id, v_variants_enabled
      FROM product_variants AS pv
      JOIN products AS p
        ON p.company_id = pv.company_id
       AND p.id = pv.product_id
     WHERE pv.company_id = v_company_id
       AND pv.id = v_variant_id;
    IF v_product_id IS NULL OR NOT v_variants_enabled THEN
        RAISE EXCEPTION 'variant values require an enabled variant product' USING ERRCODE = '23514';
    END IF;

    SELECT count(*)
      INTO v_definition_count
      FROM product_variant_definitions AS pvd
     WHERE pvd.company_id = v_company_id
       AND pvd.product_id = v_product_id;
    SELECT count(*)
      INTO v_value_count
      FROM product_variant_values AS pvv
     WHERE pvv.company_id = v_company_id
       AND pvv.variant_id = v_variant_id;
    SELECT EXISTS (
        SELECT 1
          FROM product_variant_values AS pvv
         WHERE pvv.company_id = v_company_id
           AND pvv.variant_id = v_variant_id
           AND NOT EXISTS (
               SELECT 1
                 FROM product_variant_allowed_options AS pvao
                WHERE pvao.company_id = pvv.company_id
                  AND pvao.product_id = v_product_id
                  AND pvao.definition_id = pvv.definition_id
                  AND pvao.option_id = pvv.option_id
           )
    ) INTO v_invalid_option;
    IF v_definition_count <> v_value_count OR v_invalid_option THEN
        RAISE EXCEPTION 'variant values do not match product variant configuration' USING ERRCODE = '23514';
    END IF;
    RETURN COALESCE(NEW, OLD);
END;
$$;

--
-- Name: validate_transfer_discrepancy_resolution(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_transfer_discrepancy_resolution() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    transfer_state text;
    line_transfer_id uuid;
    shipped numeric(24,8);
    received numeric(24,8);
    resolved numeric(24,8);
BEGIN
    -- Always acquire the parent transfer lock before the line lock. Service
    -- commands use the same order, preventing a resolution INSERT from
    -- deadlocking with receive/ship operations.
    SELECT state
      INTO transfer_state
      FROM warehouse_transfers
     WHERE company_id = NEW.company_id AND id = NEW.transfer_id
     FOR UPDATE;
    SELECT transfer_id, shipped_quantity, received_quantity
      INTO line_transfer_id, shipped, received
      FROM warehouse_transfer_lines
     WHERE company_id = NEW.company_id AND id = NEW.transfer_line_id
     FOR UPDATE;
    IF line_transfer_id IS NULL OR line_transfer_id <> NEW.transfer_id THEN
        RAISE EXCEPTION 'transfer discrepancy line does not belong to transfer' USING ERRCODE = '23514';
    END IF;
    IF transfer_state IS NULL OR transfer_state NOT IN ('IN_TRANSIT', 'PARTIALLY_RECEIVED') THEN
        RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
    END IF;
    SELECT COALESCE(SUM(quantity), 0)
      INTO resolved
      FROM warehouse_transfer_discrepancy_resolutions
     WHERE company_id = NEW.company_id AND transfer_line_id = NEW.transfer_line_id;
    IF resolved + NEW.quantity > shipped - received THEN
        RAISE EXCEPTION 'transfer discrepancy quantity exceeds transit quantity' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_transfer_endpoints(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_transfer_endpoints() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF NEW.source_warehouse_id = NEW.destination_warehouse_id THEN
        RAISE EXCEPTION 'WAREHOUSE_TRANSFER_SAME_WAREHOUSE' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_transfer_stock_conservation(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_transfer_stock_conservation() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    target_transfer uuid;
    transfer_state text;
    source_warehouse uuid;
    destination_warehouse uuid;
    transit_warehouse uuid;
    line record;
    source_out numeric(24,8);
    transit_in numeric(24,8);
    transit_out numeric(24,8);
    transit_waste numeric(24,8);
    endpoint_in numeric(24,8);
BEGIN
    IF TG_TABLE_NAME = 'stock_movements' THEN
        target_transfer := NEW.transfer_id;
    ELSE
        target_transfer := NEW.id;
    END IF;
    IF target_transfer IS NULL THEN
        RETURN NEW;
    END IF;

    SELECT state, source_warehouse_id, destination_warehouse_id, transit_warehouse_id
      INTO transfer_state, source_warehouse, destination_warehouse, transit_warehouse
      FROM warehouse_transfers
     WHERE company_id = NEW.company_id AND id = target_transfer;
    IF transfer_state IS NULL THEN
        RETURN NEW;
    END IF;

    FOR line IN
        SELECT id, shipped_quantity
          FROM warehouse_transfer_lines
         WHERE company_id = NEW.company_id AND transfer_id = target_transfer
         ORDER BY line_no
    LOOP
        SELECT
            COALESCE(SUM(quantity) FILTER (
                WHERE warehouse_id = source_warehouse AND direction = 'OUT'
                  AND movement_type = 'TRANSFER_OUT'), 0),
            COALESCE(SUM(quantity) FILTER (
                WHERE warehouse_id = transit_warehouse AND direction = 'IN'
                  AND movement_type = 'TRANSFER_IN'), 0),
            COALESCE(SUM(quantity) FILTER (
                WHERE warehouse_id = transit_warehouse AND direction = 'OUT'
                  AND movement_type = 'TRANSFER_OUT'), 0),
            COALESCE(SUM(quantity) FILTER (
                WHERE warehouse_id = transit_warehouse AND direction = 'OUT'
                  AND movement_type = 'WASTE'), 0),
            COALESCE(SUM(quantity) FILTER (
                WHERE warehouse_id IN (source_warehouse, destination_warehouse)
                  AND direction = 'IN' AND movement_type = 'TRANSFER_IN'), 0)
          INTO source_out, transit_in, transit_out, transit_waste, endpoint_in
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = target_transfer
           AND source_line_id = line.id;

        IF line.shipped_quantity > 0
           AND (source_out <> line.shipped_quantity OR transit_in <> line.shipped_quantity) THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_STOCK_NOT_CONSERVED' USING ERRCODE = '23514';
        END IF;
        IF transit_out <> endpoint_in THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_STOCK_NOT_CONSERVED' USING ERRCODE = '23514';
        END IF;
        IF transit_out + transit_waste > transit_in THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_STOCK_NOT_CONSERVED' USING ERRCODE = '23514';
        END IF;
        IF transfer_state IN ('RECEIVED', 'CANCELLED')
           AND line.shipped_quantity > 0
           AND transit_out + transit_waste <> transit_in THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_STOCK_NOT_CONSERVED' USING ERRCODE = '23514';
        END IF;
    END LOOP;
    RETURN NEW;
END;
$$;

--
-- Name: validate_transfer_stock_movement(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_transfer_stock_movement() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    transfer_state text;
    source_warehouse uuid;
    destination_warehouse uuid;
    transit_warehouse uuid;
    line_transfer uuid;
    line_product uuid;
    line_variant uuid;
    line_source_location uuid;
    line_destination_location uuid;
    line_lot uuid;
    line_serial uuid;
    line_quantity numeric(24,8);
    line_shipped numeric(24,8);
    existing_quantity numeric(24,8);
    transit_out_quantity numeric(24,8);
    endpoint_in_quantity numeric(24,8);
    current_physical numeric(24,8);
    current_reserved numeric(24,8);
    position_lock_key text;
BEGIN
    IF NEW.movement_type IN ('TRANSFER_IN', 'TRANSFER_OUT')
       AND NEW.source_type <> 'WAREHOUSE_TRANSFER' THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;
    IF NEW.source_type <> 'WAREHOUSE_TRANSFER' THEN
        RETURN NEW;
    END IF;
    IF NEW.source_line_id IS NULL
       OR NEW.transfer_id IS DISTINCT FROM NEW.source_id
       OR NEW.transfer_line_id IS DISTINCT FROM NEW.source_line_id THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;

    -- All transfer commands use this lock order: aggregate, line, position.
    SELECT state, source_warehouse_id, destination_warehouse_id, transit_warehouse_id
      INTO transfer_state, source_warehouse, destination_warehouse, transit_warehouse
      FROM warehouse_transfers
     WHERE company_id = NEW.company_id AND id = NEW.transfer_id
     FOR UPDATE;
    IF transfer_state IS NULL THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;

    SELECT transfer_id, product_id, variant_id, source_location_id, destination_location_id, lot_id, serial_id,
           quantity, shipped_quantity
      INTO line_transfer, line_product, line_variant, line_source_location, line_destination_location, line_lot, line_serial,
           line_quantity, line_shipped
      FROM warehouse_transfer_lines
     WHERE company_id = NEW.company_id AND id = NEW.transfer_line_id
     FOR UPDATE;
    IF line_transfer IS NULL OR line_transfer <> NEW.transfer_id
       OR line_product <> NEW.product_id
       OR line_variant IS DISTINCT FROM NEW.variant_id
       OR line_lot IS DISTINCT FROM NEW.lot_id
       OR line_serial IS DISTINCT FROM NEW.serial_id THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;

    IF NEW.warehouse_id = source_warehouse
       AND NEW.direction = 'OUT' AND NEW.movement_type = 'TRANSFER_OUT' THEN
        IF transfer_state <> 'APPROVED'
           OR line_source_location IS DISTINCT FROM NEW.location_id THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
        END IF;
        SELECT COALESCE(SUM(quantity), 0)
          INTO existing_quantity
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = NEW.transfer_id
           AND source_line_id = NEW.transfer_line_id
           AND warehouse_id = source_warehouse
           AND direction = 'OUT'
           AND movement_type = 'TRANSFER_OUT';
        IF existing_quantity + NEW.quantity > line_quantity THEN
            RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.warehouse_id = transit_warehouse
          AND NEW.direction = 'IN' AND NEW.movement_type = 'TRANSFER_IN' THEN
        IF transfer_state <> 'APPROVED' OR NEW.location_id IS NOT NULL THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
        END IF;
        SELECT COALESCE(SUM(quantity), 0)
          INTO existing_quantity
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = NEW.transfer_id
           AND source_line_id = NEW.transfer_line_id
           AND warehouse_id = transit_warehouse
           AND direction = 'IN'
           AND movement_type = 'TRANSFER_IN';
        IF existing_quantity + NEW.quantity > line_quantity THEN
            RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.warehouse_id = transit_warehouse
          AND NEW.direction = 'OUT'
          AND NEW.movement_type IN ('TRANSFER_OUT', 'WASTE') THEN
        IF transfer_state NOT IN ('IN_TRANSIT', 'PARTIALLY_RECEIVED')
           OR NEW.location_id IS NOT NULL THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
        END IF;
        SELECT COALESCE(SUM(quantity), 0)
          INTO existing_quantity
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = NEW.transfer_id
           AND source_line_id = NEW.transfer_line_id
           AND warehouse_id = transit_warehouse
           AND direction = 'OUT';
        IF existing_quantity + NEW.quantity > line_shipped THEN
            RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
        END IF;
    ELSIF NEW.warehouse_id IN (source_warehouse, destination_warehouse)
          AND NEW.direction = 'IN' AND NEW.movement_type = 'TRANSFER_IN' THEN
        IF transfer_state NOT IN ('IN_TRANSIT', 'PARTIALLY_RECEIVED') THEN
            RAISE EXCEPTION 'WAREHOUSE_TRANSFER_INVALID_STATE' USING ERRCODE = '55000';
        END IF;
        IF (NEW.warehouse_id = source_warehouse
              AND line_source_location IS DISTINCT FROM NEW.location_id)
           OR (NEW.warehouse_id = destination_warehouse
              AND line_destination_location IS DISTINCT FROM NEW.location_id) THEN
            RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
        END IF;
        SELECT COALESCE(SUM(quantity), 0)
          INTO transit_out_quantity
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = NEW.transfer_id
           AND source_line_id = NEW.transfer_line_id
           AND warehouse_id = transit_warehouse
           AND direction = 'OUT'
           AND movement_type = 'TRANSFER_OUT';
        SELECT COALESCE(SUM(quantity), 0)
          INTO endpoint_in_quantity
          FROM stock_movements
         WHERE company_id = NEW.company_id
           AND source_type = 'WAREHOUSE_TRANSFER'
           AND source_id = NEW.transfer_id
           AND source_line_id = NEW.transfer_line_id
           AND warehouse_id IN (source_warehouse, destination_warehouse)
           AND direction = 'IN'
           AND movement_type = 'TRANSFER_IN';
        IF endpoint_in_quantity + NEW.quantity > transit_out_quantity THEN
            RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
        END IF;
    ELSE
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;

    -- Ordinary warehouse TRANSFER_OUT consumes available stock. The transit
    -- warehouse is intentionally fully reserved, so controlled transit OUT
    -- consumes physical stock; the transfer-state and shipped-quantity checks
    -- above constrain that exception.
    IF NEW.movement_type = 'TRANSFER_OUT' AND NEW.direction = 'OUT' THEN
        position_lock_key := NEW.company_id::text || ':' || NEW.warehouse_id::text || ':' ||
            NEW.product_id::text || ':' || COALESCE(NEW.variant_id::text, '-') || ':' ||
            COALESCE(NEW.location_id::text, '-') || ':' || COALESCE(NEW.lot_id::text, '-') || ':' ||
            COALESCE(NEW.serial_id::text, '-');
        PERFORM pg_advisory_xact_lock(hashtextextended(position_lock_key, 731));
        SELECT physical_quantity, reserved_quantity
          INTO current_physical, current_reserved
          FROM stock_positions
         WHERE company_id = NEW.company_id AND warehouse_id = NEW.warehouse_id
           AND product_id = NEW.product_id
           AND variant_id IS NOT DISTINCT FROM NEW.variant_id
           AND location_id IS NOT DISTINCT FROM NEW.location_id
           AND lot_id IS NOT DISTINCT FROM NEW.lot_id
           AND serial_id IS NOT DISTINCT FROM NEW.serial_id
         FOR UPDATE;
        IF (NEW.warehouse_id = transit_warehouse
                AND COALESCE(current_physical, 0) < NEW.quantity)
           OR (NEW.warehouse_id <> transit_warehouse
                AND COALESCE(current_physical, 0) - COALESCE(current_reserved, 0) < NEW.quantity) THEN
            RAISE EXCEPTION 'INSUFFICIENT_STOCK' USING ERRCODE = '23514';
        END IF;
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_transfer_warehouses(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_transfer_warehouses() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    source_ok boolean;
    destination_ok boolean;
    transit_ok boolean;
    source_active boolean;
    source_type text;
    destination_active boolean;
    destination_type text;
    transit_active boolean;
    transit_type text;
    transit_system boolean;
BEGIN
    -- Lock all referenced warehouses in a deterministic order. This keeps
    -- reciprocal transfers from deadlocking while a lifecycle update waits
    -- on the same warehouse rows.
    PERFORM 1
      FROM warehouses
     WHERE company_id = NEW.company_id
       AND id IN (NEW.source_warehouse_id, NEW.destination_warehouse_id, NEW.transit_warehouse_id)
     ORDER BY id
     FOR UPDATE;

    SELECT is_active, warehouse_type
     INTO source_active, source_type
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.source_warehouse_id;
    SELECT is_active, warehouse_type
      INTO destination_active, destination_type
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.destination_warehouse_id;
    SELECT is_active, warehouse_type, is_transit
      INTO transit_active, transit_type, transit_system
      FROM warehouses
     WHERE company_id = NEW.company_id AND id = NEW.transit_warehouse_id;

    source_ok := COALESCE(source_active, false) AND source_type = 'STANDARD';
    destination_ok := COALESCE(destination_active, false) AND destination_type <> 'TRANSIT';
    transit_ok := COALESCE(transit_active, false) AND transit_type = 'TRANSIT' AND COALESCE(transit_system, false);
    IF NOT source_ok OR NOT destination_ok OR NOT transit_ok THEN
        RAISE EXCEPTION 'WAREHOUSE_TRANSFER_WAREHOUSE_RULE' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_warehouse_stock_movement(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_warehouse_stock_movement() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    warehouse_type text;
    warehouse_active boolean;
    controlled_transfer boolean := false;
    original_direction text;
BEGIN
    SELECT w.warehouse_type, w.is_active
      INTO warehouse_type, warehouse_active
     FROM warehouses w
     WHERE w.company_id = NEW.company_id AND w.id = NEW.warehouse_id
     FOR UPDATE;

    IF NOT COALESCE(warehouse_active, false) THEN
        RAISE EXCEPTION 'WAREHOUSE_INACTIVE' USING ERRCODE = '23514';
    END IF;

    IF NEW.movement_type IN ('SALES_DISPATCH', 'PURCHASE_RETURN') AND NEW.direction <> 'OUT' THEN
        RAISE EXCEPTION 'invoice stock movement direction is invalid' USING ERRCODE = '23514';
    END IF;
    IF NEW.movement_type IN ('PURCHASE_RECEIPT', 'SALES_RETURN') AND NEW.direction <> 'IN' THEN
        RAISE EXCEPTION 'invoice stock movement direction is invalid' USING ERRCODE = '23514';
    END IF;
    IF NEW.movement_type IN ('TRANSFER_OUT', 'WASTE') AND NEW.direction <> 'OUT' THEN
        RAISE EXCEPTION 'warehouse outbound movement direction is invalid' USING ERRCODE = '23514';
    END IF;
    IF NEW.movement_type = 'TRANSFER_IN' AND NEW.direction <> 'IN' THEN
        RAISE EXCEPTION 'warehouse inbound movement direction is invalid' USING ERRCODE = '23514';
    END IF;

    IF NEW.source_type = 'WAREHOUSE_TRANSFER'
       AND NEW.movement_type IN ('TRANSFER_OUT', 'WASTE') THEN
        SELECT EXISTS(
            SELECT 1
              FROM warehouse_transfers t
             WHERE t.company_id = NEW.company_id
               AND t.id = NEW.source_id
               AND t.transit_warehouse_id = NEW.warehouse_id
        ) INTO controlled_transfer;
    END IF;

    IF NEW.source_type = 'WAREHOUSE_TRANSFER'
       AND NEW.movement_type = 'TRANSFER_OUT'
       AND warehouse_type = 'STANDARD' THEN
        SELECT EXISTS(
            SELECT 1
              FROM warehouse_transfers t
             WHERE t.company_id = NEW.company_id
               AND t.id = NEW.source_id
               AND t.source_warehouse_id = NEW.warehouse_id
        ) INTO controlled_transfer;
    END IF;

    IF NEW.reversal_of_id IS NOT NULL AND NEW.movement_type = 'RECONCILIATION' THEN
        SELECT m.direction
          INTO original_direction
          FROM stock_movements m
         WHERE m.company_id = NEW.company_id
           AND m.id = NEW.reversal_of_id
           AND m.warehouse_id = NEW.warehouse_id;
        controlled_transfer := controlled_transfer OR original_direction = 'IN';
    END IF;

    IF NEW.direction = 'OUT' AND warehouse_type <> 'STANDARD' AND NOT controlled_transfer THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;
    IF NEW.movement_type = 'TRANSFER_OUT' AND NOT controlled_transfer THEN
        RAISE EXCEPTION 'WAREHOUSE_MOVEMENT_NOT_ALLOWED' USING ERRCODE = '23514';
    END IF;
    RETURN NEW;
END;
$$;

--
-- Name: validate_work_schedule_day_minutes(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION validate_work_schedule_day_minutes() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE computed integer;
BEGIN
    IF NOT NEW.is_workday THEN RETURN NEW; END IF;
    computed := (EXTRACT(EPOCH FROM (NEW.ends_at-NEW.starts_at))/60)::integer;
    IF NEW.ends_next_day THEN computed := computed+1440; END IF;
    computed := computed-NEW.break_minutes;
    IF computed<=0 OR computed<>NEW.planned_minutes THEN
        RAISE EXCEPTION 'planned minutes do not match schedule times' USING ERRCODE='23514',CONSTRAINT='work_schedule_day_minutes_match';
    END IF;
    RETURN NEW;
END; $$;

--
-- Name: api_token_branch_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE api_token_branch_scopes (
    company_id uuid NOT NULL,
    token_id uuid NOT NULL,
    branch_id uuid NOT NULL
);

ALTER TABLE ONLY api_token_branch_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: api_token_warehouse_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE api_token_warehouse_scopes (
    company_id uuid NOT NULL,
    token_id uuid NOT NULL,
    warehouse_id uuid NOT NULL
);

ALTER TABLE ONLY api_token_warehouse_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: api_tokens; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE api_tokens (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    owner_user_id uuid NOT NULL,
    name text NOT NULL,
    token_prefix text NOT NULL,
    token_hash bytea NOT NULL,
    scopes text[] DEFAULT '{}'::text[] NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    expires_at timestamp with time zone,
    last_used_at timestamp with time zone,
    revoked_at timestamp with time zone,
    CONSTRAINT api_tokens_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT api_tokens_token_hash_check CHECK ((octet_length(token_hash) = 32))
);

ALTER TABLE ONLY api_tokens FORCE ROW LEVEL SECURITY;

--
-- Name: asset_assignments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE asset_assignments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    asset_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    assigned_at timestamp with time zone NOT NULL,
    returned_at timestamp with time zone,
    assignment_note text DEFAULT ''::text NOT NULL,
    return_note text,
    assigned_by uuid NOT NULL,
    returned_by uuid,
    actor_snapshot jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT asset_assignments_actor_snapshot_check CHECK ((jsonb_typeof(actor_snapshot) = 'object'::text)),
    CONSTRAINT asset_assignments_check CHECK (((returned_at IS NULL) OR (returned_at >= assigned_at))),
    CONSTRAINT asset_assignments_check1 CHECK (((returned_at IS NULL) = (returned_by IS NULL)))
);

ALTER TABLE ONLY asset_assignments FORCE ROW LEVEL SECURITY;

--
-- Name: branches; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE branches (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT branches_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT branches_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT branches_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY branches FORCE ROW LEVEL SECURITY;

--
-- Name: command_idempotency_records; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE command_idempotency_records (
    company_id uuid NOT NULL,
    idempotency_key text NOT NULL,
    command_name text NOT NULL,
    payload_sha256 character(64) NOT NULL,
    status text DEFAULT 'IN_PROGRESS'::text NOT NULL,
    response_status smallint,
    response_body jsonb,
    response_headers jsonb DEFAULT '{}'::jsonb NOT NULL,
    actor_user_id uuid,
    trace_id text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT command_idempotency_records_check CHECK ((((status = 'IN_PROGRESS'::text) AND (completed_at IS NULL)) OR ((status = ANY (ARRAY['COMPLETED'::text, 'FAILED'::text])) AND (completed_at IS NOT NULL)))),
    CONSTRAINT command_idempotency_records_check1 CHECK (((status <> 'COMPLETED'::text) OR ((response_status IS NOT NULL) AND (response_body IS NOT NULL)))),
    CONSTRAINT command_idempotency_records_command_name_check CHECK ((command_name ~ '^[a-z][a-z0-9_.:-]{1,127}$'::text)),
    CONSTRAINT command_idempotency_records_idempotency_key_check CHECK (((btrim(idempotency_key) <> ''::text) AND (length(idempotency_key) <= 255))),
    CONSTRAINT command_idempotency_records_payload_sha256_check CHECK ((payload_sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT command_idempotency_records_response_headers_check CHECK ((jsonb_typeof(response_headers) = 'object'::text)),
    CONSTRAINT command_idempotency_records_response_status_check CHECK (((response_status IS NULL) OR ((response_status >= 100) AND (response_status <= 599)))),
    CONSTRAINT command_idempotency_records_status_check CHECK ((status = ANY (ARRAY['IN_PROGRESS'::text, 'COMPLETED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY command_idempotency_records FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_document_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_document_sequences (
    company_id uuid NOT NULL,
    document_type_code text NOT NULL,
    sequence_year integer NOT NULL,
    next_value bigint DEFAULT 1 NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT commercial_document_sequences_next_value_check CHECK ((next_value > 0)),
    CONSTRAINT commercial_document_sequences_sequence_year_check CHECK (((sequence_year >= 2000) AND (sequence_year <= 9999)))
);

ALTER TABLE ONLY commercial_document_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_document_sources; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_document_sources (
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    source_document_id uuid NOT NULL,
    relation_type text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT commercial_document_sources_relation_type_check CHECK ((relation_type = ANY (ARRAY['CONVERSION'::text, 'FULFILLMENT'::text, 'INVOICING'::text, 'RETURN'::text])))
);

ALTER TABLE ONLY commercial_document_sources FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_effect_claims; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_effect_claims (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    effect_key text NOT NULL,
    effect_type text NOT NULL,
    document_id uuid NOT NULL,
    line_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT commercial_effect_claims_effect_key_check CHECK ((btrim(effect_key) <> ''::text)),
    CONSTRAINT commercial_effect_claims_effect_type_check CHECK ((effect_type = ANY (ARRAY['STOCK'::text, 'FINANCE'::text, 'RESERVATION'::text, 'EDOCUMENT'::text])))
);

ALTER TABLE ONLY commercial_effect_claims FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_line_allocations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_line_allocations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    source_line_id uuid NOT NULL,
    target_line_id uuid NOT NULL,
    allocation_type text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    status text DEFAULT 'CONSUMED'::text NOT NULL,
    CONSTRAINT commercial_line_allocations_allocation_type_check CHECK ((allocation_type = ANY (ARRAY['FULFILLMENT'::text, 'INVOICING'::text, 'RETURN'::text]))),
    CONSTRAINT commercial_line_allocations_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT commercial_line_allocations_check CHECK ((source_line_id <> target_line_id)),
    CONSTRAINT commercial_line_allocations_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT commercial_line_allocations_status_check CHECK ((status = ANY (ARRAY['RESERVED'::text, 'CONSUMED'::text])))
);

ALTER TABLE ONLY commercial_line_allocations FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_line_registry; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_line_registry (
    company_id uuid NOT NULL,
    line_id uuid NOT NULL,
    aggregate_type text NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT commercial_line_registry_aggregate_type_check CHECK ((aggregate_type = ANY (ARRAY['SALES_QUOTE'::text, 'SALES_ORDER'::text, 'SALES_DISPATCH'::text, 'SALES_INVOICE'::text, 'SALES_RETURN'::text, 'PURCHASE_ORDER'::text, 'GOODS_RECEIPT'::text, 'PURCHASE_INVOICE'::text, 'PURCHASE_RETURN'::text]))),
    CONSTRAINT commercial_line_registry_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT commercial_line_registry_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT commercial_line_registry_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT commercial_line_registry_quantity_check CHECK ((quantity > (0)::numeric))
);

ALTER TABLE ONLY commercial_line_registry FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_party_snapshots; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_party_snapshots (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    party_code text NOT NULL,
    display_name text NOT NULL,
    legal_name text DEFAULT ''::text NOT NULL,
    tax_number text DEFAULT ''::text NOT NULL,
    identity_number text DEFAULT ''::text NOT NULL,
    tax_office text DEFAULT ''::text NOT NULL,
    tax_office_code text DEFAULT ''::text NOT NULL,
    addresses jsonb DEFAULT '[]'::jsonb NOT NULL,
    snapshot_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT commercial_party_snapshots_addresses_check CHECK ((jsonb_typeof(addresses) = 'array'::text))
);

ALTER TABLE ONLY commercial_party_snapshots FORCE ROW LEVEL SECURITY;

--
-- Name: commercial_status_history; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE commercial_status_history (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    aggregate_type text NOT NULL,
    document_id uuid NOT NULL,
    from_status text,
    to_status text NOT NULL,
    reason text DEFAULT ''::text NOT NULL,
    actor_user_id uuid NOT NULL,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL
);

ALTER TABLE ONLY commercial_status_history FORCE ROW LEVEL SECURITY;

--
-- Name: companies; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE companies (
    id uuid NOT NULL,
    legal_name text NOT NULL,
    trade_name text NOT NULL,
    entity_type company_entity_type NOT NULL,
    tax_number text,
    tax_office text,
    base_currency character(3) DEFAULT 'TRY'::bpchar NOT NULL,
    timezone text DEFAULT 'Europe/Istanbul'::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    duplicate_party_tax_number_policy duplicate_tax_number_policy DEFAULT 'WARN'::duplicate_tax_number_policy NOT NULL,
    party_code_prefix text DEFAULT 'CR'::text NOT NULL,
    party_code_digits smallint DEFAULT 6 NOT NULL,
    finance_negative_balance_policy text DEFAULT 'WARN'::text NOT NULL,
    logo text DEFAULT ''::text NOT NULL,
    hr_default_contribution_scheme_code text,
    CONSTRAINT companies_base_currency_check CHECK (((base_currency)::text = upper((base_currency)::text))),
    CONSTRAINT companies_finance_negative_balance_policy_check CHECK ((finance_negative_balance_policy = ANY (ARRAY['ALLOW'::text, 'WARN'::text, 'BLOCK'::text]))),
    CONSTRAINT companies_legal_name_check CHECK ((btrim(legal_name) <> ''::text)),
    CONSTRAINT companies_logo_check CHECK (((logo = ''::text) OR ((logo ~~ 'data:image/%'::text) AND (length(logo) <= 700000)))),
    CONSTRAINT companies_party_code_digits_check CHECK (((party_code_digits >= 3) AND (party_code_digits <= 12))),
    CONSTRAINT companies_party_code_prefix_check CHECK ((party_code_prefix ~ '^[[:alnum:]]{1,8}$'::text)),
    CONSTRAINT companies_trade_name_check CHECK ((btrim(trade_name) <> ''::text)),
    CONSTRAINT companies_version_check CHECK ((version > 0))
);

--
-- Name: company_business_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_business_sequences (
    company_id uuid NOT NULL,
    sequence_key text NOT NULL,
    sequence_year integer NOT NULL,
    next_value bigint DEFAULT 1 NOT NULL,
    CONSTRAINT company_business_sequences_next_value_check CHECK ((next_value > 0)),
    CONSTRAINT company_business_sequences_sequence_key_check CHECK ((btrim(sequence_key) <> ''::text)),
    CONSTRAINT company_business_sequences_sequence_year_check CHECK (((sequence_year >= 2000) AND (sequence_year <= 2200)))
);

ALTER TABLE ONLY company_business_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: company_memberships; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_memberships (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT company_memberships_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY company_memberships FORCE ROW LEVEL SECURITY;

--
-- Name: company_modules; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_modules (
    company_id uuid NOT NULL,
    module_code text NOT NULL,
    enabled boolean DEFAULT true NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_by uuid,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT company_modules_module_code_check CHECK ((module_code ~ '^[a-z_]+$'::text))
);

ALTER TABLE ONLY company_modules FORCE ROW LEVEL SECURITY;

--
-- Name: company_party_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_party_sequences (
    company_id uuid NOT NULL,
    next_number bigint DEFAULT 1 NOT NULL,
    CONSTRAINT company_party_sequences_next_number_check CHECK ((next_number > 0))
);

ALTER TABLE ONLY company_party_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: company_product_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_product_sequences (
    company_id uuid NOT NULL,
    prefix text DEFAULT 'STK'::text NOT NULL,
    next_number bigint DEFAULT 1 NOT NULL,
    digits smallint DEFAULT 6 NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT company_product_sequences_digits_check CHECK (((digits >= 3) AND (digits <= 12))),
    CONSTRAINT company_product_sequences_next_number_check CHECK ((next_number > 0)),
    CONSTRAINT company_product_sequences_prefix_check CHECK ((prefix ~ '^[A-Z0-9_-]{1,8}$'::text))
);

ALTER TABLE ONLY company_product_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: company_secrets; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_secrets (
    company_id uuid NOT NULL,
    name text NOT NULL,
    ciphertext bytea NOT NULL,
    key_version smallint DEFAULT 1 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT company_secrets_key_version_check CHECK ((key_version > 0))
);

ALTER TABLE ONLY company_secrets FORCE ROW LEVEL SECURITY;

--
-- Name: company_smtp_settings; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE company_smtp_settings (
    company_id uuid NOT NULL,
    host text NOT NULL,
    port integer NOT NULL,
    security_mode text NOT NULL,
    username text DEFAULT ''::text NOT NULL,
    password_ciphertext bytea,
    from_email text NOT NULL,
    from_name text NOT NULL,
    connect_timeout_seconds integer DEFAULT 10 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT company_smtp_settings_connect_timeout_seconds_check CHECK (((connect_timeout_seconds >= 1) AND (connect_timeout_seconds <= 60))),
    CONSTRAINT company_smtp_settings_from_email_check CHECK ((from_email = lower(btrim(from_email)))),
    CONSTRAINT company_smtp_settings_from_name_check CHECK ((btrim(from_name) <> ''::text)),
    CONSTRAINT company_smtp_settings_host_check CHECK ((btrim(host) <> ''::text)),
    CONSTRAINT company_smtp_settings_port_check CHECK (((port >= 1) AND (port <= 65535))),
    CONSTRAINT company_smtp_settings_security_mode_check CHECK ((security_mode = ANY (ARRAY['TLS'::text, 'STARTTLS'::text]))),
    CONSTRAINT company_smtp_settings_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY company_smtp_settings FORCE ROW LEVEL SECURITY;

--
-- Name: document_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE document_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    product_id uuid,
    product_code_snapshot text DEFAULT ''::text NOT NULL,
    product_name_snapshot text NOT NULL,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    unit_price numeric(24,8) NOT NULL,
    discount_rate numeric(12,8) DEFAULT 0 NOT NULL,
    tax_rate numeric(12,8) DEFAULT 0 NOT NULL,
    gross_amount numeric(24,8) NOT NULL,
    discount_amount numeric(24,8) NOT NULL,
    net_amount numeric(24,8) NOT NULL,
    tax_amount numeric(24,8) NOT NULL,
    line_total numeric(24,8) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    tax_treatment text DEFAULT 'STANDARD'::text NOT NULL,
    tax_definition_id uuid,
    tax_code_snapshot text DEFAULT ''::text NOT NULL,
    tax_rate_snapshot numeric(12,8) DEFAULT 0 NOT NULL,
    tax_included_snapshot boolean DEFAULT false NOT NULL,
    withholding_code_snapshot text DEFAULT ''::text NOT NULL,
    withholding_rate_snapshot numeric(12,8) DEFAULT 0 NOT NULL,
    exemption_code_snapshot text DEFAULT ''::text NOT NULL,
    tax_note_snapshot text DEFAULT ''::text NOT NULL,
    product_tax_profile_version bigint DEFAULT 1 NOT NULL,
    tax_definition_code_snapshot text DEFAULT ''::text NOT NULL,
    tax_definition_name_snapshot text DEFAULT ''::text NOT NULL,
    tax_calculation_type_snapshot text DEFAULT 'PERCENTAGE'::text NOT NULL,
    withholding_numerator_snapshot integer,
    withholding_denominator_snapshot integer,
    exemption_reason_snapshot text DEFAULT ''::text NOT NULL,
    tax_base_snapshot numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount_snapshot numeric(24,8) DEFAULT 0 NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    variant_id uuid,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    withholding_amount_snapshot numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount_snapshot numeric(24,8) DEFAULT 0 NOT NULL,
    CONSTRAINT document_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT document_lines_discount_rate_check CHECK (((discount_rate >= (0)::numeric) AND (discount_rate <= (100)::numeric))),
    CONSTRAINT document_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT document_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT document_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT document_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT document_lines_payable_amount_snapshot_check CHECK ((payable_amount_snapshot >= (0)::numeric)),
    CONSTRAINT document_lines_product_name_snapshot_check CHECK ((btrim(product_name_snapshot) <> ''::text)),
    CONSTRAINT document_lines_product_tax_profile_version_check CHECK ((product_tax_profile_version > 0)),
    CONSTRAINT document_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT document_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT document_lines_tax_calculation_type_snapshot_check CHECK ((tax_calculation_type_snapshot = ANY (ARRAY['PERCENTAGE'::text, 'FIXED_AMOUNT'::text, 'QUANTITY_BASED'::text]))),
    CONSTRAINT document_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT document_lines_tax_rate_check CHECK (((tax_rate >= (0)::numeric) AND (tax_rate <= (100)::numeric))),
    CONSTRAINT document_lines_tax_rate_snapshot_check CHECK (((tax_rate_snapshot >= (0)::numeric) AND (tax_rate_snapshot <= (100)::numeric))),
    CONSTRAINT document_lines_tax_treatment_check CHECK ((tax_treatment = ANY (ARRAY['STANDARD'::text, 'WITHHOLDING'::text, 'EXEMPT'::text, 'NOT_APPLICABLE'::text]))),
    CONSTRAINT document_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT document_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT document_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT document_lines_withholding_amount_snapshot_check CHECK ((withholding_amount_snapshot >= (0)::numeric)),
    CONSTRAINT document_lines_withholding_rate_snapshot_check CHECK (((withholding_rate_snapshot >= (0)::numeric) AND (withholding_rate_snapshot <= (100)::numeric)))
);

ALTER TABLE ONLY document_lines FORCE ROW LEVEL SECURITY;

--
-- Name: document_reversals; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE document_reversals (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    original_document_id uuid NOT NULL,
    reversal_document_id uuid,
    finance_reversal_id uuid,
    reason text NOT NULL,
    actor_user_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    idempotency_key text,
    CONSTRAINT document_reversals_idempotency_key_check CHECK (((idempotency_key IS NULL) OR ((btrim(idempotency_key) <> ''::text) AND (length(idempotency_key) <= 255)))),
    CONSTRAINT document_reversals_reason_check CHECK ((btrim(reason) <> ''::text))
);

ALTER TABLE ONLY document_reversals FORCE ROW LEVEL SECURITY;

--
-- Name: document_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE document_sequences (
    company_id uuid NOT NULL,
    document_type_code text NOT NULL,
    next_number bigint DEFAULT 1 NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT document_sequences_next_number_check CHECK ((next_number > 0))
);

ALTER TABLE ONLY document_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: document_status_history; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE document_status_history (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    from_status text,
    to_status text NOT NULL,
    actor_user_id uuid NOT NULL,
    reason text DEFAULT ''::text NOT NULL,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT document_status_history_from_status_check CHECK (((from_status IS NULL) OR (from_status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text])))),
    CONSTRAINT document_status_history_to_status_check CHECK ((to_status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text])))
);

ALTER TABLE ONLY document_status_history FORCE ROW LEVEL SECURITY;

--
-- Name: document_types; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE document_types (
    code text NOT NULL,
    company_id uuid,
    display_name text NOT NULL,
    direction text NOT NULL,
    kind text NOT NULL,
    stock_effect text DEFAULT 'NONE'::text NOT NULL,
    finance_effect text DEFAULT 'NONE'::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT document_types_code_check CHECK ((code ~ '^[A-Z][A-Z0-9_.-]{1,63}$'::text)),
    CONSTRAINT document_types_direction_check CHECK ((direction = ANY (ARRAY['SALES'::text, 'PURCHASE'::text]))),
    CONSTRAINT document_types_display_name_check CHECK ((btrim(display_name) <> ''::text)),
    CONSTRAINT document_types_finance_effect_check CHECK ((finance_effect = ANY (ARRAY['NONE'::text, 'RECEIVABLE'::text, 'PAYABLE'::text]))),
    CONSTRAINT document_types_kind_check CHECK ((kind = ANY (ARRAY['QUOTE'::text, 'ORDER'::text, 'DELIVERY'::text, 'INVOICE'::text]))),
    CONSTRAINT document_types_stock_effect_check CHECK ((stock_effect = ANY (ARRAY['NONE'::text, 'IN'::text, 'OUT'::text])))
);

ALTER TABLE ONLY document_types FORCE ROW LEVEL SECURITY;

--
-- Name: documents; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE documents (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_type_code text NOT NULL,
    document_no text NOT NULL,
    branch_id uuid NOT NULL,
    warehouse_id uuid,
    party_id uuid NOT NULL,
    document_date date NOT NULL,
    due_date date,
    currency_code character(3) NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 NOT NULL,
    notes text DEFAULT ''::text NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    subtotal numeric(24,8) DEFAULT 0 NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 NOT NULL,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    search_vector tsvector DEFAULT ''::tsvector NOT NULL,
    created_by uuid NOT NULL,
    updated_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    post_idempotency_key text,
    posted_by uuid,
    CONSTRAINT documents_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT documents_check1 CHECK ((((status = 'DRAFT'::text) AND (posted_at IS NULL) AND (cancelled_at IS NULL)) OR ((status = 'POSTED'::text) AND (posted_at IS NOT NULL) AND (cancelled_at IS NULL)) OR ((status = 'CANCELLED'::text) AND (posted_at IS NOT NULL) AND (cancelled_at IS NOT NULL) AND (btrim(COALESCE(cancellation_reason, ''::text)) <> ''::text)))),
    CONSTRAINT documents_currency_code_check CHECK (((currency_code)::text = upper((currency_code)::text))),
    CONSTRAINT documents_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT documents_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT documents_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT documents_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT documents_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT documents_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT documents_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT documents_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY documents FORCE ROW LEVEL SECURITY;

--
-- Name: edocument_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE edocument_events (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    edocument_id uuid NOT NULL,
    event_type text NOT NULL,
    status text NOT NULL,
    provider_external_id text,
    message text DEFAULT ''::text NOT NULL,
    actor_user_id uuid NOT NULL,
    trace_id text,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT edocument_events_event_type_check CHECK ((btrim(event_type) <> ''::text)),
    CONSTRAINT edocument_events_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'QUEUED'::text, 'SUBMITTING'::text, 'SUBMITTED'::text, 'ACCEPTED'::text, 'REJECTED'::text, 'CANCEL_REQUESTED'::text, 'CANCELLED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY edocument_events FORCE ROW LEVEL SECURITY;

--
-- Name: edocuments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE edocuments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    provider_key text NOT NULL,
    status text NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    payload jsonb NOT NULL,
    provider_external_id text,
    provider_result jsonb,
    created_by_user_id uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT edocuments_payload_check CHECK ((jsonb_typeof(payload) = 'object'::text)),
    CONSTRAINT edocuments_provider_key_check CHECK ((btrim(provider_key) <> ''::text)),
    CONSTRAINT edocuments_provider_result_check CHECK (((provider_result IS NULL) OR (jsonb_typeof(provider_result) = 'object'::text))),
    CONSTRAINT edocuments_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'QUEUED'::text, 'SUBMITTING'::text, 'SUBMITTED'::text, 'ACCEPTED'::text, 'REJECTED'::text, 'CANCEL_REQUESTED'::text, 'CANCELLED'::text, 'FAILED'::text]))),
    CONSTRAINT edocuments_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY edocuments FORCE ROW LEVEL SECURITY;

--
-- Name: email_message_recipients; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE email_message_recipients (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    message_id uuid NOT NULL,
    recipient text NOT NULL,
    recipient_name text DEFAULT ''::text NOT NULL,
    status text NOT NULL,
    smtp_response_code integer,
    error_code text,
    sent_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);

ALTER TABLE ONLY email_message_recipients FORCE ROW LEVEL SECURITY;

--
-- Name: email_messages; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE email_messages (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    context_type text DEFAULT 'GENERIC'::text NOT NULL,
    context_id text DEFAULT ''::text NOT NULL,
    template_id uuid,
    subject text DEFAULT ''::text NOT NULL,
    body text DEFAULT ''::text NOT NULL,
    status text DEFAULT 'RUNNING'::text NOT NULL,
    sent_count integer DEFAULT 0 NOT NULL,
    failed_count integer DEFAULT 0 NOT NULL,
    skipped_count integer DEFAULT 0 NOT NULL,
    requested_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT email_messages_status_check CHECK ((status = ANY (ARRAY['RUNNING'::text, 'COMPLETED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY email_messages FORCE ROW LEVEL SECURITY;

--
-- Name: email_templates; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE email_templates (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    scope text DEFAULT 'GENERIC'::text NOT NULL,
    subject text DEFAULT ''::text NOT NULL,
    body text DEFAULT ''::text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    is_system boolean DEFAULT false NOT NULL,
    archived_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT email_templates_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT email_templates_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT email_templates_scope_check CHECK ((scope = ANY (ARRAY['GENERIC'::text, 'PAYROLL_PAYSLIP'::text]))),
    CONSTRAINT email_templates_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY email_templates FORCE ROW LEVEL SECURITY;

--
-- Name: employee_addresses; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_addresses (
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    address_line text DEFAULT ''::text NOT NULL,
    postal_code text,
    province_id smallint,
    district_id bigint,
    neighborhood_id bigint,
    neighborhood text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT employee_addresses_hierarchy_check CHECK ((((district_id IS NULL) OR (province_id IS NOT NULL)) AND ((neighborhood_id IS NULL) OR (district_id IS NOT NULL)))),
    CONSTRAINT employee_addresses_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY employee_addresses FORCE ROW LEVEL SECURITY;

--
-- Name: employee_advance_transactions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_advance_transactions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    advance_id uuid NOT NULL,
    transaction_type text NOT NULL,
    amount numeric(20,2) NOT NULL,
    transaction_date date NOT NULL,
    account_id uuid,
    finance_movement_id uuid,
    reversal_of_id uuid,
    reason text DEFAULT ''::text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    idempotency_key text NOT NULL,
    payload_hash character(64) NOT NULL,
    actor_user_id uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT employee_advance_transactions_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT employee_advance_transactions_check CHECK ((((transaction_type = 'WRITE_OFF'::text) AND (account_id IS NULL) AND (finance_movement_id IS NULL)) OR ((transaction_type = ANY (ARRAY['DISBURSEMENT'::text, 'REPAYMENT'::text])) AND (account_id IS NOT NULL) AND (finance_movement_id IS NOT NULL)) OR ((transaction_type = 'REVERSAL'::text) AND ((account_id IS NULL) = (finance_movement_id IS NULL))))),
    CONSTRAINT employee_advance_transactions_check1 CHECK (((transaction_type = 'REVERSAL'::text) = (reversal_of_id IS NOT NULL))),
    CONSTRAINT employee_advance_transactions_check2 CHECK (((transaction_type <> ALL (ARRAY['WRITE_OFF'::text, 'REVERSAL'::text])) OR (btrim(reason) <> ''::text))),
    CONSTRAINT employee_advance_transactions_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT employee_advance_transactions_payload_hash_check CHECK ((payload_hash ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT employee_advance_transactions_transaction_type_check CHECK ((transaction_type = ANY (ARRAY['DISBURSEMENT'::text, 'REPAYMENT'::text, 'WRITE_OFF'::text, 'REVERSAL'::text])))
);

ALTER TABLE ONLY employee_advance_transactions FORCE ROW LEVEL SECURITY;

--
-- Name: employee_advances; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_advances (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    account_id uuid NOT NULL,
    original_amount numeric(20,2) NOT NULL,
    currency character(3) DEFAULT 'TRY'::bpchar NOT NULL,
    advance_date date NOT NULL,
    expected_repayment_date date,
    description text NOT NULL,
    reference text DEFAULT ''::text NOT NULL,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT employee_advances_check CHECK (((expected_repayment_date IS NULL) OR (expected_repayment_date >= advance_date))),
    CONSTRAINT employee_advances_currency_check CHECK ((currency = 'TRY'::bpchar)),
    CONSTRAINT employee_advances_description_check CHECK ((btrim(description) <> ''::text)),
    CONSTRAINT employee_advances_original_amount_check CHECK ((original_amount > (0)::numeric))
);

ALTER TABLE ONLY employee_advances FORCE ROW LEVEL SECURITY;

--
-- Name: employee_documents; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_documents (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    document_type text NOT NULL,
    sensitivity text NOT NULL,
    storage_key text NOT NULL,
    sha256 character(64) NOT NULL,
    mime_type text NOT NULL,
    size_bytes bigint NOT NULL,
    archived_at timestamp with time zone,
    archived_by uuid,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    original_filename text DEFAULT ''::text NOT NULL,
    CONSTRAINT employee_documents_check CHECK (((archived_at IS NULL) = (archived_by IS NULL))),
    CONSTRAINT employee_documents_document_type_check CHECK ((btrim(document_type) <> ''::text)),
    CONSTRAINT employee_documents_mime_type_check CHECK ((btrim(mime_type) <> ''::text)),
    CONSTRAINT employee_documents_sensitivity_check CHECK ((sensitivity = ANY (ARRAY['GENERAL'::text, 'IDENTITY'::text, 'HEALTH'::text]))),
    CONSTRAINT employee_documents_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT employee_documents_size_bytes_check CHECK ((size_bytes >= 0)),
    CONSTRAINT employee_documents_storage_key_check CHECK ((btrim(storage_key) <> ''::text))
);

ALTER TABLE ONLY employee_documents FORCE ROW LEVEL SECURITY;

--
-- Name: employee_legal_deductions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_legal_deductions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    deduction_type text NOT NULL,
    reference text NOT NULL,
    amount numeric(20,2) NOT NULL,
    status text DEFAULT 'ACTIVE'::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT employee_legal_deductions_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT employee_legal_deductions_deduction_type_check CHECK ((deduction_type = ANY (ARRAY['GARNISHMENT'::text, 'ALIMONY'::text]))),
    CONSTRAINT employee_legal_deductions_reference_check CHECK ((btrim(reference) <> ''::text)),
    CONSTRAINT employee_legal_deductions_status_check CHECK ((status = ANY (ARRAY['ACTIVE'::text, 'CLOSED'::text])))
);

ALTER TABLE ONLY employee_legal_deductions FORCE ROW LEVEL SECURITY;

--
-- Name: employee_payroll_components; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_payroll_components (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_payroll_id uuid NOT NULL,
    component_code text NOT NULL,
    component_name text NOT NULL,
    component_kind text NOT NULL,
    amount numeric(20,2) NOT NULL,
    calculation_order integer NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    CONSTRAINT employee_payroll_components_calculation_order_check CHECK ((calculation_order > 0)),
    CONSTRAINT employee_payroll_components_component_code_check CHECK ((component_code ~ '^[A-Z][A-Z0-9_]{1,63}$'::text)),
    CONSTRAINT employee_payroll_components_component_kind_check CHECK ((component_kind = ANY (ARRAY['EARNING'::text, 'DEDUCTION'::text, 'EMPLOYER_COST'::text, 'INFORMATION'::text]))),
    CONSTRAINT employee_payroll_components_component_name_check CHECK ((btrim(component_name) <> ''::text)),
    CONSTRAINT employee_payroll_components_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text))
);

ALTER TABLE ONLY employee_payroll_components FORCE ROW LEVEL SECURITY;

--
-- Name: employee_payroll_year_openings; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_payroll_year_openings (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    tax_year integer NOT NULL,
    source text NOT NULL,
    cumulative_income_tax_base numeric(20,2) CONSTRAINT employee_payroll_year_openi_cumulative_income_tax_base_not_null NOT NULL,
    evidence_note text NOT NULL,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT employee_payroll_year_openings_cumulative_income_tax_base_check CHECK ((cumulative_income_tax_base >= (0)::numeric)),
    CONSTRAINT employee_payroll_year_openings_evidence_note_check CHECK ((btrim(evidence_note) <> ''::text)),
    CONSTRAINT employee_payroll_year_openings_source_check CHECK ((source = ANY (ARRAY['COMPANY_MIGRATION'::text, 'PRIOR_EMPLOYER_CARRY'::text]))),
    CONSTRAINT employee_payroll_year_openings_tax_year_check CHECK (((tax_year >= 2000) AND (tax_year <= 2200))),
    CONSTRAINT employee_payroll_year_openings_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY employee_payroll_year_openings FORCE ROW LEVEL SECURITY;

--
-- Name: employee_payrolls; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_payrolls (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    generation_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    status text NOT NULL,
    gross numeric(20,2),
    sgk_base numeric(20,2),
    employee_sgk numeric(20,2),
    employee_unemployment numeric(20,2),
    income_tax_base numeric(20,2),
    income_tax numeric(20,2),
    stamp_tax numeric(20,2),
    total_deductions numeric(20,2),
    net numeric(20,2),
    employer_contributions numeric(20,2),
    employer_cost numeric(20,2),
    paid_days numeric(6,2),
    sgk_days smallint,
    employee_input_checksum character(64) NOT NULL,
    employee_snapshot jsonb NOT NULL,
    company_snapshot jsonb NOT NULL,
    legislation_snapshot jsonb NOT NULL,
    attendance_snapshot jsonb NOT NULL,
    error_details jsonb DEFAULT '[]'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT employee_payrolls_attendance_snapshot_check CHECK ((jsonb_typeof(attendance_snapshot) = 'object'::text)),
    CONSTRAINT employee_payrolls_check CHECK ((((status = 'FAILED'::text) AND (net IS NULL)) OR ((status <> 'FAILED'::text) AND (gross IS NOT NULL) AND (net IS NOT NULL) AND (net >= (0)::numeric)))),
    CONSTRAINT employee_payrolls_company_snapshot_check CHECK ((jsonb_typeof(company_snapshot) = 'object'::text)),
    CONSTRAINT employee_payrolls_employee_input_checksum_check CHECK ((employee_input_checksum ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT employee_payrolls_employee_snapshot_check CHECK ((jsonb_typeof(employee_snapshot) = 'object'::text)),
    CONSTRAINT employee_payrolls_error_details_check CHECK ((jsonb_typeof(error_details) = 'array'::text)),
    CONSTRAINT employee_payrolls_legislation_snapshot_check CHECK ((jsonb_typeof(legislation_snapshot) = 'object'::text)),
    CONSTRAINT employee_payrolls_sgk_days_check CHECK (((sgk_days >= 0) AND (sgk_days <= 30))),
    CONSTRAINT employee_payrolls_status_check CHECK ((status = ANY (ARRAY['CALCULATED'::text, 'FAILED'::text, 'FINALIZED'::text])))
);

ALTER TABLE ONLY employee_payrolls FORCE ROW LEVEL SECURITY;

--
-- Name: employee_private_profiles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_private_profiles (
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    tckn_ciphertext bytea,
    tckn_sha256 bytea,
    iban_ciphertext bytea,
    birth_date date,
    emergency_contact_name text,
    emergency_contact_phone text,
    payroll_email text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    bank_name text,
    CONSTRAINT employee_private_profiles_payroll_email_check CHECK (((payroll_email IS NULL) OR (payroll_email = lower(btrim(payroll_email))))),
    CONSTRAINT employee_private_profiles_tckn_sha256_check CHECK (((tckn_sha256 IS NULL) OR (octet_length(tckn_sha256) = 32))),
    CONSTRAINT employee_private_profiles_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY employee_private_profiles FORCE ROW LEVEL SECURITY;

--
-- Name: employee_schedule_assignments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employee_schedule_assignments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    template_id uuid NOT NULL,
    effective_from date NOT NULL,
    effective_to date,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT employee_schedule_assignments_check CHECK (((effective_to IS NULL) OR (effective_to >= effective_from))),
    CONSTRAINT employee_schedule_assignments_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY employee_schedule_assignments FORCE ROW LEVEL SECURITY;

--
-- Name: employees; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employees (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_code text NOT NULL,
    first_name text NOT NULL,
    last_name text NOT NULL,
    status text DEFAULT 'ACTIVE'::text NOT NULL,
    position_title text DEFAULT ''::text NOT NULL,
    work_email text,
    personal_email text,
    phone text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    occupation_code text,
    CONSTRAINT employees_employee_code_check CHECK ((btrim(employee_code) <> ''::text)),
    CONSTRAINT employees_first_name_check CHECK ((btrim(first_name) <> ''::text)),
    CONSTRAINT employees_last_name_check CHECK ((btrim(last_name) <> ''::text)),
    CONSTRAINT employees_personal_email_check CHECK (((personal_email IS NULL) OR (personal_email = lower(btrim(personal_email))))),
    CONSTRAINT employees_status_check CHECK ((status = ANY (ARRAY['ACTIVE'::text, 'INACTIVE'::text, 'ARCHIVED'::text]))),
    CONSTRAINT employees_version_check CHECK ((version > 0)),
    CONSTRAINT employees_work_email_check CHECK (((work_email IS NULL) OR (work_email = lower(btrim(work_email)))))
);

ALTER TABLE ONLY employees FORCE ROW LEVEL SECURITY;

--
-- Name: employment_terms; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employment_terms (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employment_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    effective_from date NOT NULL,
    effective_to date,
    wage_type text NOT NULL,
    wage_period text NOT NULL,
    gross_wage numeric(20,4) NOT NULL,
    currency character(3) NOT NULL,
    work_type text NOT NULL,
    weekly_minutes integer NOT NULL,
    contribution_scheme_code text NOT NULL,
    prior_employer_tax_policy text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    sgk_status text DEFAULT '4A'::text NOT NULL,
    is_minimum_wage boolean DEFAULT false NOT NULL,
    CONSTRAINT employment_terms_check CHECK (((effective_to IS NULL) OR (effective_to >= effective_from))),
    CONSTRAINT employment_terms_contribution_scheme_code_check CHECK ((btrim(contribution_scheme_code) <> ''::text)),
    CONSTRAINT employment_terms_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT employment_terms_gross_wage_check CHECK ((gross_wage >= (0)::numeric)),
    CONSTRAINT employment_terms_prior_employer_tax_policy_check CHECK ((prior_employer_tax_policy = ANY (ARRAY['SEPARATE'::text, 'CARRY'::text]))),
    CONSTRAINT employment_terms_sgk_status_check CHECK ((sgk_status = ANY (ARRAY['4A'::text, '4A_SGDP'::text, '4A_NO_UNEMPLOYMENT'::text, 'APPRENTICE'::text, '4B'::text, '4C'::text]))),
    CONSTRAINT employment_terms_version_check CHECK ((version > 0)),
    CONSTRAINT employment_terms_wage_period_check CHECK ((wage_period = 'MONTHLY'::text)),
    CONSTRAINT employment_terms_wage_type_check CHECK ((wage_type = 'GROSS'::text)),
    CONSTRAINT employment_terms_weekly_minutes_check CHECK (((weekly_minutes > 0) AND (weekly_minutes <= 10080))),
    CONSTRAINT employment_terms_work_type_check CHECK ((work_type = ANY (ARRAY['FULL_TIME'::text, 'PART_TIME'::text, 'INTERN'::text, 'CONTRACT'::text])))
);

ALTER TABLE ONLY employment_terms FORCE ROW LEVEL SECURITY;

--
-- Name: employments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE employments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    start_date date NOT NULL,
    end_date date,
    termination_reason text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT employments_check CHECK (((end_date IS NULL) OR (end_date >= start_date))),
    CONSTRAINT employments_check1 CHECK ((((end_date IS NULL) AND (termination_reason IS NULL)) OR (end_date IS NOT NULL))),
    CONSTRAINT employments_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY employments FORCE ROW LEVEL SECURITY;

--
-- Name: exchange_rate_settings; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE exchange_rate_settings (
    company_id uuid NOT NULL,
    source_preference text DEFAULT 'AUTO'::text NOT NULL,
    refresh_interval_hours smallint DEFAULT 6 NOT NULL,
    last_attempt_at timestamp with time zone,
    last_success_at timestamp with time zone,
    last_rate_date date,
    last_source text,
    last_error text DEFAULT ''::text NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT exchange_rate_settings_refresh_interval_hours_check CHECK (((refresh_interval_hours >= 1) AND (refresh_interval_hours <= 72))),
    CONSTRAINT exchange_rate_settings_source_preference_check CHECK ((source_preference = ANY (ARRAY['AUTO'::text, 'TCMB'::text, 'ECB'::text]))),
    CONSTRAINT exchange_rate_settings_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY exchange_rate_settings FORCE ROW LEVEL SECURITY;

--
-- Name: exchange_rates; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE exchange_rates (
    company_id uuid NOT NULL,
    currency_code character varying(8) NOT NULL,
    rate_date date NOT NULL,
    rate_to_base numeric(38,18) NOT NULL,
    source_code text NOT NULL,
    source_url text DEFAULT ''::text NOT NULL,
    fetched_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT exchange_rates_rate_to_base_check CHECK ((rate_to_base > (0)::numeric)),
    CONSTRAINT exchange_rates_source_code_check CHECK ((source_code = ANY (ARRAY['TCMB'::text, 'ECB'::text, 'MANUAL'::text])))
);

ALTER TABLE ONLY exchange_rates FORCE ROW LEVEL SECURITY;

--
-- Name: export_artifacts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE export_artifacts (
    company_id uuid NOT NULL,
    export_job_id uuid NOT NULL,
    storage_key text NOT NULL,
    sha256 text NOT NULL,
    size_bytes bigint NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT export_artifacts_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT export_artifacts_size_bytes_check CHECK ((size_bytes >= 0))
);

ALTER TABLE ONLY export_artifacts FORCE ROW LEVEL SECURITY;

--
-- Name: export_jobs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE export_jobs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    entity_type text NOT NULL,
    format text NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    artifact_storage_key text,
    filename text,
    content_type text,
    row_count integer DEFAULT 0 NOT NULL,
    error_message text DEFAULT ''::text NOT NULL,
    requested_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT export_jobs_entity_type_check CHECK ((entity_type = ANY (ARRAY['PRODUCT'::text, 'VARIANT'::text, 'BARCODE'::text, 'WAREHOUSE'::text, 'PARTY'::text, 'PRICE_LIST'::text, 'OPENING_STOCK'::text, 'STOCK_COUNT'::text]))),
    CONSTRAINT export_jobs_format_check CHECK ((format = ANY (ARRAY['CSV'::text, 'XLSX'::text]))),
    CONSTRAINT export_jobs_row_count_check CHECK ((row_count >= 0)),
    CONSTRAINT export_jobs_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'RUNNING'::text, 'COMPLETED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY export_jobs FORCE ROW LEVEL SECURITY;

--
-- Name: finance_account_movements; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_account_movements (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    account_id uuid NOT NULL,
    movement_kind text NOT NULL,
    direction text NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    transaction_date date NOT NULL,
    source_type text NOT NULL,
    source_id uuid NOT NULL,
    idempotency_key text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    exchange_rate numeric(20,10) DEFAULT 1 NOT NULL,
    base_currency character(3),
    base_amount numeric(20,4),
    external_reference text DEFAULT ''::text NOT NULL,
    bank_statement_line_id text,
    reconciliation_status text,
    CONSTRAINT finance_account_movements_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_account_movements_base_amount_check CHECK ((((base_amount IS NULL) AND (base_currency IS NULL)) OR ((base_amount IS NOT NULL) AND (base_currency IS NOT NULL) AND (base_amount > (0)::numeric)))),
    CONSTRAINT finance_account_movements_base_currency_check CHECK (((base_currency IS NULL) OR ((base_currency)::text = upper((base_currency)::text)))),
    CONSTRAINT finance_account_movements_check CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT finance_account_movements_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_account_movements_direction_check CHECK ((direction = ANY (ARRAY['IN'::text, 'OUT'::text]))),
    CONSTRAINT finance_account_movements_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT finance_account_movements_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT finance_account_movements_movement_kind_check CHECK ((movement_kind = ANY (ARRAY['OPENING_BALANCE'::text, 'COLLECTION'::text, 'PAYMENT'::text, 'TRANSFER'::text, 'MANUAL_IN'::text, 'MANUAL_OUT'::text, 'REVERSAL'::text, 'OTHER'::text, 'ADJUSTMENT'::text, 'EMPLOYEE_ADVANCE'::text, 'PAYROLL'::text]))),
    CONSTRAINT finance_account_movements_reconciliation_status_check CHECK (((reconciliation_status IS NULL) OR (reconciliation_status = ANY (ARRAY['UNMATCHED'::text, 'MATCHED'::text, 'IGNORED'::text])))),
    CONSTRAINT finance_account_movements_snapshot_check CHECK ((jsonb_typeof(snapshot) = 'object'::text)),
    CONSTRAINT finance_account_movements_source_type_check CHECK ((btrim(source_type) <> ''::text))
);

ALTER TABLE ONLY finance_account_movements FORCE ROW LEVEL SECURITY;

--
-- Name: finance_accounts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_accounts (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    account_type text NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    currency character(3) NOT NULL,
    branch_id uuid,
    bank_name text DEFAULT ''::text NOT NULL,
    iban text DEFAULT ''::text NOT NULL,
    account_number text DEFAULT ''::text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    bank_branch_name text DEFAULT ''::text NOT NULL,
    bank_branch_code text DEFAULT ''::text NOT NULL,
    notes text DEFAULT ''::text NOT NULL,
    CONSTRAINT finance_accounts_account_type_check CHECK ((account_type = ANY (ARRAY['CASH'::text, 'BANK'::text, 'POS'::text]))),
    CONSTRAINT finance_accounts_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT finance_accounts_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_accounts_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT finance_accounts_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY finance_accounts FORCE ROW LEVEL SECURITY;

--
-- Name: finance_instrument_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_instrument_events (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    instrument_id uuid NOT NULL,
    event_type text NOT NULL,
    event_date date NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    source_type text DEFAULT 'finance_instrument'::text NOT NULL,
    source_id uuid,
    actor_user_id uuid,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_instrument_events_event_type_check CHECK ((event_type = ANY (ARRAY['RECEIVED'::text, 'ISSUED'::text, 'DEPOSITED'::text, 'COLLECTED'::text, 'RETURNED'::text, 'CANCELLED'::text])))
);

ALTER TABLE ONLY finance_instrument_events FORCE ROW LEVEL SECURITY;

--
-- Name: finance_instruments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_instruments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    instrument_type text NOT NULL,
    instrument_no text NOT NULL,
    party_id uuid NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    issue_date date NOT NULL,
    due_date date,
    bank_name text DEFAULT ''::text NOT NULL,
    drawer_name text DEFAULT ''::text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    status text DEFAULT 'RECEIVED'::text NOT NULL,
    created_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_instruments_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_instruments_check CHECK (((due_date IS NULL) OR (due_date >= issue_date))),
    CONSTRAINT finance_instruments_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_instruments_instrument_no_check CHECK ((btrim(instrument_no) <> ''::text)),
    CONSTRAINT finance_instruments_instrument_type_check CHECK ((instrument_type = ANY (ARRAY['CHECK'::text, 'PROMISSORY_NOTE'::text]))),
    CONSTRAINT finance_instruments_status_check CHECK ((status = ANY (ARRAY['RECEIVED'::text, 'ISSUED'::text, 'DEPOSITED'::text, 'COLLECTED'::text, 'RETURNED'::text, 'CANCELLED'::text])))
);

ALTER TABLE ONLY finance_instruments FORCE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_open_item_reversals; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_invoice_open_item_reversals (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    open_item_id uuid NOT NULL,
    document_id uuid NOT NULL,
    reversal_ledger_entry_id uuid CONSTRAINT finance_invoice_open_item_rev_reversal_ledger_entry_id_not_null NOT NULL,
    amount numeric(20,4) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_invoice_open_item_reversals_amount_check CHECK ((amount > (0)::numeric))
);

ALTER TABLE ONLY finance_invoice_open_item_reversals FORCE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_open_items; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_invoice_open_items (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    party_id uuid NOT NULL,
    party_ledger_entry_id uuid NOT NULL,
    side text NOT NULL,
    currency character(3) NOT NULL,
    original_amount numeric(20,4) NOT NULL,
    exchange_rate numeric(20,10) DEFAULT 1 NOT NULL,
    base_currency character(3) NOT NULL,
    base_amount numeric(20,4) NOT NULL,
    document_date date NOT NULL,
    due_date date,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_invoice_open_items_base_amount_check CHECK ((base_amount > (0)::numeric)),
    CONSTRAINT finance_invoice_open_items_base_currency_check CHECK ((((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_invoice_open_items_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT finance_invoice_open_items_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_invoice_open_items_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT finance_invoice_open_items_original_amount_check CHECK ((original_amount > (0)::numeric)),
    CONSTRAINT finance_invoice_open_items_side_check CHECK ((side = ANY (ARRAY['RECEIVABLE'::text, 'PAYABLE'::text])))
);

ALTER TABLE ONLY finance_invoice_open_items FORCE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_postings; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_invoice_postings (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    party_ledger_entry_id uuid NOT NULL,
    open_item_id uuid NOT NULL,
    idempotency_key text NOT NULL,
    posted_by uuid,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_invoice_postings_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text))
);

ALTER TABLE ONLY finance_invoice_postings FORCE ROW LEVEL SECURITY;

--
-- Name: finance_manual_entries; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_manual_entries (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    party_ledger_entry_id uuid NOT NULL,
    entry_kind text NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    exchange_rate numeric(20,10) DEFAULT 1 NOT NULL,
    base_currency character(3),
    base_amount numeric(20,4),
    description text NOT NULL,
    transaction_date date NOT NULL,
    idempotency_key text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    document_no text DEFAULT ''::text NOT NULL,
    reference_no text DEFAULT ''::text NOT NULL,
    due_date date,
    CONSTRAINT finance_manual_entries_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_manual_entries_check CHECK ((((base_amount IS NULL) AND (base_currency IS NULL)) OR ((base_amount IS NOT NULL) AND (base_currency IS NOT NULL) AND (base_amount > (0)::numeric)))),
    CONSTRAINT finance_manual_entries_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_manual_entries_description_check CHECK ((btrim(description) <> ''::text)),
    CONSTRAINT finance_manual_entries_due_date_check CHECK (((due_date IS NULL) OR (due_date >= transaction_date))),
    CONSTRAINT finance_manual_entries_entry_kind_check CHECK ((entry_kind = ANY (ARRAY['DEBIT'::text, 'CREDIT'::text]))),
    CONSTRAINT finance_manual_entries_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT finance_manual_entries_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text))
);

ALTER TABLE ONLY finance_manual_entries FORCE ROW LEVEL SECURITY;

--
-- Name: finance_party_transfers; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_party_transfers (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    from_party_id uuid NOT NULL,
    to_party_id uuid NOT NULL,
    debit_ledger_entry_id uuid NOT NULL,
    credit_ledger_entry_id uuid NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    description text NOT NULL,
    transaction_date date NOT NULL,
    idempotency_key text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_party_transfers_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_party_transfers_check CHECK ((from_party_id <> to_party_id)),
    CONSTRAINT finance_party_transfers_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_party_transfers_description_check CHECK ((btrim(description) <> ''::text)),
    CONSTRAINT finance_party_transfers_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text))
);

ALTER TABLE ONLY finance_party_transfers FORCE ROW LEVEL SECURITY;

--
-- Name: finance_payment_allocations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_payment_allocations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payment_id uuid NOT NULL,
    party_id uuid NOT NULL,
    target_type text NOT NULL,
    target_id uuid NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    idempotency_key text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    allocated_at timestamp with time zone DEFAULT now() NOT NULL,
    open_item_id uuid,
    CONSTRAINT finance_payment_allocations_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_payment_allocations_check CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT finance_payment_allocations_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_payment_allocations_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT finance_payment_allocations_open_item_target_check CHECK ((((target_type = 'DOCUMENT'::text) AND (open_item_id IS NOT NULL)) OR ((target_type = 'PARTY_LEDGER'::text) AND (open_item_id IS NULL)))),
    CONSTRAINT finance_payment_allocations_snapshot_check CHECK ((jsonb_typeof(snapshot) = 'object'::text)),
    CONSTRAINT finance_payment_allocations_target_type_check CHECK ((target_type = ANY (ARRAY['PARTY_LEDGER'::text, 'DOCUMENT'::text])))
);

ALTER TABLE ONLY finance_payment_allocations FORCE ROW LEVEL SECURITY;

--
-- Name: finance_payments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_payments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    account_id uuid,
    movement_id uuid,
    party_ledger_entry_id uuid NOT NULL,
    payment_kind text NOT NULL,
    movement_direction text NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    document_no text DEFAULT ''::text NOT NULL,
    description text NOT NULL,
    transaction_date date NOT NULL,
    idempotency_key text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    payment_method text DEFAULT 'OTHER'::text NOT NULL,
    exchange_rate numeric(20,10) DEFAULT 1 NOT NULL,
    base_currency character(3),
    base_amount numeric(20,4),
    instrument_id uuid,
    reference_no text DEFAULT ''::text NOT NULL,
    CONSTRAINT finance_payments_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_payments_base_amount_check CHECK ((((base_amount IS NULL) AND (base_currency IS NULL)) OR ((base_amount IS NOT NULL) AND (base_currency IS NOT NULL) AND (base_amount > (0)::numeric)))),
    CONSTRAINT finance_payments_base_currency_check CHECK (((base_currency IS NULL) OR ((base_currency)::text = upper((base_currency)::text)))),
    CONSTRAINT finance_payments_check CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT finance_payments_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_payments_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT finance_payments_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT finance_payments_instrument_method_check CHECK (((payment_method = ANY (ARRAY['CHECK'::text, 'PROMISSORY_NOTE'::text])) = (instrument_id IS NOT NULL))),
    CONSTRAINT finance_payments_method_account_check CHECK ((((payment_method = ANY (ARRAY['CASH'::text, 'BANK'::text, 'POS'::text])) AND (account_id IS NOT NULL) AND (movement_id IS NOT NULL)) OR (payment_method = ANY (ARRAY['CHECK'::text, 'PROMISSORY_NOTE'::text, 'OTHER'::text])))),
    CONSTRAINT finance_payments_movement_direction_check CHECK ((movement_direction = ANY (ARRAY['IN'::text, 'OUT'::text]))),
    CONSTRAINT finance_payments_payment_kind_check CHECK ((payment_kind = ANY (ARRAY['COLLECTION'::text, 'PAYMENT'::text]))),
    CONSTRAINT finance_payments_payment_method_check CHECK ((payment_method = ANY (ARRAY['CASH'::text, 'BANK'::text, 'POS'::text, 'CHECK'::text, 'PROMISSORY_NOTE'::text, 'OTHER'::text]))),
    CONSTRAINT finance_payments_snapshot_check CHECK ((jsonb_typeof(snapshot) = 'object'::text))
);

ALTER TABLE ONLY finance_payments FORCE ROW LEVEL SECURITY;

--
-- Name: finance_period_locks; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_period_locks (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    period_start date NOT NULL,
    period_end date NOT NULL,
    reason text NOT NULL,
    locked_by uuid,
    locked_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_period_locks_check CHECK ((period_end >= period_start)),
    CONSTRAINT finance_period_locks_reason_check CHECK ((btrim(reason) <> ''::text))
);

ALTER TABLE ONLY finance_period_locks FORCE ROW LEVEL SECURITY;

--
-- Name: finance_transfers; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE finance_transfers (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    from_account_id uuid NOT NULL,
    to_account_id uuid NOT NULL,
    out_movement_id uuid NOT NULL,
    in_movement_id uuid NOT NULL,
    currency character(3) NOT NULL,
    amount numeric(20,4) NOT NULL,
    document_no text NOT NULL,
    external_reference text DEFAULT ''::text NOT NULL,
    description text NOT NULL,
    transaction_date date NOT NULL,
    idempotency_key text NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT finance_transfers_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT finance_transfers_check CHECK ((from_account_id <> to_account_id)),
    CONSTRAINT finance_transfers_check1 CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT finance_transfers_check2 CHECK ((out_movement_id <> in_movement_id)),
    CONSTRAINT finance_transfers_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT finance_transfers_description_check CHECK ((btrim(description) <> ''::text)),
    CONSTRAINT finance_transfers_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT finance_transfers_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT finance_transfers_snapshot_check CHECK ((jsonb_typeof(snapshot) = 'object'::text))
);

ALTER TABLE ONLY finance_transfers FORCE ROW LEVEL SECURITY;

--
-- Name: fixed_asset_categories; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE fixed_asset_categories (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    is_system boolean DEFAULT false NOT NULL,
    archived_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT fixed_asset_categories_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT fixed_asset_categories_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT fixed_asset_categories_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY fixed_asset_categories FORCE ROW LEVEL SECURITY;

--
-- Name: fixed_assets; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE fixed_assets (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    asset_code text NOT NULL,
    name text NOT NULL,
    category text NOT NULL,
    serial_number text,
    description text DEFAULT ''::text NOT NULL,
    status text DEFAULT 'AVAILABLE'::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT fixed_assets_asset_code_check CHECK ((btrim(asset_code) <> ''::text)),
    CONSTRAINT fixed_assets_category_check CHECK ((btrim(category) <> ''::text)),
    CONSTRAINT fixed_assets_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT fixed_assets_status_check CHECK ((status = ANY (ARRAY['AVAILABLE'::text, 'ASSIGNED'::text, 'MAINTENANCE'::text, 'RETIRED'::text]))),
    CONSTRAINT fixed_assets_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY fixed_assets FORCE ROW LEVEL SECURITY;

--
-- Name: goods_receipt_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE goods_receipt_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    receipt_id uuid NOT NULL,
    purchase_order_line_id uuid,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    accepted_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    damaged_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    rejected_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    unit_code text NOT NULL,
    unit_cost numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    lot_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    serial_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    warehouse_id uuid NOT NULL,
    CONSTRAINT goods_receipt_lines_accepted_quantity_check CHECK ((accepted_quantity >= (0)::numeric)),
    CONSTRAINT goods_receipt_lines_base_quantity_check CHECK ((base_quantity >= (0)::numeric)),
    CONSTRAINT goods_receipt_lines_check CHECK ((((accepted_quantity + damaged_quantity) + rejected_quantity) > (0)::numeric)),
    CONSTRAINT goods_receipt_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT goods_receipt_lines_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT goods_receipt_lines_damaged_quantity_check CHECK ((damaged_quantity >= (0)::numeric)),
    CONSTRAINT goods_receipt_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT goods_receipt_lines_lot_snapshot_check CHECK ((jsonb_typeof(lot_snapshot) = 'array'::text)),
    CONSTRAINT goods_receipt_lines_rejected_quantity_check CHECK ((rejected_quantity >= (0)::numeric)),
    CONSTRAINT goods_receipt_lines_serial_snapshot_check CHECK ((jsonb_typeof(serial_snapshot) = 'array'::text)),
    CONSTRAINT goods_receipt_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT goods_receipt_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT goods_receipt_lines_unit_cost_check CHECK ((unit_cost >= (0)::numeric))
);

ALTER TABLE ONLY goods_receipt_lines FORCE ROW LEVEL SECURITY;

--
-- Name: goods_receipts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE goods_receipts (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    receipt_no text NOT NULL,
    purchase_order_id uuid,
    supplier_id uuid NOT NULL,
    branch_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    receipt_date date NOT NULL,
    status text DEFAULT 'POSTED'::text NOT NULL,
    over_delivery_warning boolean DEFAULT false NOT NULL,
    notes text DEFAULT ''::text NOT NULL,
    created_by uuid NOT NULL,
    posted_at timestamp with time zone DEFAULT now(),
    document_id uuid,
    currency character(3) DEFAULT 'TRY'::bpchar NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT goods_receipts_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT goods_receipts_receipt_no_check CHECK ((btrim(receipt_no) <> ''::text)),
    CONSTRAINT goods_receipts_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT goods_receipts_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY goods_receipts FORCE ROW LEVEL SECURITY;

--
-- Name: import_jobs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE import_jobs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    entity_type text NOT NULL,
    direction text DEFAULT 'IMPORT'::text NOT NULL,
    target_id uuid,
    status text DEFAULT 'UPLOADED'::text NOT NULL,
    commit_mode text DEFAULT 'ATOMIC'::text NOT NULL,
    dry_run boolean DEFAULT false NOT NULL,
    source_filename text NOT NULL,
    source_content_type text DEFAULT 'application/octet-stream'::text NOT NULL,
    source_storage_key text NOT NULL,
    source_sha256 text NOT NULL,
    row_count integer DEFAULT 0 NOT NULL,
    error_count integer DEFAULT 0 NOT NULL,
    warning_count integer DEFAULT 0 NOT NULL,
    created_by uuid NOT NULL,
    committed_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    analysis_revision text DEFAULT ''::text NOT NULL,
    preview_hash text DEFAULT ''::text NOT NULL,
    committing_at timestamp with time zone,
    commit_token uuid,
    last_error text DEFAULT ''::text NOT NULL,
    CONSTRAINT import_jobs_check CHECK (((status = 'COMMITTED'::text) = (committed_at IS NOT NULL))),
    CONSTRAINT import_jobs_commit_mode_check CHECK ((commit_mode = ANY (ARRAY['ATOMIC'::text, 'PARTIAL'::text]))),
    CONSTRAINT import_jobs_commit_state_check CHECK (((status = 'COMMITTED'::text) = (committed_at IS NOT NULL))),
    CONSTRAINT import_jobs_direction_check CHECK ((direction = ANY (ARRAY['IMPORT'::text, 'EXPORT'::text]))),
    CONSTRAINT import_jobs_entity_type_check CHECK ((entity_type = ANY (ARRAY['PRODUCT'::text, 'VARIANT'::text, 'BARCODE'::text, 'WAREHOUSE'::text, 'PARTY'::text, 'PRICE_LIST'::text, 'OPENING_STOCK'::text, 'STOCK_COUNT'::text]))),
    CONSTRAINT import_jobs_error_count_check CHECK ((error_count >= 0)),
    CONSTRAINT import_jobs_row_count_check CHECK ((row_count >= 0)),
    CONSTRAINT import_jobs_source_filename_check CHECK ((btrim(source_filename) <> ''::text)),
    CONSTRAINT import_jobs_source_sha256_check CHECK ((source_sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT import_jobs_status_check CHECK ((status = ANY (ARRAY['UPLOADED'::text, 'ANALYZING'::text, 'READY'::text, 'COMMITTING'::text, 'COMMITTED'::text, 'FAILED'::text]))),
    CONSTRAINT import_jobs_warning_count_check CHECK ((warning_count >= 0))
);

ALTER TABLE ONLY import_jobs FORCE ROW LEVEL SECURITY;

--
-- Name: import_mappings; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE import_mappings (
    company_id uuid NOT NULL,
    import_job_id uuid NOT NULL,
    source_column text NOT NULL,
    target_field text NOT NULL,
    mapping_source text DEFAULT 'AUTO'::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT import_mappings_mapping_source_check CHECK ((mapping_source = ANY (ARRAY['AUTO'::text, 'MANUAL'::text])))
);

ALTER TABLE ONLY import_mappings FORCE ROW LEVEL SECURITY;

--
-- Name: import_row_results; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE import_row_results (
    company_id uuid NOT NULL,
    import_job_id uuid NOT NULL,
    row_number integer NOT NULL,
    row_key text DEFAULT ''::text NOT NULL,
    status text NOT NULL,
    "values" jsonb DEFAULT '{}'::jsonb NOT NULL,
    errors jsonb DEFAULT '[]'::jsonb NOT NULL,
    warnings jsonb DEFAULT '[]'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT import_row_results_row_number_check CHECK ((row_number > 0)),
    CONSTRAINT import_row_results_status_check CHECK ((status = ANY (ARRAY['VALID'::text, 'WARNING'::text, 'ERROR'::text])))
);

ALTER TABLE ONLY import_row_results FORCE ROW LEVEL SECURITY;

--
-- Name: instance_setup; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE instance_setup (
    singleton boolean DEFAULT true NOT NULL,
    completed_at timestamp with time zone NOT NULL,
    completed_by uuid NOT NULL,
    CONSTRAINT instance_setup_singleton_check CHECK (singleton)
);

--
-- Name: inventory_company_policies; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE inventory_company_policies (
    company_id uuid NOT NULL,
    negative_stock_policy text DEFAULT 'BLOCK'::text NOT NULL,
    expired_lot_policy text DEFAULT 'BLOCK'::text NOT NULL,
    cost_method text DEFAULT 'FIFO'::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT inventory_company_policies_cost_method_check CHECK ((cost_method = ANY (ARRAY['FIFO'::text, 'MOVING_AVERAGE'::text]))),
    CONSTRAINT inventory_company_policies_expired_lot_policy_check CHECK ((expired_lot_policy = ANY (ARRAY['ALLOW'::text, 'WARN'::text, 'BLOCK'::text]))),
    CONSTRAINT inventory_company_policies_negative_stock_policy_check CHECK ((negative_stock_policy = ANY (ARRAY['ALLOW'::text, 'WARN'::text, 'BLOCK'::text])))
);

ALTER TABLE ONLY inventory_company_policies FORCE ROW LEVEL SECURITY;

--
-- Name: inventory_reason_codes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE inventory_reason_codes (
    code text NOT NULL,
    display_name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    CONSTRAINT inventory_reason_codes_code_check CHECK (((code = upper(btrim(code))) AND (btrim(code) <> ''::text))),
    CONSTRAINT inventory_reason_codes_display_name_check CHECK ((btrim(display_name) <> ''::text))
);

--
-- Name: leave_types; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE leave_types (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    payroll_treatment text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT leave_types_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT leave_types_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT leave_types_payroll_treatment_check CHECK ((payroll_treatment = ANY (ARRAY['PAID'::text, 'UNPAID'::text, 'SICK_REQUIRES_REVIEW'::text]))),
    CONSTRAINT leave_types_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY leave_types FORCE ROW LEVEL SECURITY;

--
-- Name: locations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE locations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    parent_id uuid,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT locations_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT locations_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT locations_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY locations FORCE ROW LEVEL SECURITY;

--
-- Name: login_attempts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE login_attempts (
    id bigint NOT NULL,
    email_hash bytea NOT NULL,
    ip_hash bytea NOT NULL,
    succeeded boolean NOT NULL,
    attempted_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT login_attempts_email_hash_check CHECK ((octet_length(email_hash) = 32)),
    CONSTRAINT login_attempts_ip_hash_check CHECK ((octet_length(ip_hash) = 32))
);

--
-- Name: login_attempts_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE login_attempts ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME login_attempts_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);

--
-- Name: lots; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE lots (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    lot_number text NOT NULL,
    manufactured_at date,
    expires_at date,
    supplier_reference text DEFAULT ''::text NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT lots_lot_number_check CHECK ((btrim(lot_number) <> ''::text)),
    CONSTRAINT lots_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text))
);

ALTER TABLE ONLY lots FORCE ROW LEVEL SECURITY;

--
-- Name: membership_branch_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE membership_branch_scopes (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    branch_id uuid NOT NULL
);

ALTER TABLE ONLY membership_branch_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: membership_finance_account_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE membership_finance_account_scopes (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    account_id uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);

ALTER TABLE ONLY membership_finance_account_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: membership_roles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE membership_roles (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    role_id uuid NOT NULL
);

ALTER TABLE ONLY membership_roles FORCE ROW LEVEL SECURITY;

--
-- Name: membership_warehouse_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE membership_warehouse_scopes (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    warehouse_id uuid NOT NULL
);

ALTER TABLE ONLY membership_warehouse_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: outbox_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE outbox_events (
    event_id uuid NOT NULL,
    type text NOT NULL,
    schema_version integer NOT NULL,
    company_id uuid,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL,
    trace_id text,
    payload jsonb NOT NULL,
    available_at timestamp with time zone DEFAULT now() NOT NULL,
    attempts integer DEFAULT 0 NOT NULL,
    locked_at timestamp with time zone,
    processed_at timestamp with time zone,
    dead_lettered_at timestamp with time zone,
    last_error_class text,
    CONSTRAINT outbox_events_attempts_check CHECK ((attempts >= 0)),
    CONSTRAINT outbox_events_schema_version_check CHECK ((schema_version > 0))
);

ALTER TABLE ONLY outbox_events FORCE ROW LEVEL SECURITY;

--
-- Name: parties; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE parties (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    kind party_kind NOT NULL,
    is_customer boolean DEFAULT false NOT NULL,
    is_supplier boolean DEFAULT false NOT NULL,
    display_name text NOT NULL,
    legal_name text,
    trade_name text,
    first_name text,
    last_name text,
    tax_number text,
    identity_number text,
    tax_office text,
    default_currency character(3) NOT NULL,
    payment_term_id uuid,
    price_list_id uuid,
    default_discount_rate numeric(9,6) DEFAULT 0 NOT NULL,
    sales_rep_user_id uuid,
    credit_limit numeric(20,4) DEFAULT 0 NOT NULL,
    risk_limit numeric(20,4) DEFAULT 0 NOT NULL,
    risk_policy party_risk_policy DEFAULT 'WARN'::party_risk_policy NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    deactivated_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    tax_office_id uuid,
    CONSTRAINT parties_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT parties_credit_limit_check CHECK ((credit_limit >= (0)::numeric)),
    CONSTRAINT parties_deactivation_consistent CHECK ((is_active = (deactivated_at IS NULL))),
    CONSTRAINT parties_default_currency_check CHECK (((default_currency)::text = upper((default_currency)::text))),
    CONSTRAINT parties_default_discount_rate_check CHECK (((default_discount_rate >= (0)::numeric) AND (default_discount_rate <= (100)::numeric))),
    CONSTRAINT parties_display_name_check CHECK ((btrim(display_name) <> ''::text)),
    CONSTRAINT parties_has_role CHECK ((is_customer OR is_supplier)),
    CONSTRAINT parties_identity_number_format CHECK (((identity_number IS NULL) OR (identity_number ~ '^[0-9]{11}$'::text))),
    CONSTRAINT parties_kind_fields CHECK ((((kind = 'PERSON'::party_kind) AND (btrim(COALESCE(first_name, ''::text)) <> ''::text) AND (btrim(COALESCE(last_name, ''::text)) <> ''::text)) OR ((kind = 'ORGANIZATION'::party_kind) AND (btrim(COALESCE(legal_name, ''::text)) <> ''::text)))),
    CONSTRAINT parties_risk_limit_check CHECK ((risk_limit >= (0)::numeric)),
    CONSTRAINT parties_tax_number_format CHECK (((tax_number IS NULL) OR (tax_number ~ '^[0-9]{10}$'::text))),
    CONSTRAINT parties_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY parties FORCE ROW LEVEL SECURITY;

--
-- Name: party_addresses; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_addresses (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    address_line text,
    district text,
    city text NOT NULL,
    is_default boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    neighborhood text,
    province_id smallint,
    district_id bigint,
    neighborhood_id bigint,
    CONSTRAINT party_addresses_city_check CHECK ((btrim(city) <> ''::text)),
    CONSTRAINT party_addresses_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY party_addresses FORCE ROW LEVEL SECURITY;

--
-- Name: party_contacts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_contacts (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    full_name text NOT NULL,
    title text,
    department text,
    email text,
    phone text,
    is_primary boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT party_contacts_check CHECK (((email IS NOT NULL) OR (phone IS NOT NULL))),
    CONSTRAINT party_contacts_full_name_check CHECK ((btrim(full_name) <> ''::text)),
    CONSTRAINT party_contacts_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY party_contacts FORCE ROW LEVEL SECURITY;

--
-- Name: party_custom_field_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_custom_field_definitions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    field_type custom_field_type NOT NULL,
    select_options jsonb DEFAULT '[]'::jsonb NOT NULL,
    is_required boolean DEFAULT false NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    CONSTRAINT party_custom_field_definitions_code_check CHECK ((code ~ '^[a-z][a-z0-9_]{0,62}$'::text)),
    CONSTRAINT party_custom_field_definitions_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT party_custom_field_definitions_select_options_check CHECK ((jsonb_typeof(select_options) = 'array'::text))
);

ALTER TABLE ONLY party_custom_field_definitions FORCE ROW LEVEL SECURITY;

--
-- Name: party_custom_field_values; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_custom_field_values (
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    definition_id uuid NOT NULL,
    text_value text,
    number_value numeric(30,10),
    date_value date,
    boolean_value boolean,
    select_value text,
    CONSTRAINT party_custom_field_values_check CHECK ((num_nonnulls(text_value, number_value, date_value, boolean_value, select_value) = 1))
);

ALTER TABLE ONLY party_custom_field_values FORCE ROW LEVEL SECURITY;

--
-- Name: party_group_memberships; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_group_memberships (
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    group_id uuid NOT NULL
);

ALTER TABLE ONLY party_group_memberships FORCE ROW LEVEL SECURITY;

--
-- Name: party_groups; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_groups (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT party_groups_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT party_groups_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT party_groups_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY party_groups FORCE ROW LEVEL SECURITY;

--
-- Name: party_ledger_entries; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_ledger_entries (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    currency character(3) NOT NULL,
    entry_type text NOT NULL,
    source_type text NOT NULL,
    source_id uuid NOT NULL,
    idempotency_key text NOT NULL,
    description text NOT NULL,
    debit numeric(20,4) DEFAULT 0 NOT NULL,
    credit numeric(20,4) DEFAULT 0 NOT NULL,
    exchange_rate numeric(20,10) DEFAULT 1 NOT NULL,
    document_date date NOT NULL,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    reversal_of_id uuid,
    actor_user_id uuid,
    snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    base_currency character(3),
    base_amount numeric(20,4),
    CONSTRAINT party_ledger_base_amount_check CHECK ((((base_amount IS NULL) AND (base_currency IS NULL)) OR ((base_amount IS NOT NULL) AND (base_currency IS NOT NULL) AND (base_amount > (0)::numeric)))),
    CONSTRAINT party_ledger_base_currency_check CHECK (((base_currency IS NULL) OR (((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text)))),
    CONSTRAINT party_ledger_entries_credit_check CHECK ((credit >= (0)::numeric)),
    CONSTRAINT party_ledger_entries_currency_check CHECK (((currency)::text = upper((currency)::text))),
    CONSTRAINT party_ledger_entries_debit_check CHECK ((debit >= (0)::numeric)),
    CONSTRAINT party_ledger_entries_description_check CHECK ((btrim(description) <> ''::text)),
    CONSTRAINT party_ledger_entries_entry_type_check CHECK ((entry_type ~ '^[A-Z][A-Z0-9_]{1,63}$'::text)),
    CONSTRAINT party_ledger_entries_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT party_ledger_entries_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT party_ledger_entries_snapshot_check CHECK ((jsonb_typeof(snapshot) = 'object'::text)),
    CONSTRAINT party_ledger_entries_source_type_check CHECK ((btrim(source_type) <> ''::text)),
    CONSTRAINT party_ledger_reversal_not_self CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT party_ledger_single_side CHECK ((((debit > (0)::numeric) AND (credit = (0)::numeric)) OR ((credit > (0)::numeric) AND (debit = (0)::numeric))))
);

ALTER TABLE ONLY party_ledger_entries FORCE ROW LEVEL SECURITY;

--
-- Name: party_ledger_balance_effects; Type: VIEW; Schema: public; Owner: -
--

CREATE VIEW party_ledger_balance_effects AS
 SELECT l.company_id,
    l.id,
    l.party_id,
    l.currency,
    l.entry_type,
    l.source_type,
    l.source_id,
    l.description,
    l.debit,
    l.credit,
    l.exchange_rate,
    l.base_amount,
    (l.debit - l.credit) AS signed_amount,
        CASE
            WHEN ((l.base_amount IS NOT NULL) AND (COALESCE(l.base_currency, c.base_currency) = c.base_currency)) THEN
            CASE
                WHEN (l.debit > (0)::numeric) THEN l.base_amount
                ELSE (- l.base_amount)
            END
            ELSE round(((l.debit - l.credit) * l.exchange_rate), 4)
        END AS base_signed_amount,
    c.base_currency,
    l.document_date,
    l.posted_at,
    l.reversal_of_id,
    l.actor_user_id,
    l.snapshot
   FROM (party_ledger_entries l
     JOIN companies c ON ((c.id = l.company_id)));

--
-- Name: party_search_documents; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_search_documents (
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    search_text text DEFAULT ''::text NOT NULL,
    balance_search text DEFAULT '0'::text NOT NULL,
    search_vector tsvector DEFAULT ''::tsvector NOT NULL
);

ALTER TABLE ONLY party_search_documents FORCE ROW LEVEL SECURITY;

--
-- Name: party_tag_assignments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_tag_assignments (
    company_id uuid NOT NULL,
    party_id uuid NOT NULL,
    tag_id uuid NOT NULL
);

ALTER TABLE ONLY party_tag_assignments FORCE ROW LEVEL SECURITY;

--
-- Name: party_tags; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE party_tags (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    name text NOT NULL,
    color text,
    CONSTRAINT party_tags_color_check CHECK (((color IS NULL) OR (color ~ '^#[0-9A-Fa-f]{6}$'::text))),
    CONSTRAINT party_tags_name_check CHECK ((btrim(name) <> ''::text))
);

ALTER TABLE ONLY party_tags FORCE ROW LEVEL SECURITY;

--
-- Name: payment_terms; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payment_terms (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    due_days integer DEFAULT 0 NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT payment_terms_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT payment_terms_due_days_check CHECK ((due_days >= 0)),
    CONSTRAINT payment_terms_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT payment_terms_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY payment_terms FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_calculation_generations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_calculation_generations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    generation_no integer NOT NULL,
    status text DEFAULT 'RUNNING'::text NOT NULL,
    engine_version text NOT NULL,
    legislation_pack_version integer CONSTRAINT payroll_calculation_generatio_legislation_pack_version_not_null NOT NULL,
    population_hash character(64) NOT NULL,
    timesheet_checksum character(64) NOT NULL,
    manual_input_version bigint NOT NULL,
    input_checksum character(64) NOT NULL,
    error_summary jsonb DEFAULT '[]'::jsonb NOT NULL,
    started_at timestamp with time zone DEFAULT now() NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT payroll_calculation_generations_check CHECK ((((status = 'RUNNING'::text) AND (completed_at IS NULL)) OR ((status <> 'RUNNING'::text) AND (completed_at IS NOT NULL)))),
    CONSTRAINT payroll_calculation_generations_engine_version_check CHECK ((btrim(engine_version) <> ''::text)),
    CONSTRAINT payroll_calculation_generations_error_summary_check CHECK ((jsonb_typeof(error_summary) = 'array'::text)),
    CONSTRAINT payroll_calculation_generations_generation_no_check CHECK ((generation_no > 0)),
    CONSTRAINT payroll_calculation_generations_input_checksum_check CHECK ((input_checksum ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT payroll_calculation_generations_legislation_pack_version_check CHECK ((legislation_pack_version > 0)),
    CONSTRAINT payroll_calculation_generations_manual_input_version_check CHECK ((manual_input_version >= 0)),
    CONSTRAINT payroll_calculation_generations_population_hash_check CHECK ((population_hash ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT payroll_calculation_generations_status_check CHECK ((status = ANY (ARRAY['RUNNING'::text, 'FAILED'::text, 'SUCCEEDED'::text, 'ACTIVE'::text, 'FINALIZED'::text]))),
    CONSTRAINT payroll_calculation_generations_timesheet_checksum_check CHECK ((timesheet_checksum ~ '^[0-9a-f]{64}$'::text))
);

ALTER TABLE ONLY payroll_calculation_generations FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_calculation_jobs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_calculation_jobs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    generation_id uuid NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    progress_total integer DEFAULT 0 NOT NULL,
    progress_completed integer DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    started_at timestamp with time zone,
    completed_at timestamp with time zone,
    CONSTRAINT payroll_calculation_jobs_check CHECK (((progress_completed >= 0) AND (progress_completed <= progress_total))),
    CONSTRAINT payroll_calculation_jobs_progress_total_check CHECK ((progress_total >= 0)),
    CONSTRAINT payroll_calculation_jobs_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'RUNNING'::text, 'SUCCEEDED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY payroll_calculation_jobs FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_component_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_component_definitions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    pack_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    ownership text NOT NULL,
    component_kind text NOT NULL,
    payment_form text DEFAULT 'CASH'::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    CONSTRAINT payroll_component_definitions_code_check CHECK ((code ~ '^[A-Z][A-Z0-9_]{1,63}$'::text)),
    CONSTRAINT payroll_component_definitions_component_kind_check CHECK ((component_kind = ANY (ARRAY['EARNING'::text, 'DEDUCTION'::text, 'EMPLOYER_COST'::text]))),
    CONSTRAINT payroll_component_definitions_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT payroll_component_definitions_ownership_check CHECK ((ownership = ANY (ARRAY['SYSTEM'::text, 'MANUAL'::text]))),
    CONSTRAINT payroll_component_definitions_payment_form_check CHECK ((payment_form = ANY (ARRAY['CASH'::text, 'IN_KIND'::text])))
);

ALTER TABLE ONLY payroll_component_definitions FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_component_treatments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_component_treatments (
    company_id uuid NOT NULL,
    component_definition_id uuid NOT NULL,
    levy text NOT NULL,
    treatment text NOT NULL,
    limit_value numeric(20,8),
    qualification jsonb DEFAULT '{}'::jsonb NOT NULL,
    CONSTRAINT payroll_component_treatments_check CHECK ((((treatment = ANY (ARRAY['FULLY_INCLUDED'::text, 'FULLY_EXEMPT'::text])) AND (limit_value IS NULL)) OR ((treatment <> ALL (ARRAY['FULLY_INCLUDED'::text, 'FULLY_EXEMPT'::text])) AND (limit_value IS NOT NULL) AND (limit_value >= (0)::numeric)))),
    CONSTRAINT payroll_component_treatments_levy_check CHECK ((levy = ANY (ARRAY['SGK'::text, 'INCOME_TAX'::text, 'STAMP_TAX'::text]))),
    CONSTRAINT payroll_component_treatments_qualification_check CHECK ((jsonb_typeof(qualification) = 'object'::text)),
    CONSTRAINT payroll_component_treatments_treatment_check CHECK ((treatment = ANY (ARRAY['FULLY_INCLUDED'::text, 'FULLY_EXEMPT'::text, 'DAILY_LIMIT'::text, 'MONTHLY_LIMIT'::text, 'PERCENT_LIMIT'::text])))
);

ALTER TABLE ONLY payroll_component_treatments FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_contribution_schemes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_contribution_schemes (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    pack_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    employee_sgk_rate numeric(12,8) NOT NULL,
    employee_unemployment_rate numeric(12,8) CONSTRAINT payroll_contribution_scheme_employee_unemployment_rate_not_null NOT NULL,
    employer_sgk_rate numeric(12,8) NOT NULL,
    employer_unemployment_rate numeric(12,8) CONSTRAINT payroll_contribution_scheme_employer_unemployment_rate_not_null NOT NULL,
    sgdp_employee_rate numeric(12,8) DEFAULT 0.075 NOT NULL,
    sgdp_employer_rate numeric(12,8) DEFAULT 0.245 NOT NULL,
    CONSTRAINT payroll_contribution_schemes_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT payroll_contribution_schemes_employee_sgk_rate_check CHECK (((employee_sgk_rate >= (0)::numeric) AND (employee_sgk_rate <= (1)::numeric))),
    CONSTRAINT payroll_contribution_schemes_employee_unemployment_rate_check CHECK (((employee_unemployment_rate >= (0)::numeric) AND (employee_unemployment_rate <= (1)::numeric))),
    CONSTRAINT payroll_contribution_schemes_employer_sgk_rate_check CHECK (((employer_sgk_rate >= (0)::numeric) AND (employer_sgk_rate <= (1)::numeric))),
    CONSTRAINT payroll_contribution_schemes_employer_unemployment_rate_check CHECK (((employer_unemployment_rate >= (0)::numeric) AND (employer_unemployment_rate <= (1)::numeric))),
    CONSTRAINT payroll_contribution_schemes_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT payroll_contribution_schemes_sgdp_employee_rate_check CHECK (((sgdp_employee_rate >= (0)::numeric) AND (sgdp_employee_rate <= (1)::numeric))),
    CONSTRAINT payroll_contribution_schemes_sgdp_employer_rate_check CHECK (((sgdp_employer_rate >= (0)::numeric) AND (sgdp_employer_rate <= (1)::numeric)))
);

ALTER TABLE ONLY payroll_contribution_schemes FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_email_batches; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_email_batches (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    idempotency_key text NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    is_resend boolean DEFAULT false NOT NULL,
    requested_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT payroll_email_batches_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT payroll_email_batches_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'RUNNING'::text, 'COMPLETED'::text, 'BLOCKED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY payroll_email_batches FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_email_deliveries; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_email_deliveries (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    batch_id uuid NOT NULL,
    employee_payroll_id uuid NOT NULL,
    payslip_id uuid NOT NULL,
    recipient_snapshot text NOT NULL,
    subject_snapshot text NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    attempt_count integer DEFAULT 0 NOT NULL,
    next_attempt_at timestamp with time zone,
    smtp_response_code integer,
    error_code text,
    sent_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT payroll_email_deliveries_attempt_count_check CHECK ((attempt_count >= 0)),
    CONSTRAINT payroll_email_deliveries_check CHECK (((status <> 'SENT'::text) OR ((smtp_response_code = 250) AND (sent_at IS NOT NULL)))),
    CONSTRAINT payroll_email_deliveries_check1 CHECK (((status <> 'DELIVERY_STATUS_UNKNOWN'::text) OR (error_code = 'DELIVERY_STATUS_UNKNOWN'::text))),
    CONSTRAINT payroll_email_deliveries_recipient_snapshot_check CHECK ((recipient_snapshot = lower(btrim(recipient_snapshot)))),
    CONSTRAINT payroll_email_deliveries_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'SENDING'::text, 'SENT'::text, 'SKIPPED_NO_EMAIL'::text, 'FAILED_PERMANENT'::text, 'DELIVERY_STATUS_UNKNOWN'::text]))),
    CONSTRAINT payroll_email_deliveries_subject_snapshot_check CHECK ((btrim(subject_snapshot) <> ''::text))
);

ALTER TABLE ONLY payroll_email_deliveries FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_export_jobs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_export_jobs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    generation_id uuid NOT NULL,
    export_type text NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    storage_key text,
    sha256 character(64),
    size_bytes bigint,
    error_code text,
    requested_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    started_at timestamp with time zone,
    completed_at timestamp with time zone,
    CONSTRAINT payroll_export_jobs_check CHECK ((((status = 'SUCCEEDED'::text) AND (storage_key IS NOT NULL) AND (sha256 IS NOT NULL) AND (size_bytes IS NOT NULL) AND (completed_at IS NOT NULL)) OR (status <> 'SUCCEEDED'::text))),
    CONSTRAINT payroll_export_jobs_export_type_check CHECK ((export_type = ANY (ARRAY['PAYSLIP_ZIP'::text, 'PAYSLIP_MERGED_PDF'::text, 'SUMMARY_CSV'::text, 'SUMMARY_XLSX'::text, 'SUMMARY_PDF'::text]))),
    CONSTRAINT payroll_export_jobs_sha256_check CHECK (((sha256 IS NULL) OR (sha256 ~ '^[0-9a-f]{64}$'::text))),
    CONSTRAINT payroll_export_jobs_size_bytes_check CHECK (((size_bytes IS NULL) OR (size_bytes > 0))),
    CONSTRAINT payroll_export_jobs_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'RUNNING'::text, 'SUCCEEDED'::text, 'FAILED'::text])))
);

ALTER TABLE ONLY payroll_export_jobs FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_export_payslips; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_export_payslips (
    company_id uuid NOT NULL,
    export_job_id uuid NOT NULL,
    payslip_id uuid NOT NULL,
    employee_payroll_id uuid NOT NULL,
    document_order integer NOT NULL,
    CONSTRAINT payroll_export_payslips_document_order_check CHECK ((document_order > 0))
);

ALTER TABLE ONLY payroll_export_payslips FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_income_tax_brackets; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_income_tax_brackets (
    company_id uuid NOT NULL,
    pack_id uuid NOT NULL,
    country_code character(2) NOT NULL,
    sequence smallint NOT NULL,
    upper_bound numeric(20,2),
    rate numeric(12,8) NOT NULL,
    CONSTRAINT payroll_income_tax_brackets_country_code_check CHECK ((country_code = 'TR'::bpchar)),
    CONSTRAINT payroll_income_tax_brackets_rate_check CHECK (((rate >= (0)::numeric) AND (rate <= (1)::numeric))),
    CONSTRAINT payroll_income_tax_brackets_sequence_check CHECK ((sequence > 0)),
    CONSTRAINT payroll_income_tax_brackets_upper_bound_check CHECK ((upper_bound > (0)::numeric))
);

ALTER TABLE ONLY payroll_income_tax_brackets FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_legislation_packs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_legislation_packs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    country_code character(2) NOT NULL,
    code text NOT NULL,
    version integer NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    effective_from date NOT NULL,
    effective_to date NOT NULL,
    supersedes_pack_id uuid,
    change_reason text,
    minimum_monthly_gross numeric(20,2) NOT NULL,
    sgk_daily_floor numeric(20,4) NOT NULL,
    sgk_daily_ceiling numeric(20,4) NOT NULL,
    stamp_tax_rate numeric(12,8) NOT NULL,
    source_metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    activated_at timestamp with time zone,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT payroll_legislation_packs_check CHECK ((sgk_daily_ceiling >= sgk_daily_floor)),
    CONSTRAINT payroll_legislation_packs_check1 CHECK ((effective_to >= effective_from)),
    CONSTRAINT payroll_legislation_packs_check2 CHECK ((((status = 'DRAFT'::text) AND (activated_at IS NULL)) OR ((status <> 'DRAFT'::text) AND (activated_at IS NOT NULL)))),
    CONSTRAINT payroll_legislation_packs_check3 CHECK (((supersedes_pack_id IS NULL) OR ((change_reason IS NOT NULL) AND (btrim(change_reason) <> ''::text)))),
    CONSTRAINT payroll_legislation_packs_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT payroll_legislation_packs_country_code_check CHECK (((country_code)::text = upper((country_code)::text))),
    CONSTRAINT payroll_legislation_packs_minimum_monthly_gross_check CHECK ((minimum_monthly_gross > (0)::numeric)),
    CONSTRAINT payroll_legislation_packs_sgk_daily_floor_check CHECK ((sgk_daily_floor > (0)::numeric)),
    CONSTRAINT payroll_legislation_packs_source_metadata_check CHECK ((jsonb_typeof(source_metadata) = 'object'::text)),
    CONSTRAINT payroll_legislation_packs_stamp_tax_rate_check CHECK (((stamp_tax_rate >= (0)::numeric) AND (stamp_tax_rate <= (1)::numeric))),
    CONSTRAINT payroll_legislation_packs_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'ACTIVE'::text, 'SUPERSEDED'::text]))),
    CONSTRAINT payroll_legislation_packs_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY payroll_legislation_packs FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_manual_components; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_manual_components (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    component_definition_id uuid NOT NULL,
    amount numeric(20,2) NOT NULL,
    explanation text NOT NULL,
    archived_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT payroll_manual_components_amount_check CHECK ((amount >= (0)::numeric)),
    CONSTRAINT payroll_manual_components_explanation_check CHECK ((btrim(explanation) <> ''::text)),
    CONSTRAINT payroll_manual_components_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY payroll_manual_components FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_payments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_payments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    payroll_run_id uuid NOT NULL,
    account_id uuid NOT NULL,
    amount numeric(20,2) NOT NULL,
    currency character(3) DEFAULT 'TRY'::bpchar NOT NULL,
    payment_date date NOT NULL,
    status text DEFAULT 'PAID'::text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    finance_movement_id uuid NOT NULL,
    reversal_movement_id uuid,
    reversed_at timestamp with time zone,
    reversed_by uuid,
    reversal_reason text,
    idempotency_key text NOT NULL,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT payroll_payments_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT payroll_payments_check CHECK (((status = 'REVERSED'::text) = (reversal_movement_id IS NOT NULL))),
    CONSTRAINT payroll_payments_check1 CHECK (((reversed_at IS NULL) = (reversed_by IS NULL))),
    CONSTRAINT payroll_payments_currency_check CHECK ((currency = 'TRY'::bpchar)),
    CONSTRAINT payroll_payments_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT payroll_payments_status_check CHECK ((status = ANY (ARRAY['PAID'::text, 'REVERSED'::text])))
);

ALTER TABLE ONLY payroll_payments FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_payslip_jobs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_payslip_jobs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_payroll_id uuid NOT NULL,
    template_version text NOT NULL,
    status text DEFAULT 'QUEUED'::text NOT NULL,
    payslip_id uuid,
    error_code text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    started_at timestamp with time zone,
    completed_at timestamp with time zone,
    CONSTRAINT payroll_payslip_jobs_check CHECK ((((status = 'SUCCEEDED'::text) AND (payslip_id IS NOT NULL) AND (completed_at IS NOT NULL)) OR (status <> 'SUCCEEDED'::text))),
    CONSTRAINT payroll_payslip_jobs_status_check CHECK ((status = ANY (ARRAY['QUEUED'::text, 'RUNNING'::text, 'SUCCEEDED'::text, 'FAILED'::text]))),
    CONSTRAINT payroll_payslip_jobs_template_version_check CHECK ((btrim(template_version) <> ''::text))
);

ALTER TABLE ONLY payroll_payslip_jobs FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_payslips; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_payslips (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    employee_payroll_id uuid NOT NULL,
    template_version text NOT NULL,
    source_checksum character(64) NOT NULL,
    storage_key text NOT NULL,
    sha256 character(64) NOT NULL,
    size_bytes bigint NOT NULL,
    render_metadata jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT payroll_payslips_render_metadata_check CHECK ((jsonb_typeof(render_metadata) = 'object'::text)),
    CONSTRAINT payroll_payslips_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT payroll_payslips_size_bytes_check CHECK ((size_bytes > 0)),
    CONSTRAINT payroll_payslips_source_checksum_check CHECK ((source_checksum ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT payroll_payslips_storage_key_check CHECK ((btrim(storage_key) <> ''::text)),
    CONSTRAINT payroll_payslips_template_version_check CHECK ((btrim(template_version) <> ''::text))
);

ALTER TABLE ONLY payroll_payslips FORCE ROW LEVEL SECURITY;

--
-- Name: payroll_runs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE payroll_runs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    run_number text NOT NULL,
    run_type text DEFAULT 'REGULAR'::text NOT NULL,
    correction_of_run_id uuid,
    period_year integer NOT NULL,
    period_month smallint NOT NULL,
    payment_date date NOT NULL,
    timesheet_period_id uuid NOT NULL,
    legislation_pack_id uuid NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    active_generation_id uuid,
    total_gross numeric(20,2),
    total_employee_deductions numeric(20,2),
    total_net numeric(20,2),
    total_employer_cost numeric(20,2),
    finalized_at timestamp with time zone,
    finalized_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT payroll_runs_check CHECK ((((status = 'FINALIZED'::text) AND (active_generation_id IS NOT NULL) AND (finalized_at IS NOT NULL) AND (finalized_by IS NOT NULL) AND (total_gross IS NOT NULL) AND (total_net IS NOT NULL) AND (total_employer_cost IS NOT NULL)) OR (status <> 'FINALIZED'::text))),
    CONSTRAINT payroll_runs_check1 CHECK ((((run_type = 'REGULAR'::text) AND (correction_of_run_id IS NULL)) OR (run_type <> 'REGULAR'::text))),
    CONSTRAINT payroll_runs_period_month_check CHECK (((period_month >= 1) AND (period_month <= 12))),
    CONSTRAINT payroll_runs_period_year_check CHECK (((period_year >= 2000) AND (period_year <= 2200))),
    CONSTRAINT payroll_runs_run_number_check CHECK ((btrim(run_number) <> ''::text)),
    CONSTRAINT payroll_runs_run_type_check CHECK ((run_type = ANY (ARRAY['REGULAR'::text, 'CORRECTION'::text, 'ADDITIONAL'::text]))),
    CONSTRAINT payroll_runs_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'CALCULATING'::text, 'CALCULATED'::text, 'CALCULATION_FAILED'::text, 'FINALIZED'::text]))),
    CONSTRAINT payroll_runs_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY payroll_runs FORCE ROW LEVEL SECURITY;

--
-- Name: permissions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE permissions (
    code text NOT NULL,
    description text NOT NULL,
    CONSTRAINT permissions_code_check CHECK ((code ~ '^[a-z][a-z0-9_.]*$'::text))
);

--
-- Name: platform_metadata; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE platform_metadata (
    key text NOT NULL,
    value jsonb NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

--
-- Name: TABLE platform_metadata; Type: COMMENT; Schema: public; Owner: -
--

COMMENT ON TABLE platform_metadata IS 'Varya One runtime metadata; business settings belong to their owning domain.';

--
-- Name: platform_schema_migrations; Type: TABLE; Schema: public; Owner: -
--

-- platform_schema_migrations is created by the migration runner (ensureTable);
-- the baseline must not redefine it.

--
-- Name: price_list_entries; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE price_list_entries (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    price_list_id uuid NOT NULL,
    item_id uuid NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    unit_price numeric(38,18) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    variant_id uuid,
    CONSTRAINT price_list_entries_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT price_list_entries_valid_period CHECK (((valid_to IS NULL) OR (valid_to >= valid_from))),
    CONSTRAINT price_list_entries_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY price_list_entries FORCE ROW LEVEL SECURITY;

--
-- Name: price_lists; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE price_lists (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    currency_code character varying(8) NOT NULL,
    tax_mode text DEFAULT 'EXCLUSIVE'::text NOT NULL,
    round_policy text DEFAULT 'HALF_UP'::text NOT NULL,
    round_scale smallint DEFAULT 2 NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    applies_to_all_categories boolean DEFAULT true NOT NULL,
    scope_category_id uuid,
    CONSTRAINT price_lists_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT price_lists_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT price_lists_round_policy_check CHECK ((round_policy = ANY (ARRAY['HALF_UP'::text, 'HALF_EVEN'::text, 'DOWN'::text, 'UP'::text]))),
    CONSTRAINT price_lists_round_scale_check CHECK (((round_scale >= 0) AND (round_scale <= 8))),
    CONSTRAINT price_lists_scope_category_check CHECK ((applies_to_all_categories OR (scope_category_id IS NOT NULL))),
    CONSTRAINT price_lists_tax_mode_check CHECK ((tax_mode = ANY (ARRAY['INCLUSIVE'::text, 'EXCLUSIVE'::text]))),
    CONSTRAINT price_lists_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY price_lists FORCE ROW LEVEL SECURITY;

--
-- Name: pricing_currencies; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE pricing_currencies (
    company_id uuid NOT NULL,
    code character varying(8) NOT NULL,
    name text NOT NULL,
    symbol text DEFAULT ''::text NOT NULL,
    minor_unit smallint DEFAULT 2 NOT NULL,
    is_custom boolean DEFAULT false NOT NULL,
    source text DEFAULT 'ISO_4217_BASELINE'::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT pricing_currencies_code_check CHECK ((((code)::text = upper((code)::text)) AND ((code)::text ~ '^[A-Z][A-Z0-9]{2,7}$'::text))),
    CONSTRAINT pricing_currencies_minor_unit_check CHECK (((minor_unit >= 0) AND (minor_unit <= 6))),
    CONSTRAINT pricing_currencies_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT pricing_currencies_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY pricing_currencies FORCE ROW LEVEL SECURITY;

--
-- Name: product_attachments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_attachments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    attachment_kind text DEFAULT 'GENERAL'::text NOT NULL,
    storage_key text NOT NULL,
    original_filename text NOT NULL,
    content_type text NOT NULL,
    byte_size bigint NOT NULL,
    sha256 text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    uploaded_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    archived_at timestamp with time zone,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT product_attachments_attachment_kind_check CHECK ((attachment_kind ~ '^[A-Z][A-Z0-9_.-]{0,63}$'::text)),
    CONSTRAINT product_attachments_byte_size_check CHECK ((byte_size > 0)),
    CONSTRAINT product_attachments_content_type_check CHECK ((btrim(content_type) <> ''::text)),
    CONSTRAINT product_attachments_original_filename_check CHECK ((btrim(original_filename) <> ''::text)),
    CONSTRAINT product_attachments_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT product_attachments_storage_key_check CHECK ((btrim(storage_key) <> ''::text)),
    CONSTRAINT product_attachments_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY product_attachments FORCE ROW LEVEL SECURITY;

--
-- Name: product_barcodes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_barcodes (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    barcode text NOT NULL,
    barcode_type text DEFAULT 'EAN'::text NOT NULL,
    is_primary boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_id uuid,
    CONSTRAINT product_barcodes_barcode_check CHECK ((btrim(barcode) <> ''::text))
);

ALTER TABLE ONLY product_barcodes FORCE ROW LEVEL SECURITY;

--
-- Name: product_brands; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_brands (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT product_brands_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT product_brands_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT product_brands_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY product_brands FORCE ROW LEVEL SECURITY;

--
-- Name: product_categories; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_categories (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT product_categories_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT product_categories_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT product_categories_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY product_categories FORCE ROW LEVEL SECURITY;

--
-- Name: product_image_variants; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_image_variants (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_image_id uuid NOT NULL,
    variant_code text NOT NULL,
    storage_key text NOT NULL,
    content_type text NOT NULL,
    byte_size bigint NOT NULL,
    width integer NOT NULL,
    height integer NOT NULL,
    sha256 text NOT NULL,
    generated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT product_image_variants_byte_size_check CHECK ((byte_size > 0)),
    CONSTRAINT product_image_variants_content_type_check CHECK ((content_type = 'image/webp'::text)),
    CONSTRAINT product_image_variants_height_check CHECK ((height > 0)),
    CONSTRAINT product_image_variants_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT product_image_variants_storage_key_check CHECK ((btrim(storage_key) <> ''::text)),
    CONSTRAINT product_image_variants_variant_code_check CHECK ((variant_code = ANY (ARRAY['MASTER'::text, '128'::text, '320'::text, '768'::text, '1600'::text]))),
    CONSTRAINT product_image_variants_width_check CHECK ((width > 0))
);

ALTER TABLE ONLY product_image_variants FORCE ROW LEVEL SECURITY;

--
-- Name: product_images; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_images (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    source_storage_key text NOT NULL,
    master_storage_key text NOT NULL,
    original_filename text NOT NULL,
    original_content_type text NOT NULL,
    original_size bigint NOT NULL,
    master_size bigint NOT NULL,
    width integer NOT NULL,
    height integer NOT NULL,
    orientation smallint DEFAULT 1 NOT NULL,
    sha256 text NOT NULL,
    master_sha256 text NOT NULL,
    "position" integer DEFAULT 0 NOT NULL,
    is_primary boolean DEFAULT false NOT NULL,
    archived_at timestamp with time zone,
    uploaded_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT product_images_check CHECK (((archived_at IS NULL) OR (NOT is_primary))),
    CONSTRAINT product_images_height_check CHECK ((height > 0)),
    CONSTRAINT product_images_master_sha256_check CHECK ((master_sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT product_images_master_size_check CHECK ((master_size > 0)),
    CONSTRAINT product_images_master_storage_key_check CHECK ((btrim(master_storage_key) <> ''::text)),
    CONSTRAINT product_images_orientation_check CHECK (((orientation >= 1) AND (orientation <= 8))),
    CONSTRAINT product_images_original_content_type_check CHECK ((original_content_type = ANY (ARRAY['image/jpeg'::text, 'image/png'::text, 'image/webp'::text]))),
    CONSTRAINT product_images_original_filename_check CHECK ((btrim(original_filename) <> ''::text)),
    CONSTRAINT product_images_original_size_check CHECK ((original_size > 0)),
    CONSTRAINT product_images_position_check CHECK (("position" >= 0)),
    CONSTRAINT product_images_sha256_check CHECK ((sha256 ~ '^[0-9a-f]{64}$'::text)),
    CONSTRAINT product_images_source_storage_key_check CHECK ((btrim(source_storage_key) <> ''::text)),
    CONSTRAINT product_images_version_check CHECK ((version > 0)),
    CONSTRAINT product_images_width_check CHECK ((width > 0))
);

ALTER TABLE ONLY product_images FORCE ROW LEVEL SECURITY;

--
-- Name: product_tax_profile_components; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_tax_profile_components (
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    direction text NOT NULL,
    sequence smallint NOT NULL,
    tax_definition_id uuid NOT NULL,
    tax_rate_id uuid,
    calculation_type text DEFAULT 'PERCENTAGE'::text NOT NULL,
    included_in_tax_base boolean DEFAULT false NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    CONSTRAINT product_tax_profile_components_calculation_type_check CHECK ((calculation_type = ANY (ARRAY['PERCENTAGE'::text, 'FIXED_AMOUNT'::text, 'QUANTITY_BASED'::text]))),
    CONSTRAINT product_tax_profile_components_direction_check CHECK ((direction = ANY (ARRAY['PURCHASE'::text, 'SALES'::text]))),
    CONSTRAINT product_tax_profile_components_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT product_tax_profile_components_sequence_check CHECK ((sequence > 0))
);

ALTER TABLE ONLY product_tax_profile_components FORCE ROW LEVEL SECURITY;

--
-- Name: product_tax_profiles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_tax_profiles (
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    direction text NOT NULL,
    treatment text DEFAULT 'STANDARD'::text NOT NULL,
    tax_definition_id uuid,
    tax_rate_id uuid,
    tax_code text DEFAULT ''::text NOT NULL,
    rate numeric(12,8) DEFAULT 0 NOT NULL,
    tax_included boolean DEFAULT false NOT NULL,
    withholding_rule_id uuid,
    withholding_code text DEFAULT ''::text NOT NULL,
    withholding_rate numeric(12,8) DEFAULT 0 NOT NULL,
    exemption_id uuid,
    exemption_code text DEFAULT ''::text NOT NULL,
    tax_note text DEFAULT ''::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    withholding_numerator smallint,
    withholding_denominator smallint,
    CONSTRAINT product_tax_profile_not_applicable_rate CHECK (((treatment <> 'NOT_APPLICABLE'::text) OR ((rate = (0)::numeric) AND (withholding_rate = (0)::numeric)))),
    CONSTRAINT product_tax_profile_treatment_data CHECK ((((treatment = 'WITHHOLDING'::text) AND ((withholding_rule_id IS NOT NULL) OR (btrim(withholding_code) <> ''::text))) OR ((treatment = 'EXEMPT'::text) AND ((exemption_id IS NOT NULL) OR (btrim(exemption_code) <> ''::text))) OR (treatment = ANY (ARRAY['STANDARD'::text, 'NOT_APPLICABLE'::text])))),
    CONSTRAINT product_tax_profile_withholding_ratio_check CHECK ((((withholding_numerator IS NULL) AND (withholding_denominator IS NULL)) OR ((withholding_numerator > 0) AND (withholding_denominator > 0) AND (withholding_numerator <= withholding_denominator)))),
    CONSTRAINT product_tax_profiles_direction_check CHECK ((direction = ANY (ARRAY['PURCHASE'::text, 'SALES'::text]))),
    CONSTRAINT product_tax_profiles_rate_check CHECK (((rate >= (0)::numeric) AND (rate <= (100)::numeric))),
    CONSTRAINT product_tax_profiles_treatment_check CHECK ((treatment = ANY (ARRAY['STANDARD'::text, 'WITHHOLDING'::text, 'EXEMPT'::text, 'NOT_APPLICABLE'::text]))),
    CONSTRAINT product_tax_profiles_version_check CHECK ((version > 0)),
    CONSTRAINT product_tax_profiles_withholding_rate_check CHECK (((withholding_rate >= (0)::numeric) AND (withholding_rate <= (100)::numeric)))
);

ALTER TABLE ONLY product_tax_profiles FORCE ROW LEVEL SECURITY;

--
-- Name: product_units; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_units (
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    unit_code text NOT NULL,
    is_base boolean DEFAULT false NOT NULL,
    conversion_factor numeric(20,8) DEFAULT 1 NOT NULL,
    decimal_scale smallint DEFAULT 3 NOT NULL,
    CONSTRAINT product_units_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT product_units_decimal_scale_check CHECK (((decimal_scale >= 0) AND (decimal_scale <= 8))),
    CONSTRAINT product_units_unit_code_check CHECK ((btrim(unit_code) <> ''::text))
);

ALTER TABLE ONLY product_units FORCE ROW LEVEL SECURITY;

--
-- Name: product_variant_allowed_options; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_variant_allowed_options (
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    definition_id uuid NOT NULL,
    option_id uuid NOT NULL
);

ALTER TABLE ONLY product_variant_allowed_options FORCE ROW LEVEL SECURITY;

--
-- Name: product_variant_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_variant_definitions (
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    definition_id uuid NOT NULL,
    "position" smallint NOT NULL,
    CONSTRAINT product_variant_definitions_position_check CHECK ((("position" >= 1) AND ("position" <= 5)))
);

ALTER TABLE ONLY product_variant_definitions FORCE ROW LEVEL SECURITY;

--
-- Name: product_variant_price_overrides; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_variant_price_overrides (
    company_id uuid NOT NULL,
    variant_id uuid NOT NULL,
    direction text NOT NULL,
    unit_price numeric(20,8) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT product_variant_price_overrides_direction_check CHECK ((direction = ANY (ARRAY['PURCHASE'::text, 'SALES'::text]))),
    CONSTRAINT product_variant_price_overrides_unit_price_check CHECK ((unit_price >= (0)::numeric))
);

ALTER TABLE ONLY product_variant_price_overrides FORCE ROW LEVEL SECURITY;

--
-- Name: product_variant_values; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_variant_values (
    company_id uuid NOT NULL,
    variant_id uuid NOT NULL,
    definition_id uuid NOT NULL,
    option_id uuid NOT NULL
);

ALTER TABLE ONLY product_variant_values FORCE ROW LEVEL SECURITY;

--
-- Name: product_variants; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE product_variants (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_code text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    variant_signature text DEFAULT ''::text NOT NULL,
    CONSTRAINT product_variants_code_format_check CHECK (((variant_code = upper(btrim(variant_code))) AND (variant_code ~ '^[A-Z0-9][A-Z0-9_-]{0,99}$'::text))),
    CONSTRAINT product_variants_signature_check CHECK ((btrim(variant_signature) <> ''::text)),
    CONSTRAINT product_variants_variant_code_check CHECK ((btrim(variant_code) <> ''::text)),
    CONSTRAINT product_variants_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY product_variants FORCE ROW LEVEL SECURITY;

--
-- Name: products; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE products (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    kind product_kind NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    category_id uuid,
    brand_id uuid,
    is_active boolean DEFAULT true NOT NULL,
    search_vector tsvector DEFAULT ''::tsvector NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    purchase_price numeric(20,8) DEFAULT 0 NOT NULL,
    sales_price numeric(20,8) DEFAULT 0 NOT NULL,
    custom_description_1 text DEFAULT ''::text NOT NULL,
    custom_description_2 text DEFAULT ''::text NOT NULL,
    custom_description_3 text DEFAULT ''::text NOT NULL,
    purchase_tax_type text DEFAULT 'KDV'::text NOT NULL,
    sales_tax_type text DEFAULT 'KDV'::text NOT NULL,
    purchase_tax_rate numeric(12,8) DEFAULT 0 NOT NULL,
    sales_tax_rate numeric(12,8) DEFAULT 0 NOT NULL,
    purchase_tax_included boolean DEFAULT false NOT NULL,
    sales_tax_included boolean DEFAULT false NOT NULL,
    excise_tax_rate numeric(12,8) DEFAULT 0 NOT NULL,
    withholding_code text DEFAULT ''::text NOT NULL,
    withholding_rate numeric(12,8) DEFAULT 0 NOT NULL,
    exemption_code text DEFAULT ''::text NOT NULL,
    tax_note text DEFAULT ''::text NOT NULL,
    variants_enabled boolean DEFAULT false NOT NULL,
    CONSTRAINT products_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT products_excise_tax_rate_check CHECK (((excise_tax_rate >= (0)::numeric) AND (excise_tax_rate <= (100)::numeric))),
    CONSTRAINT products_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT products_purchase_price_check CHECK ((purchase_price >= (0)::numeric)),
    CONSTRAINT products_purchase_tax_rate_check CHECK (((purchase_tax_rate >= (0)::numeric) AND (purchase_tax_rate <= (100)::numeric))),
    CONSTRAINT products_sales_price_check CHECK ((sales_price >= (0)::numeric)),
    CONSTRAINT products_sales_tax_rate_check CHECK (((sales_tax_rate >= (0)::numeric) AND (sales_tax_rate <= (100)::numeric))),
    CONSTRAINT products_version_check CHECK ((version > 0)),
    CONSTRAINT products_withholding_rate_check CHECK (((withholding_rate >= (0)::numeric) AND (withholding_rate <= (100)::numeric)))
);

ALTER TABLE ONLY products FORCE ROW LEVEL SECURITY;

--
-- Name: public_holiday_calendars; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public_holiday_calendars (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    country_code character(2) NOT NULL,
    calendar_year integer NOT NULL,
    version integer NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    source_name text NOT NULL,
    source_url text NOT NULL,
    published_on date,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    activated_at timestamp with time zone,
    CONSTRAINT public_holiday_calendars_calendar_year_check CHECK (((calendar_year >= 2000) AND (calendar_year <= 2200))),
    CONSTRAINT public_holiday_calendars_country_code_check CHECK (((country_code)::text = upper((country_code)::text))),
    CONSTRAINT public_holiday_calendars_source_name_check CHECK ((btrim(source_name) <> ''::text)),
    CONSTRAINT public_holiday_calendars_source_url_check CHECK ((btrim(source_url) <> ''::text)),
    CONSTRAINT public_holiday_calendars_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'ACTIVE'::text, 'SUPERSEDED'::text]))),
    CONSTRAINT public_holiday_calendars_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY public_holiday_calendars FORCE ROW LEVEL SECURITY;

--
-- Name: public_holidays; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public_holidays (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    calendar_id uuid NOT NULL,
    calendar_year integer NOT NULL,
    holiday_date date NOT NULL,
    name text NOT NULL,
    duration text NOT NULL,
    CONSTRAINT public_holidays_check CHECK ((EXTRACT(year FROM holiday_date) = (calendar_year)::numeric)),
    CONSTRAINT public_holidays_duration_check CHECK ((duration = ANY (ARRAY['FULL_DAY'::text, 'HALF_DAY_AFTERNOON'::text]))),
    CONSTRAINT public_holidays_name_check CHECK ((btrim(name) <> ''::text))
);

ALTER TABLE ONLY public_holidays FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_invoice_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_invoice_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    invoice_id uuid NOT NULL,
    goods_receipt_line_id uuid,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    description_snapshot text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_base numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    purchase_order_line_id uuid,
    warehouse_id uuid,
    unit_code text DEFAULT 'ADET'::text NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    line_type text DEFAULT 'PRODUCT'::text NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT purchase_invoice_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_description_snapshot_check CHECK ((btrim(description_snapshot) <> ''::text)),
    CONSTRAINT purchase_invoice_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT purchase_invoice_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT purchase_invoice_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT purchase_invoice_lines_line_warehouse_check CHECK ((((line_type = 'SERVICE'::text) AND (warehouse_id IS NULL)) OR ((line_type = 'PRODUCT'::text) AND (warehouse_id IS NOT NULL)))),
    CONSTRAINT purchase_invoice_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_tax_base_check CHECK ((tax_base >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT purchase_invoice_lines_unit_code_required CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT purchase_invoice_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT purchase_invoice_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

ALTER TABLE ONLY purchase_invoice_lines FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_invoices; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_invoices (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    invoice_no text NOT NULL,
    supplier_id uuid NOT NULL,
    branch_id uuid NOT NULL,
    purchase_order_id uuid,
    goods_receipt_id uuid,
    invoice_date date NOT NULL,
    due_date date,
    currency character(3) NOT NULL,
    status text DEFAULT 'POSTED'::text NOT NULL,
    subtotal numeric(24,8) DEFAULT 0 NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    finance_posting_id uuid,
    created_by uuid NOT NULL,
    posted_at timestamp with time zone DEFAULT now(),
    document_id uuid,
    warehouse_id uuid,
    version bigint DEFAULT 1 NOT NULL,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT purchase_invoices_check CHECK (((due_date IS NULL) OR (due_date >= invoice_date))),
    CONSTRAINT purchase_invoices_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_invoices_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT purchase_invoices_invoice_no_check CHECK ((btrim(invoice_no) <> ''::text)),
    CONSTRAINT purchase_invoices_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT purchase_invoices_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT purchase_invoices_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT purchase_invoices_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT purchase_invoices_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT purchase_invoices_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY purchase_invoices FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_landed_cost_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_landed_cost_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    landed_cost_id uuid NOT NULL,
    goods_receipt_line_id uuid NOT NULL,
    allocated_amount numeric(24,8) DEFAULT 0 NOT NULL,
    base_allocated_amount numeric(24,8),
    base_currency character(3),
    CONSTRAINT purchase_landed_cost_lines_allocated_amount_check CHECK ((allocated_amount >= (0)::numeric)),
    CONSTRAINT purchase_landed_cost_lines_base_allocated_amount_check CHECK ((base_allocated_amount >= (0)::numeric)),
    CONSTRAINT purchase_landed_cost_lines_base_currency_check CHECK ((((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text)))
);

ALTER TABLE ONLY purchase_landed_cost_lines FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_landed_costs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_landed_costs (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_no text NOT NULL,
    goods_receipt_id uuid NOT NULL,
    supplier_id uuid,
    description text DEFAULT ''::text NOT NULL,
    amount numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 NOT NULL,
    allocation_method text DEFAULT 'BY_AMOUNT'::text NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid NOT NULL,
    updated_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT purchase_landed_costs_allocation_method_check CHECK ((allocation_method = ANY (ARRAY['BY_AMOUNT'::text, 'BY_QUANTITY'::text]))),
    CONSTRAINT purchase_landed_costs_amount_check CHECK ((amount > (0)::numeric)),
    CONSTRAINT purchase_landed_costs_check CHECK ((((status = 'DRAFT'::text) AND (posted_at IS NULL) AND (cancelled_at IS NULL)) OR ((status = 'POSTED'::text) AND (posted_at IS NOT NULL) AND (cancelled_at IS NULL)) OR ((status = 'CANCELLED'::text) AND (cancelled_at IS NOT NULL)))),
    CONSTRAINT purchase_landed_costs_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_landed_costs_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT purchase_landed_costs_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT purchase_landed_costs_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT purchase_landed_costs_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY purchase_landed_costs FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_order_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_order_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    order_id uuid NOT NULL,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    supplier_product_code_snapshot text DEFAULT ''::text NOT NULL,
    product_code_snapshot text DEFAULT ''::text NOT NULL,
    product_name_snapshot text NOT NULL,
    unit_code text NOT NULL,
    ordered_quantity numeric(24,8) NOT NULL,
    received_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    invoiced_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    unit_price numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    warehouse_id uuid,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    line_type text DEFAULT 'PRODUCT'::text NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    CONSTRAINT purchase_order_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT purchase_order_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT purchase_order_lines_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_order_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT purchase_order_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT purchase_order_lines_invoiced_quantity_check CHECK (((invoiced_quantity >= (0)::numeric) AND (((line_type = 'SERVICE'::text) AND (invoiced_quantity <= ordered_quantity)) OR ((line_type = 'PRODUCT'::text) AND (invoiced_quantity <= received_quantity))))),
    CONSTRAINT purchase_order_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT purchase_order_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT purchase_order_lines_line_warehouse_check CHECK ((((line_type = 'SERVICE'::text) AND (warehouse_id IS NULL)) OR ((line_type = 'PRODUCT'::text) AND (warehouse_id IS NOT NULL)))),
    CONSTRAINT purchase_order_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT purchase_order_lines_ordered_quantity_check CHECK ((ordered_quantity > (0)::numeric)),
    CONSTRAINT purchase_order_lines_product_name_snapshot_check CHECK ((btrim(product_name_snapshot) <> ''::text)),
    CONSTRAINT purchase_order_lines_received_quantity_check CHECK ((received_quantity >= (0)::numeric)),
    CONSTRAINT purchase_order_lines_received_quantity_check1 CHECK ((received_quantity >= (0)::numeric)),
    CONSTRAINT purchase_order_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT purchase_order_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT purchase_order_lines_unit_price_check CHECK ((unit_price >= (0)::numeric))
);

ALTER TABLE ONLY purchase_order_lines FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_orders; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_orders (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    order_no text NOT NULL,
    supplier_id uuid NOT NULL,
    branch_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    order_date date NOT NULL,
    currency character(3) NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    over_delivery_policy text DEFAULT 'WARN'::text NOT NULL,
    notes text DEFAULT ''::text NOT NULL,
    total numeric(24,8) DEFAULT 0 NOT NULL,
    confirmed_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid NOT NULL,
    updated_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    document_id uuid,
    discount_total numeric(24,8) DEFAULT 0 NOT NULL,
    CONSTRAINT purchase_orders_check CHECK ((((status = 'DRAFT'::text) AND (confirmed_at IS NULL) AND (cancelled_at IS NULL)) OR ((status = ANY (ARRAY['CONFIRMED'::text, 'PARTIALLY_FULFILLED'::text, 'FULFILLED'::text])) AND (confirmed_at IS NOT NULL) AND (cancelled_at IS NULL)) OR ((status = 'CANCELLED'::text) AND (cancelled_at IS NOT NULL) AND (btrim(COALESCE(cancellation_reason, ''::text)) <> ''::text)))),
    CONSTRAINT purchase_orders_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_orders_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT purchase_orders_order_no_check CHECK ((btrim(order_no) <> ''::text)),
    CONSTRAINT purchase_orders_over_delivery_policy_check CHECK ((over_delivery_policy = ANY (ARRAY['ALLOW'::text, 'WARN'::text, 'BLOCK'::text]))),
    CONSTRAINT purchase_orders_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'CONFIRMED'::text, 'PARTIALLY_FULFILLED'::text, 'FULFILLED'::text, 'CANCELLED'::text]))),
    CONSTRAINT purchase_orders_total_check CHECK ((total >= (0)::numeric)),
    CONSTRAINT purchase_orders_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY purchase_orders FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_return_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_return_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    return_id uuid NOT NULL,
    source_receipt_line_id uuid,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    quantity numeric(24,8) NOT NULL,
    unit_code text NOT NULL,
    unit_cost numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    reason text DEFAULT ''::text NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    warehouse_id uuid NOT NULL,
    CONSTRAINT purchase_return_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT purchase_return_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT purchase_return_lines_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_return_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT purchase_return_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT purchase_return_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT purchase_return_lines_unit_cost_check CHECK ((unit_cost >= (0)::numeric))
);

ALTER TABLE ONLY purchase_return_lines FORCE ROW LEVEL SECURITY;

--
-- Name: purchase_returns; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE purchase_returns (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    return_no text NOT NULL,
    supplier_id uuid NOT NULL,
    branch_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    source_receipt_id uuid,
    return_date date NOT NULL,
    currency character(3) NOT NULL,
    status text DEFAULT 'POSTED'::text NOT NULL,
    total numeric(24,8) DEFAULT 0 NOT NULL,
    reason text NOT NULL,
    finance_posting_id uuid,
    created_by uuid NOT NULL,
    posted_at timestamp with time zone DEFAULT now(),
    document_id uuid,
    version bigint DEFAULT 1 NOT NULL,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT purchase_returns_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT purchase_returns_reason_check CHECK ((btrim(reason) <> ''::text)),
    CONSTRAINT purchase_returns_return_no_check CHECK ((btrim(return_no) <> ''::text)),
    CONSTRAINT purchase_returns_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT purchase_returns_total_check CHECK ((total >= (0)::numeric)),
    CONSTRAINT purchase_returns_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY purchase_returns FORCE ROW LEVEL SECURITY;

--
-- Name: recovery_codes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE recovery_codes (
    user_id uuid NOT NULL,
    code_hash bytea NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    used_at timestamp with time zone,
    CONSTRAINT recovery_codes_code_hash_check CHECK ((octet_length(code_hash) = 32))
);

--
-- Name: role_permissions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE role_permissions (
    company_id uuid NOT NULL,
    role_id uuid NOT NULL,
    permission_code text NOT NULL
);

ALTER TABLE ONLY role_permissions FORCE ROW LEVEL SECURITY;

--
-- Name: roles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE roles (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    name text NOT NULL,
    is_system boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT roles_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT roles_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY roles FORCE ROW LEVEL SECURITY;

--
-- Name: sales_dispatch_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_dispatch_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    product_id uuid,
    variant_id uuid,
    warehouse_id uuid,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    price_source text DEFAULT 'DEFAULT'::text NOT NULL,
    price_list_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    description_snapshot text DEFAULT ''::text NOT NULL,
    source_line_id uuid,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    line_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT sales_dispatch_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_dispatch_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT sales_dispatch_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT sales_dispatch_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_price_list_snapshot_check CHECK ((jsonb_typeof(price_list_snapshot) = 'object'::text)),
    CONSTRAINT sales_dispatch_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_dispatch_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT sales_dispatch_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT sales_dispatch_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT sales_dispatch_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT sales_dispatch_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

--
-- Name: sales_dispatches; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_dispatches (
    id uuid CONSTRAINT sales_quotes_id_not_null NOT NULL,
    company_id uuid CONSTRAINT sales_quotes_company_id_not_null NOT NULL,
    document_id uuid CONSTRAINT sales_quotes_document_id_not_null NOT NULL,
    document_no text CONSTRAINT sales_quotes_document_no_not_null NOT NULL,
    branch_id uuid CONSTRAINT sales_quotes_branch_id_not_null NOT NULL,
    default_warehouse_id uuid,
    party_id uuid CONSTRAINT sales_quotes_party_id_not_null NOT NULL,
    document_date date CONSTRAINT sales_quotes_document_date_not_null NOT NULL,
    due_date date,
    valid_until date,
    currency_code character(3) CONSTRAINT sales_quotes_currency_code_not_null NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 CONSTRAINT sales_quotes_exchange_rate_not_null NOT NULL,
    notes text DEFAULT ''::text CONSTRAINT sales_quotes_notes_not_null NOT NULL,
    status text DEFAULT 'DRAFT'::text CONSTRAINT sales_quotes_status_not_null NOT NULL,
    source_kind text DEFAULT 'DIRECT'::text CONSTRAINT sales_quotes_source_kind_not_null NOT NULL,
    source_document_id uuid,
    subtotal numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_subtotal_not_null NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_discount_total_not_null NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_tax_total_not_null NOT NULL,
    withholding_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_withholding_total_not_null NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_grand_total_not_null NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_payable_total_not_null NOT NULL,
    finance_posting_id uuid,
    post_idempotency_key text,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid CONSTRAINT sales_quotes_created_by_not_null NOT NULL,
    updated_by uuid CONSTRAINT sales_quotes_updated_by_not_null NOT NULL,
    created_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_created_at_not_null NOT NULL,
    updated_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_updated_at_not_null NOT NULL,
    version bigint DEFAULT 1 CONSTRAINT sales_quotes_version_not_null NOT NULL,
    sales_rep_user_id uuid,
    payment_term_id uuid,
    CONSTRAINT sales_dispatches_source_kind_check CHECK ((source_kind = ANY (string_to_array('DIRECT,QUOTE,ORDER,DISPATCH,RECEIPT,INVOICE,UNKNOWN'::text, ','::text)))),
    CONSTRAINT sales_dispatches_status_check CHECK ((status = ANY (string_to_array('DRAFT,POSTED,CANCELLED'::text, ','::text)))),
    CONSTRAINT sales_quotes_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT sales_quotes_check1 CHECK (((valid_until IS NULL) OR (valid_until >= document_date))),
    CONSTRAINT sales_quotes_currency_code_check CHECK ((((currency_code)::text = upper((currency_code)::text)) AND (currency_code ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT sales_quotes_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT sales_quotes_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT sales_quotes_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT sales_quotes_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_version_check CHECK ((version > 0)),
    CONSTRAINT sales_quotes_withholding_total_check CHECK ((withholding_total >= (0)::numeric))
);

--
-- Name: sales_invoice_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_invoice_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    product_id uuid,
    variant_id uuid,
    warehouse_id uuid,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    price_source text DEFAULT 'DEFAULT'::text NOT NULL,
    price_list_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    description_snapshot text DEFAULT ''::text NOT NULL,
    source_line_id uuid,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    line_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT sales_invoice_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT sales_invoice_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT sales_invoice_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_invoice_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT sales_invoice_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT sales_invoice_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_price_list_snapshot_check CHECK ((jsonb_typeof(price_list_snapshot) = 'object'::text)),
    CONSTRAINT sales_invoice_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_invoice_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_invoice_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT sales_invoice_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT sales_invoice_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT sales_invoice_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT sales_invoice_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

--
-- Name: sales_invoices; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_invoices (
    id uuid CONSTRAINT sales_quotes_id_not_null NOT NULL,
    company_id uuid CONSTRAINT sales_quotes_company_id_not_null NOT NULL,
    document_id uuid CONSTRAINT sales_quotes_document_id_not_null NOT NULL,
    document_no text CONSTRAINT sales_quotes_document_no_not_null NOT NULL,
    branch_id uuid CONSTRAINT sales_quotes_branch_id_not_null NOT NULL,
    default_warehouse_id uuid,
    party_id uuid CONSTRAINT sales_quotes_party_id_not_null NOT NULL,
    document_date date CONSTRAINT sales_quotes_document_date_not_null NOT NULL,
    due_date date,
    valid_until date,
    currency_code character(3) CONSTRAINT sales_quotes_currency_code_not_null NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 CONSTRAINT sales_quotes_exchange_rate_not_null NOT NULL,
    notes text DEFAULT ''::text CONSTRAINT sales_quotes_notes_not_null NOT NULL,
    status text DEFAULT 'DRAFT'::text CONSTRAINT sales_quotes_status_not_null NOT NULL,
    source_kind text DEFAULT 'DIRECT'::text CONSTRAINT sales_quotes_source_kind_not_null NOT NULL,
    source_document_id uuid,
    subtotal numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_subtotal_not_null NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_discount_total_not_null NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_tax_total_not_null NOT NULL,
    withholding_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_withholding_total_not_null NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_grand_total_not_null NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_payable_total_not_null NOT NULL,
    finance_posting_id uuid,
    post_idempotency_key text,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid CONSTRAINT sales_quotes_created_by_not_null NOT NULL,
    updated_by uuid CONSTRAINT sales_quotes_updated_by_not_null NOT NULL,
    created_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_created_at_not_null NOT NULL,
    updated_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_updated_at_not_null NOT NULL,
    version bigint DEFAULT 1 CONSTRAINT sales_quotes_version_not_null NOT NULL,
    sales_rep_user_id uuid,
    payment_term_id uuid,
    CONSTRAINT sales_invoices_source_kind_check CHECK ((source_kind = ANY (string_to_array('DIRECT,QUOTE,ORDER,DISPATCH,RECEIPT,INVOICE,UNKNOWN'::text, ','::text)))),
    CONSTRAINT sales_invoices_status_check CHECK ((status = ANY (string_to_array('DRAFT,POSTED,CANCELLED'::text, ','::text)))),
    CONSTRAINT sales_quotes_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT sales_quotes_check1 CHECK (((valid_until IS NULL) OR (valid_until >= document_date))),
    CONSTRAINT sales_quotes_currency_code_check CHECK ((((currency_code)::text = upper((currency_code)::text)) AND (currency_code ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT sales_quotes_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT sales_quotes_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT sales_quotes_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT sales_quotes_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_version_check CHECK ((version > 0)),
    CONSTRAINT sales_quotes_withholding_total_check CHECK ((withholding_total >= (0)::numeric))
);

--
-- Name: sales_order_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_order_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    product_id uuid,
    variant_id uuid,
    warehouse_id uuid,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    price_source text DEFAULT 'DEFAULT'::text NOT NULL,
    price_list_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    description_snapshot text DEFAULT ''::text NOT NULL,
    source_line_id uuid,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    line_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT sales_order_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT sales_order_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT sales_order_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT sales_order_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_order_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT sales_order_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT sales_order_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT sales_order_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT sales_order_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT sales_order_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT sales_order_lines_price_list_snapshot_check CHECK ((jsonb_typeof(price_list_snapshot) = 'object'::text)),
    CONSTRAINT sales_order_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_order_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT sales_order_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_order_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT sales_order_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT sales_order_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT sales_order_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT sales_order_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

--
-- Name: sales_order_reservations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_order_reservations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    order_id uuid NOT NULL,
    order_line_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    quantity numeric(24,8) NOT NULL,
    consumed_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    released_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    status text DEFAULT 'ACTIVE'::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT sales_order_reservations_check CHECK (((consumed_quantity + released_quantity) <= quantity)),
    CONSTRAINT sales_order_reservations_consumed_quantity_check CHECK ((consumed_quantity >= (0)::numeric)),
    CONSTRAINT sales_order_reservations_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_order_reservations_released_quantity_check CHECK ((released_quantity >= (0)::numeric)),
    CONSTRAINT sales_order_reservations_status_check CHECK ((status = ANY (ARRAY['ACTIVE'::text, 'CONSUMED'::text, 'RELEASED'::text])))
);

ALTER TABLE ONLY sales_order_reservations FORCE ROW LEVEL SECURITY;

--
-- Name: sales_orders; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_orders (
    id uuid CONSTRAINT sales_quotes_id_not_null NOT NULL,
    company_id uuid CONSTRAINT sales_quotes_company_id_not_null NOT NULL,
    document_id uuid CONSTRAINT sales_quotes_document_id_not_null NOT NULL,
    document_no text CONSTRAINT sales_quotes_document_no_not_null NOT NULL,
    branch_id uuid CONSTRAINT sales_quotes_branch_id_not_null NOT NULL,
    default_warehouse_id uuid,
    party_id uuid CONSTRAINT sales_quotes_party_id_not_null NOT NULL,
    document_date date CONSTRAINT sales_quotes_document_date_not_null NOT NULL,
    due_date date,
    valid_until date,
    currency_code character(3) CONSTRAINT sales_quotes_currency_code_not_null NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 CONSTRAINT sales_quotes_exchange_rate_not_null NOT NULL,
    notes text DEFAULT ''::text CONSTRAINT sales_quotes_notes_not_null NOT NULL,
    status text DEFAULT 'DRAFT'::text CONSTRAINT sales_quotes_status_not_null NOT NULL,
    source_kind text DEFAULT 'DIRECT'::text CONSTRAINT sales_quotes_source_kind_not_null NOT NULL,
    source_document_id uuid,
    subtotal numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_subtotal_not_null NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_discount_total_not_null NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_tax_total_not_null NOT NULL,
    withholding_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_withholding_total_not_null NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_grand_total_not_null NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_payable_total_not_null NOT NULL,
    finance_posting_id uuid,
    post_idempotency_key text,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid CONSTRAINT sales_quotes_created_by_not_null NOT NULL,
    updated_by uuid CONSTRAINT sales_quotes_updated_by_not_null NOT NULL,
    created_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_created_at_not_null NOT NULL,
    updated_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_updated_at_not_null NOT NULL,
    version bigint DEFAULT 1 CONSTRAINT sales_quotes_version_not_null NOT NULL,
    sales_rep_user_id uuid,
    payment_term_id uuid,
    CONSTRAINT sales_orders_source_kind_check CHECK ((source_kind = ANY (string_to_array('DIRECT,QUOTE,ORDER,DISPATCH,RECEIPT,INVOICE,UNKNOWN'::text, ','::text)))),
    CONSTRAINT sales_orders_status_check CHECK ((status = ANY (string_to_array('DRAFT,CONFIRMED,PARTIALLY_FULFILLED,FULFILLED,CANCELLED'::text, ','::text)))),
    CONSTRAINT sales_quotes_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT sales_quotes_check1 CHECK (((valid_until IS NULL) OR (valid_until >= document_date))),
    CONSTRAINT sales_quotes_currency_code_check CHECK ((((currency_code)::text = upper((currency_code)::text)) AND (currency_code ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT sales_quotes_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT sales_quotes_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT sales_quotes_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT sales_quotes_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_version_check CHECK ((version > 0)),
    CONSTRAINT sales_quotes_withholding_total_check CHECK ((withholding_total >= (0)::numeric))
);

--
-- Name: sales_quote_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_quote_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    product_id uuid,
    variant_id uuid,
    warehouse_id uuid,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    price_source text DEFAULT 'DEFAULT'::text NOT NULL,
    price_list_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    description_snapshot text DEFAULT ''::text NOT NULL,
    source_line_id uuid,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    line_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT sales_quote_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT sales_quote_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT sales_quote_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_quote_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT sales_quote_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT sales_quote_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_price_list_snapshot_check CHECK ((jsonb_typeof(price_list_snapshot) = 'object'::text)),
    CONSTRAINT sales_quote_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_quote_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_quote_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT sales_quote_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT sales_quote_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT sales_quote_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT sales_quote_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

--
-- Name: sales_quotes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_quotes (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    document_no text NOT NULL,
    branch_id uuid NOT NULL,
    default_warehouse_id uuid,
    party_id uuid NOT NULL,
    document_date date NOT NULL,
    due_date date,
    valid_until date,
    currency_code character(3) NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 NOT NULL,
    notes text DEFAULT ''::text NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    source_kind text DEFAULT 'DIRECT'::text NOT NULL,
    source_document_id uuid,
    subtotal numeric(24,8) DEFAULT 0 NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_total numeric(24,8) DEFAULT 0 NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 NOT NULL,
    finance_posting_id uuid,
    post_idempotency_key text,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid NOT NULL,
    updated_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    sales_rep_user_id uuid,
    payment_term_id uuid,
    CONSTRAINT sales_quotes_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT sales_quotes_check1 CHECK (((valid_until IS NULL) OR (valid_until >= document_date))),
    CONSTRAINT sales_quotes_currency_code_check CHECK ((((currency_code)::text = upper((currency_code)::text)) AND (currency_code ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT sales_quotes_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT sales_quotes_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT sales_quotes_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_source_kind_check CHECK ((source_kind = ANY (ARRAY['DIRECT'::text, 'QUOTE'::text, 'ORDER'::text, 'DISPATCH'::text, 'RECEIPT'::text, 'INVOICE'::text, 'UNKNOWN'::text]))),
    CONSTRAINT sales_quotes_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'SENT'::text, 'ACCEPTED'::text, 'REJECTED'::text, 'EXPIRED'::text, 'CANCELLED'::text]))),
    CONSTRAINT sales_quotes_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT sales_quotes_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_version_check CHECK ((version > 0)),
    CONSTRAINT sales_quotes_withholding_total_check CHECK ((withholding_total >= (0)::numeric))
);

ALTER TABLE ONLY sales_quotes FORCE ROW LEVEL SECURITY;

--
-- Name: sales_return_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_return_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    document_id uuid NOT NULL,
    line_no integer NOT NULL,
    line_type text NOT NULL,
    product_id uuid,
    variant_id uuid,
    warehouse_id uuid,
    unit_code text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    conversion_factor numeric(24,8) DEFAULT 1 NOT NULL,
    price_source text DEFAULT 'DEFAULT'::text NOT NULL,
    price_list_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    discount_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    tax_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    description_snapshot text DEFAULT ''::text NOT NULL,
    source_line_id uuid,
    unit_price numeric(24,8) NOT NULL,
    gross_amount numeric(24,8) DEFAULT 0 NOT NULL,
    discount_amount numeric(24,8) DEFAULT 0 NOT NULL,
    net_amount numeric(24,8) DEFAULT 0 NOT NULL,
    tax_amount numeric(24,8) DEFAULT 0 NOT NULL,
    withholding_amount numeric(24,8) DEFAULT 0 NOT NULL,
    line_total numeric(24,8) DEFAULT 0 NOT NULL,
    payable_amount numeric(24,8) DEFAULT 0 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_attributes_snapshot jsonb DEFAULT '{}'::jsonb NOT NULL,
    tax_components_snapshot jsonb DEFAULT '[]'::jsonb NOT NULL,
    CONSTRAINT sales_return_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT sales_return_lines_conversion_factor_check CHECK ((conversion_factor > (0)::numeric)),
    CONSTRAINT sales_return_lines_discount_amount_check CHECK ((discount_amount >= (0)::numeric)),
    CONSTRAINT sales_return_lines_discount_components_snapshot_check CHECK ((jsonb_typeof(discount_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_return_lines_gross_amount_check CHECK ((gross_amount >= (0)::numeric)),
    CONSTRAINT sales_return_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT sales_return_lines_line_total_check CHECK ((line_total >= (0)::numeric)),
    CONSTRAINT sales_return_lines_line_type_check CHECK ((line_type = ANY (ARRAY['PRODUCT'::text, 'SERVICE'::text]))),
    CONSTRAINT sales_return_lines_net_amount_check CHECK ((net_amount >= (0)::numeric)),
    CONSTRAINT sales_return_lines_payable_amount_check CHECK ((payable_amount >= (0)::numeric)),
    CONSTRAINT sales_return_lines_price_list_snapshot_check CHECK ((jsonb_typeof(price_list_snapshot) = 'object'::text)),
    CONSTRAINT sales_return_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT sales_return_lines_tax_amount_check CHECK ((tax_amount >= (0)::numeric)),
    CONSTRAINT sales_return_lines_tax_components_snapshot_check CHECK ((jsonb_typeof(tax_components_snapshot) = 'array'::text)),
    CONSTRAINT sales_return_lines_tax_snapshot_check CHECK ((jsonb_typeof(tax_snapshot) = 'object'::text)),
    CONSTRAINT sales_return_lines_unit_code_check CHECK ((btrim(unit_code) <> ''::text)),
    CONSTRAINT sales_return_lines_unit_price_check CHECK ((unit_price >= (0)::numeric)),
    CONSTRAINT sales_return_lines_variant_attributes_snapshot_check CHECK ((jsonb_typeof(variant_attributes_snapshot) = 'object'::text)),
    CONSTRAINT sales_return_lines_withholding_amount_check CHECK ((withholding_amount >= (0)::numeric))
);

--
-- Name: sales_returns; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sales_returns (
    id uuid CONSTRAINT sales_quotes_id_not_null NOT NULL,
    company_id uuid CONSTRAINT sales_quotes_company_id_not_null NOT NULL,
    document_id uuid CONSTRAINT sales_quotes_document_id_not_null NOT NULL,
    document_no text CONSTRAINT sales_quotes_document_no_not_null NOT NULL,
    branch_id uuid CONSTRAINT sales_quotes_branch_id_not_null NOT NULL,
    default_warehouse_id uuid,
    party_id uuid CONSTRAINT sales_quotes_party_id_not_null NOT NULL,
    document_date date CONSTRAINT sales_quotes_document_date_not_null NOT NULL,
    due_date date,
    valid_until date,
    currency_code character(3) CONSTRAINT sales_quotes_currency_code_not_null NOT NULL,
    exchange_rate numeric(24,8) DEFAULT 1 CONSTRAINT sales_quotes_exchange_rate_not_null NOT NULL,
    notes text DEFAULT ''::text CONSTRAINT sales_quotes_notes_not_null NOT NULL,
    status text DEFAULT 'DRAFT'::text CONSTRAINT sales_quotes_status_not_null NOT NULL,
    source_kind text DEFAULT 'DIRECT'::text CONSTRAINT sales_quotes_source_kind_not_null NOT NULL,
    source_document_id uuid,
    subtotal numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_subtotal_not_null NOT NULL,
    discount_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_discount_total_not_null NOT NULL,
    tax_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_tax_total_not_null NOT NULL,
    withholding_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_withholding_total_not_null NOT NULL,
    grand_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_grand_total_not_null NOT NULL,
    payable_total numeric(24,8) DEFAULT 0 CONSTRAINT sales_quotes_payable_total_not_null NOT NULL,
    finance_posting_id uuid,
    post_idempotency_key text,
    posted_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text,
    created_by uuid CONSTRAINT sales_quotes_created_by_not_null NOT NULL,
    updated_by uuid CONSTRAINT sales_quotes_updated_by_not_null NOT NULL,
    created_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_created_at_not_null NOT NULL,
    updated_at timestamp with time zone DEFAULT now() CONSTRAINT sales_quotes_updated_at_not_null NOT NULL,
    version bigint DEFAULT 1 CONSTRAINT sales_quotes_version_not_null NOT NULL,
    reason text DEFAULT ''::text NOT NULL,
    sales_rep_user_id uuid,
    payment_term_id uuid,
    CONSTRAINT sales_quotes_check CHECK (((due_date IS NULL) OR (due_date >= document_date))),
    CONSTRAINT sales_quotes_check1 CHECK (((valid_until IS NULL) OR (valid_until >= document_date))),
    CONSTRAINT sales_quotes_currency_code_check CHECK ((((currency_code)::text = upper((currency_code)::text)) AND (currency_code ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT sales_quotes_discount_total_check CHECK ((discount_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_document_no_check CHECK ((btrim(document_no) <> ''::text)),
    CONSTRAINT sales_quotes_exchange_rate_check CHECK ((exchange_rate > (0)::numeric)),
    CONSTRAINT sales_quotes_grand_total_check CHECK ((grand_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_payable_total_check CHECK ((payable_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_subtotal_check CHECK ((subtotal >= (0)::numeric)),
    CONSTRAINT sales_quotes_tax_total_check CHECK ((tax_total >= (0)::numeric)),
    CONSTRAINT sales_quotes_version_check CHECK ((version > 0)),
    CONSTRAINT sales_quotes_withholding_total_check CHECK ((withholding_total >= (0)::numeric)),
    CONSTRAINT sales_returns_reason_required CHECK ((btrim(reason) <> ''::text)),
    CONSTRAINT sales_returns_source_kind_check CHECK ((source_kind = ANY (string_to_array('DIRECT,QUOTE,ORDER,DISPATCH,RECEIPT,INVOICE,UNKNOWN'::text, ','::text)))),
    CONSTRAINT sales_returns_status_check CHECK ((status = ANY (string_to_array('DRAFT,POSTED,CANCELLED'::text, ','::text))))
);

--
-- Name: security_audit_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE security_audit_events (
    id uuid NOT NULL,
    company_id uuid,
    actor_user_id uuid,
    event_type text NOT NULL,
    entity_type text,
    entity_id uuid,
    details jsonb DEFAULT '{}'::jsonb NOT NULL,
    trace_id text,
    source_ip text,
    user_agent text,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL
);

ALTER TABLE ONLY security_audit_events FORCE ROW LEVEL SECURITY;

--
-- Name: serial_number_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE serial_number_events (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    serial_id uuid NOT NULL,
    movement_id uuid NOT NULL,
    from_status text,
    to_status text NOT NULL,
    from_warehouse_id uuid,
    to_warehouse_id uuid,
    occurred_at timestamp with time zone DEFAULT now() NOT NULL
);

ALTER TABLE ONLY serial_number_events FORCE ROW LEVEL SECURITY;

--
-- Name: serial_numbers; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE serial_numbers (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    product_id uuid NOT NULL,
    serial_number text NOT NULL,
    status text DEFAULT 'IN_STOCK'::text NOT NULL,
    active_warehouse_id uuid,
    active_location_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT serial_numbers_check CHECK (((active_location_id IS NULL) OR (active_warehouse_id IS NOT NULL))),
    CONSTRAINT serial_numbers_serial_number_check CHECK ((btrim(serial_number) <> ''::text)),
    CONSTRAINT serial_numbers_status_check CHECK ((status = ANY (ARRAY['IN_STOCK'::text, 'RESERVED'::text, 'DISPATCHED'::text, 'RETURNED'::text, 'QUARANTINED'::text])))
);

ALTER TABLE ONLY serial_numbers FORCE ROW LEVEL SECURITY;

--
-- Name: sessions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sessions (
    id uuid NOT NULL,
    token_hash bytea NOT NULL,
    csrf_hash bytea NOT NULL,
    user_id uuid NOT NULL,
    current_company_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    last_seen_at timestamp with time zone DEFAULT now() NOT NULL,
    expires_at timestamp with time zone NOT NULL,
    revoked_at timestamp with time zone,
    ip_hash bytea,
    user_agent text,
    CONSTRAINT sessions_check CHECK ((expires_at > created_at)),
    CONSTRAINT sessions_csrf_hash_check CHECK ((octet_length(csrf_hash) = 32)),
    CONSTRAINT sessions_token_hash_check CHECK ((octet_length(token_hash) = 32))
);

--
-- Name: sgk_occupation_codes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE sgk_occupation_codes (
    code text NOT NULL,
    name text NOT NULL,
    CONSTRAINT sgk_occupation_codes_code_check CHECK ((code ~ '^[0-9]{4}\.[0-9]{2}$'::text)),
    CONSTRAINT sgk_occupation_codes_name_check CHECK ((btrim(name) <> ''::text))
);

--
-- Name: stock_cost_adjustments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_cost_adjustments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    layer_id uuid NOT NULL,
    reason_code text NOT NULL,
    amount numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    base_amount numeric(24,8),
    base_currency character(3),
    source_type text NOT NULL,
    source_id uuid NOT NULL,
    note text DEFAULT ''::text NOT NULL,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT stock_cost_adjustments_base_currency_check CHECK ((((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_adjustments_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_adjustments_reason_code_check CHECK ((reason_code = ANY (ARRAY['INVOICE_PRICE_DIFF'::text, 'LANDED_COST'::text, 'RECONCILIATION'::text])))
);

ALTER TABLE ONLY stock_cost_adjustments FORCE ROW LEVEL SECURITY;

--
-- Name: stock_cost_consumptions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_cost_consumptions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    movement_id uuid NOT NULL,
    layer_id uuid NOT NULL,
    quantity numeric(24,8) NOT NULL,
    unit_cost numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    consumed_at timestamp with time zone DEFAULT now() NOT NULL,
    base_unit_cost numeric(24,8),
    base_currency character(3),
    CONSTRAINT stock_cost_consumptions_base_currency_check CHECK ((((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_consumptions_base_unit_cost_check CHECK ((base_unit_cost >= (0)::numeric)),
    CONSTRAINT stock_cost_consumptions_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_consumptions_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT stock_cost_consumptions_unit_cost_check CHECK ((unit_cost >= (0)::numeric))
);

ALTER TABLE ONLY stock_cost_consumptions FORCE ROW LEVEL SECURITY;

--
-- Name: stock_cost_layers; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_cost_layers (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    lot_id uuid,
    source_movement_id uuid NOT NULL,
    quantity numeric(24,8) NOT NULL,
    remaining_quantity numeric(24,8) NOT NULL,
    unit_cost numeric(24,8) NOT NULL,
    currency character(3) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    is_provisional boolean DEFAULT false NOT NULL,
    base_unit_cost numeric(24,8),
    base_currency character(3),
    CONSTRAINT stock_cost_layers_base_currency_check CHECK ((((base_currency)::text = upper((base_currency)::text)) AND (base_currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_layers_base_unit_cost_check CHECK ((base_unit_cost >= (0)::numeric)),
    CONSTRAINT stock_cost_layers_check CHECK (((remaining_quantity >= (0)::numeric) AND (remaining_quantity <= quantity))),
    CONSTRAINT stock_cost_layers_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT stock_cost_layers_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT stock_cost_layers_unit_cost_check CHECK ((unit_cost >= (0)::numeric))
);

ALTER TABLE ONLY stock_cost_layers FORCE ROW LEVEL SECURITY;

--
-- Name: stock_cost_unpriced_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_cost_unpriced_events (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    event_type text NOT NULL,
    movement_id uuid NOT NULL,
    layer_id uuid,
    quantity numeric(24,8) NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT stock_cost_unpriced_events_event_type_check CHECK ((event_type = ANY (ARRAY['UNPRICED_RECEIPT'::text, 'UNPRICED_CONSUMPTION'::text]))),
    CONSTRAINT stock_cost_unpriced_events_quantity_check CHECK ((quantity > (0)::numeric))
);

ALTER TABLE ONLY stock_cost_unpriced_events FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_assignments; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_assignments (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    pass_id uuid NOT NULL,
    user_id uuid NOT NULL,
    status text DEFAULT 'ASSIGNED'::text NOT NULL,
    assigned_at timestamp with time zone DEFAULT now() NOT NULL,
    released_at timestamp with time zone,
    CONSTRAINT stock_count_engine_assignments_check CHECK (((status = 'ASSIGNED'::text) = (released_at IS NULL))),
    CONSTRAINT stock_count_engine_assignments_status_check CHECK ((status = ANY (ARRAY['ASSIGNED'::text, 'RELEASED'::text])))
);

ALTER TABLE ONLY stock_count_engine_assignments FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_commands; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_commands (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    command_name text NOT NULL,
    idempotency_key text NOT NULL,
    payload_hash bytea NOT NULL,
    completed_at timestamp with time zone,
    result jsonb,
    actor_user_id uuid,
    CONSTRAINT stock_count_engine_commands_check CHECK (((completed_at IS NULL) = (result IS NULL))),
    CONSTRAINT stock_count_engine_commands_command_name_check CHECK ((command_name = ANY (ARRAY['POST'::text, 'CANCEL'::text, 'RECOUNT'::text]))),
    CONSTRAINT stock_count_engine_commands_idempotency_key_check CHECK (((btrim(idempotency_key) <> ''::text) AND (length(idempotency_key) <= 255))),
    CONSTRAINT stock_count_engine_commands_payload_hash_check CHECK ((octet_length(payload_hash) = 32))
);

ALTER TABLE ONLY stock_count_engine_commands FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_counts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_counts (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    state text DEFAULT 'IN_PROGRESS'::text NOT NULL,
    movement_policy text DEFAULT 'CONTINUE'::text NOT NULL,
    blind_count boolean DEFAULT false NOT NULL,
    snapshot_at timestamp with time zone DEFAULT clock_timestamp() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    start_idempotency_key text NOT NULL,
    start_payload_hash bytea NOT NULL,
    posted_at timestamp with time zone,
    posted_by uuid,
    cancelled_at timestamp with time zone,
    cancellation_reason text DEFAULT ''::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    scope_mode text DEFAULT 'FULL'::text NOT NULL,
    count_no text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    CONSTRAINT stock_count_engine_counts_check CHECK (((state = 'POSTED'::text) = (posted_at IS NOT NULL))),
    CONSTRAINT stock_count_engine_counts_check1 CHECK (((state <> 'CANCELLED'::text) OR ((cancelled_at IS NOT NULL) AND (btrim(cancellation_reason) <> ''::text)))),
    CONSTRAINT stock_count_engine_counts_check2 CHECK (((state <> 'POSTED'::text) OR (posted_by IS NOT NULL))),
    CONSTRAINT stock_count_engine_counts_count_no_format CHECK ((count_no ~ '^SAY-[0-9]{6,}$'::text)),
    CONSTRAINT stock_count_engine_counts_description_check CHECK ((char_length(description) <= 500)),
    CONSTRAINT stock_count_engine_counts_movement_policy_check CHECK ((movement_policy = ANY (ARRAY['CONTINUE'::text, 'LOCK_SCOPE'::text]))),
    CONSTRAINT stock_count_engine_counts_scope_mode_check CHECK ((scope_mode = ANY (ARRAY['FULL'::text, 'PARTIAL'::text]))),
    CONSTRAINT stock_count_engine_counts_start_idempotency_key_check CHECK (((btrim(start_idempotency_key) <> ''::text) AND (length(start_idempotency_key) <= 255))),
    CONSTRAINT stock_count_engine_counts_start_payload_hash_check CHECK ((octet_length(start_payload_hash) = 32)),
    CONSTRAINT stock_count_engine_counts_state_check CHECK ((state = ANY (ARRAY['IN_PROGRESS'::text, 'REVIEW'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT stock_count_engine_counts_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY stock_count_engine_counts FORCE ROW LEVEL SECURITY;

--
-- Name: COLUMN stock_count_engine_counts.scope_mode; Type: COMMENT; Schema: public; Owner: -
--

COMMENT ON COLUMN stock_count_engine_counts.scope_mode IS 'FULL counts may discover zero-balance products and variants while counting; PARTIAL counts remain restricted to their initial scopes.';

--
-- Name: COLUMN stock_count_engine_counts.count_no; Type: COMMENT; Schema: public; Owner: -
--

COMMENT ON COLUMN stock_count_engine_counts.count_no IS 'Company-scoped human-readable stock count number, for example SAY-000001.';

--
-- Name: COLUMN stock_count_engine_counts.description; Type: COMMENT; Schema: public; Owner: -
--

COMMENT ON COLUMN stock_count_engine_counts.description IS 'Optional user-entered stock count description, maximum 500 characters.';

--
-- Name: stock_count_engine_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_events (
    event_seq bigint NOT NULL,
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    pass_id uuid NOT NULL,
    session_id uuid,
    scope_id uuid,
    event_id text NOT NULL,
    event_type text NOT NULL,
    barcode text DEFAULT ''::text NOT NULL,
    reason text DEFAULT ''::text NOT NULL,
    resolution_status text DEFAULT 'ACCEPTED'::text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    payload_hash bytea NOT NULL,
    actor_user_id uuid,
    occurred_at timestamp with time zone DEFAULT clock_timestamp() NOT NULL,
    recorded_at timestamp with time zone DEFAULT clock_timestamp() NOT NULL,
    CONSTRAINT stock_count_engine_events_check CHECK (((resolution_status = 'ACCEPTED'::text) = (scope_id IS NOT NULL))),
    CONSTRAINT stock_count_engine_events_check1 CHECK (((event_type <> 'CORRECTION'::text) OR (btrim(reason) <> ''::text))),
    CONSTRAINT stock_count_engine_events_check2 CHECK (((event_type <> 'ZERO'::text) OR (quantity = (0)::numeric))),
    CONSTRAINT stock_count_engine_events_check3 CHECK (((event_type <> 'SCAN'::text) OR (btrim(barcode) <> ''::text))),
    CONSTRAINT stock_count_engine_events_event_id_check CHECK (((btrim(event_id) <> ''::text) AND (length(event_id) <= 255))),
    CONSTRAINT stock_count_engine_events_event_type_check CHECK ((event_type = ANY (ARRAY['SCAN'::text, 'CORRECTION'::text, 'ZERO'::text]))),
    CONSTRAINT stock_count_engine_events_payload_hash_check CHECK ((octet_length(payload_hash) = 32)),
    CONSTRAINT stock_count_engine_events_quantity_check CHECK ((quantity >= (0)::numeric)),
    CONSTRAINT stock_count_engine_events_resolution_status_check CHECK ((resolution_status = ANY (ARRAY['ACCEPTED'::text, 'UNKNOWN'::text, 'OUT_OF_SCOPE'::text, 'AMBIGUOUS'::text])))
);

ALTER TABLE ONLY stock_count_engine_events FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_events_event_seq_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_events ALTER COLUMN event_seq ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME stock_count_engine_events_event_seq_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);

--
-- Name: stock_count_engine_number_sequences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_number_sequences (
    company_id uuid NOT NULL,
    next_number bigint NOT NULL,
    CONSTRAINT stock_count_engine_number_sequences_next_number_check CHECK ((next_number > 0))
);

ALTER TABLE ONLY stock_count_engine_number_sequences FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_passes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_passes (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    pass_no integer NOT NULL,
    mode text NOT NULL,
    state text DEFAULT 'IN_PROGRESS'::text NOT NULL,
    created_by uuid,
    completed_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT stock_count_engine_passes_check CHECK ((((state = 'IN_PROGRESS'::text) AND (completed_at IS NULL)) OR ((state = ANY (ARRAY['COMPLETED'::text, 'CANCELLED'::text])) AND (completed_at IS NOT NULL)))),
    CONSTRAINT stock_count_engine_passes_mode_check CHECK ((mode = ANY (ARRAY['BLIND'::text, 'OPEN'::text]))),
    CONSTRAINT stock_count_engine_passes_pass_no_check CHECK ((pass_no > 0)),
    CONSTRAINT stock_count_engine_passes_state_check CHECK ((state = ANY (ARRAY['IN_PROGRESS'::text, 'COMPLETED'::text, 'CANCELLED'::text])))
);

ALTER TABLE ONLY stock_count_engine_passes FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_review_exceptions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_review_exceptions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    scope_id uuid,
    exception_type text NOT NULL,
    status text DEFAULT 'OPEN'::text NOT NULL,
    details jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    resolved_at timestamp with time zone,
    resolved_by uuid,
    CONSTRAINT stock_count_engine_review_exceptions_check CHECK (((status = 'OPEN'::text) = ((resolved_at IS NULL) AND (resolved_by IS NULL)))),
    CONSTRAINT stock_count_engine_review_exceptions_details_check CHECK ((jsonb_typeof(details) = 'object'::text)),
    CONSTRAINT stock_count_engine_review_exceptions_exception_type_check CHECK ((exception_type = ANY (ARRAY['UNCHECKED'::text, 'MOVEMENT_OVERLAP'::text, 'UNKNOWN_BARCODE'::text, 'OUT_OF_SCOPE'::text, 'AMBIGUOUS_BARCODE'::text]))),
    CONSTRAINT stock_count_engine_review_exceptions_status_check CHECK ((status = ANY (ARRAY['OPEN'::text, 'RESOLVED'::text])))
);

ALTER TABLE ONLY stock_count_engine_review_exceptions FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_scopes; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_scopes (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    warehouse_id uuid NOT NULL,
    location_id uuid,
    lot_id uuid,
    serial_id uuid,
    snapshot_quantity numeric(24,8) NOT NULL,
    CONSTRAINT stock_count_engine_scopes_check CHECK (((variant_id IS NOT NULL) OR (product_id IS NOT NULL))),
    CONSTRAINT stock_count_engine_scopes_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT stock_count_engine_scopes_snapshot_quantity_check CHECK ((snapshot_quantity >= (0)::numeric))
);

ALTER TABLE ONLY stock_count_engine_scopes FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_sessions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_engine_sessions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    pass_id uuid NOT NULL,
    user_id uuid NOT NULL,
    client_session_id text NOT NULL,
    opened_at timestamp with time zone DEFAULT now() NOT NULL,
    closed_at timestamp with time zone,
    last_event_seq bigint,
    CONSTRAINT stock_count_engine_sessions_client_session_id_check CHECK ((btrim(client_session_id) <> ''::text))
);

ALTER TABLE ONLY stock_count_engine_sessions FORCE ROW LEVEL SECURITY;

--
-- Name: stock_count_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_count_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    count_id uuid NOT NULL,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    location_id uuid,
    lot_id uuid,
    serial_id uuid,
    snapshot_quantity numeric(24,8) NOT NULL,
    counted_quantity numeric(24,8),
    expected_quantity numeric(24,8),
    difference_quantity numeric(24,8),
    counted_at timestamp with time zone,
    CONSTRAINT stock_count_lines_counted_quantity_check CHECK ((counted_quantity >= (0)::numeric)),
    CONSTRAINT stock_count_lines_line_no_check CHECK ((line_no > 0))
);

ALTER TABLE ONLY stock_count_lines FORCE ROW LEVEL SECURITY;

--
-- Name: stock_counts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_counts (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    state text DEFAULT 'DRAFT'::text NOT NULL,
    blind_count boolean DEFAULT false NOT NULL,
    snapshot_at timestamp with time zone,
    posted_at timestamp with time zone,
    posted_by uuid,
    cancelled_at timestamp with time zone,
    cancellation_reason text DEFAULT ''::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT stock_counts_check CHECK ((((state = ANY (ARRAY['DRAFT'::text, 'IN_PROGRESS'::text, 'COUNTED'::text, 'REVIEW'::text])) AND (posted_at IS NULL)) OR ((state = 'POSTED'::text) AND (posted_at IS NOT NULL)) OR (state = 'CANCELLED'::text))),
    CONSTRAINT stock_counts_check1 CHECK (((state <> 'CANCELLED'::text) OR (btrim(cancellation_reason) <> ''::text))),
    CONSTRAINT stock_counts_state_check CHECK ((state = ANY (ARRAY['DRAFT'::text, 'IN_PROGRESS'::text, 'COUNTED'::text, 'REVIEW'::text, 'POSTED'::text, 'CANCELLED'::text]))),
    CONSTRAINT stock_counts_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY stock_counts FORCE ROW LEVEL SECURITY;

--
-- Name: stock_movement_operation_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_movement_operation_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    operation_id uuid NOT NULL,
    line_no integer NOT NULL,
    variant_id uuid NOT NULL,
    variant_code text NOT NULL,
    variant_display jsonb DEFAULT '{}'::jsonb NOT NULL,
    quantity numeric(24,8) NOT NULL,
    base_quantity numeric(24,8) NOT NULL,
    unit_cost numeric(24,8),
    movement_id uuid NOT NULL,
    CONSTRAINT stock_movement_operation_lines_base_quantity_check CHECK ((base_quantity > (0)::numeric)),
    CONSTRAINT stock_movement_operation_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT stock_movement_operation_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT stock_movement_operation_lines_unit_cost_check CHECK (((unit_cost IS NULL) OR (unit_cost >= (0)::numeric))),
    CONSTRAINT stock_movement_operation_lines_variant_code_check CHECK ((btrim(variant_code) <> ''::text)),
    CONSTRAINT stock_movement_operation_lines_variant_display_check CHECK ((jsonb_typeof(variant_display) = 'object'::text))
);

ALTER TABLE ONLY stock_movement_operation_lines FORCE ROW LEVEL SECURITY;

--
-- Name: stock_movement_operations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_movement_operations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    product_id uuid NOT NULL,
    movement_type text NOT NULL,
    direction text NOT NULL,
    unit_code text DEFAULT ''::text NOT NULL,
    currency character(3),
    reason_code text NOT NULL,
    reason_description text DEFAULT ''::text NOT NULL,
    idempotency_key text NOT NULL,
    payload_hash bytea NOT NULL,
    actor_user_id uuid,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT stock_movement_operations_check CHECK (((reason_code <> 'OTHER'::text) OR (btrim(reason_description) <> ''::text))),
    CONSTRAINT stock_movement_operations_currency_check CHECK (((currency IS NULL) OR (((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text)))),
    CONSTRAINT stock_movement_operations_direction_check CHECK ((direction = ANY (ARRAY['IN'::text, 'OUT'::text]))),
    CONSTRAINT stock_movement_operations_idempotency_key_check CHECK (((btrim(idempotency_key) <> ''::text) AND (length(idempotency_key) <= 255))),
    CONSTRAINT stock_movement_operations_movement_type_check CHECK ((movement_type = 'MANUAL_ADJUSTMENT'::text)),
    CONSTRAINT stock_movement_operations_payload_hash_check CHECK ((octet_length(payload_hash) = 32))
);

ALTER TABLE ONLY stock_movement_operations FORCE ROW LEVEL SECURITY;

--
-- Name: stock_movements; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_movements (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    location_id uuid,
    product_id uuid NOT NULL,
    variant_id uuid,
    lot_id uuid,
    serial_id uuid,
    movement_type text NOT NULL,
    direction text NOT NULL,
    quantity numeric(24,8) NOT NULL,
    quantity_delta numeric(24,8) GENERATED ALWAYS AS (
CASE
    WHEN (direction = 'IN'::text) THEN quantity
    ELSE (- quantity)
END) STORED,
    unit_cost numeric(24,8),
    currency character(3),
    reason_code text DEFAULT 'SYSTEM'::text NOT NULL,
    reason_description text DEFAULT ''::text NOT NULL,
    source_type text NOT NULL,
    source_id uuid NOT NULL,
    source_line_id uuid,
    idempotency_key text NOT NULL,
    payload_hash bytea NOT NULL,
    reversal_of_id uuid,
    expiry_override boolean DEFAULT false NOT NULL,
    expiry_override_reason text DEFAULT ''::text NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    actor_user_id uuid,
    posted_at timestamp with time zone DEFAULT now() NOT NULL,
    transfer_id uuid,
    transfer_line_id uuid,
    count_id uuid,
    count_line_id uuid,
    operation_id uuid,
    exchange_rate_snapshot numeric(24,8) DEFAULT 1 NOT NULL,
    CONSTRAINT stock_movements_check CHECK (((reason_code <> 'OTHER'::text) OR (btrim(reason_description) <> ''::text))),
    CONSTRAINT stock_movements_check1 CHECK (((NOT expiry_override) OR (btrim(expiry_override_reason) <> ''::text))),
    CONSTRAINT stock_movements_check2 CHECK (((reversal_of_id IS NULL) OR (reversal_of_id <> id))),
    CONSTRAINT stock_movements_count_line_pair_check CHECK (((count_id IS NULL) = (count_line_id IS NULL))),
    CONSTRAINT stock_movements_currency_check CHECK (((currency IS NULL) OR (((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text)))),
    CONSTRAINT stock_movements_direction_check CHECK ((direction = ANY (ARRAY['IN'::text, 'OUT'::text]))),
    CONSTRAINT stock_movements_exchange_rate_snapshot_check CHECK ((exchange_rate_snapshot > (0)::numeric)),
    CONSTRAINT stock_movements_idempotency_key_check CHECK ((btrim(idempotency_key) <> ''::text)),
    CONSTRAINT stock_movements_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT stock_movements_movement_type_check CHECK ((movement_type = ANY (ARRAY['PURCHASE_RECEIPT'::text, 'SALES_DISPATCH'::text, 'SALES_RETURN'::text, 'PURCHASE_RETURN'::text, 'TRANSFER_OUT'::text, 'TRANSFER_IN'::text, 'COUNT_ADJUSTMENT'::text, 'MANUAL_ADJUSTMENT'::text, 'DAMAGE'::text, 'WASTE'::text, 'RECONCILIATION'::text]))),
    CONSTRAINT stock_movements_operation_source_check CHECK (((operation_id IS NULL) OR (source_type = 'STOCK_MOVEMENT_OPERATION'::text))),
    CONSTRAINT stock_movements_payload_hash_check CHECK ((octet_length(payload_hash) = 32)),
    CONSTRAINT stock_movements_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT stock_movements_source_type_check CHECK ((btrim(source_type) <> ''::text)),
    CONSTRAINT stock_movements_transfer_line_pair_check CHECK (((transfer_id IS NULL) = (transfer_line_id IS NULL))),
    CONSTRAINT stock_movements_unit_cost_check CHECK (((unit_cost IS NULL) OR (unit_cost >= (0)::numeric)))
);

ALTER TABLE ONLY stock_movements FORCE ROW LEVEL SECURITY;

--
-- Name: stock_positions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE stock_positions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    location_id uuid,
    product_id uuid NOT NULL,
    variant_id uuid,
    lot_id uuid,
    serial_id uuid,
    physical_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    reserved_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    available_quantity numeric(24,8) GENERATED ALWAYS AS ((physical_quantity - reserved_quantity)) STORED,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT stock_positions_reserved_quantity_check CHECK ((reserved_quantity >= (0)::numeric))
);

ALTER TABLE ONLY stock_positions FORCE ROW LEVEL SECURITY;

--
-- Name: supplier_product_references; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE supplier_product_references (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    supplier_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    supplier_code text DEFAULT ''::text NOT NULL,
    barcode text DEFAULT ''::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT supplier_product_references_check CHECK (((btrim(supplier_code) <> ''::text) OR (btrim(barcode) <> ''::text))),
    CONSTRAINT supplier_product_references_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY supplier_product_references FORCE ROW LEVEL SECURITY;

--
-- Name: supplier_purchase_prices; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE supplier_purchase_prices (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    supplier_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    source_receipt_line_id uuid,
    currency character(3) NOT NULL,
    unit_price numeric(24,8) NOT NULL,
    observed_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT supplier_purchase_prices_currency_check CHECK ((((currency)::text = upper((currency)::text)) AND (currency ~ '^[A-Z]{3}$'::text))),
    CONSTRAINT supplier_purchase_prices_unit_price_check CHECK ((unit_price >= (0)::numeric))
);

ALTER TABLE ONLY supplier_purchase_prices FORCE ROW LEVEL SECURITY;

--
-- Name: tax_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE tax_definitions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    source text NOT NULL,
    source_reference text DEFAULT ''::text NOT NULL,
    source_version text DEFAULT ''::text NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT tax_definitions_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT tax_definitions_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT tax_definitions_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT tax_definitions_source_check CHECK ((btrim(source) <> ''::text)),
    CONSTRAINT tax_definitions_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY tax_definitions FORCE ROW LEVEL SECURITY;

--
-- Name: tax_exemptions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE tax_exemptions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    legal_basis text DEFAULT ''::text NOT NULL,
    source text NOT NULL,
    source_reference text DEFAULT ''::text NOT NULL,
    source_version text DEFAULT ''::text NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT tax_exemptions_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT tax_exemptions_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT tax_exemptions_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT tax_exemptions_source_check CHECK ((btrim(source) <> ''::text)),
    CONSTRAINT tax_exemptions_valid_period CHECK (((valid_to IS NULL) OR (valid_to >= valid_from))),
    CONSTRAINT tax_exemptions_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY tax_exemptions FORCE ROW LEVEL SECURITY;

--
-- Name: tax_rates; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE tax_rates (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    tax_definition_id uuid NOT NULL,
    rate numeric(12,8) NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    source text NOT NULL,
    source_reference text DEFAULT ''::text NOT NULL,
    source_version text DEFAULT ''::text NOT NULL,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    calculation_type text DEFAULT 'PERCENTAGE'::text NOT NULL,
    CONSTRAINT tax_rates_calculation_type_check CHECK ((calculation_type = ANY (ARRAY['PERCENTAGE'::text, 'QUANTITY_BASED'::text]))),
    CONSTRAINT tax_rates_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT tax_rates_rate_check CHECK (((rate >= (0)::numeric) AND ((calculation_type = 'QUANTITY_BASED'::text) OR (rate <= (100)::numeric)))),
    CONSTRAINT tax_rates_source_check CHECK ((btrim(source) <> ''::text)),
    CONSTRAINT tax_rates_valid_period CHECK (((valid_to IS NULL) OR (valid_to >= valid_from))),
    CONSTRAINT tax_rates_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY tax_rates FORCE ROW LEVEL SECURITY;

--
-- Name: tax_withholding_rules; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE tax_withholding_rules (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    rate numeric(12,8) NOT NULL,
    legal_basis text DEFAULT ''::text NOT NULL,
    source text NOT NULL,
    source_reference text DEFAULT ''::text NOT NULL,
    source_version text DEFAULT ''::text NOT NULL,
    valid_from date NOT NULL,
    valid_to date,
    metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    ratio_numerator smallint,
    ratio_denominator smallint,
    CONSTRAINT tax_withholding_ratio_check CHECK ((((ratio_numerator IS NULL) AND (ratio_denominator IS NULL)) OR ((ratio_numerator > 0) AND (ratio_denominator > 0) AND (ratio_numerator <= ratio_denominator)))),
    CONSTRAINT tax_withholding_rules_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT tax_withholding_rules_metadata_check CHECK ((jsonb_typeof(metadata) = 'object'::text)),
    CONSTRAINT tax_withholding_rules_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT tax_withholding_rules_rate_check CHECK (((rate >= (0)::numeric) AND (rate <= (100)::numeric))),
    CONSTRAINT tax_withholding_rules_source_check CHECK ((btrim(source) <> ''::text)),
    CONSTRAINT tax_withholding_rules_version_check CHECK ((version > 0)),
    CONSTRAINT tax_withholding_valid_period CHECK (((valid_to IS NULL) OR (valid_to >= valid_from)))
);

ALTER TABLE ONLY tax_withholding_rules FORCE ROW LEVEL SECURITY;

--
-- Name: timesheet_days; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE timesheet_days (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    period_id uuid NOT NULL,
    employee_id uuid NOT NULL,
    work_date date NOT NULL,
    source text NOT NULL,
    schedule_version_id uuid,
    planned_minutes integer NOT NULL,
    worked_minutes integer NOT NULL,
    paid_leave_minutes integer DEFAULT 0 NOT NULL,
    unpaid_leave_minutes integer DEFAULT 0 NOT NULL,
    overtime_minutes integer DEFAULT 0 NOT NULL,
    week_rest_minutes integer DEFAULT 0 NOT NULL,
    public_holiday_minutes integer DEFAULT 0 NOT NULL,
    absence_minutes integer DEFAULT 0 NOT NULL,
    explanation text DEFAULT ''::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    leave_type_id uuid,
    CONSTRAINT timesheet_days_absence_minutes_check CHECK ((absence_minutes >= 0)),
    CONSTRAINT timesheet_days_overtime_minutes_check CHECK ((overtime_minutes >= 0)),
    CONSTRAINT timesheet_days_paid_leave_minutes_check CHECK (((paid_leave_minutes >= 0) AND (paid_leave_minutes <= 1440))),
    CONSTRAINT timesheet_days_planned_minutes_check CHECK (((planned_minutes >= 0) AND (planned_minutes <= 1440))),
    CONSTRAINT timesheet_days_public_holiday_minutes_check CHECK ((public_holiday_minutes >= 0)),
    CONSTRAINT timesheet_days_source_check CHECK ((source = ANY (ARRAY['GENERATED'::text, 'MANUAL'::text]))),
    CONSTRAINT timesheet_days_unpaid_leave_minutes_check CHECK (((unpaid_leave_minutes >= 0) AND (unpaid_leave_minutes <= 1440))),
    CONSTRAINT timesheet_days_version_check CHECK ((version > 0)),
    CONSTRAINT timesheet_days_week_rest_minutes_check CHECK ((week_rest_minutes >= 0)),
    CONSTRAINT timesheet_days_worked_minutes_check CHECK (((worked_minutes >= 0) AND (worked_minutes <= 1440)))
);

ALTER TABLE ONLY timesheet_days FORCE ROW LEVEL SECURITY;

--
-- Name: timesheet_periods; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE timesheet_periods (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    period_year integer NOT NULL,
    period_month smallint NOT NULL,
    status text DEFAULT 'DRAFT'::text NOT NULL,
    generation integer DEFAULT 1 NOT NULL,
    checksum character(64),
    finalized_at timestamp with time zone,
    finalized_by uuid,
    reopen_reason text,
    reopened_at timestamp with time zone,
    reopened_by uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT timesheet_periods_check CHECK ((((status = 'DRAFT'::text) AND (checksum IS NULL) AND (finalized_at IS NULL) AND (finalized_by IS NULL)) OR ((status = 'FINALIZED'::text) AND (checksum IS NOT NULL) AND (finalized_at IS NOT NULL) AND (finalized_by IS NOT NULL)))),
    CONSTRAINT timesheet_periods_checksum_check CHECK (((checksum IS NULL) OR (checksum ~ '^[0-9a-f]{64}$'::text))),
    CONSTRAINT timesheet_periods_generation_check CHECK ((generation > 0)),
    CONSTRAINT timesheet_periods_period_month_check CHECK (((period_month >= 1) AND (period_month <= 12))),
    CONSTRAINT timesheet_periods_period_year_check CHECK (((period_year >= 2000) AND (period_year <= 2200))),
    CONSTRAINT timesheet_periods_status_check CHECK ((status = ANY (ARRAY['DRAFT'::text, 'FINALIZED'::text]))),
    CONSTRAINT timesheet_periods_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY timesheet_periods FORCE ROW LEVEL SECURITY;

--
-- Name: turkish_districts; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE turkish_districts (
    id bigint NOT NULL,
    province_id smallint NOT NULL,
    name text NOT NULL,
    CONSTRAINT turkish_districts_id_check CHECK ((id > 0)),
    CONSTRAINT turkish_districts_name_check CHECK ((btrim(name) <> ''::text))
);

--
-- Name: turkish_neighborhoods; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE turkish_neighborhoods (
    id bigint NOT NULL,
    district_id bigint NOT NULL,
    name text NOT NULL,
    CONSTRAINT turkish_neighborhoods_id_check CHECK ((id > 0)),
    CONSTRAINT turkish_neighborhoods_name_check CHECK ((btrim(name) <> ''::text))
);

--
-- Name: turkish_provinces; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE turkish_provinces (
    id smallint NOT NULL,
    plate_code character(2) NOT NULL,
    name text NOT NULL,
    CONSTRAINT turkish_provinces_id_check CHECK (((id >= 1) AND (id <= 81))),
    CONSTRAINT turkish_provinces_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT turkish_provinces_plate_code_check CHECK ((plate_code ~ '^[0-9]{2}$'::text))
);

--
-- Name: turkish_tax_offices; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE turkish_tax_offices (
    id uuid NOT NULL,
    code text,
    name text NOT NULL,
    province_id smallint NOT NULL,
    district_name text NOT NULL,
    office_type text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    source_version text NOT NULL,
    snapshot_date date NOT NULL,
    CONSTRAINT turkish_tax_offices_code_format CHECK (((code IS NULL) OR (code ~ '^[0-9]{5}$'::text))),
    CONSTRAINT turkish_tax_offices_district_name_check CHECK ((btrim(district_name) <> ''::text)),
    CONSTRAINT turkish_tax_offices_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT turkish_tax_offices_office_type_check CHECK ((office_type = ANY (ARRAY['Vergi Dairesi Müdürlüğü'::text, 'Şube'::text, 'Malmüdürlüğü'::text, 'Defterdarlık'::text]))),
    CONSTRAINT turkish_tax_offices_source_version_check CHECK ((btrim(source_version) <> ''::text))
);

--
-- Name: units; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE units (
    code text NOT NULL,
    name text NOT NULL,
    decimal_scale smallint DEFAULT 3 NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    CONSTRAINT units_code_check CHECK (((code = upper(btrim(code))) AND (btrim(code) <> ''::text))),
    CONSTRAINT units_decimal_scale_check CHECK (((decimal_scale >= 0) AND (decimal_scale <= 8))),
    CONSTRAINT units_name_check CHECK ((btrim(name) <> ''::text))
);

--
-- Name: user_address_preferences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE user_address_preferences (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    province_id smallint,
    district_id bigint,
    neighborhood_id bigint,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    province_name text,
    district_name text,
    neighborhood_name text,
    CONSTRAINT user_address_preferences_hierarchy_check CHECK ((((district_id IS NULL) OR (province_id IS NOT NULL)) AND ((neighborhood_id IS NULL) OR (district_id IS NOT NULL)))),
    CONSTRAINT user_address_preferences_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY user_address_preferences FORCE ROW LEVEL SECURITY;

--
-- Name: user_agenda_events; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE user_agenda_events (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    event_date date NOT NULL,
    event_time text DEFAULT ''::text NOT NULL,
    title text NOT NULL,
    remind_minutes integer DEFAULT 0 NOT NULL,
    notified_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    completed_at timestamp with time zone,
    CONSTRAINT user_agenda_events_event_time_check CHECK (((event_time = ''::text) OR (event_time ~ '^([01][0-9]|2[0-3]):[0-5][0-9]$'::text))),
    CONSTRAINT user_agenda_events_remind_minutes_check CHECK (((remind_minutes >= 0) AND (remind_minutes <= 10080))),
    CONSTRAINT user_agenda_events_title_check CHECK (((char_length(btrim(title)) >= 1) AND (char_length(btrim(title)) <= 200))),
    CONSTRAINT user_agenda_events_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY user_agenda_events FORCE ROW LEVEL SECURITY;

--
-- Name: user_dashboard_preferences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE user_dashboard_preferences (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    pinned_shortcuts jsonb DEFAULT '[]'::jsonb NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT user_dashboard_preferences_pinned_shortcuts_check CHECK (((jsonb_typeof(pinned_shortcuts) = 'array'::text) AND (jsonb_array_length(pinned_shortcuts) <= 32))),
    CONSTRAINT user_dashboard_preferences_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY user_dashboard_preferences FORCE ROW LEVEL SECURITY;

--
-- Name: user_table_preferences; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE user_table_preferences (
    company_id uuid NOT NULL,
    user_id uuid NOT NULL,
    table_key text NOT NULL,
    column_visibility jsonb DEFAULT '{}'::jsonb NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT user_table_preferences_column_visibility_check CHECK ((jsonb_typeof(column_visibility) = 'object'::text)),
    CONSTRAINT user_table_preferences_table_key_check CHECK ((table_key ~ '^[a-z][a-z0-9_.-]{0,127}$'::text)),
    CONSTRAINT user_table_preferences_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY user_table_preferences FORCE ROW LEVEL SECURITY;

--
-- Name: users; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE users (
    id uuid NOT NULL,
    email text NOT NULL,
    display_name text NOT NULL,
    password_hash text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    totp_pending_ciphertext bytea,
    totp_secret_ciphertext bytea,
    totp_enabled_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT users_display_name_check CHECK ((btrim(display_name) <> ''::text)),
    CONSTRAINT users_email_normalized CHECK ((email = lower(btrim(email)))),
    CONSTRAINT users_totp_consistent CHECK (((totp_secret_ciphertext IS NULL) = (totp_enabled_at IS NULL))),
    CONSTRAINT users_version_check CHECK ((version > 0))
);

--
-- Name: variant_definition_options; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE variant_definition_options (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    definition_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    short_code text NOT NULL,
    sort_order integer DEFAULT 1 NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT variant_definition_options_code_check CHECK (((code = upper(btrim(code))) AND (code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definition_options_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT variant_definition_options_short_code_check CHECK (((short_code = upper(btrim(short_code))) AND (short_code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definition_options_sort_order_check CHECK ((sort_order > 0)),
    CONSTRAINT variant_definition_options_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY variant_definition_options FORCE ROW LEVEL SECURITY;

--
-- Name: variant_definition_package_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE variant_definition_package_definitions (
    package_code text NOT NULL,
    definition_code text NOT NULL,
    definition_name text NOT NULL,
    "position" smallint NOT NULL,
    CONSTRAINT variant_definition_package_definitions_definition_code_check CHECK (((definition_code = upper(btrim(definition_code))) AND (definition_code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definition_package_definitions_definition_name_check CHECK ((btrim(definition_name) <> ''::text)),
    CONSTRAINT variant_definition_package_definitions_position_check CHECK ((("position" >= 1) AND ("position" <= 5)))
);

--
-- Name: variant_definition_package_options; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE variant_definition_package_options (
    package_code text NOT NULL,
    definition_code text NOT NULL,
    option_code text NOT NULL,
    option_name text NOT NULL,
    short_code text NOT NULL,
    "position" smallint NOT NULL,
    CONSTRAINT variant_definition_package_options_option_code_check CHECK (((option_code = upper(btrim(option_code))) AND (option_code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definition_package_options_option_name_check CHECK ((btrim(option_name) <> ''::text)),
    CONSTRAINT variant_definition_package_options_position_check CHECK (("position" > 0)),
    CONSTRAINT variant_definition_package_options_short_code_check CHECK (((short_code = upper(btrim(short_code))) AND (short_code ~ '^[A-Z0-9_-]+$'::text)))
);

--
-- Name: variant_definition_packages; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE variant_definition_packages (
    code text NOT NULL,
    name text NOT NULL,
    description text DEFAULT ''::text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    CONSTRAINT variant_definition_packages_code_check CHECK (((code = upper(btrim(code))) AND (code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definition_packages_name_check CHECK ((btrim(name) <> ''::text))
);

--
-- Name: variant_definitions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE variant_definitions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT variant_definitions_code_check CHECK (((code = upper(btrim(code))) AND (code ~ '^[A-Z0-9_-]+$'::text))),
    CONSTRAINT variant_definitions_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT variant_definitions_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY variant_definitions FORCE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_discrepancy_resolutions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE warehouse_transfer_discrepancy_resolutions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    transfer_id uuid NOT NULL,
    transfer_line_id uuid CONSTRAINT warehouse_transfer_discrepancy_resolu_transfer_line_id_not_null NOT NULL,
    resolution_type text CONSTRAINT warehouse_transfer_discrepancy_resolut_resolution_type_not_null NOT NULL,
    quantity numeric(24,8) NOT NULL,
    reason text NOT NULL,
    idempotency_key text CONSTRAINT warehouse_transfer_discrepancy_resolut_idempotency_key_not_null NOT NULL,
    actor_user_id uuid,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT warehouse_transfer_discrepancy_resolution_idempotency_key_check CHECK (((btrim(idempotency_key) <> ''::text) AND (length(idempotency_key) <= 255))),
    CONSTRAINT warehouse_transfer_discrepancy_resolution_resolution_type_check CHECK ((resolution_type = ANY (ARRAY['DELIVER'::text, 'RETURN'::text, 'WASTE'::text]))),
    CONSTRAINT warehouse_transfer_discrepancy_resolutions_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT warehouse_transfer_discrepancy_resolutions_reason_check CHECK ((btrim(reason) <> ''::text))
);

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions FORCE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_lines; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE warehouse_transfer_lines (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    transfer_id uuid NOT NULL,
    line_no integer NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    lot_id uuid,
    serial_id uuid,
    source_location_id uuid,
    destination_location_id uuid,
    quantity numeric(24,8) NOT NULL,
    shipped_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    received_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    damaged_quantity numeric(24,8) DEFAULT 0 NOT NULL,
    discrepancy_reason text DEFAULT ''::text NOT NULL,
    product_code_snapshot text DEFAULT ''::text NOT NULL,
    product_name_snapshot text DEFAULT ''::text NOT NULL,
    variant_code_snapshot text DEFAULT ''::text NOT NULL,
    variant_description_snapshot text DEFAULT ''::text NOT NULL,
    CONSTRAINT warehouse_transfer_lines_check CHECK ((shipped_quantity <= quantity)),
    CONSTRAINT warehouse_transfer_lines_check1 CHECK (((received_quantity + damaged_quantity) <= shipped_quantity)),
    CONSTRAINT warehouse_transfer_lines_damaged_quantity_check CHECK ((damaged_quantity >= (0)::numeric)),
    CONSTRAINT warehouse_transfer_lines_line_no_check CHECK ((line_no > 0)),
    CONSTRAINT warehouse_transfer_lines_product_code_snapshot_check CHECK ((btrim(product_code_snapshot) <> ''::text)),
    CONSTRAINT warehouse_transfer_lines_product_name_snapshot_check CHECK ((btrim(product_name_snapshot) <> ''::text)),
    CONSTRAINT warehouse_transfer_lines_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT warehouse_transfer_lines_received_quantity_check CHECK ((received_quantity >= (0)::numeric)),
    CONSTRAINT warehouse_transfer_lines_shipped_quantity_check CHECK ((shipped_quantity >= (0)::numeric)),
    CONSTRAINT warehouse_transfer_lines_variant_snapshot_pair_check CHECK ((((variant_code_snapshot = ''::text) AND (variant_description_snapshot = ''::text)) OR ((btrim(variant_code_snapshot) <> ''::text) AND (btrim(variant_description_snapshot) <> ''::text))))
);

ALTER TABLE ONLY warehouse_transfer_lines FORCE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_reservations; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE warehouse_transfer_reservations (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    transfer_id uuid NOT NULL,
    transfer_line_id uuid NOT NULL,
    warehouse_id uuid NOT NULL,
    product_id uuid NOT NULL,
    variant_id uuid,
    location_id uuid,
    lot_id uuid,
    serial_id uuid,
    quantity numeric(24,8) NOT NULL,
    state text DEFAULT 'ACTIVE'::text NOT NULL,
    reserved_at timestamp with time zone DEFAULT now() NOT NULL,
    consumed_at timestamp with time zone,
    released_at timestamp with time zone,
    CONSTRAINT warehouse_transfer_reservations_check CHECK ((((state = 'ACTIVE'::text) AND (consumed_at IS NULL) AND (released_at IS NULL)) OR ((state = 'CONSUMED'::text) AND (consumed_at IS NOT NULL) AND (released_at IS NULL)) OR ((state = 'RELEASED'::text) AND (released_at IS NOT NULL) AND (consumed_at IS NULL)))),
    CONSTRAINT warehouse_transfer_reservations_quantity_check CHECK ((quantity > (0)::numeric)),
    CONSTRAINT warehouse_transfer_reservations_state_check CHECK ((state = ANY (ARRAY['ACTIVE'::text, 'CONSUMED'::text, 'RELEASED'::text])))
);

ALTER TABLE ONLY warehouse_transfer_reservations FORCE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfers; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE warehouse_transfers (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    transfer_no text NOT NULL,
    source_warehouse_id uuid NOT NULL,
    destination_warehouse_id uuid NOT NULL,
    transit_warehouse_id uuid NOT NULL,
    state text DEFAULT 'DRAFT'::text NOT NULL,
    requested_by uuid,
    approved_by uuid,
    requested_at timestamp with time zone,
    approved_at timestamp with time zone,
    shipped_at timestamp with time zone,
    received_at timestamp with time zone,
    cancelled_at timestamp with time zone,
    cancellation_reason text DEFAULT ''::text NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    transfer_type text DEFAULT 'WORKFLOW'::text NOT NULL,
    CONSTRAINT warehouse_transfers_check CHECK ((source_warehouse_id <> destination_warehouse_id)),
    CONSTRAINT warehouse_transfers_check1 CHECK (((state <> 'CANCELLED'::text) OR (btrim(cancellation_reason) <> ''::text))),
    CONSTRAINT warehouse_transfers_state_check CHECK ((state = ANY (ARRAY['DRAFT'::text, 'REQUESTED'::text, 'APPROVED'::text, 'IN_TRANSIT'::text, 'PARTIALLY_RECEIVED'::text, 'RECEIVED'::text, 'CANCELLED'::text]))),
    CONSTRAINT warehouse_transfers_transfer_no_check CHECK ((btrim(transfer_no) <> ''::text)),
    CONSTRAINT warehouse_transfers_transfer_type_check CHECK ((transfer_type = ANY (ARRAY['QUICK'::text, 'WORKFLOW'::text]))),
    CONSTRAINT warehouse_transfers_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY warehouse_transfers FORCE ROW LEVEL SECURITY;

--
-- Name: warehouses; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE warehouses (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    branch_id uuid,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    warehouse_type text DEFAULT 'STANDARD'::text NOT NULL,
    address text DEFAULT ''::text NOT NULL,
    responsible_user_id uuid,
    uses_locations boolean DEFAULT false NOT NULL,
    is_transit boolean DEFAULT false NOT NULL,
    is_system boolean DEFAULT false NOT NULL,
    CONSTRAINT warehouses_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT warehouses_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT warehouses_system_transit_flags_check CHECK (((is_system = is_transit) AND ((NOT is_transit) OR (warehouse_type = 'TRANSIT'::text)))),
    CONSTRAINT warehouses_type_check CHECK ((warehouse_type = ANY (ARRAY['STANDARD'::text, 'QUARANTINE'::text, 'TRANSIT'::text, 'RETURN'::text]))),
    CONSTRAINT warehouses_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY warehouses FORCE ROW LEVEL SECURITY;

--
-- Name: work_schedule_days; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE work_schedule_days (
    company_id uuid NOT NULL,
    schedule_version_id uuid NOT NULL,
    template_id uuid NOT NULL,
    weekday smallint NOT NULL,
    is_workday boolean NOT NULL,
    starts_at time without time zone,
    ends_at time without time zone,
    ends_next_day boolean DEFAULT false NOT NULL,
    break_minutes integer DEFAULT 0 NOT NULL,
    planned_minutes integer NOT NULL,
    CONSTRAINT work_schedule_days_break_minutes_check CHECK ((break_minutes >= 0)),
    CONSTRAINT work_schedule_days_check CHECK ((((NOT is_workday) AND (starts_at IS NULL) AND (ends_at IS NULL) AND (NOT ends_next_day) AND (planned_minutes = 0)) OR (is_workday AND (starts_at IS NOT NULL) AND (ends_at IS NOT NULL) AND (planned_minutes > 0)))),
    CONSTRAINT work_schedule_days_check1 CHECK (((NOT is_workday) OR ends_next_day OR (ends_at > starts_at))),
    CONSTRAINT work_schedule_days_check2 CHECK (((NOT is_workday) OR (NOT ends_next_day) OR (ends_at <= starts_at))),
    CONSTRAINT work_schedule_days_planned_minutes_check CHECK (((planned_minutes >= 0) AND (planned_minutes <= 1440))),
    CONSTRAINT work_schedule_days_weekday_check CHECK (((weekday >= 1) AND (weekday <= 7)))
);

ALTER TABLE ONLY work_schedule_days FORCE ROW LEVEL SECURITY;

--
-- Name: work_schedule_template_versions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE work_schedule_template_versions (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    template_id uuid NOT NULL,
    effective_from date NOT NULL,
    effective_to date,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT work_schedule_template_versions_check CHECK (((effective_to IS NULL) OR (effective_to >= effective_from)))
);

ALTER TABLE ONLY work_schedule_template_versions FORCE ROW LEVEL SECURITY;

--
-- Name: work_schedule_templates; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE work_schedule_templates (
    id uuid NOT NULL,
    company_id uuid NOT NULL,
    code text NOT NULL,
    name text NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    version bigint DEFAULT 1 NOT NULL,
    CONSTRAINT work_schedule_templates_code_check CHECK ((btrim(code) <> ''::text)),
    CONSTRAINT work_schedule_templates_name_check CHECK ((btrim(name) <> ''::text)),
    CONSTRAINT work_schedule_templates_version_check CHECK ((version > 0))
);

ALTER TABLE ONLY work_schedule_templates FORCE ROW LEVEL SECURITY;

--
-- Name: api_token_branch_scopes api_token_branch_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_branch_scopes
    ADD CONSTRAINT api_token_branch_scopes_pkey PRIMARY KEY (company_id, token_id, branch_id);

--
-- Name: api_token_warehouse_scopes api_token_warehouse_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_warehouse_scopes
    ADD CONSTRAINT api_token_warehouse_scopes_pkey PRIMARY KEY (company_id, token_id, warehouse_id);

--
-- Name: api_tokens api_tokens_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_tokens
    ADD CONSTRAINT api_tokens_company_id_id_key UNIQUE (company_id, id);

--
-- Name: api_tokens api_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_tokens
    ADD CONSTRAINT api_tokens_pkey PRIMARY KEY (id);

--
-- Name: api_tokens api_tokens_token_hash_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_tokens
    ADD CONSTRAINT api_tokens_token_hash_key UNIQUE (token_hash);

--
-- Name: asset_assignments asset_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY asset_assignments
    ADD CONSTRAINT asset_assignments_pkey PRIMARY KEY (company_id, id);

--
-- Name: branches branches_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY branches
    ADD CONSTRAINT branches_company_id_code_key UNIQUE (company_id, code);

--
-- Name: branches branches_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY branches
    ADD CONSTRAINT branches_pkey PRIMARY KEY (company_id, id);

--
-- Name: command_idempotency_records command_idempotency_records_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY command_idempotency_records
    ADD CONSTRAINT command_idempotency_records_pkey PRIMARY KEY (company_id, idempotency_key);

--
-- Name: commercial_document_sequences commercial_document_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sequences
    ADD CONSTRAINT commercial_document_sequences_pkey PRIMARY KEY (company_id, document_type_code, sequence_year);

--
-- Name: commercial_document_sources commercial_document_sources_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sources
    ADD CONSTRAINT commercial_document_sources_pkey PRIMARY KEY (company_id, document_id, source_document_id, relation_type);

--
-- Name: commercial_effect_claims commercial_effect_claims_company_id_effect_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_effect_claims
    ADD CONSTRAINT commercial_effect_claims_company_id_effect_key_key UNIQUE (company_id, effect_key);

--
-- Name: commercial_effect_claims commercial_effect_claims_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_effect_claims
    ADD CONSTRAINT commercial_effect_claims_pkey PRIMARY KEY (company_id, id);

--
-- Name: commercial_line_allocations commercial_line_allocations_company_id_source_line_id_targe_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_allocations
    ADD CONSTRAINT commercial_line_allocations_company_id_source_line_id_targe_key UNIQUE (company_id, source_line_id, target_line_id, allocation_type);

--
-- Name: commercial_line_allocations commercial_line_allocations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_allocations
    ADD CONSTRAINT commercial_line_allocations_pkey PRIMARY KEY (company_id, id);

--
-- Name: commercial_line_registry commercial_line_registry_company_id_aggregate_type_document_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_registry
    ADD CONSTRAINT commercial_line_registry_company_id_aggregate_type_document_key UNIQUE (company_id, aggregate_type, document_id, line_no);

--
-- Name: commercial_line_registry commercial_line_registry_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_registry
    ADD CONSTRAINT commercial_line_registry_pkey PRIMARY KEY (company_id, line_id);

--
-- Name: commercial_party_snapshots commercial_party_snapshots_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_party_snapshots
    ADD CONSTRAINT commercial_party_snapshots_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: commercial_party_snapshots commercial_party_snapshots_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_party_snapshots
    ADD CONSTRAINT commercial_party_snapshots_pkey PRIMARY KEY (company_id, id);

--
-- Name: commercial_status_history commercial_status_history_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_status_history
    ADD CONSTRAINT commercial_status_history_pkey PRIMARY KEY (company_id, id);

--
-- Name: companies companies_id_is_active_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY companies
    ADD CONSTRAINT companies_id_is_active_key UNIQUE (id, is_active);

--
-- Name: companies companies_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY companies
    ADD CONSTRAINT companies_pkey PRIMARY KEY (id);

--
-- Name: company_business_sequences company_business_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_business_sequences
    ADD CONSTRAINT company_business_sequences_pkey PRIMARY KEY (company_id, sequence_key, sequence_year);

--
-- Name: company_memberships company_memberships_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_memberships
    ADD CONSTRAINT company_memberships_pkey PRIMARY KEY (company_id, user_id);

--
-- Name: company_modules company_modules_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_modules
    ADD CONSTRAINT company_modules_pkey PRIMARY KEY (company_id, module_code);

--
-- Name: company_party_sequences company_party_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_party_sequences
    ADD CONSTRAINT company_party_sequences_pkey PRIMARY KEY (company_id);

--
-- Name: company_product_sequences company_product_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_product_sequences
    ADD CONSTRAINT company_product_sequences_pkey PRIMARY KEY (company_id);

--
-- Name: company_secrets company_secrets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_secrets
    ADD CONSTRAINT company_secrets_pkey PRIMARY KEY (company_id, name);

--
-- Name: company_smtp_settings company_smtp_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_smtp_settings
    ADD CONSTRAINT company_smtp_settings_pkey PRIMARY KEY (company_id);

--
-- Name: document_lines document_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_lines
    ADD CONSTRAINT document_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: document_lines document_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_lines
    ADD CONSTRAINT document_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: document_reversals document_reversals_company_id_original_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_reversals
    ADD CONSTRAINT document_reversals_company_id_original_document_id_key UNIQUE (company_id, original_document_id);

--
-- Name: document_reversals document_reversals_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_reversals
    ADD CONSTRAINT document_reversals_pkey PRIMARY KEY (company_id, id);

--
-- Name: document_sequences document_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_sequences
    ADD CONSTRAINT document_sequences_pkey PRIMARY KEY (company_id, document_type_code);

--
-- Name: document_status_history document_status_history_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_status_history
    ADD CONSTRAINT document_status_history_pkey PRIMARY KEY (company_id, id);

--
-- Name: document_types document_types_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_types
    ADD CONSTRAINT document_types_pkey PRIMARY KEY (code);

--
-- Name: documents documents_company_id_document_type_code_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_document_type_code_document_no_key UNIQUE (company_id, document_type_code, document_no);

--
-- Name: documents documents_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_pkey PRIMARY KEY (company_id, id);

--
-- Name: edocument_events edocument_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocument_events
    ADD CONSTRAINT edocument_events_pkey PRIMARY KEY (company_id, id);

--
-- Name: edocuments edocuments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocuments
    ADD CONSTRAINT edocuments_pkey PRIMARY KEY (company_id, id);

--
-- Name: email_message_recipients email_message_recipients_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_message_recipients
    ADD CONSTRAINT email_message_recipients_pkey PRIMARY KEY (id);

--
-- Name: email_messages email_messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_messages
    ADD CONSTRAINT email_messages_pkey PRIMARY KEY (id);

--
-- Name: email_templates email_templates_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_templates
    ADD CONSTRAINT email_templates_company_id_code_key UNIQUE (company_id, code);

--
-- Name: email_templates email_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_templates
    ADD CONSTRAINT email_templates_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_addresses employee_addresses_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_addresses
    ADD CONSTRAINT employee_addresses_pkey PRIMARY KEY (company_id, employee_id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: employee_advance_transactions employee_advance_transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_advances employee_advances_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advances
    ADD CONSTRAINT employee_advances_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_documents employee_documents_company_id_storage_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_documents
    ADD CONSTRAINT employee_documents_company_id_storage_key_key UNIQUE (company_id, storage_key);

--
-- Name: employee_documents employee_documents_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_documents
    ADD CONSTRAINT employee_documents_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_legal_deductions employee_legal_deductions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_legal_deductions
    ADD CONSTRAINT employee_legal_deductions_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_payroll_components employee_payroll_components_company_id_employee_payroll_id__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_components
    ADD CONSTRAINT employee_payroll_components_company_id_employee_payroll_id__key UNIQUE (company_id, employee_payroll_id, calculation_order);

--
-- Name: employee_payroll_components employee_payroll_components_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_components
    ADD CONSTRAINT employee_payroll_components_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_payroll_year_openings employee_payroll_year_opening_company_id_employee_id_tax_ye_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_year_openings
    ADD CONSTRAINT employee_payroll_year_opening_company_id_employee_id_tax_ye_key UNIQUE (company_id, employee_id, tax_year, source);

--
-- Name: employee_payroll_year_openings employee_payroll_year_openings_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_year_openings
    ADD CONSTRAINT employee_payroll_year_openings_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_payrolls employee_payrolls_company_id_generation_id_employee_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payrolls
    ADD CONSTRAINT employee_payrolls_company_id_generation_id_employee_id_key UNIQUE (company_id, generation_id, employee_id);

--
-- Name: employee_payrolls employee_payrolls_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payrolls
    ADD CONSTRAINT employee_payrolls_pkey PRIMARY KEY (company_id, id);

--
-- Name: employee_private_profiles employee_private_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_private_profiles
    ADD CONSTRAINT employee_private_profiles_pkey PRIMARY KEY (company_id, employee_id);

--
-- Name: employee_schedule_assignments employee_schedule_assignments_no_overlap; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_schedule_assignments
    ADD CONSTRAINT employee_schedule_assignments_no_overlap EXCLUDE USING gist (company_id WITH =, employee_id WITH =, daterange(effective_from, COALESCE(effective_to, 'infinity'::date), '[]'::text) WITH &&);

--
-- Name: employee_schedule_assignments employee_schedule_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_schedule_assignments
    ADD CONSTRAINT employee_schedule_assignments_pkey PRIMARY KEY (company_id, id);

--
-- Name: employees employees_company_id_employee_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employees
    ADD CONSTRAINT employees_company_id_employee_code_key UNIQUE (company_id, employee_code);

--
-- Name: employees employees_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employees
    ADD CONSTRAINT employees_pkey PRIMARY KEY (company_id, id);

--
-- Name: employment_terms employment_terms_no_overlap; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employment_terms
    ADD CONSTRAINT employment_terms_no_overlap EXCLUDE USING gist (company_id WITH =, employment_id WITH =, daterange(effective_from, COALESCE(effective_to, 'infinity'::date), '[]'::text) WITH &&);

--
-- Name: employment_terms employment_terms_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employment_terms
    ADD CONSTRAINT employment_terms_pkey PRIMARY KEY (company_id, id);

--
-- Name: employments employments_company_id_id_employee_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employments
    ADD CONSTRAINT employments_company_id_id_employee_id_key UNIQUE (company_id, id, employee_id);

--
-- Name: employments employments_no_overlap; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employments
    ADD CONSTRAINT employments_no_overlap EXCLUDE USING gist (company_id WITH =, employee_id WITH =, daterange(start_date, COALESCE(end_date, 'infinity'::date), '[]'::text) WITH &&);

--
-- Name: employments employments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employments
    ADD CONSTRAINT employments_pkey PRIMARY KEY (company_id, id);

--
-- Name: exchange_rate_settings exchange_rate_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY exchange_rate_settings
    ADD CONSTRAINT exchange_rate_settings_pkey PRIMARY KEY (company_id);

--
-- Name: exchange_rates exchange_rates_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY exchange_rates
    ADD CONSTRAINT exchange_rates_pkey PRIMARY KEY (company_id, currency_code, rate_date, source_code);

--
-- Name: export_artifacts export_artifacts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_artifacts
    ADD CONSTRAINT export_artifacts_pkey PRIMARY KEY (company_id, export_job_id);

--
-- Name: export_jobs export_jobs_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_jobs
    ADD CONSTRAINT export_jobs_company_id_id_key UNIQUE (company_id, id);

--
-- Name: export_jobs export_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_jobs
    ADD CONSTRAINT export_jobs_pkey PRIMARY KEY (id);

--
-- Name: finance_account_movements finance_account_movements_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_account_movements finance_account_movements_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_account_movements finance_account_movements_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_accounts finance_accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_accounts
    ADD CONSTRAINT finance_accounts_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_instrument_events finance_instrument_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instrument_events
    ADD CONSTRAINT finance_instrument_events_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_instruments finance_instruments_company_id_instrument_type_instrument_n_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instruments
    ADD CONSTRAINT finance_instruments_company_id_instrument_type_instrument_n_key UNIQUE (company_id, instrument_type, instrument_no);

--
-- Name: finance_instruments finance_instruments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instruments
    ADD CONSTRAINT finance_instruments_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_reversals_company_id_open_item_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_item_reversals
    ADD CONSTRAINT finance_invoice_open_item_reversals_company_id_open_item_id_key UNIQUE (company_id, open_item_id);

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_reversals_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_item_reversals
    ADD CONSTRAINT finance_invoice_open_item_reversals_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_invoice_open_items finance_invoice_open_items_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_items
    ADD CONSTRAINT finance_invoice_open_items_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: finance_invoice_open_items finance_invoice_open_items_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_items
    ADD CONSTRAINT finance_invoice_open_items_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_invoice_postings finance_invoice_postings_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_manual_entries finance_manual_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_party_transfers finance_party_transfers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_payment_allocations finance_payment_allocations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_payments finance_payments_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_payments finance_payments_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_payments finance_payments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_period_locks finance_period_locks_company_id_period_start_period_end_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_period_locks
    ADD CONSTRAINT finance_period_locks_company_id_period_start_period_end_key UNIQUE (company_id, period_start, period_end);

--
-- Name: finance_period_locks finance_period_locks_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_period_locks
    ADD CONSTRAINT finance_period_locks_pkey PRIMARY KEY (company_id, id);

--
-- Name: finance_transfers finance_transfers_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: finance_transfers finance_transfers_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: finance_transfers finance_transfers_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: finance_transfers finance_transfers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_pkey PRIMARY KEY (company_id, id);

--
-- Name: fixed_asset_categories fixed_asset_categories_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_asset_categories
    ADD CONSTRAINT fixed_asset_categories_company_id_code_key UNIQUE (company_id, code);

--
-- Name: fixed_asset_categories fixed_asset_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_asset_categories
    ADD CONSTRAINT fixed_asset_categories_pkey PRIMARY KEY (company_id, id);

--
-- Name: fixed_assets fixed_assets_company_id_asset_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_assets
    ADD CONSTRAINT fixed_assets_company_id_asset_code_key UNIQUE (company_id, asset_code);

--
-- Name: fixed_assets fixed_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_assets
    ADD CONSTRAINT fixed_assets_pkey PRIMARY KEY (company_id, id);

--
-- Name: goods_receipt_lines goods_receipt_lines_company_id_receipt_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_company_id_receipt_id_line_no_key UNIQUE (company_id, receipt_id, line_no);

--
-- Name: goods_receipt_lines goods_receipt_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: goods_receipts goods_receipts_company_id_receipt_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_receipt_no_key UNIQUE (company_id, receipt_no);

--
-- Name: goods_receipts goods_receipts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_pkey PRIMARY KEY (company_id, id);

--
-- Name: import_jobs import_jobs_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_jobs
    ADD CONSTRAINT import_jobs_company_id_id_key UNIQUE (company_id, id);

--
-- Name: import_jobs import_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_jobs
    ADD CONSTRAINT import_jobs_pkey PRIMARY KEY (id);

--
-- Name: import_jobs import_jobs_source_storage_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_jobs
    ADD CONSTRAINT import_jobs_source_storage_key_key UNIQUE (source_storage_key);

--
-- Name: import_mappings import_mappings_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_mappings
    ADD CONSTRAINT import_mappings_pkey PRIMARY KEY (company_id, import_job_id, source_column);

--
-- Name: import_row_results import_row_results_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_row_results
    ADD CONSTRAINT import_row_results_pkey PRIMARY KEY (company_id, import_job_id, row_number);

--
-- Name: instance_setup instance_setup_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY instance_setup
    ADD CONSTRAINT instance_setup_pkey PRIMARY KEY (singleton);

--
-- Name: inventory_company_policies inventory_company_policies_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY inventory_company_policies
    ADD CONSTRAINT inventory_company_policies_pkey PRIMARY KEY (company_id);

--
-- Name: inventory_reason_codes inventory_reason_codes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY inventory_reason_codes
    ADD CONSTRAINT inventory_reason_codes_pkey PRIMARY KEY (code);

--
-- Name: leave_types leave_types_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY leave_types
    ADD CONSTRAINT leave_types_company_id_code_key UNIQUE (company_id, code);

--
-- Name: leave_types leave_types_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY leave_types
    ADD CONSTRAINT leave_types_pkey PRIMARY KEY (company_id, id);

--
-- Name: locations locations_company_id_warehouse_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY locations
    ADD CONSTRAINT locations_company_id_warehouse_id_code_key UNIQUE (company_id, warehouse_id, code);

--
-- Name: locations locations_company_id_warehouse_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY locations
    ADD CONSTRAINT locations_company_id_warehouse_id_id_key UNIQUE (company_id, warehouse_id, id);

--
-- Name: locations locations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY locations
    ADD CONSTRAINT locations_pkey PRIMARY KEY (company_id, id);

--
-- Name: login_attempts login_attempts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY login_attempts
    ADD CONSTRAINT login_attempts_pkey PRIMARY KEY (id);

--
-- Name: lots lots_company_id_product_id_lot_number_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY lots
    ADD CONSTRAINT lots_company_id_product_id_lot_number_key UNIQUE (company_id, product_id, lot_number);

--
-- Name: lots lots_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY lots
    ADD CONSTRAINT lots_pkey PRIMARY KEY (company_id, id);

--
-- Name: membership_branch_scopes membership_branch_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_branch_scopes
    ADD CONSTRAINT membership_branch_scopes_pkey PRIMARY KEY (company_id, user_id, branch_id);

--
-- Name: membership_finance_account_scopes membership_finance_account_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_finance_account_scopes
    ADD CONSTRAINT membership_finance_account_scopes_pkey PRIMARY KEY (company_id, user_id, account_id);

--
-- Name: membership_roles membership_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_roles
    ADD CONSTRAINT membership_roles_pkey PRIMARY KEY (company_id, user_id, role_id);

--
-- Name: membership_warehouse_scopes membership_warehouse_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_warehouse_scopes
    ADD CONSTRAINT membership_warehouse_scopes_pkey PRIMARY KEY (company_id, user_id, warehouse_id);

--
-- Name: outbox_events outbox_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY outbox_events
    ADD CONSTRAINT outbox_events_pkey PRIMARY KEY (event_id);

--
-- Name: parties parties_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY parties
    ADD CONSTRAINT parties_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_addresses party_addresses_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_addresses
    ADD CONSTRAINT party_addresses_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_contacts party_contacts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_contacts
    ADD CONSTRAINT party_contacts_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_custom_field_definitions party_custom_field_definitions_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_definitions
    ADD CONSTRAINT party_custom_field_definitions_company_id_code_key UNIQUE (company_id, code);

--
-- Name: party_custom_field_definitions party_custom_field_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_definitions
    ADD CONSTRAINT party_custom_field_definitions_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_custom_field_values party_custom_field_values_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_values
    ADD CONSTRAINT party_custom_field_values_pkey PRIMARY KEY (company_id, party_id, definition_id);

--
-- Name: party_group_memberships party_group_memberships_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_group_memberships
    ADD CONSTRAINT party_group_memberships_pkey PRIMARY KEY (company_id, party_id, group_id);

--
-- Name: party_groups party_groups_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_groups
    ADD CONSTRAINT party_groups_company_id_code_key UNIQUE (company_id, code);

--
-- Name: party_groups party_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_groups
    ADD CONSTRAINT party_groups_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_id_party_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_id_party_id_key UNIQUE (company_id, id, party_id);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: party_ledger_entries party_ledger_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_pkey PRIMARY KEY (company_id, id);

--
-- Name: party_search_documents party_search_documents_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_search_documents
    ADD CONSTRAINT party_search_documents_pkey PRIMARY KEY (company_id, party_id);

--
-- Name: party_tag_assignments party_tag_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tag_assignments
    ADD CONSTRAINT party_tag_assignments_pkey PRIMARY KEY (company_id, party_id, tag_id);

--
-- Name: party_tags party_tags_company_id_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tags
    ADD CONSTRAINT party_tags_company_id_name_key UNIQUE (company_id, name);

--
-- Name: party_tags party_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tags
    ADD CONSTRAINT party_tags_pkey PRIMARY KEY (company_id, id);

--
-- Name: payment_terms payment_terms_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payment_terms
    ADD CONSTRAINT payment_terms_company_id_code_key UNIQUE (company_id, code);

--
-- Name: payment_terms payment_terms_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payment_terms
    ADD CONSTRAINT payment_terms_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_calculation_generations payroll_calculation_generatio_company_id_payroll_run_id_gen_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_generations
    ADD CONSTRAINT payroll_calculation_generatio_company_id_payroll_run_id_gen_key UNIQUE (company_id, payroll_run_id, generation_no);

--
-- Name: payroll_calculation_generations payroll_calculation_generation_company_id_id_payroll_run_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_generations
    ADD CONSTRAINT payroll_calculation_generation_company_id_id_payroll_run_id_key UNIQUE (company_id, id, payroll_run_id);

--
-- Name: payroll_calculation_generations payroll_calculation_generations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_generations
    ADD CONSTRAINT payroll_calculation_generations_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_calculation_jobs payroll_calculation_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_jobs
    ADD CONSTRAINT payroll_calculation_jobs_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_component_definitions payroll_component_definitions_company_id_pack_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_component_definitions
    ADD CONSTRAINT payroll_component_definitions_company_id_pack_id_code_key UNIQUE (company_id, pack_id, code);

--
-- Name: payroll_component_definitions payroll_component_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_component_definitions
    ADD CONSTRAINT payroll_component_definitions_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_component_treatments payroll_component_treatments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_component_treatments
    ADD CONSTRAINT payroll_component_treatments_pkey PRIMARY KEY (company_id, component_definition_id, levy);

--
-- Name: payroll_contribution_schemes payroll_contribution_schemes_company_id_pack_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_contribution_schemes
    ADD CONSTRAINT payroll_contribution_schemes_company_id_pack_id_code_key UNIQUE (company_id, pack_id, code);

--
-- Name: payroll_contribution_schemes payroll_contribution_schemes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_contribution_schemes
    ADD CONSTRAINT payroll_contribution_schemes_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_email_batches payroll_email_batches_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_batches
    ADD CONSTRAINT payroll_email_batches_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: payroll_email_batches payroll_email_batches_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_batches
    ADD CONSTRAINT payroll_email_batches_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_email_deliveries payroll_email_deliveries_company_id_batch_id_employee_payro_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_deliveries
    ADD CONSTRAINT payroll_email_deliveries_company_id_batch_id_employee_payro_key UNIQUE (company_id, batch_id, employee_payroll_id);

--
-- Name: payroll_email_deliveries payroll_email_deliveries_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_deliveries
    ADD CONSTRAINT payroll_email_deliveries_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_export_jobs payroll_export_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_jobs
    ADD CONSTRAINT payroll_export_jobs_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_export_payslips payroll_export_payslips_company_id_export_job_id_document_o_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_payslips
    ADD CONSTRAINT payroll_export_payslips_company_id_export_job_id_document_o_key UNIQUE (company_id, export_job_id, document_order);

--
-- Name: payroll_export_payslips payroll_export_payslips_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_payslips
    ADD CONSTRAINT payroll_export_payslips_pkey PRIMARY KEY (company_id, export_job_id, payslip_id);

--
-- Name: payroll_income_tax_brackets payroll_income_tax_brackets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_income_tax_brackets
    ADD CONSTRAINT payroll_income_tax_brackets_pkey PRIMARY KEY (company_id, pack_id, sequence);

--
-- Name: payroll_legislation_packs payroll_legislation_active_no_overlap; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_active_no_overlap EXCLUDE USING gist (company_id WITH =, country_code WITH =, daterange(effective_from, effective_to, '[]'::text) WITH &&) WHERE ((status = 'ACTIVE'::text));

--
-- Name: payroll_legislation_packs payroll_legislation_packs_company_id_country_code_code_vers_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_company_id_country_code_code_vers_key UNIQUE (company_id, country_code, code, version);

--
-- Name: payroll_legislation_packs payroll_legislation_packs_company_id_id_country_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_company_id_id_country_code_key UNIQUE (company_id, id, country_code);

--
-- Name: payroll_legislation_packs payroll_legislation_packs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_manual_components payroll_manual_components_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_manual_components
    ADD CONSTRAINT payroll_manual_components_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_payments payroll_payments_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: payroll_payments payroll_payments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_payslip_jobs payroll_payslip_jobs_company_id_employee_payroll_id_templat_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslip_jobs
    ADD CONSTRAINT payroll_payslip_jobs_company_id_employee_payroll_id_templat_key UNIQUE (company_id, employee_payroll_id, template_version);

--
-- Name: payroll_payslip_jobs payroll_payslip_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslip_jobs
    ADD CONSTRAINT payroll_payslip_jobs_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_payslips payroll_payslips_company_id_employee_payroll_id_template_ve_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslips
    ADD CONSTRAINT payroll_payslips_company_id_employee_payroll_id_template_ve_key UNIQUE (company_id, employee_payroll_id, template_version, source_checksum);

--
-- Name: payroll_payslips payroll_payslips_company_id_id_employee_payroll_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslips
    ADD CONSTRAINT payroll_payslips_company_id_id_employee_payroll_id_key UNIQUE (company_id, id, employee_payroll_id);

--
-- Name: payroll_payslips payroll_payslips_company_id_storage_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslips
    ADD CONSTRAINT payroll_payslips_company_id_storage_key_key UNIQUE (company_id, storage_key);

--
-- Name: payroll_payslips payroll_payslips_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslips
    ADD CONSTRAINT payroll_payslips_pkey PRIMARY KEY (company_id, id);

--
-- Name: payroll_runs payroll_runs_company_id_run_number_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_company_id_run_number_key UNIQUE (company_id, run_number);

--
-- Name: payroll_runs payroll_runs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_pkey PRIMARY KEY (company_id, id);

--
-- Name: permissions permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY permissions
    ADD CONSTRAINT permissions_pkey PRIMARY KEY (code);

--
-- Name: platform_metadata platform_metadata_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY platform_metadata
    ADD CONSTRAINT platform_metadata_pkey PRIMARY KEY (key);

--
-- Name: platform_schema_migrations platform_schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

-- platform_schema_migrations primary key is defined by the migration runner.

--
-- Name: price_list_entries price_list_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_list_entries
    ADD CONSTRAINT price_list_entries_pkey PRIMARY KEY (company_id, id);

--
-- Name: price_lists price_lists_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_lists
    ADD CONSTRAINT price_lists_company_id_code_key UNIQUE (company_id, code);

--
-- Name: price_lists price_lists_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_lists
    ADD CONSTRAINT price_lists_pkey PRIMARY KEY (company_id, id);

--
-- Name: pricing_currencies pricing_currencies_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY pricing_currencies
    ADD CONSTRAINT pricing_currencies_pkey PRIMARY KEY (company_id, code);

--
-- Name: product_attachments product_attachments_company_id_storage_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_company_id_storage_key_key UNIQUE (company_id, storage_key);

--
-- Name: product_attachments product_attachments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_pkey PRIMARY KEY (company_id, id);

--
-- Name: product_barcodes product_barcodes_company_id_barcode_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_barcodes
    ADD CONSTRAINT product_barcodes_company_id_barcode_key UNIQUE (company_id, barcode);

--
-- Name: product_barcodes product_barcodes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_barcodes
    ADD CONSTRAINT product_barcodes_pkey PRIMARY KEY (id);

--
-- Name: product_brands product_brands_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_brands
    ADD CONSTRAINT product_brands_company_id_code_key UNIQUE (company_id, code);

--
-- Name: product_brands product_brands_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_brands
    ADD CONSTRAINT product_brands_company_id_id_key UNIQUE (company_id, id);

--
-- Name: product_brands product_brands_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_brands
    ADD CONSTRAINT product_brands_pkey PRIMARY KEY (id);

--
-- Name: product_categories product_categories_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_categories
    ADD CONSTRAINT product_categories_company_id_code_key UNIQUE (company_id, code);

--
-- Name: product_categories product_categories_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_categories
    ADD CONSTRAINT product_categories_company_id_id_key UNIQUE (company_id, id);

--
-- Name: product_categories product_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_categories
    ADD CONSTRAINT product_categories_pkey PRIMARY KEY (id);

--
-- Name: product_image_variants product_image_variants_company_id_product_image_id_variant__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_image_variants
    ADD CONSTRAINT product_image_variants_company_id_product_image_id_variant__key UNIQUE (company_id, product_image_id, variant_code);

--
-- Name: product_image_variants product_image_variants_company_id_storage_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_image_variants
    ADD CONSTRAINT product_image_variants_company_id_storage_key_key UNIQUE (company_id, storage_key);

--
-- Name: product_image_variants product_image_variants_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_image_variants
    ADD CONSTRAINT product_image_variants_pkey PRIMARY KEY (company_id, id);

--
-- Name: product_images product_images_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_images
    ADD CONSTRAINT product_images_pkey PRIMARY KEY (company_id, id);

--
-- Name: product_tax_profile_components product_tax_profile_components_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profile_components
    ADD CONSTRAINT product_tax_profile_components_pkey PRIMARY KEY (company_id, product_id, direction, sequence);

--
-- Name: product_tax_profiles product_tax_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_pkey PRIMARY KEY (company_id, product_id, direction);

--
-- Name: product_units product_units_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_units
    ADD CONSTRAINT product_units_pkey PRIMARY KEY (company_id, product_id, unit_code);

--
-- Name: product_variant_allowed_options product_variant_allowed_options_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_allowed_options
    ADD CONSTRAINT product_variant_allowed_options_pkey PRIMARY KEY (company_id, product_id, definition_id, option_id);

--
-- Name: product_variant_definitions product_variant_definitions_company_id_product_id_position_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_definitions
    ADD CONSTRAINT product_variant_definitions_company_id_product_id_position_key UNIQUE (company_id, product_id, "position");

--
-- Name: product_variant_definitions product_variant_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_definitions
    ADD CONSTRAINT product_variant_definitions_pkey PRIMARY KEY (company_id, product_id, definition_id);

--
-- Name: product_variant_price_overrides product_variant_price_overrides_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_price_overrides
    ADD CONSTRAINT product_variant_price_overrides_pkey PRIMARY KEY (company_id, variant_id, direction);

--
-- Name: product_variant_values product_variant_values_company_id_variant_id_definition_id__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_values
    ADD CONSTRAINT product_variant_values_company_id_variant_id_definition_id__key UNIQUE (company_id, variant_id, definition_id, option_id);

--
-- Name: product_variant_values product_variant_values_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_values
    ADD CONSTRAINT product_variant_values_pkey PRIMARY KEY (company_id, variant_id, definition_id);

--
-- Name: product_variants product_variants_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variants
    ADD CONSTRAINT product_variants_pkey PRIMARY KEY (id);

--
-- Name: products products_company_code_unique; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_company_code_unique UNIQUE (company_id, code);

--
-- Name: products products_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_company_id_id_key UNIQUE (company_id, id);

--
-- Name: products products_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_pkey PRIMARY KEY (id);

--
-- Name: public_holiday_calendars public_holiday_calendars_company_id_country_code_calendar_y_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holiday_calendars
    ADD CONSTRAINT public_holiday_calendars_company_id_country_code_calendar_y_key UNIQUE (company_id, country_code, calendar_year, version);

--
-- Name: public_holiday_calendars public_holiday_calendars_company_id_id_calendar_year_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holiday_calendars
    ADD CONSTRAINT public_holiday_calendars_company_id_id_calendar_year_key UNIQUE (company_id, id, calendar_year);

--
-- Name: public_holiday_calendars public_holiday_calendars_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holiday_calendars
    ADD CONSTRAINT public_holiday_calendars_pkey PRIMARY KEY (company_id, id);

--
-- Name: public_holidays public_holidays_company_id_calendar_id_holiday_date_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holidays
    ADD CONSTRAINT public_holidays_company_id_calendar_id_holiday_date_key UNIQUE (company_id, calendar_id, holiday_date);

--
-- Name: public_holidays public_holidays_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holidays
    ADD CONSTRAINT public_holidays_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_company_id_invoice_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_company_id_invoice_id_line_no_key UNIQUE (company_id, invoice_id, line_no);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_invoices purchase_invoices_company_id_invoice_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_invoice_no_key UNIQUE (company_id, invoice_no);

--
-- Name: purchase_invoices purchase_invoices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_landed_cost_lines purchase_landed_cost_lines_company_id_landed_cost_id_goods__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_cost_lines
    ADD CONSTRAINT purchase_landed_cost_lines_company_id_landed_cost_id_goods__key UNIQUE (company_id, landed_cost_id, goods_receipt_line_id);

--
-- Name: purchase_landed_cost_lines purchase_landed_cost_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_cost_lines
    ADD CONSTRAINT purchase_landed_cost_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_landed_costs purchase_landed_costs_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: purchase_landed_costs purchase_landed_costs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_order_lines purchase_order_lines_company_id_order_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_company_id_order_id_line_no_key UNIQUE (company_id, order_id, line_no);

--
-- Name: purchase_order_lines purchase_order_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_orders purchase_orders_company_id_order_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_order_no_key UNIQUE (company_id, order_no);

--
-- Name: purchase_orders purchase_orders_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_return_lines purchase_return_lines_company_id_return_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_company_id_return_id_line_no_key UNIQUE (company_id, return_id, line_no);

--
-- Name: purchase_return_lines purchase_return_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: purchase_returns purchase_returns_company_id_return_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_return_no_key UNIQUE (company_id, return_no);

--
-- Name: purchase_returns purchase_returns_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_pkey PRIMARY KEY (company_id, id);

--
-- Name: recovery_codes recovery_codes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY recovery_codes
    ADD CONSTRAINT recovery_codes_pkey PRIMARY KEY (user_id, code_hash);

--
-- Name: role_permissions role_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY role_permissions
    ADD CONSTRAINT role_permissions_pkey PRIMARY KEY (company_id, role_id, permission_code);

--
-- Name: roles roles_company_id_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY roles
    ADD CONSTRAINT roles_company_id_name_key UNIQUE (company_id, name);

--
-- Name: roles roles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY roles
    ADD CONSTRAINT roles_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_dispatches sales_dispatches_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: sales_dispatches sales_dispatches_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: sales_dispatches sales_dispatches_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: sales_invoice_lines sales_invoice_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_invoices sales_invoices_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: sales_invoices sales_invoices_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: sales_invoices sales_invoices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_order_lines sales_order_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: sales_order_lines sales_order_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_order_line_id_warehouse_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_order_line_id_warehouse_key UNIQUE (company_id, order_line_id, warehouse_id);

--
-- Name: sales_order_reservations sales_order_reservations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_orders sales_orders_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: sales_orders sales_orders_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: sales_orders sales_orders_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_quote_lines sales_quote_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: sales_quote_lines sales_quote_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: sales_quotes sales_quotes_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: sales_quotes sales_quotes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_return_lines sales_return_lines_company_id_document_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_document_id_line_no_key UNIQUE (company_id, document_id, line_no);

--
-- Name: sales_return_lines sales_return_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: sales_returns sales_returns_company_id_document_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_company_id_document_id_key UNIQUE (company_id, document_id);

--
-- Name: sales_returns sales_returns_company_id_document_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_company_id_document_no_key UNIQUE (company_id, document_no);

--
-- Name: sales_returns sales_returns_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_pkey PRIMARY KEY (company_id, id);

--
-- Name: security_audit_events security_audit_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY security_audit_events
    ADD CONSTRAINT security_audit_events_pkey PRIMARY KEY (id);

--
-- Name: serial_number_events serial_number_events_company_id_movement_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_company_id_movement_id_key UNIQUE (company_id, movement_id);

--
-- Name: serial_number_events serial_number_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_pkey PRIMARY KEY (company_id, id);

--
-- Name: serial_numbers serial_numbers_active_state_check; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE serial_numbers
    ADD CONSTRAINT serial_numbers_active_state_check CHECK ((((status = 'DISPATCHED'::text) AND (active_warehouse_id IS NULL) AND (active_location_id IS NULL)) OR ((status <> 'DISPATCHED'::text) AND (active_warehouse_id IS NOT NULL)))) NOT VALID;

--
-- Name: serial_numbers serial_numbers_company_id_product_id_serial_number_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_company_id_product_id_serial_number_key UNIQUE (company_id, product_id, serial_number);

--
-- Name: serial_numbers serial_numbers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_pkey PRIMARY KEY (company_id, id);

--
-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sessions
    ADD CONSTRAINT sessions_pkey PRIMARY KEY (id);

--
-- Name: sessions sessions_token_hash_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sessions
    ADD CONSTRAINT sessions_token_hash_key UNIQUE (token_hash);

--
-- Name: sgk_occupation_codes sgk_occupation_codes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sgk_occupation_codes
    ADD CONSTRAINT sgk_occupation_codes_pkey PRIMARY KEY (code);

--
-- Name: stock_cost_adjustments stock_cost_adjustments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_adjustments
    ADD CONSTRAINT stock_cost_adjustments_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_cost_consumptions stock_cost_consumptions_company_id_movement_id_layer_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_consumptions
    ADD CONSTRAINT stock_cost_consumptions_company_id_movement_id_layer_id_key UNIQUE (company_id, movement_id, layer_id);

--
-- Name: stock_cost_consumptions stock_cost_consumptions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_consumptions
    ADD CONSTRAINT stock_cost_consumptions_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_source_movement_unique; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_source_movement_unique UNIQUE (company_id, source_movement_id);

--
-- Name: stock_cost_unpriced_events stock_cost_unpriced_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_unpriced_events
    ADD CONSTRAINT stock_cost_unpriced_events_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_assignments stock_count_engine_assignments_company_id_pass_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_assignments
    ADD CONSTRAINT stock_count_engine_assignments_company_id_pass_id_user_id_key UNIQUE (company_id, pass_id, user_id);

--
-- Name: stock_count_engine_assignments stock_count_engine_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_assignments
    ADD CONSTRAINT stock_count_engine_assignments_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_commands stock_count_engine_commands_company_id_count_id_command_nam_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_commands
    ADD CONSTRAINT stock_count_engine_commands_company_id_count_id_command_nam_key UNIQUE (company_id, count_id, command_name, idempotency_key);

--
-- Name: stock_count_engine_commands stock_count_engine_commands_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_commands
    ADD CONSTRAINT stock_count_engine_commands_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_counts stock_count_engine_counts_company_id_start_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_counts
    ADD CONSTRAINT stock_count_engine_counts_company_id_start_idempotency_key_key UNIQUE (company_id, start_idempotency_key);

--
-- Name: stock_count_engine_counts stock_count_engine_counts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_counts
    ADD CONSTRAINT stock_count_engine_counts_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_event_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_event_id_key UNIQUE (company_id, event_id);

--
-- Name: stock_count_engine_events stock_count_engine_events_event_seq_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_event_seq_key UNIQUE (event_seq);

--
-- Name: stock_count_engine_events stock_count_engine_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_number_sequences stock_count_engine_number_sequences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_number_sequences
    ADD CONSTRAINT stock_count_engine_number_sequences_pkey PRIMARY KEY (company_id);

--
-- Name: stock_count_engine_passes stock_count_engine_passes_company_id_count_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_passes
    ADD CONSTRAINT stock_count_engine_passes_company_id_count_id_id_key UNIQUE (company_id, count_id, id);

--
-- Name: stock_count_engine_passes stock_count_engine_passes_company_id_count_id_pass_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_passes
    ADD CONSTRAINT stock_count_engine_passes_company_id_count_id_pass_no_key UNIQUE (company_id, count_id, pass_no);

--
-- Name: stock_count_engine_passes stock_count_engine_passes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_passes
    ADD CONSTRAINT stock_count_engine_passes_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_review_exceptions stock_count_engine_review_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_review_exceptions
    ADD CONSTRAINT stock_count_engine_review_exceptions_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_count_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_count_id_id_key UNIQUE (company_id, count_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_count_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_count_id_line_no_key UNIQUE (company_id, count_id, line_no);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_company_id_count_id_pass_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_company_id_count_id_pass_id_id_key UNIQUE (company_id, count_id, pass_id, id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_company_id_pass_id_client_sessi_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_company_id_pass_id_client_sessi_key UNIQUE (company_id, pass_id, client_session_id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_count_lines stock_count_lines_company_id_count_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_count_id_line_no_key UNIQUE (company_id, count_id, line_no);

--
-- Name: stock_count_lines stock_count_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_counts stock_counts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_counts
    ADD CONSTRAINT stock_counts_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_line_company_id_operation_id_line__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_line_company_id_operation_id_line__key UNIQUE (company_id, operation_id, line_no);

--
-- Name: stock_movement_operation_lines stock_movement_operation_line_company_id_operation_id_varia_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_line_company_id_operation_id_varia_key UNIQUE (company_id, operation_id, variant_id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_company_id_movement_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_company_id_movement_id_key UNIQUE (company_id, movement_id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_movement_operations stock_movement_operations_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: stock_movement_operations stock_movement_operations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_movements stock_movements_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: stock_movements stock_movements_company_id_reversal_of_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_reversal_of_id_key UNIQUE (company_id, reversal_of_id);

--
-- Name: stock_movements stock_movements_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_pkey PRIMARY KEY (company_id, id);

--
-- Name: stock_positions stock_positions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_pkey PRIMARY KEY (company_id, id);

--
-- Name: supplier_product_references supplier_product_references_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_product_references
    ADD CONSTRAINT supplier_product_references_pkey PRIMARY KEY (company_id, id);

--
-- Name: supplier_purchase_prices supplier_purchase_prices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_purchase_prices
    ADD CONSTRAINT supplier_purchase_prices_pkey PRIMARY KEY (company_id, id);

--
-- Name: tax_definitions tax_definitions_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_definitions
    ADD CONSTRAINT tax_definitions_company_id_code_key UNIQUE (company_id, code);

--
-- Name: tax_definitions tax_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_definitions
    ADD CONSTRAINT tax_definitions_pkey PRIMARY KEY (company_id, id);

--
-- Name: tax_exemptions tax_exemptions_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_exemptions
    ADD CONSTRAINT tax_exemptions_company_id_code_key UNIQUE (company_id, code);

--
-- Name: tax_exemptions tax_exemptions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_exemptions
    ADD CONSTRAINT tax_exemptions_pkey PRIMARY KEY (company_id, id);

--
-- Name: tax_rates tax_rates_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_rates
    ADD CONSTRAINT tax_rates_pkey PRIMARY KEY (company_id, id);

--
-- Name: tax_withholding_rules tax_withholding_rules_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_withholding_rules
    ADD CONSTRAINT tax_withholding_rules_company_id_code_key UNIQUE (company_id, code);

--
-- Name: tax_withholding_rules tax_withholding_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_withholding_rules
    ADD CONSTRAINT tax_withholding_rules_pkey PRIMARY KEY (company_id, id);

--
-- Name: timesheet_days timesheet_days_company_id_period_id_employee_id_work_date_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_company_id_period_id_employee_id_work_date_key UNIQUE (company_id, period_id, employee_id, work_date);

--
-- Name: timesheet_days timesheet_days_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_pkey PRIMARY KEY (company_id, id);

--
-- Name: timesheet_periods timesheet_periods_company_id_period_year_period_month_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_periods
    ADD CONSTRAINT timesheet_periods_company_id_period_year_period_month_key UNIQUE (company_id, period_year, period_month);

--
-- Name: timesheet_periods timesheet_periods_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_periods
    ADD CONSTRAINT timesheet_periods_pkey PRIMARY KEY (company_id, id);

--
-- Name: turkish_districts turkish_districts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_districts
    ADD CONSTRAINT turkish_districts_pkey PRIMARY KEY (id);

--
-- Name: turkish_districts turkish_districts_province_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_districts
    ADD CONSTRAINT turkish_districts_province_id_id_key UNIQUE (province_id, id);

--
-- Name: turkish_districts turkish_districts_province_id_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_districts
    ADD CONSTRAINT turkish_districts_province_id_name_key UNIQUE (province_id, name);

--
-- Name: turkish_neighborhoods turkish_neighborhoods_district_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_neighborhoods
    ADD CONSTRAINT turkish_neighborhoods_district_id_id_key UNIQUE (district_id, id);

--
-- Name: turkish_neighborhoods turkish_neighborhoods_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_neighborhoods
    ADD CONSTRAINT turkish_neighborhoods_pkey PRIMARY KEY (id);

--
-- Name: turkish_provinces turkish_provinces_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_provinces
    ADD CONSTRAINT turkish_provinces_name_key UNIQUE (name);

--
-- Name: turkish_provinces turkish_provinces_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_provinces
    ADD CONSTRAINT turkish_provinces_pkey PRIMARY KEY (id);

--
-- Name: turkish_provinces turkish_provinces_plate_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_provinces
    ADD CONSTRAINT turkish_provinces_plate_code_key UNIQUE (plate_code);

--
-- Name: turkish_tax_offices turkish_tax_offices_code_unique; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_tax_offices
    ADD CONSTRAINT turkish_tax_offices_code_unique UNIQUE (code);

--
-- Name: turkish_tax_offices turkish_tax_offices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_tax_offices
    ADD CONSTRAINT turkish_tax_offices_pkey PRIMARY KEY (id);

--
-- Name: units units_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY units
    ADD CONSTRAINT units_pkey PRIMARY KEY (code);

--
-- Name: user_address_preferences user_address_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_address_preferences
    ADD CONSTRAINT user_address_preferences_pkey PRIMARY KEY (company_id, user_id);

--
-- Name: user_agenda_events user_agenda_events_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_agenda_events
    ADD CONSTRAINT user_agenda_events_pkey PRIMARY KEY (id);

--
-- Name: user_dashboard_preferences user_dashboard_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_dashboard_preferences
    ADD CONSTRAINT user_dashboard_preferences_pkey PRIMARY KEY (company_id, user_id);

--
-- Name: user_table_preferences user_table_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_table_preferences
    ADD CONSTRAINT user_table_preferences_pkey PRIMARY KEY (company_id, user_id, table_key);

--
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY users
    ADD CONSTRAINT users_pkey PRIMARY KEY (id);

--
-- Name: variant_definition_options variant_definition_options_company_id_definition_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_company_id_definition_id_code_key UNIQUE (company_id, definition_id, code);

--
-- Name: variant_definition_options variant_definition_options_company_id_definition_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_company_id_definition_id_id_key UNIQUE (company_id, definition_id, id);

--
-- Name: variant_definition_options variant_definition_options_company_id_definition_id_short_c_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_company_id_definition_id_short_c_key UNIQUE (company_id, definition_id, short_code);

--
-- Name: variant_definition_options variant_definition_options_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_company_id_id_key UNIQUE (company_id, id);

--
-- Name: variant_definition_options variant_definition_options_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_pkey PRIMARY KEY (id);

--
-- Name: variant_definition_package_definitions variant_definition_package_definition_package_code_position_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_definitions
    ADD CONSTRAINT variant_definition_package_definition_package_code_position_key UNIQUE (package_code, "position");

--
-- Name: variant_definition_package_definitions variant_definition_package_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_definitions
    ADD CONSTRAINT variant_definition_package_definitions_pkey PRIMARY KEY (package_code, definition_code);

--
-- Name: variant_definition_package_options variant_definition_package_op_package_code_definition_code__key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_options
    ADD CONSTRAINT variant_definition_package_op_package_code_definition_code__key UNIQUE (package_code, definition_code, short_code);

--
-- Name: variant_definition_package_options variant_definition_package_options_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_options
    ADD CONSTRAINT variant_definition_package_options_pkey PRIMARY KEY (package_code, definition_code, option_code);

--
-- Name: variant_definition_packages variant_definition_packages_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_packages
    ADD CONSTRAINT variant_definition_packages_pkey PRIMARY KEY (code);

--
-- Name: variant_definitions variant_definitions_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definitions
    ADD CONSTRAINT variant_definitions_company_id_code_key UNIQUE (company_id, code);

--
-- Name: variant_definitions variant_definitions_company_id_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definitions
    ADD CONSTRAINT variant_definitions_company_id_id_key UNIQUE (company_id, id);

--
-- Name: variant_definitions variant_definitions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definitions
    ADD CONSTRAINT variant_definitions_pkey PRIMARY KEY (id);

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_r_company_id_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions
    ADD CONSTRAINT warehouse_transfer_discrepancy_r_company_id_idempotency_key_key UNIQUE (company_id, idempotency_key);

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_resolutions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions
    ADD CONSTRAINT warehouse_transfer_discrepancy_resolutions_pkey PRIMARY KEY (company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_transfer_id_line_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_transfer_id_line_no_key UNIQUE (company_id, transfer_id, line_no);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_discrepancy_reason_check; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_discrepancy_reason_check CHECK (((damaged_quantity = (0)::numeric) OR (btrim(discrepancy_reason) <> ''::text))) NOT VALID;

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_pkey PRIMARY KEY (company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_transfer_line_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_transfer_line_id_key UNIQUE (company_id, transfer_line_id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_pkey PRIMARY KEY (company_id, id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_transfer_no_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_transfer_no_key UNIQUE (company_id, transfer_no);

--
-- Name: warehouse_transfers warehouse_transfers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_pkey PRIMARY KEY (company_id, id);

--
-- Name: warehouses warehouses_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouses
    ADD CONSTRAINT warehouses_company_id_code_key UNIQUE (company_id, code);

--
-- Name: warehouses warehouses_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouses
    ADD CONSTRAINT warehouses_pkey PRIMARY KEY (company_id, id);

--
-- Name: work_schedule_days work_schedule_days_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_days
    ADD CONSTRAINT work_schedule_days_pkey PRIMARY KEY (company_id, schedule_version_id, weekday);

--
-- Name: work_schedule_template_versions work_schedule_template_versions_company_id_id_template_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_template_versions
    ADD CONSTRAINT work_schedule_template_versions_company_id_id_template_id_key UNIQUE (company_id, id, template_id);

--
-- Name: work_schedule_template_versions work_schedule_template_versions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_template_versions
    ADD CONSTRAINT work_schedule_template_versions_pkey PRIMARY KEY (company_id, id);

--
-- Name: work_schedule_templates work_schedule_templates_company_id_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_templates
    ADD CONSTRAINT work_schedule_templates_company_id_code_key UNIQUE (company_id, code);

--
-- Name: work_schedule_templates work_schedule_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_templates
    ADD CONSTRAINT work_schedule_templates_pkey PRIMARY KEY (company_id, id);

--
-- Name: work_schedule_template_versions work_schedule_versions_no_overlap; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_template_versions
    ADD CONSTRAINT work_schedule_versions_no_overlap EXCLUDE USING gist (company_id WITH =, template_id WITH =, daterange(effective_from, COALESCE(effective_to, 'infinity'::date), '[]'::text) WITH &&);

--
-- Name: asset_assignments_employee_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX asset_assignments_employee_idx ON asset_assignments USING btree (company_id, employee_id, assigned_at DESC);

--
-- Name: asset_assignments_one_active; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX asset_assignments_one_active ON asset_assignments USING btree (company_id, asset_id) WHERE (returned_at IS NULL);

--
-- Name: command_idempotency_cleanup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX command_idempotency_cleanup_idx ON command_idempotency_records USING btree (created_at) WHERE (status <> 'IN_PROGRESS'::text);

--
-- Name: commercial_document_sources_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_document_sources_source_idx ON commercial_document_sources USING btree (company_id, source_document_id, relation_type);

--
-- Name: commercial_line_allocations_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_line_allocations_source_idx ON commercial_line_allocations USING btree (company_id, source_line_id, allocation_type);

--
-- Name: commercial_line_allocations_status_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_line_allocations_status_idx ON commercial_line_allocations USING btree (company_id, source_line_id, allocation_type, status);

--
-- Name: commercial_line_allocations_target_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_line_allocations_target_idx ON commercial_line_allocations USING btree (company_id, target_line_id, allocation_type);

--
-- Name: commercial_line_registry_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_line_registry_document_idx ON commercial_line_registry USING btree (company_id, aggregate_type, document_id, line_no);

--
-- Name: commercial_status_history_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX commercial_status_history_document_idx ON commercial_status_history USING btree (company_id, aggregate_type, document_id, occurred_at DESC);

--
-- Name: document_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX document_lines_document_idx ON document_lines USING btree (company_id, document_id, line_no);

--
-- Name: document_lines_product_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX document_lines_product_idx ON document_lines USING btree (company_id, product_id) WHERE (product_id IS NOT NULL);

--
-- Name: document_lines_variant_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX document_lines_variant_idx ON document_lines USING btree (company_id, variant_id) WHERE (variant_id IS NOT NULL);

--
-- Name: document_reversals_idempotency_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX document_reversals_idempotency_unique ON document_reversals USING btree (company_id, idempotency_key) WHERE (idempotency_key IS NOT NULL);

--
-- Name: document_status_history_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX document_status_history_document_idx ON document_status_history USING btree (company_id, document_id, occurred_at DESC);

--
-- Name: documents_company_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX documents_company_date_idx ON documents USING btree (company_id, document_date DESC, id DESC);

--
-- Name: documents_company_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX documents_company_party_idx ON documents USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: documents_company_status_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX documents_company_status_idx ON documents USING btree (company_id, status, document_date DESC, id DESC);

--
-- Name: documents_post_idempotency_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX documents_post_idempotency_unique ON documents USING btree (company_id, post_idempotency_key) WHERE (post_idempotency_key IS NOT NULL);

--
-- Name: documents_search_vector_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX documents_search_vector_idx ON documents USING gin (search_vector);

--
-- Name: edocument_events_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX edocument_events_document_idx ON edocument_events USING btree (company_id, edocument_id, occurred_at DESC, id DESC);

--
-- Name: edocuments_company_status_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX edocuments_company_status_idx ON edocuments USING btree (company_id, status, updated_at DESC, id DESC);

--
-- Name: edocuments_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX edocuments_source_idx ON edocuments USING btree (company_id, ((payload ->> 'source_type'::text)), ((payload ->> 'source_id'::text)));

--
-- Name: email_message_recipients_message; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX email_message_recipients_message ON email_message_recipients USING btree (company_id, message_id);

--
-- Name: email_messages_company_created; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX email_messages_company_created ON email_messages USING btree (company_id, created_at DESC);

--
-- Name: email_templates_company_scope; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX email_templates_company_scope ON email_templates USING btree (company_id, scope) WHERE (archived_at IS NULL);

--
-- Name: employee_advance_transactions_ledger_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX employee_advance_transactions_ledger_idx ON employee_advance_transactions USING btree (company_id, advance_id, transaction_date, created_at, id);

--
-- Name: employee_advances_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX employee_advances_date_idx ON employee_advances USING btree (company_id, advance_date DESC, id);

--
-- Name: employee_advances_employee_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX employee_advances_employee_idx ON employee_advances USING btree (company_id, employee_id, advance_date DESC, id);

--
-- Name: employee_private_profiles_tckn_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX employee_private_profiles_tckn_unique ON employee_private_profiles USING btree (company_id, tckn_sha256) WHERE (tckn_sha256 IS NOT NULL);

--
-- Name: employees_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX employees_company_name_idx ON employees USING btree (company_id, last_name, first_name, id);

--
-- Name: exchange_rates_latest_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX exchange_rates_latest_idx ON exchange_rates USING btree (company_id, currency_code, rate_date DESC, fetched_at DESC);

--
-- Name: export_jobs_company_created_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX export_jobs_company_created_idx ON export_jobs USING btree (company_id, created_at DESC, id DESC);

--
-- Name: finance_account_movements_balance_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_account_movements_balance_idx ON finance_account_movements USING btree (company_id, account_id, transaction_date, posted_at, id);

--
-- Name: finance_account_movements_one_opening; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX finance_account_movements_one_opening ON finance_account_movements USING btree (company_id, account_id) WHERE ((movement_kind = 'OPENING_BALANCE'::text) AND (reversal_of_id IS NULL));

--
-- Name: finance_account_movements_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_account_movements_source_idx ON finance_account_movements USING btree (company_id, source_type, source_id);

--
-- Name: finance_accounts_company_code_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX finance_accounts_company_code_unique ON finance_accounts USING btree (company_id, lower(code));

--
-- Name: finance_accounts_company_id_currency_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX finance_accounts_company_id_currency_unique ON finance_accounts USING btree (company_id, id, currency);

--
-- Name: finance_accounts_list_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_accounts_list_idx ON finance_accounts USING btree (company_id, is_active, account_type, lower(name), id);

--
-- Name: finance_instrument_events_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_instrument_events_lookup_idx ON finance_instrument_events USING btree (company_id, instrument_id, event_date, occurred_at, id);

--
-- Name: finance_instruments_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_instruments_party_idx ON finance_instruments USING btree (company_id, party_id, status, due_date, id);

--
-- Name: finance_invoice_open_items_fifo_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_invoice_open_items_fifo_idx ON finance_invoice_open_items USING btree (company_id, party_id, side, currency, document_date, created_at, id);

--
-- Name: finance_invoice_postings_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_invoice_postings_document_idx ON finance_invoice_postings USING btree (company_id, document_id, posted_at, id);

--
-- Name: finance_manual_entries_document_no_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX finance_manual_entries_document_no_idx ON finance_manual_entries USING btree (company_id, document_no) WHERE (document_no <> ''::text);

--
-- Name: finance_manual_entries_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_manual_entries_party_idx ON finance_manual_entries USING btree (company_id, party_id, transaction_date DESC, posted_at DESC, id);

--
-- Name: finance_manual_entries_reference_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_manual_entries_reference_idx ON finance_manual_entries USING btree (company_id, lower(reference_no), transaction_date DESC, id) WHERE (reference_no <> ''::text);

--
-- Name: finance_party_transfers_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_party_transfers_party_idx ON finance_party_transfers USING btree (company_id, from_party_id, to_party_id, transaction_date DESC, id);

--
-- Name: finance_payment_allocations_open_item_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payment_allocations_open_item_idx ON finance_payment_allocations USING btree (company_id, open_item_id, allocated_at, id) WHERE (open_item_id IS NOT NULL);

--
-- Name: finance_payment_allocations_payment_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payment_allocations_payment_idx ON finance_payment_allocations USING btree (company_id, payment_id, allocated_at, id);

--
-- Name: finance_payment_allocations_target_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payment_allocations_target_idx ON finance_payment_allocations USING btree (company_id, party_id, target_type, target_id);

--
-- Name: finance_payments_account_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payments_account_date_idx ON finance_payments USING btree (company_id, account_id, transaction_date DESC, posted_at DESC, id);

--
-- Name: finance_payments_instrument_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payments_instrument_idx ON finance_payments USING btree (company_id, instrument_id) WHERE (instrument_id IS NOT NULL);

--
-- Name: finance_payments_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payments_party_date_idx ON finance_payments USING btree (company_id, party_id, transaction_date DESC, posted_at DESC, id);

--
-- Name: finance_payments_reference_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_payments_reference_idx ON finance_payments USING btree (company_id, lower(reference_no), transaction_date DESC, id) WHERE (reference_no <> ''::text);

--
-- Name: finance_period_locks_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_period_locks_lookup_idx ON finance_period_locks USING btree (company_id, period_start, period_end);

--
-- Name: finance_transfers_account_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_transfers_account_idx ON finance_transfers USING btree (company_id, from_account_id, to_account_id, transaction_date DESC);

--
-- Name: finance_transfers_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finance_transfers_date_idx ON finance_transfers USING btree (company_id, transaction_date DESC, posted_at DESC, id);

--
-- Name: fixed_asset_categories_company_active; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX fixed_asset_categories_company_active ON fixed_asset_categories USING btree (company_id) WHERE (archived_at IS NULL);

--
-- Name: fixed_assets_serial_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX fixed_assets_serial_unique ON fixed_assets USING btree (company_id, serial_number) WHERE ((serial_number IS NOT NULL) AND (btrim(serial_number) <> ''::text));

--
-- Name: goods_receipts_order_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX goods_receipts_order_idx ON goods_receipts USING btree (company_id, purchase_order_id, receipt_date DESC, id);

--
-- Name: goods_receipts_recency_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX goods_receipts_recency_idx ON goods_receipts USING btree (company_id, created_at DESC, id DESC);

--
-- Name: import_jobs_committing_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX import_jobs_committing_idx ON import_jobs USING btree (company_id, committing_at) WHERE (status = 'COMMITTING'::text);

--
-- Name: import_jobs_company_created_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX import_jobs_company_created_idx ON import_jobs USING btree (company_id, created_at DESC, id DESC);

--
-- Name: import_row_results_status_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX import_row_results_status_idx ON import_row_results USING btree (company_id, import_job_id, status, row_number);

--
-- Name: locations_active_tree_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX locations_active_tree_idx ON locations USING btree (company_id, warehouse_id, is_active, parent_id, lower(name), id);

--
-- Name: login_attempts_rate_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX login_attempts_rate_idx ON login_attempts USING btree (email_hash, ip_hash, attempted_at DESC);

--
-- Name: membership_finance_account_scopes_account_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX membership_finance_account_scopes_account_idx ON membership_finance_account_scopes USING btree (company_id, account_id, user_id);

--
-- Name: outbox_events_pending_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX outbox_events_pending_idx ON outbox_events USING btree (available_at, occurred_at) WHERE ((processed_at IS NULL) AND (dead_lettered_at IS NULL));

--
-- Name: parties_company_active_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX parties_company_active_name_idx ON parties USING btree (company_id, lower(display_name), id) WHERE is_active;

--
-- Name: parties_company_code_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX parties_company_code_unique ON parties USING btree (company_id, lower(code));

--
-- Name: parties_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX parties_company_name_idx ON parties USING btree (company_id, lower(display_name), id);

--
-- Name: parties_company_tax_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX parties_company_tax_idx ON parties USING btree (company_id, tax_number) WHERE (tax_number IS NOT NULL);

--
-- Name: party_addresses_party_presentation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_addresses_party_presentation_idx ON party_addresses USING btree (company_id, party_id, is_default DESC, created_at, id);

--
-- Name: party_addresses_search_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_addresses_search_party_idx ON party_addresses USING btree (company_id, party_id);

--
-- Name: party_contacts_one_primary; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX party_contacts_one_primary ON party_contacts USING btree (company_id, party_id) WHERE is_primary;

--
-- Name: party_contacts_party_presentation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_contacts_party_presentation_idx ON party_contacts USING btree (company_id, party_id, is_primary DESC, created_at, id);

--
-- Name: party_contacts_search_party_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_contacts_search_party_idx ON party_contacts USING btree (company_id, party_id);

--
-- Name: party_custom_field_values_party_presentation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_custom_field_values_party_presentation_idx ON party_custom_field_values USING btree (company_id, party_id, definition_id);

--
-- Name: party_custom_field_values_search_definition_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_custom_field_values_search_definition_idx ON party_custom_field_values USING btree (company_id, definition_id, party_id);

--
-- Name: party_group_memberships_party_presentation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_group_memberships_party_presentation_idx ON party_group_memberships USING btree (company_id, party_id, group_id);

--
-- Name: party_group_memberships_search_group_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_group_memberships_search_group_idx ON party_group_memberships USING btree (company_id, group_id, party_id);

--
-- Name: party_ledger_balance_effects_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_balance_effects_lookup_idx ON party_ledger_entries USING btree (company_id, party_id, currency, document_date, posted_at, id);

--
-- Name: party_ledger_base_currency_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_base_currency_idx ON party_ledger_entries USING btree (company_id, party_id, base_currency, document_date, id);

--
-- Name: party_ledger_entries_search_balance_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_entries_search_balance_idx ON party_ledger_entries USING btree (company_id, party_id, currency);

--
-- Name: party_ledger_opening_entries_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_opening_entries_idx ON party_ledger_entries USING btree (company_id, party_id, document_date, posted_at, id) WHERE (entry_type = ANY (ARRAY['OPENING_BALANCE'::text, 'OPENING'::text, 'CARRY_FORWARD'::text, 'DEBIT_TRANSFER'::text, 'CREDIT_TRANSFER'::text]));

--
-- Name: party_ledger_party_currency_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_party_currency_date_idx ON party_ledger_entries USING btree (company_id, party_id, currency, document_date, posted_at, id);

--
-- Name: party_ledger_source_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_source_lookup_idx ON party_ledger_entries USING btree (company_id, source_type, source_id);

--
-- Name: party_ledger_statement_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_ledger_statement_idx ON party_ledger_entries USING btree (company_id, party_id, document_date, posted_at, id);

--
-- Name: party_search_documents_vector_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_search_documents_vector_idx ON party_search_documents USING gin (search_vector);

--
-- Name: party_tag_assignments_party_presentation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_tag_assignments_party_presentation_idx ON party_tag_assignments USING btree (company_id, party_id, tag_id);

--
-- Name: party_tag_assignments_search_tag_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX party_tag_assignments_search_tag_idx ON party_tag_assignments USING btree (company_id, tag_id, party_id);

--
-- Name: payroll_email_deliveries_queue_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX payroll_email_deliveries_queue_idx ON payroll_email_deliveries USING btree (status, next_attempt_at, created_at) WHERE (status = ANY (ARRAY['QUEUED'::text, 'SENDING'::text]));

--
-- Name: payroll_generations_one_running; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX payroll_generations_one_running ON payroll_calculation_generations USING btree (company_id, payroll_run_id) WHERE (status = 'RUNNING'::text);

--
-- Name: payroll_payments_one_active_per_run; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX payroll_payments_one_active_per_run ON payroll_payments USING btree (company_id, payroll_run_id) WHERE (status = 'PAID'::text);

--
-- Name: payroll_payments_run_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX payroll_payments_run_idx ON payroll_payments USING btree (company_id, payroll_run_id, created_at DESC, id);

--
-- Name: price_list_entries_item_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX price_list_entries_item_idx ON price_list_entries USING btree (company_id, item_id, valid_from DESC);

--
-- Name: price_list_entries_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX price_list_entries_lookup_idx ON price_list_entries USING btree (company_id, price_list_id, item_id, valid_from DESC);

--
-- Name: price_list_entries_variant_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX price_list_entries_variant_idx ON price_list_entries USING btree (company_id, price_list_id, variant_id, valid_from DESC) WHERE (variant_id IS NOT NULL);

--
-- Name: price_lists_active_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX price_lists_active_idx ON price_lists USING btree (company_id, is_active, code);

--
-- Name: price_lists_scope_category_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX price_lists_scope_category_idx ON price_lists USING btree (company_id, scope_category_id, is_active);

--
-- Name: pricing_currencies_active_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX pricing_currencies_active_idx ON pricing_currencies USING btree (company_id, is_active, code);

--
-- Name: product_attachments_product_created_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_attachments_product_created_idx ON product_attachments USING btree (company_id, product_id, created_at DESC, id) WHERE (archived_at IS NULL);

--
-- Name: product_attachments_variant_created_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_attachments_variant_created_idx ON product_attachments USING btree (company_id, variant_id, created_at DESC, id) WHERE ((variant_id IS NOT NULL) AND (archived_at IS NULL));

--
-- Name: product_attachments_version_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_attachments_version_idx ON product_attachments USING btree (company_id, product_id, version, id);

--
-- Name: product_barcodes_product_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_barcodes_product_idx ON product_barcodes USING btree (company_id, product_id);

--
-- Name: product_barcodes_variant_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_barcodes_variant_idx ON product_barcodes USING btree (company_id, variant_id, barcode) WHERE (variant_id IS NOT NULL);

--
-- Name: product_base_unit_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_base_unit_unique ON product_units USING btree (company_id, product_id) WHERE is_base;

--
-- Name: product_brands_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_brands_company_name_idx ON product_brands USING btree (company_id, lower(name), id);

--
-- Name: product_categories_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_categories_company_name_idx ON product_categories USING btree (company_id, lower(name), id);

--
-- Name: product_image_variants_image_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_image_variants_image_idx ON product_image_variants USING btree (company_id, product_image_id, variant_code);

--
-- Name: product_images_master_key_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_images_master_key_unique ON product_images USING btree (company_id, master_storage_key);

--
-- Name: product_images_one_primary_product; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_images_one_primary_product ON product_images USING btree (company_id, product_id) WHERE ((variant_id IS NULL) AND is_primary AND (archived_at IS NULL));

--
-- Name: product_images_one_primary_variant; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_images_one_primary_variant ON product_images USING btree (company_id, variant_id) WHERE ((variant_id IS NOT NULL) AND is_primary AND (archived_at IS NULL));

--
-- Name: product_images_product_position_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_images_product_position_idx ON product_images USING btree (company_id, product_id, "position", id) WHERE (archived_at IS NULL);

--
-- Name: product_images_source_key_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_images_source_key_unique ON product_images USING btree (company_id, source_storage_key);

--
-- Name: product_images_variant_position_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_images_variant_position_idx ON product_images USING btree (company_id, variant_id, "position", id) WHERE ((variant_id IS NOT NULL) AND (archived_at IS NULL));

--
-- Name: product_primary_barcode_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_primary_barcode_unique ON product_barcodes USING btree (company_id, product_id) WHERE (is_primary AND (variant_id IS NULL));

--
-- Name: product_tax_profile_components_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_tax_profile_components_lookup_idx ON product_tax_profile_components USING btree (company_id, product_id, direction, sequence);

--
-- Name: product_tax_profiles_definition_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_tax_profiles_definition_idx ON product_tax_profiles USING btree (company_id, tax_definition_id) WHERE (tax_definition_id IS NOT NULL);

--
-- Name: product_tax_profiles_product_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_tax_profiles_product_idx ON product_tax_profiles USING btree (company_id, product_id, direction);

--
-- Name: product_units_product_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_units_product_idx ON product_units USING btree (company_id, product_id);

--
-- Name: product_variant_allowed_options_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_variant_allowed_options_lookup_idx ON product_variant_allowed_options USING btree (company_id, product_id, definition_id, option_id);

--
-- Name: product_variant_primary_barcode_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_variant_primary_barcode_unique ON product_barcodes USING btree (company_id, variant_id) WHERE (is_primary AND (variant_id IS NOT NULL));

--
-- Name: product_variant_values_option_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX product_variant_values_option_idx ON product_variant_values USING btree (company_id, definition_id, option_id, variant_id);

--
-- Name: product_variants_company_id_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_variants_company_id_unique ON product_variants USING btree (company_id, id);

--
-- Name: product_variants_product_code_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_variants_product_code_unique ON product_variants USING btree (company_id, product_id, variant_code);

--
-- Name: product_variants_product_signature_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX product_variants_product_signature_unique ON product_variants USING btree (company_id, product_id, variant_signature);

--
-- Name: products_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX products_company_name_idx ON products USING btree (company_id, lower(name), id);

--
-- Name: products_search_vector_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX products_search_vector_idx ON products USING gin (search_vector);

--
-- Name: public_holiday_calendars_one_active; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX public_holiday_calendars_one_active ON public_holiday_calendars USING btree (company_id, country_code, calendar_year) WHERE (status = 'ACTIVE'::text);

--
-- Name: purchase_invoice_lines_order_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_invoice_lines_order_idx ON purchase_invoice_lines USING btree (company_id, purchase_order_line_id) WHERE (purchase_order_line_id IS NOT NULL);

--
-- Name: purchase_invoice_lines_type_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_invoice_lines_type_idx ON purchase_invoice_lines USING btree (company_id, invoice_id, line_type, line_no);

--
-- Name: purchase_invoices_recency_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_invoices_recency_idx ON purchase_invoices USING btree (company_id, created_at DESC, id DESC);

--
-- Name: purchase_invoices_supplier_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_invoices_supplier_idx ON purchase_invoices USING btree (company_id, supplier_id, invoice_date DESC, id);

--
-- Name: purchase_invoices_warehouse_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_invoices_warehouse_idx ON purchase_invoices USING btree (company_id, warehouse_id, invoice_date DESC, id);

--
-- Name: purchase_landed_costs_receipt_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_landed_costs_receipt_idx ON purchase_landed_costs USING btree (company_id, goods_receipt_id);

--
-- Name: purchase_order_lines_type_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_order_lines_type_idx ON purchase_order_lines USING btree (company_id, order_id, line_type, line_no);

--
-- Name: purchase_orders_company_status_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_orders_company_status_idx ON purchase_orders USING btree (company_id, status, order_date DESC, id);

--
-- Name: purchase_orders_recency_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_orders_recency_idx ON purchase_orders USING btree (company_id, created_at DESC, id DESC);

--
-- Name: purchase_orders_supplier_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_orders_supplier_idx ON purchase_orders USING btree (company_id, supplier_id, order_date DESC, id);

--
-- Name: purchase_returns_recency_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_returns_recency_idx ON purchase_returns USING btree (company_id, created_at DESC, id DESC);

--
-- Name: purchase_returns_supplier_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX purchase_returns_supplier_idx ON purchase_returns USING btree (company_id, supplier_id, return_date DESC, id);

--
-- Name: sales_dispatch_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_dispatch_lines_document_idx ON sales_dispatch_lines USING btree (company_id, document_id, line_no);

--
-- Name: sales_dispatches_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_dispatches_party_date_idx ON sales_dispatches USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: sales_dispatches_sales_rep_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_dispatches_sales_rep_idx ON sales_dispatches USING btree (company_id, sales_rep_user_id) WHERE (sales_rep_user_id IS NOT NULL);

--
-- Name: sales_invoice_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_invoice_lines_document_idx ON sales_invoice_lines USING btree (company_id, document_id, line_no);

--
-- Name: sales_invoices_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_invoices_party_date_idx ON sales_invoices USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: sales_invoices_sales_rep_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_invoices_sales_rep_idx ON sales_invoices USING btree (company_id, sales_rep_user_id) WHERE (sales_rep_user_id IS NOT NULL);

--
-- Name: sales_order_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_order_lines_document_idx ON sales_order_lines USING btree (company_id, document_id, line_no);

--
-- Name: sales_order_reservations_line_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_order_reservations_line_idx ON sales_order_reservations USING btree (company_id, order_line_id, status);

--
-- Name: sales_orders_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_orders_party_date_idx ON sales_orders USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: sales_orders_sales_rep_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_orders_sales_rep_idx ON sales_orders USING btree (company_id, sales_rep_user_id) WHERE (sales_rep_user_id IS NOT NULL);

--
-- Name: sales_quote_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_quote_lines_document_idx ON sales_quote_lines USING btree (company_id, document_id, line_no);

--
-- Name: sales_quotes_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_quotes_party_date_idx ON sales_quotes USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: sales_quotes_sales_rep_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_quotes_sales_rep_idx ON sales_quotes USING btree (company_id, sales_rep_user_id) WHERE (sales_rep_user_id IS NOT NULL);

--
-- Name: sales_return_lines_document_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_return_lines_document_idx ON sales_return_lines USING btree (company_id, document_id, line_no);

--
-- Name: sales_returns_party_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_returns_party_date_idx ON sales_returns USING btree (company_id, party_id, document_date DESC, id DESC);

--
-- Name: sales_returns_sales_rep_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sales_returns_sales_rep_idx ON sales_returns USING btree (company_id, sales_rep_user_id) WHERE (sales_rep_user_id IS NOT NULL);

--
-- Name: security_audit_company_time_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX security_audit_company_time_idx ON security_audit_events USING btree (company_id, occurred_at DESC);

--
-- Name: serial_number_events_serial_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX serial_number_events_serial_idx ON serial_number_events USING btree (company_id, serial_id, occurred_at DESC);

--
-- Name: serial_numbers_active_location_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX serial_numbers_active_location_idx ON serial_numbers USING btree (company_id, active_warehouse_id, active_location_id, status);

--
-- Name: sessions_active_token_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sessions_active_token_idx ON sessions USING btree (token_hash) WHERE (revoked_at IS NULL);

--
-- Name: sgk_occupation_codes_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX sgk_occupation_codes_name_idx ON sgk_occupation_codes USING btree (lower(name));

--
-- Name: stock_cost_adjustments_layer_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_adjustments_layer_idx ON stock_cost_adjustments USING btree (company_id, layer_id, created_at);

--
-- Name: stock_cost_adjustments_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_adjustments_source_idx ON stock_cost_adjustments USING btree (company_id, source_type, source_id);

--
-- Name: stock_cost_consumptions_layer_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_consumptions_layer_idx ON stock_cost_consumptions USING btree (company_id, layer_id, consumed_at, id);

--
-- Name: stock_cost_consumptions_movement_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_consumptions_movement_idx ON stock_cost_consumptions USING btree (company_id, movement_id, consumed_at, id);

--
-- Name: stock_cost_layers_fifo_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_layers_fifo_idx ON stock_cost_layers USING btree (company_id, warehouse_id, product_id, created_at, id) WHERE (remaining_quantity > (0)::numeric);

--
-- Name: stock_cost_unpriced_events_open_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_cost_unpriced_events_open_idx ON stock_cost_unpriced_events USING btree (company_id, event_type, created_at);

--
-- Name: stock_count_engine_assignments_user_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_assignments_user_idx ON stock_count_engine_assignments USING btree (company_id, user_id, status);

--
-- Name: stock_count_engine_counts_company_count_no_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX stock_count_engine_counts_company_count_no_idx ON stock_count_engine_counts USING btree (company_id, count_no);

--
-- Name: stock_count_engine_counts_state_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_counts_state_idx ON stock_count_engine_counts USING btree (company_id, warehouse_id, state, created_at DESC, id);

--
-- Name: stock_count_engine_events_scope_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_events_scope_idx ON stock_count_engine_events USING btree (company_id, count_id, scope_id, event_seq);

--
-- Name: stock_count_engine_events_sync_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_events_sync_idx ON stock_count_engine_events USING btree (company_id, count_id, event_seq);

--
-- Name: stock_count_engine_open_exception_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX stock_count_engine_open_exception_idx ON stock_count_engine_review_exceptions USING btree (company_id, count_id, COALESCE(scope_id, '00000000-0000-0000-0000-000000000000'::uuid), exception_type) WHERE (status = 'OPEN'::text);

--
-- Name: stock_count_engine_passes_count_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_passes_count_idx ON stock_count_engine_passes USING btree (company_id, count_id, pass_no);

--
-- Name: stock_count_engine_review_exception_count_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_review_exception_count_idx ON stock_count_engine_review_exceptions USING btree (company_id, count_id, status, exception_type);

--
-- Name: stock_count_engine_scopes_identity_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX stock_count_engine_scopes_identity_idx ON stock_count_engine_scopes USING btree (company_id, count_id, product_id, COALESCE(variant_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(warehouse_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(location_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(lot_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(serial_id, '00000000-0000-0000-0000-000000000000'::uuid));

--
-- Name: stock_count_engine_scopes_movement_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_scopes_movement_idx ON stock_count_engine_scopes USING btree (company_id, warehouse_id, product_id, variant_id, location_id, lot_id, serial_id);

--
-- Name: stock_count_engine_sessions_sync_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_engine_sessions_sync_idx ON stock_count_engine_sessions USING btree (company_id, count_id, pass_id, last_event_seq);

--
-- Name: stock_count_lines_count_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_count_lines_count_idx ON stock_count_lines USING btree (company_id, count_id, line_no);

--
-- Name: stock_counts_state_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_counts_state_idx ON stock_counts USING btree (company_id, warehouse_id, state, created_at DESC);

--
-- Name: stock_movement_operation_lines_operation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movement_operation_lines_operation_idx ON stock_movement_operation_lines USING btree (company_id, operation_id, line_no);

--
-- Name: stock_movement_operations_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movement_operations_lookup_idx ON stock_movement_operations USING btree (company_id, warehouse_id, product_id, posted_at DESC, id);

--
-- Name: stock_movements_lot_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movements_lot_idx ON stock_movements USING btree (company_id, lot_id, posted_at) WHERE (lot_id IS NOT NULL);

--
-- Name: stock_movements_operation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movements_operation_idx ON stock_movements USING btree (company_id, operation_id, posted_at, id) WHERE (operation_id IS NOT NULL);

--
-- Name: stock_movements_product_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movements_product_date_idx ON stock_movements USING btree (company_id, product_id, warehouse_id, posted_at, id);

--
-- Name: stock_movements_serial_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movements_serial_idx ON stock_movements USING btree (company_id, serial_id, posted_at) WHERE (serial_id IS NOT NULL);

--
-- Name: stock_movements_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_movements_source_idx ON stock_movements USING btree (company_id, source_type, source_id, posted_at);

--
-- Name: stock_positions_identity_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX stock_positions_identity_idx ON stock_positions USING btree (company_id, warehouse_id, product_id, COALESCE(variant_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(location_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(lot_id, '00000000-0000-0000-0000-000000000000'::uuid), COALESCE(serial_id, '00000000-0000-0000-0000-000000000000'::uuid));

--
-- Name: stock_positions_product_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stock_positions_product_idx ON stock_positions USING btree (company_id, product_id, warehouse_id, location_id);

--
-- Name: supplier_product_ref_barcode_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX supplier_product_ref_barcode_unique ON supplier_product_references USING btree (company_id, supplier_id, barcode) WHERE (is_active AND (barcode <> ''::text));

--
-- Name: supplier_product_ref_code_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX supplier_product_ref_code_unique ON supplier_product_references USING btree (company_id, supplier_id, supplier_code) WHERE (is_active AND (supplier_code <> ''::text));

--
-- Name: supplier_purchase_prices_history_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX supplier_purchase_prices_history_idx ON supplier_purchase_prices USING btree (company_id, supplier_id, product_id, variant_id, observed_at DESC);

--
-- Name: tax_exemptions_active_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX tax_exemptions_active_idx ON tax_exemptions USING btree (company_id, is_active, code);

--
-- Name: tax_rates_lookup_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX tax_rates_lookup_idx ON tax_rates USING btree (company_id, tax_definition_id, valid_from DESC);

--
-- Name: tax_withholding_active_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX tax_withholding_active_idx ON tax_withholding_rules USING btree (company_id, is_active, code);

--
-- Name: timesheet_days_generation_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX timesheet_days_generation_idx ON timesheet_days USING btree (company_id, period_id, employee_id, work_date);

--
-- Name: turkish_districts_province_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX turkish_districts_province_name_idx ON turkish_districts USING btree (province_id, lower(name), id);

--
-- Name: turkish_neighborhoods_district_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX turkish_neighborhoods_district_name_idx ON turkish_neighborhoods USING btree (district_id, lower(name), id);

--
-- Name: turkish_tax_offices_code_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX turkish_tax_offices_code_idx ON turkish_tax_offices USING btree (code) WHERE (is_active AND (code IS NOT NULL));

--
-- Name: turkish_tax_offices_province_district_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX turkish_tax_offices_province_district_name_idx ON turkish_tax_offices USING btree (province_id, lower(district_name), lower(name), id) WHERE is_active;

--
-- Name: user_agenda_events_owner_date_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX user_agenda_events_owner_date_idx ON user_agenda_events USING btree (company_id, user_id, event_date);

--
-- Name: user_table_preferences_user_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX user_table_preferences_user_idx ON user_table_preferences USING btree (user_id, company_id);

--
-- Name: users_email_unique; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX users_email_unique ON users USING btree (lower(email));

--
-- Name: variant_definition_options_definition_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX variant_definition_options_definition_idx ON variant_definition_options USING btree (company_id, definition_id, sort_order, id);

--
-- Name: variant_definitions_company_name_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX variant_definitions_company_name_idx ON variant_definitions USING btree (company_id, lower(name), id);

--
-- Name: warehouse_transfer_discrepancy_resolution_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfer_discrepancy_resolution_idx ON warehouse_transfer_discrepancy_resolutions USING btree (company_id, transfer_id, transfer_line_id, created_at, id);

--
-- Name: warehouse_transfer_lines_product_transfer_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfer_lines_product_transfer_idx ON warehouse_transfer_lines USING btree (company_id, product_id, transfer_id);

--
-- Name: warehouse_transfer_lines_transfer_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfer_lines_transfer_idx ON warehouse_transfer_lines USING btree (company_id, transfer_id, line_no);

--
-- Name: warehouse_transfer_reservations_active_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfer_reservations_active_idx ON warehouse_transfer_reservations USING btree (company_id, warehouse_id, product_id) WHERE (state = 'ACTIVE'::text);

--
-- Name: warehouse_transfers_state_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfers_state_idx ON warehouse_transfers USING btree (company_id, state, created_at DESC, id);

--
-- Name: warehouse_transfers_type_state_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouse_transfers_type_state_idx ON warehouse_transfers USING btree (company_id, transfer_type, state, created_at DESC, id);

--
-- Name: warehouses_active_branch_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX warehouses_active_branch_idx ON warehouses USING btree (company_id, is_active, branch_id, lower(name), id);

--
-- Name: warehouses_one_transit_per_company; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX warehouses_one_transit_per_company ON warehouses USING btree (company_id) WHERE is_transit;

--
-- Name: asset_assignments asset_assignments_history_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER asset_assignments_history_guard BEFORE DELETE OR UPDATE ON asset_assignments FOR EACH ROW EXECUTE FUNCTION enforce_asset_assignment_history();

--
-- Name: command_idempotency_records command_idempotency_completed_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER command_idempotency_completed_immutable BEFORE DELETE OR UPDATE ON command_idempotency_records FOR EACH ROW EXECUTE FUNCTION reject_completed_idempotency_mutation();

--
-- Name: commercial_line_allocations commercial_line_allocations_capacity; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER commercial_line_allocations_capacity BEFORE INSERT OR UPDATE ON commercial_line_allocations FOR EACH ROW EXECUTE FUNCTION enforce_commercial_allocation_capacity();

--
-- Name: companies companies_seed_pricing_currencies; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER companies_seed_pricing_currencies AFTER INSERT ON companies FOR EACH ROW EXECUTE FUNCTION pricing_seed_default_currencies();

--
-- Name: companies companies_seed_turkey_simple_tax_definitions; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER companies_seed_turkey_simple_tax_definitions AFTER INSERT ON companies FOR EACH ROW EXECUTE FUNCTION tax_seed_turkey_simple_tax_definitions();

--
-- Name: companies companies_seed_turkey_vat_catalog; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER companies_seed_turkey_vat_catalog AFTER INSERT ON companies FOR EACH ROW EXECUTE FUNCTION tax_seed_turkey_vat_catalog();

--
-- Name: companies company_base_currency_change_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER company_base_currency_change_guard BEFORE UPDATE OF base_currency ON companies FOR EACH ROW EXECUTE FUNCTION reject_company_base_currency_change();

--
-- Name: company_memberships company_memberships_seed_default_email_templates; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER company_memberships_seed_default_email_templates AFTER INSERT ON company_memberships FOR EACH ROW EXECUTE FUNCTION seed_company_default_email_templates_on_membership();

--
-- Name: company_memberships company_memberships_seed_default_fixed_asset_categories; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER company_memberships_seed_default_fixed_asset_categories AFTER INSERT ON company_memberships FOR EACH ROW EXECUTE FUNCTION seed_company_default_fixed_asset_categories_on_membership();

--
-- Name: company_memberships company_memberships_seed_default_leave_types; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER company_memberships_seed_default_leave_types AFTER INSERT ON company_memberships FOR EACH ROW EXECUTE FUNCTION seed_company_default_leave_types_on_membership();

--
-- Name: company_memberships company_memberships_seed_hr_2026; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER company_memberships_seed_hr_2026 AFTER INSERT ON company_memberships FOR EACH ROW EXECUTE FUNCTION seed_company_hr_2026_on_membership();

--
-- Name: document_lines document_lines_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER document_lines_immutable_trigger BEFORE INSERT OR DELETE OR UPDATE ON document_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_document_line_mutation();

--
-- Name: document_lines document_lines_variant_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER document_lines_variant_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON document_lines FOR EACH ROW EXECUTE FUNCTION validate_document_line_variant();

--
-- Name: document_reversals document_reversals_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER document_reversals_no_update BEFORE DELETE OR UPDATE ON document_reversals FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: documents documents_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER documents_immutable_trigger BEFORE UPDATE ON documents FOR EACH ROW EXECUTE FUNCTION reject_posted_document_update();

--
-- Name: documents documents_search_vector_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER documents_search_vector_trigger BEFORE INSERT OR UPDATE OF document_no, notes ON documents FOR EACH ROW EXECUTE FUNCTION refresh_document_search_vector();

--
-- Name: documents documents_transition_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER documents_transition_trigger BEFORE UPDATE OF status ON documents FOR EACH ROW EXECUTE FUNCTION enforce_document_transition();

--
-- Name: edocument_events edocument_events_append_only; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER edocument_events_append_only BEFORE DELETE OR UPDATE ON edocument_events FOR EACH ROW EXECUTE FUNCTION reject_edocument_event_mutation();

--
-- Name: employee_advance_transactions employee_advance_transactions_no_update_delete; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER employee_advance_transactions_no_update_delete BEFORE DELETE OR UPDATE ON employee_advance_transactions FOR EACH ROW EXECUTE FUNCTION reject_employee_advance_mutation();

--
-- Name: employee_advances employee_advances_no_update_delete; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER employee_advances_no_update_delete BEFORE DELETE OR UPDATE ON employee_advances FOR EACH ROW EXECUTE FUNCTION reject_employee_advance_mutation();

--
-- Name: employee_payroll_components employee_payroll_components_finalized_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER employee_payroll_components_finalized_guard BEFORE DELETE OR UPDATE ON employee_payroll_components FOR EACH ROW EXECUTE FUNCTION reject_finalized_payroll_mutation();

--
-- Name: employee_payrolls employee_payrolls_finalized_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER employee_payrolls_finalized_guard BEFORE DELETE OR UPDATE ON employee_payrolls FOR EACH ROW EXECUTE FUNCTION reject_finalized_payroll_mutation();

--
-- Name: finance_account_movements finance_account_movements_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_account_movements_no_update BEFORE DELETE OR UPDATE ON finance_account_movements FOR EACH ROW EXECUTE FUNCTION reject_finance_posted_mutation();

--
-- Name: finance_accounts finance_accounts_identity_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_accounts_identity_guard BEFORE UPDATE ON finance_accounts FOR EACH ROW EXECUTE FUNCTION enforce_finance_account_identity();

--
-- Name: finance_accounts finance_accounts_no_delete; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_accounts_no_delete BEFORE DELETE ON finance_accounts FOR EACH ROW EXECUTE FUNCTION reject_finance_account_delete();

--
-- Name: finance_instrument_events finance_instrument_events_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_instrument_events_no_update BEFORE DELETE OR UPDATE ON finance_instrument_events FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_instruments finance_instruments_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_instruments_no_update BEFORE DELETE OR UPDATE ON finance_instruments FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_reversals_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_invoice_open_item_reversals_no_update BEFORE DELETE OR UPDATE ON finance_invoice_open_item_reversals FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_invoice_open_items finance_invoice_open_items_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_invoice_open_items_no_update BEFORE DELETE OR UPDATE ON finance_invoice_open_items FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_invoice_postings finance_invoice_postings_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_invoice_postings_no_update BEFORE DELETE OR UPDATE ON finance_invoice_postings FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_manual_entries finance_manual_entries_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_manual_entries_no_update BEFORE DELETE OR UPDATE ON finance_manual_entries FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_party_transfers finance_party_transfers_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_party_transfers_no_update BEFORE DELETE OR UPDATE ON finance_party_transfers FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_payment_allocations finance_payment_allocations_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_payment_allocations_no_update BEFORE DELETE OR UPDATE ON finance_payment_allocations FOR EACH ROW EXECUTE FUNCTION reject_finance_posted_mutation();

--
-- Name: finance_payments finance_payments_movement_account_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_payments_movement_account_guard BEFORE INSERT ON finance_payments FOR EACH ROW EXECUTE FUNCTION enforce_finance_payment_movement_account();

--
-- Name: finance_payments finance_payments_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_payments_no_update BEFORE DELETE OR UPDATE ON finance_payments FOR EACH ROW EXECUTE FUNCTION reject_finance_posted_mutation();

--
-- Name: finance_period_locks finance_period_locks_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_period_locks_no_update BEFORE DELETE OR UPDATE ON finance_period_locks FOR EACH ROW EXECUTE FUNCTION reject_finance_completion_mutation();

--
-- Name: finance_transfers finance_transfers_movement_pair_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_transfers_movement_pair_guard BEFORE INSERT ON finance_transfers FOR EACH ROW EXECUTE FUNCTION enforce_finance_transfer_movement_pair();

--
-- Name: finance_transfers finance_transfers_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER finance_transfers_no_update BEFORE DELETE OR UPDATE ON finance_transfers FOR EACH ROW EXECUTE FUNCTION reject_finance_posted_mutation();

--
-- Name: goods_receipt_lines goods_receipt_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER goods_receipt_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON goods_receipt_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_purchase_line_mutation();

--
-- Name: goods_receipts goods_receipts_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER goods_receipts_immutable BEFORE DELETE OR UPDATE ON goods_receipts FOR EACH ROW EXECUTE FUNCTION enforce_purchase_posted_header_immutability();

--
-- Name: locations locations_validate_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER locations_validate_trigger BEFORE INSERT OR UPDATE ON locations FOR EACH ROW EXECUTE FUNCTION validate_inventory_location();

--
-- Name: membership_roles membership_roles_require_admin; Type: TRIGGER; Schema: public; Owner: -
--

CREATE CONSTRAINT TRIGGER membership_roles_require_admin AFTER INSERT OR DELETE OR UPDATE ON membership_roles DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION ensure_company_has_system_admin();

--
-- Name: company_memberships memberships_require_admin; Type: TRIGGER; Schema: public; Owner: -
--

CREATE CONSTRAINT TRIGGER memberships_require_admin AFTER DELETE OR UPDATE ON company_memberships DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION ensure_company_has_system_admin();

--
-- Name: parties parties_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER parties_search_document_after_change AFTER INSERT OR UPDATE ON parties FOR EACH ROW EXECUTE FUNCTION party_search_party_trigger();

--
-- Name: party_addresses party_addresses_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_addresses_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_addresses FOR EACH ROW EXECUTE FUNCTION party_search_detail_trigger();

--
-- Name: party_contacts party_contacts_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_contacts_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_contacts FOR EACH ROW EXECUTE FUNCTION party_search_detail_trigger();

--
-- Name: party_custom_field_definitions party_custom_field_definitions_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_custom_field_definitions_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_custom_field_definitions FOR EACH ROW EXECUTE FUNCTION party_search_related_definition_trigger();

--
-- Name: party_custom_field_values party_custom_field_values_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_custom_field_values_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_custom_field_values FOR EACH ROW EXECUTE FUNCTION party_search_detail_trigger();

--
-- Name: party_group_memberships party_group_memberships_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_group_memberships_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_group_memberships FOR EACH ROW EXECUTE FUNCTION party_search_detail_trigger();

--
-- Name: party_groups party_groups_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_groups_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_groups FOR EACH ROW EXECUTE FUNCTION party_search_related_definition_trigger();

--
-- Name: party_ledger_entries party_ledger_currency_snapshot_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_ledger_currency_snapshot_trigger BEFORE INSERT ON party_ledger_entries FOR EACH ROW EXECUTE FUNCTION populate_party_ledger_currency_snapshot();

--
-- Name: party_ledger_entries party_ledger_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_ledger_no_update BEFORE DELETE OR UPDATE ON party_ledger_entries FOR EACH ROW EXECUTE FUNCTION reject_party_ledger_mutation();

--
-- Name: party_ledger_entries party_ledger_search_balance_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_ledger_search_balance_after_change AFTER INSERT OR DELETE OR UPDATE ON party_ledger_entries FOR EACH ROW EXECUTE FUNCTION party_search_ledger_trigger();

--
-- Name: payment_terms party_payment_terms_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_payment_terms_search_document_after_change AFTER DELETE OR UPDATE ON payment_terms FOR EACH ROW EXECUTE FUNCTION party_search_related_definition_trigger();

--
-- Name: parties party_search_balance_canonical_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_search_balance_canonical_after_change AFTER INSERT OR UPDATE ON parties FOR EACH ROW EXECUTE FUNCTION refresh_party_search_balance_after_party_change();

--
-- Name: party_search_documents party_search_balance_canonical_after_document_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_search_balance_canonical_after_document_change AFTER INSERT OR UPDATE OF search_text ON party_search_documents FOR EACH ROW EXECUTE FUNCTION refresh_party_search_balance_after_document_change();

--
-- Name: party_search_documents party_search_documents_vector_before_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_search_documents_vector_before_change BEFORE INSERT OR UPDATE OF search_text, balance_search ON party_search_documents FOR EACH ROW EXECUTE FUNCTION update_party_search_vector();

--
-- Name: party_tag_assignments party_tag_assignments_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_tag_assignments_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_tag_assignments FOR EACH ROW EXECUTE FUNCTION party_search_detail_trigger();

--
-- Name: party_tags party_tags_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_tags_search_document_after_change AFTER INSERT OR DELETE OR UPDATE ON party_tags FOR EACH ROW EXECUTE FUNCTION party_search_related_definition_trigger();

--
-- Name: users party_users_search_document_after_change; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER party_users_search_document_after_change AFTER DELETE OR UPDATE ON users FOR EACH ROW EXECUTE FUNCTION party_search_related_definition_trigger();

--
-- Name: payroll_component_definitions payroll_component_definitions_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_component_definitions_guard BEFORE DELETE OR UPDATE ON payroll_component_definitions FOR EACH ROW EXECUTE FUNCTION guard_active_legislation_mutation();

--
-- Name: payroll_component_treatments payroll_component_treatments_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_component_treatments_guard BEFORE DELETE OR UPDATE ON payroll_component_treatments FOR EACH ROW EXECUTE FUNCTION guard_active_component_treatment_mutation();

--
-- Name: payroll_contribution_schemes payroll_contribution_schemes_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_contribution_schemes_guard BEFORE DELETE OR UPDATE ON payroll_contribution_schemes FOR EACH ROW EXECUTE FUNCTION guard_active_legislation_mutation();

--
-- Name: payroll_export_payslips payroll_export_payslips_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_export_payslips_immutable BEFORE DELETE OR UPDATE ON payroll_export_payslips FOR EACH ROW EXECUTE FUNCTION reject_payroll_artifact_mutation();

--
-- Name: payroll_calculation_generations payroll_generations_finalized_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_generations_finalized_guard BEFORE DELETE OR UPDATE ON payroll_calculation_generations FOR EACH ROW EXECUTE FUNCTION reject_finalized_payroll_mutation();

--
-- Name: payroll_income_tax_brackets payroll_income_tax_brackets_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_income_tax_brackets_guard BEFORE DELETE OR UPDATE ON payroll_income_tax_brackets FOR EACH ROW EXECUTE FUNCTION guard_active_legislation_mutation();

--
-- Name: payroll_legislation_packs payroll_legislation_packs_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_legislation_packs_guard BEFORE DELETE ON payroll_legislation_packs FOR EACH ROW EXECUTE FUNCTION guard_active_legislation_mutation();

--
-- Name: payroll_legislation_packs payroll_legislation_packs_lifecycle_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_legislation_packs_lifecycle_guard BEFORE UPDATE ON payroll_legislation_packs FOR EACH ROW EXECUTE FUNCTION enforce_legislation_pack_lifecycle();

--
-- Name: payroll_payments payroll_payments_reverse_only; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_payments_reverse_only BEFORE DELETE OR UPDATE ON payroll_payments FOR EACH ROW EXECUTE FUNCTION reject_payroll_payment_mutation();

--
-- Name: payroll_payslips payroll_payslips_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_payslips_immutable BEFORE DELETE OR UPDATE ON payroll_payslips FOR EACH ROW EXECUTE FUNCTION reject_payroll_artifact_mutation();

--
-- Name: payroll_runs payroll_runs_finalized_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER payroll_runs_finalized_guard BEFORE DELETE OR UPDATE ON payroll_runs FOR EACH ROW WHEN ((old.status = 'FINALIZED'::text)) EXECUTE FUNCTION reject_finalized_payroll_mutation();

--
-- Name: price_list_entries price_list_entries_variant_target_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER price_list_entries_variant_target_trigger BEFORE INSERT OR UPDATE OF item_id, variant_id ON price_list_entries FOR EACH ROW EXECUTE FUNCTION validate_price_entry_variant_target();

--
-- Name: product_attachments product_attachments_variant_product_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER product_attachments_variant_product_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON product_attachments FOR EACH ROW EXECUTE FUNCTION enforce_product_media_variant();

--
-- Name: product_barcodes product_barcodes_variant_target_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER product_barcodes_variant_target_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON product_barcodes FOR EACH ROW EXECUTE FUNCTION validate_product_barcode_target();

--
-- Name: product_images product_images_variant_product_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER product_images_variant_product_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON product_images FOR EACH ROW EXECUTE FUNCTION enforce_product_media_variant();

--
-- Name: product_variants product_variant_identity_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER product_variant_identity_guard_trigger BEFORE UPDATE OF variant_code, variant_signature ON product_variants FOR EACH ROW EXECUTE FUNCTION guard_product_variant_identity();

--
-- Name: products product_variant_mode_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER product_variant_mode_guard_trigger BEFORE UPDATE OF variants_enabled ON products FOR EACH ROW EXECUTE FUNCTION guard_product_variant_mode();

--
-- Name: product_variant_values product_variant_values_complete_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE CONSTRAINT TRIGGER product_variant_values_complete_trigger AFTER INSERT OR DELETE OR UPDATE ON product_variant_values DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION validate_product_variant_values();

--
-- Name: purchase_invoice_lines purchase_invoice_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_invoice_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON purchase_invoice_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_purchase_line_mutation();

--
-- Name: purchase_invoices purchase_invoices_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_invoices_immutable BEFORE DELETE OR UPDATE ON purchase_invoices FOR EACH ROW EXECUTE FUNCTION enforce_purchase_posted_header_immutability();

--
-- Name: purchase_landed_cost_lines purchase_landed_cost_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_landed_cost_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON purchase_landed_cost_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_landed_cost_line_mutation();

--
-- Name: purchase_landed_costs purchase_landed_costs_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_landed_costs_immutable BEFORE DELETE OR UPDATE ON purchase_landed_costs FOR EACH ROW EXECUTE FUNCTION reject_posted_landed_cost_mutation();

--
-- Name: purchase_order_lines purchase_order_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_order_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON purchase_order_lines FOR EACH ROW EXECUTE FUNCTION enforce_purchase_order_line_immutability();

--
-- Name: purchase_orders purchase_orders_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_orders_immutable BEFORE DELETE OR UPDATE ON purchase_orders FOR EACH ROW EXECUTE FUNCTION enforce_purchase_order_header_immutability();

--
-- Name: purchase_return_lines purchase_return_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_return_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON purchase_return_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_purchase_line_mutation();

--
-- Name: purchase_returns purchase_returns_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER purchase_returns_immutable BEFORE DELETE OR UPDATE ON purchase_returns FOR EACH ROW EXECUTE FUNCTION enforce_purchase_posted_header_immutability();

--
-- Name: sales_dispatch_lines sales_dispatch_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_dispatch_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON sales_dispatch_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_commercial_line_mutation();

--
-- Name: sales_dispatch_lines sales_dispatch_lines_validate; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_dispatch_lines_validate BEFORE INSERT OR UPDATE ON sales_dispatch_lines FOR EACH ROW EXECUTE FUNCTION validate_commercial_line_product();

--
-- Name: sales_dispatches sales_dispatches_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_dispatches_immutable BEFORE DELETE OR UPDATE ON sales_dispatches FOR EACH ROW EXECUTE FUNCTION enforce_commercial_header_immutability();

--
-- Name: sales_invoice_lines sales_invoice_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_invoice_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON sales_invoice_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_commercial_line_mutation();

--
-- Name: sales_invoice_lines sales_invoice_lines_validate; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_invoice_lines_validate BEFORE INSERT OR UPDATE ON sales_invoice_lines FOR EACH ROW EXECUTE FUNCTION validate_commercial_line_product();

--
-- Name: sales_invoices sales_invoices_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_invoices_immutable BEFORE DELETE OR UPDATE ON sales_invoices FOR EACH ROW EXECUTE FUNCTION enforce_commercial_header_immutability();

--
-- Name: sales_order_lines sales_order_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_order_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON sales_order_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_commercial_line_mutation();

--
-- Name: sales_order_lines sales_order_lines_validate; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_order_lines_validate BEFORE INSERT OR UPDATE ON sales_order_lines FOR EACH ROW EXECUTE FUNCTION validate_commercial_line_product();

--
-- Name: sales_orders sales_orders_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_orders_immutable BEFORE DELETE OR UPDATE ON sales_orders FOR EACH ROW EXECUTE FUNCTION enforce_commercial_header_immutability();

--
-- Name: sales_quote_lines sales_quote_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_quote_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON sales_quote_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_commercial_line_mutation();

--
-- Name: sales_quote_lines sales_quote_lines_validate; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_quote_lines_validate BEFORE INSERT OR UPDATE ON sales_quote_lines FOR EACH ROW EXECUTE FUNCTION validate_commercial_line_product();

--
-- Name: sales_quotes sales_quotes_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_quotes_immutable BEFORE DELETE OR UPDATE ON sales_quotes FOR EACH ROW EXECUTE FUNCTION enforce_commercial_header_immutability();

--
-- Name: sales_return_lines sales_return_lines_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_return_lines_immutable BEFORE INSERT OR DELETE OR UPDATE ON sales_return_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_commercial_line_mutation();

--
-- Name: sales_return_lines sales_return_lines_validate; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_return_lines_validate BEFORE INSERT OR UPDATE ON sales_return_lines FOR EACH ROW EXECUTE FUNCTION validate_commercial_line_product();

--
-- Name: sales_returns sales_returns_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_returns_immutable BEFORE DELETE OR UPDATE ON sales_returns FOR EACH ROW EXECUTE FUNCTION enforce_commercial_header_immutability();

--
-- Name: sales_returns sales_returns_reason_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER sales_returns_reason_immutable BEFORE UPDATE ON sales_returns FOR EACH ROW EXECUTE FUNCTION enforce_sales_return_reason_immutability();

--
-- Name: security_audit_events security_audit_no_update; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER security_audit_no_update BEFORE DELETE OR UPDATE ON security_audit_events FOR EACH ROW EXECUTE FUNCTION reject_security_audit_mutation();

--
-- Name: serial_number_events serial_number_events_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER serial_number_events_immutable_trigger BEFORE DELETE OR UPDATE ON serial_number_events FOR EACH ROW EXECUTE FUNCTION reject_serial_event_mutation();

--
-- Name: stock_cost_adjustments stock_cost_adjustments_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_cost_adjustments_immutable_trigger BEFORE DELETE OR UPDATE ON stock_cost_adjustments FOR EACH ROW EXECUTE FUNCTION reject_stock_cost_adjustment_mutation();

--
-- Name: stock_cost_consumptions stock_cost_consumptions_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_cost_consumptions_immutable_trigger BEFORE DELETE OR UPDATE ON stock_cost_consumptions FOR EACH ROW EXECUTE FUNCTION reject_stock_cost_consumption_mutation();

--
-- Name: stock_cost_layers stock_cost_layers_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_cost_layers_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON stock_cost_layers FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: stock_cost_unpriced_events stock_cost_unpriced_events_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_cost_unpriced_events_immutable_trigger BEFORE DELETE OR UPDATE ON stock_cost_unpriced_events FOR EACH ROW EXECUTE FUNCTION reject_stock_cost_unpriced_event_mutation();

--
-- Name: stock_count_engine_events stock_count_engine_event_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_engine_event_immutable BEFORE DELETE OR UPDATE ON stock_count_engine_events FOR EACH ROW EXECUTE FUNCTION reject_stock_count_engine_append_only_mutation();

--
-- Name: stock_count_engine_counts stock_count_engine_header_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_engine_header_guard BEFORE UPDATE ON stock_count_engine_counts FOR EACH ROW EXECUTE FUNCTION guard_stock_count_engine_header();

--
-- Name: stock_count_engine_counts stock_count_engine_header_no_delete; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_engine_header_no_delete BEFORE DELETE ON stock_count_engine_counts FOR EACH ROW EXECUTE FUNCTION reject_stock_count_engine_append_only_mutation();

--
-- Name: stock_count_engine_counts stock_count_engine_metadata_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_engine_metadata_guard BEFORE UPDATE ON stock_count_engine_counts FOR EACH ROW EXECUTE FUNCTION guard_stock_count_engine_metadata();

--
-- Name: stock_count_engine_scopes stock_count_engine_scope_immutable; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_engine_scope_immutable BEFORE DELETE OR UPDATE ON stock_count_engine_scopes FOR EACH ROW EXECUTE FUNCTION reject_stock_count_engine_append_only_mutation();

--
-- Name: stock_count_lines stock_count_lines_mutation_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_lines_mutation_trigger BEFORE INSERT OR DELETE OR UPDATE ON stock_count_lines FOR EACH ROW EXECUTE FUNCTION reject_posted_count_mutation();

--
-- Name: stock_count_lines stock_count_lines_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_count_lines_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON stock_count_lines FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: stock_counts stock_counts_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_counts_immutable_trigger BEFORE DELETE OR UPDATE ON stock_counts FOR EACH ROW EXECUTE FUNCTION reject_posted_count_header_mutation();

--
-- Name: stock_counts stock_counts_state_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_counts_state_trigger BEFORE UPDATE OF state ON stock_counts FOR EACH ROW EXECUTE FUNCTION enforce_stock_count_transition();

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movement_operation_lines_immutable_trigger BEFORE DELETE OR UPDATE ON stock_movement_operation_lines FOR EACH ROW EXECUTE FUNCTION reject_stock_movement_operation_mutation();

--
-- Name: stock_movement_operations stock_movement_operations_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movement_operations_immutable_trigger BEFORE DELETE OR UPDATE ON stock_movement_operations FOR EACH ROW EXECUTE FUNCTION reject_stock_movement_operation_mutation();

--
-- Name: stock_movements stock_movements_cost_layer_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_cost_layer_trigger AFTER INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION apply_stock_cost_layer();

--
-- Name: stock_movements stock_movements_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_immutable_trigger BEFORE DELETE OR UPDATE ON stock_movements FOR EACH ROW EXECUTE FUNCTION reject_inventory_movement_mutation();

--
-- Name: stock_movements stock_movements_manual_reversal_provenance; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_manual_reversal_provenance BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION enforce_manual_reversal_provenance();

--
-- Name: stock_movements stock_movements_operation_id_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_operation_id_trigger BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION set_stock_movement_operation_id();

--
-- Name: stock_movements stock_movements_position_projection_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_position_projection_trigger AFTER INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION apply_inventory_stock_projection();

--
-- Name: stock_movements stock_movements_serial_projection_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_serial_projection_trigger AFTER INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION apply_inventory_serial_movement();

--
-- Name: stock_movements stock_movements_stock_count_scope_lock; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_stock_count_scope_lock BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION reject_stock_movement_in_locked_count_scope();

--
-- Name: stock_movements stock_movements_system_transit_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_system_transit_guard_trigger BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION reject_uncontrolled_system_transit_movement();

--
-- Name: stock_movements stock_movements_transfer_conservation_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE CONSTRAINT TRIGGER stock_movements_transfer_conservation_trigger AFTER INSERT ON stock_movements DEFERRABLE INITIALLY DEFERRED FOR EACH ROW WHEN ((new.source_type = 'WAREHOUSE_TRANSFER'::text)) EXECUTE FUNCTION validate_transfer_stock_conservation();

--
-- Name: stock_movements stock_movements_transfer_invariants_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_transfer_invariants_trigger BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION validate_transfer_stock_movement();

--
-- Name: stock_movements stock_movements_validate_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_validate_trigger BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION validate_inventory_movement();

--
-- Name: stock_movements stock_movements_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON stock_movements FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: stock_movements stock_movements_warehouse_rules_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_movements_warehouse_rules_trigger BEFORE INSERT ON stock_movements FOR EACH ROW EXECUTE FUNCTION validate_warehouse_stock_movement();

--
-- Name: stock_positions stock_positions_identity_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_positions_identity_trigger BEFORE DELETE OR UPDATE ON stock_positions FOR EACH ROW EXECUTE FUNCTION reject_inventory_projection_mutation();

--
-- Name: stock_positions stock_positions_transit_visibility_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_positions_transit_visibility_trigger BEFORE INSERT OR UPDATE ON stock_positions FOR EACH ROW EXECUTE FUNCTION keep_system_transit_unavailable();

--
-- Name: stock_positions stock_positions_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER stock_positions_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON stock_positions FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: timesheet_days timesheet_days_finalized_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER timesheet_days_finalized_guard BEFORE INSERT OR DELETE OR UPDATE ON timesheet_days FOR EACH ROW EXECUTE FUNCTION reject_finalized_timesheet_day_mutation();

--
-- Name: timesheet_periods timesheet_periods_payroll_reopen_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER timesheet_periods_payroll_reopen_guard BEFORE UPDATE ON timesheet_periods FOR EACH ROW EXECUTE FUNCTION prevent_used_timesheet_reopen();

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_resolution_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_discrepancy_resolution_immutable_trigger BEFORE DELETE OR UPDATE ON warehouse_transfer_discrepancy_resolutions FOR EACH ROW EXECUTE FUNCTION reject_transfer_discrepancy_resolution_mutation();

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_resolution_validate_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_discrepancy_resolution_validate_trigger BEFORE INSERT ON warehouse_transfer_discrepancy_resolutions FOR EACH ROW EXECUTE FUNCTION validate_transfer_discrepancy_resolution();

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_identity_snapshot_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_lines_identity_snapshot_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON warehouse_transfer_lines FOR EACH ROW EXECUTE FUNCTION set_transfer_line_identity_snapshots();

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_mutation_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_lines_mutation_trigger BEFORE DELETE OR UPDATE ON warehouse_transfer_lines FOR EACH ROW EXECUTE FUNCTION reject_transfer_line_mutation_after_request();

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_snapshot_immutable_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_lines_snapshot_immutable_trigger BEFORE UPDATE OF product_code_snapshot, product_name_snapshot, variant_code_snapshot, variant_description_snapshot ON warehouse_transfer_lines FOR EACH ROW EXECUTE FUNCTION reject_transfer_line_snapshot_mutation();

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_lines_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON warehouse_transfer_lines FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_reservations_guard_trigger BEFORE INSERT OR DELETE OR UPDATE ON warehouse_transfer_reservations FOR EACH ROW EXECUTE FUNCTION guard_transfer_reservation_mutation();

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_variant_required_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfer_reservations_variant_required_trigger BEFORE INSERT OR UPDATE OF product_id, variant_id ON warehouse_transfer_reservations FOR EACH ROW EXECUTE FUNCTION require_active_variant_for_stock_row();

--
-- Name: warehouse_transfers warehouse_transfers_endpoint_distinct_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfers_endpoint_distinct_trigger BEFORE INSERT OR UPDATE OF source_warehouse_id, destination_warehouse_id ON warehouse_transfers FOR EACH ROW EXECUTE FUNCTION validate_transfer_endpoints();

--
-- Name: warehouse_transfers warehouse_transfers_reroute_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfers_reroute_guard_trigger BEFORE UPDATE ON warehouse_transfers FOR EACH ROW EXECUTE FUNCTION reject_transfer_header_reroute_after_draft();

--
-- Name: warehouse_transfers warehouse_transfers_state_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfers_state_trigger BEFORE UPDATE OF state ON warehouse_transfers FOR EACH ROW EXECUTE FUNCTION enforce_transfer_state_transition();

--
-- Name: warehouse_transfers warehouse_transfers_stock_conservation_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE CONSTRAINT TRIGGER warehouse_transfers_stock_conservation_trigger AFTER UPDATE OF state ON warehouse_transfers DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION validate_transfer_stock_conservation();

--
-- Name: warehouse_transfers warehouse_transfers_warehouse_scope_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouse_transfers_warehouse_scope_trigger BEFORE INSERT OR UPDATE OF source_warehouse_id, destination_warehouse_id, transit_warehouse_id ON warehouse_transfers FOR EACH ROW EXECUTE FUNCTION validate_transfer_warehouses();

--
-- Name: warehouses warehouses_system_transit_guard_trigger; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER warehouses_system_transit_guard_trigger BEFORE INSERT OR DELETE OR UPDATE ON warehouses FOR EACH ROW EXECUTE FUNCTION guard_system_transit_warehouse();

--
-- Name: work_schedule_days work_schedule_days_minutes_guard; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER work_schedule_days_minutes_guard BEFORE INSERT OR UPDATE ON work_schedule_days FOR EACH ROW EXECUTE FUNCTION validate_work_schedule_day_minutes();

--
-- Name: api_token_branch_scopes api_token_branch_scopes_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_branch_scopes
    ADD CONSTRAINT api_token_branch_scopes_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: api_token_branch_scopes api_token_branch_scopes_company_id_token_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_branch_scopes
    ADD CONSTRAINT api_token_branch_scopes_company_id_token_id_fkey FOREIGN KEY (company_id, token_id) REFERENCES api_tokens(company_id, id);

--
-- Name: api_token_warehouse_scopes api_token_warehouse_scopes_company_id_token_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_warehouse_scopes
    ADD CONSTRAINT api_token_warehouse_scopes_company_id_token_id_fkey FOREIGN KEY (company_id, token_id) REFERENCES api_tokens(company_id, id);

--
-- Name: api_token_warehouse_scopes api_token_warehouse_scopes_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_token_warehouse_scopes
    ADD CONSTRAINT api_token_warehouse_scopes_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: api_tokens api_tokens_company_id_owner_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY api_tokens
    ADD CONSTRAINT api_tokens_company_id_owner_user_id_fkey FOREIGN KEY (company_id, owner_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: asset_assignments asset_assignments_company_id_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY asset_assignments
    ADD CONSTRAINT asset_assignments_company_id_asset_id_fkey FOREIGN KEY (company_id, asset_id) REFERENCES fixed_assets(company_id, id);

--
-- Name: asset_assignments asset_assignments_company_id_assigned_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY asset_assignments
    ADD CONSTRAINT asset_assignments_company_id_assigned_by_fkey FOREIGN KEY (company_id, assigned_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: asset_assignments asset_assignments_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY asset_assignments
    ADD CONSTRAINT asset_assignments_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: asset_assignments asset_assignments_company_id_returned_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY asset_assignments
    ADD CONSTRAINT asset_assignments_company_id_returned_by_fkey FOREIGN KEY (company_id, returned_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: branches branches_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY branches
    ADD CONSTRAINT branches_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: command_idempotency_records command_idempotency_records_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY command_idempotency_records
    ADD CONSTRAINT command_idempotency_records_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: command_idempotency_records command_idempotency_records_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY command_idempotency_records
    ADD CONSTRAINT command_idempotency_records_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_document_sequences commercial_document_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sequences
    ADD CONSTRAINT commercial_document_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_document_sequences commercial_document_sequences_document_type_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sequences
    ADD CONSTRAINT commercial_document_sequences_document_type_code_fkey FOREIGN KEY (document_type_code) REFERENCES document_types(code);

--
-- Name: commercial_document_sources commercial_document_sources_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sources
    ADD CONSTRAINT commercial_document_sources_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id) ON DELETE CASCADE;

--
-- Name: commercial_document_sources commercial_document_sources_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sources
    ADD CONSTRAINT commercial_document_sources_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_document_sources commercial_document_sources_company_id_source_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_document_sources
    ADD CONSTRAINT commercial_document_sources_company_id_source_document_id_fkey FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: commercial_effect_claims commercial_effect_claims_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_effect_claims
    ADD CONSTRAINT commercial_effect_claims_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_effect_claims commercial_effect_claims_company_id_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_effect_claims
    ADD CONSTRAINT commercial_effect_claims_company_id_line_id_fkey FOREIGN KEY (company_id, line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: commercial_effect_claims commercial_effect_claims_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_effect_claims
    ADD CONSTRAINT commercial_effect_claims_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: commercial_line_allocations commercial_line_allocations_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_allocations
    ADD CONSTRAINT commercial_line_allocations_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_line_allocations commercial_line_allocations_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_allocations
    ADD CONSTRAINT commercial_line_allocations_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: commercial_line_allocations commercial_line_allocations_company_id_target_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_allocations
    ADD CONSTRAINT commercial_line_allocations_company_id_target_line_id_fkey FOREIGN KEY (company_id, target_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: commercial_line_registry commercial_line_registry_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_registry
    ADD CONSTRAINT commercial_line_registry_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_line_registry commercial_line_registry_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_line_registry
    ADD CONSTRAINT commercial_line_registry_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: commercial_party_snapshots commercial_party_snapshots_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_party_snapshots
    ADD CONSTRAINT commercial_party_snapshots_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_party_snapshots commercial_party_snapshots_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_party_snapshots
    ADD CONSTRAINT commercial_party_snapshots_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: commercial_status_history commercial_status_history_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_status_history
    ADD CONSTRAINT commercial_status_history_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: commercial_status_history commercial_status_history_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_status_history
    ADD CONSTRAINT commercial_status_history_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: commercial_status_history commercial_status_history_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY commercial_status_history
    ADD CONSTRAINT commercial_status_history_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: company_business_sequences company_business_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_business_sequences
    ADD CONSTRAINT company_business_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_memberships company_memberships_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_memberships
    ADD CONSTRAINT company_memberships_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_memberships company_memberships_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_memberships
    ADD CONSTRAINT company_memberships_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);

--
-- Name: company_modules company_modules_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_modules
    ADD CONSTRAINT company_modules_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_modules company_modules_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_modules
    ADD CONSTRAINT company_modules_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id);

--
-- Name: company_party_sequences company_party_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_party_sequences
    ADD CONSTRAINT company_party_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_product_sequences company_product_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_product_sequences
    ADD CONSTRAINT company_product_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_secrets company_secrets_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_secrets
    ADD CONSTRAINT company_secrets_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: company_smtp_settings company_smtp_settings_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY company_smtp_settings
    ADD CONSTRAINT company_smtp_settings_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: document_lines document_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_lines
    ADD CONSTRAINT document_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id) ON DELETE CASCADE;

--
-- Name: document_lines document_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_lines
    ADD CONSTRAINT document_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: document_lines document_lines_variant_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_lines
    ADD CONSTRAINT document_lines_variant_fk FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: document_reversals document_reversals_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_reversals
    ADD CONSTRAINT document_reversals_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: document_reversals document_reversals_company_id_original_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_reversals
    ADD CONSTRAINT document_reversals_company_id_original_document_id_fkey FOREIGN KEY (company_id, original_document_id) REFERENCES documents(company_id, id);

--
-- Name: document_reversals document_reversals_company_id_reversal_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_reversals
    ADD CONSTRAINT document_reversals_company_id_reversal_document_id_fkey FOREIGN KEY (company_id, reversal_document_id) REFERENCES documents(company_id, id);

--
-- Name: document_sequences document_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_sequences
    ADD CONSTRAINT document_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: document_sequences document_sequences_document_type_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_sequences
    ADD CONSTRAINT document_sequences_document_type_code_fkey FOREIGN KEY (document_type_code) REFERENCES document_types(code);

--
-- Name: document_status_history document_status_history_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_status_history
    ADD CONSTRAINT document_status_history_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: document_status_history document_status_history_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_status_history
    ADD CONSTRAINT document_status_history_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id) ON DELETE CASCADE;

--
-- Name: document_types document_types_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY document_types
    ADD CONSTRAINT document_types_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: documents documents_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: documents documents_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: documents documents_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: documents documents_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: documents documents_company_id_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_updated_by_fkey FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: documents documents_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: documents documents_document_type_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_document_type_code_fkey FOREIGN KEY (document_type_code) REFERENCES document_types(code);

--
-- Name: documents documents_posted_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY documents
    ADD CONSTRAINT documents_posted_by_fk FOREIGN KEY (company_id, posted_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: edocument_events edocument_events_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocument_events
    ADD CONSTRAINT edocument_events_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: edocument_events edocument_events_company_id_edocument_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocument_events
    ADD CONSTRAINT edocument_events_company_id_edocument_id_fkey FOREIGN KEY (company_id, edocument_id) REFERENCES edocuments(company_id, id);

--
-- Name: edocuments edocuments_company_id_created_by_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocuments
    ADD CONSTRAINT edocuments_company_id_created_by_user_id_fkey FOREIGN KEY (company_id, created_by_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: edocuments edocuments_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY edocuments
    ADD CONSTRAINT edocuments_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: email_message_recipients email_message_recipients_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_message_recipients
    ADD CONSTRAINT email_message_recipients_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: email_message_recipients email_message_recipients_message_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_message_recipients
    ADD CONSTRAINT email_message_recipients_message_id_fkey FOREIGN KEY (message_id) REFERENCES email_messages(id) ON DELETE CASCADE;

--
-- Name: email_messages email_messages_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_messages
    ADD CONSTRAINT email_messages_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: email_templates email_templates_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY email_templates
    ADD CONSTRAINT email_templates_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: employee_addresses employee_addresses_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_addresses
    ADD CONSTRAINT employee_addresses_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_addresses employee_addresses_district_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_addresses
    ADD CONSTRAINT employee_addresses_district_fk FOREIGN KEY (province_id, district_id) REFERENCES turkish_districts(province_id, id);

--
-- Name: employee_addresses employee_addresses_neighborhood_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_addresses
    ADD CONSTRAINT employee_addresses_neighborhood_fk FOREIGN KEY (district_id, neighborhood_id) REFERENCES turkish_neighborhoods(district_id, id);

--
-- Name: employee_addresses employee_addresses_province_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_addresses
    ADD CONSTRAINT employee_addresses_province_fk FOREIGN KEY (province_id) REFERENCES turkish_provinces(id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_account_id_fkey FOREIGN KEY (company_id, account_id) REFERENCES finance_accounts(company_id, id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_advance_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_advance_id_fkey FOREIGN KEY (company_id, advance_id) REFERENCES employee_advances(company_id, id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_finance_movement__fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_finance_movement__fkey FOREIGN KEY (company_id, finance_movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: employee_advance_transactions employee_advance_transactions_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advance_transactions
    ADD CONSTRAINT employee_advance_transactions_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES employee_advance_transactions(company_id, id);

--
-- Name: employee_advances employee_advances_company_id_account_id_currency_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advances
    ADD CONSTRAINT employee_advances_company_id_account_id_currency_fkey FOREIGN KEY (company_id, account_id, currency) REFERENCES finance_accounts(company_id, id, currency);

--
-- Name: employee_advances employee_advances_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advances
    ADD CONSTRAINT employee_advances_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: employee_advances employee_advances_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_advances
    ADD CONSTRAINT employee_advances_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_documents employee_documents_company_id_archived_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_documents
    ADD CONSTRAINT employee_documents_company_id_archived_by_fkey FOREIGN KEY (company_id, archived_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: employee_documents employee_documents_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_documents
    ADD CONSTRAINT employee_documents_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: employee_documents employee_documents_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_documents
    ADD CONSTRAINT employee_documents_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_legal_deductions employee_legal_deductions_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_legal_deductions
    ADD CONSTRAINT employee_legal_deductions_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_payroll_components employee_payroll_components_company_id_employee_payroll_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_components
    ADD CONSTRAINT employee_payroll_components_company_id_employee_payroll_id_fkey FOREIGN KEY (company_id, employee_payroll_id) REFERENCES employee_payrolls(company_id, id);

--
-- Name: employee_payroll_year_openings employee_payroll_year_openings_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_year_openings
    ADD CONSTRAINT employee_payroll_year_openings_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: employee_payroll_year_openings employee_payroll_year_openings_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payroll_year_openings
    ADD CONSTRAINT employee_payroll_year_openings_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_payrolls employee_payrolls_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payrolls
    ADD CONSTRAINT employee_payrolls_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_payrolls employee_payrolls_company_id_generation_id_payroll_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_payrolls
    ADD CONSTRAINT employee_payrolls_company_id_generation_id_payroll_run_id_fkey FOREIGN KEY (company_id, generation_id, payroll_run_id) REFERENCES payroll_calculation_generations(company_id, id, payroll_run_id);

--
-- Name: employee_private_profiles employee_private_profiles_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_private_profiles
    ADD CONSTRAINT employee_private_profiles_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_schedule_assignments employee_schedule_assignments_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_schedule_assignments
    ADD CONSTRAINT employee_schedule_assignments_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: employee_schedule_assignments employee_schedule_assignments_company_id_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employee_schedule_assignments
    ADD CONSTRAINT employee_schedule_assignments_company_id_template_id_fkey FOREIGN KEY (company_id, template_id) REFERENCES work_schedule_templates(company_id, id);

--
-- Name: employees employees_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employees
    ADD CONSTRAINT employees_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: employees employees_occupation_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employees
    ADD CONSTRAINT employees_occupation_code_fkey FOREIGN KEY (occupation_code) REFERENCES sgk_occupation_codes(code);

--
-- Name: employment_terms employment_terms_company_id_employment_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employment_terms
    ADD CONSTRAINT employment_terms_company_id_employment_id_employee_id_fkey FOREIGN KEY (company_id, employment_id, employee_id) REFERENCES employments(company_id, id, employee_id);

--
-- Name: employments employments_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY employments
    ADD CONSTRAINT employments_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: exchange_rate_settings exchange_rate_settings_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY exchange_rate_settings
    ADD CONSTRAINT exchange_rate_settings_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: exchange_rates exchange_rates_company_id_currency_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY exchange_rates
    ADD CONSTRAINT exchange_rates_company_id_currency_code_fkey FOREIGN KEY (company_id, currency_code) REFERENCES pricing_currencies(company_id, code);

--
-- Name: export_artifacts export_artifacts_company_id_export_job_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_artifacts
    ADD CONSTRAINT export_artifacts_company_id_export_job_id_fkey FOREIGN KEY (company_id, export_job_id) REFERENCES export_jobs(company_id, id) ON DELETE CASCADE;

--
-- Name: export_jobs export_jobs_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_jobs
    ADD CONSTRAINT export_jobs_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: export_jobs export_jobs_company_id_requested_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY export_jobs
    ADD CONSTRAINT export_jobs_company_id_requested_by_fkey FOREIGN KEY (company_id, requested_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_account_movements finance_account_movements_account_currency_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_account_currency_fk FOREIGN KEY (company_id, account_id, currency) REFERENCES finance_accounts(company_id, id, currency);

--
-- Name: finance_account_movements finance_account_movements_company_id_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_company_id_account_id_fkey FOREIGN KEY (company_id, account_id) REFERENCES finance_accounts(company_id, id);

--
-- Name: finance_account_movements finance_account_movements_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_account_movements finance_account_movements_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_account_movements
    ADD CONSTRAINT finance_account_movements_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: finance_accounts finance_accounts_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_accounts
    ADD CONSTRAINT finance_accounts_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: finance_accounts finance_accounts_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_accounts
    ADD CONSTRAINT finance_accounts_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: finance_instrument_events finance_instrument_events_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instrument_events
    ADD CONSTRAINT finance_instrument_events_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_instrument_events finance_instrument_events_company_id_instrument_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instrument_events
    ADD CONSTRAINT finance_instrument_events_company_id_instrument_id_fkey FOREIGN KEY (company_id, instrument_id) REFERENCES finance_instruments(company_id, id);

--
-- Name: finance_instruments finance_instruments_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instruments
    ADD CONSTRAINT finance_instruments_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_instruments finance_instruments_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instruments
    ADD CONSTRAINT finance_instruments_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: finance_instruments finance_instruments_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_instruments
    ADD CONSTRAINT finance_instruments_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_rev_company_id_reversal_ledger_e_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_item_reversals
    ADD CONSTRAINT finance_invoice_open_item_rev_company_id_reversal_ledger_e_fkey FOREIGN KEY (company_id, reversal_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_reversal_company_id_open_item_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_item_reversals
    ADD CONSTRAINT finance_invoice_open_item_reversal_company_id_open_item_id_fkey FOREIGN KEY (company_id, open_item_id) REFERENCES finance_invoice_open_items(company_id, id);

--
-- Name: finance_invoice_open_item_reversals finance_invoice_open_item_reversals_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_item_reversals
    ADD CONSTRAINT finance_invoice_open_item_reversals_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: finance_invoice_open_items finance_invoice_open_items_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_items
    ADD CONSTRAINT finance_invoice_open_items_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: finance_invoice_open_items finance_invoice_open_items_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_items
    ADD CONSTRAINT finance_invoice_open_items_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_invoice_open_items finance_invoice_open_items_company_id_party_ledger_entry_i_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_open_items
    ADD CONSTRAINT finance_invoice_open_items_company_id_party_ledger_entry_i_fkey FOREIGN KEY (company_id, party_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_open_item_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_open_item_id_fkey FOREIGN KEY (company_id, open_item_id) REFERENCES finance_invoice_open_items(company_id, id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_party_ledger_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_party_ledger_entry_id_fkey FOREIGN KEY (company_id, party_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_invoice_postings finance_invoice_postings_company_id_posted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_invoice_postings
    ADD CONSTRAINT finance_invoice_postings_company_id_posted_by_fkey FOREIGN KEY (company_id, posted_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_party_ledger_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_party_ledger_entry_id_fkey FOREIGN KEY (company_id, party_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_manual_entries finance_manual_entries_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_manual_entries
    ADD CONSTRAINT finance_manual_entries_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_manual_entries(company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_credit_ledger_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_credit_ledger_entry_id_fkey FOREIGN KEY (company_id, credit_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_debit_ledger_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_debit_ledger_entry_id_fkey FOREIGN KEY (company_id, debit_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_from_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_from_party_id_fkey FOREIGN KEY (company_id, from_party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_party_transfers(company_id, id);

--
-- Name: finance_party_transfers finance_party_transfers_company_id_to_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_party_transfers
    ADD CONSTRAINT finance_party_transfers_company_id_to_party_id_fkey FOREIGN KEY (company_id, to_party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_payment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_payment_id_fkey FOREIGN KEY (company_id, payment_id) REFERENCES finance_payments(company_id, id);

--
-- Name: finance_payment_allocations finance_payment_allocations_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_payment_allocations(company_id, id);

--
-- Name: finance_payment_allocations finance_payment_allocations_open_item_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payment_allocations
    ADD CONSTRAINT finance_payment_allocations_open_item_fk FOREIGN KEY (company_id, open_item_id) REFERENCES finance_invoice_open_items(company_id, id);

--
-- Name: finance_payments finance_payments_company_id_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_account_id_fkey FOREIGN KEY (company_id, account_id) REFERENCES finance_accounts(company_id, id);

--
-- Name: finance_payments finance_payments_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_payments finance_payments_company_id_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_movement_id_fkey FOREIGN KEY (company_id, movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: finance_payments finance_payments_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: finance_payments finance_payments_company_id_party_ledger_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_party_ledger_entry_id_fkey FOREIGN KEY (company_id, party_ledger_entry_id) REFERENCES party_ledger_entries(company_id, id);

--
-- Name: finance_payments finance_payments_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_payments(company_id, id);

--
-- Name: finance_payments finance_payments_instrument_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_payments
    ADD CONSTRAINT finance_payments_instrument_fk FOREIGN KEY (company_id, instrument_id) REFERENCES finance_instruments(company_id, id);

--
-- Name: finance_period_locks finance_period_locks_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_period_locks
    ADD CONSTRAINT finance_period_locks_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: finance_period_locks finance_period_locks_company_id_locked_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_period_locks
    ADD CONSTRAINT finance_period_locks_company_id_locked_by_fkey FOREIGN KEY (company_id, locked_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_transfers finance_transfers_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: finance_transfers finance_transfers_company_id_from_account_id_currency_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_from_account_id_currency_fkey FOREIGN KEY (company_id, from_account_id, currency) REFERENCES finance_accounts(company_id, id, currency);

--
-- Name: finance_transfers finance_transfers_company_id_in_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_in_movement_id_fkey FOREIGN KEY (company_id, in_movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: finance_transfers finance_transfers_company_id_out_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_out_movement_id_fkey FOREIGN KEY (company_id, out_movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: finance_transfers finance_transfers_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES finance_transfers(company_id, id);

--
-- Name: finance_transfers finance_transfers_company_id_to_account_id_currency_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY finance_transfers
    ADD CONSTRAINT finance_transfers_company_id_to_account_id_currency_fkey FOREIGN KEY (company_id, to_account_id, currency) REFERENCES finance_accounts(company_id, id, currency);

--
-- Name: fixed_asset_categories fixed_asset_categories_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_asset_categories
    ADD CONSTRAINT fixed_asset_categories_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: fixed_assets fixed_assets_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY fixed_assets
    ADD CONSTRAINT fixed_assets_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: goods_receipt_lines goods_receipt_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: goods_receipt_lines goods_receipt_lines_company_id_purchase_order_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_company_id_purchase_order_line_id_fkey FOREIGN KEY (company_id, purchase_order_line_id) REFERENCES purchase_order_lines(company_id, id);

--
-- Name: goods_receipt_lines goods_receipt_lines_company_id_receipt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_company_id_receipt_id_fkey FOREIGN KEY (company_id, receipt_id) REFERENCES goods_receipts(company_id, id) ON DELETE CASCADE;

--
-- Name: goods_receipt_lines goods_receipt_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: goods_receipt_lines goods_receipt_lines_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipt_lines
    ADD CONSTRAINT goods_receipt_lines_warehouse_fk FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: goods_receipts goods_receipts_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: goods_receipts goods_receipts_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: goods_receipts goods_receipts_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: goods_receipts goods_receipts_company_id_purchase_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_purchase_order_id_fkey FOREIGN KEY (company_id, purchase_order_id) REFERENCES purchase_orders(company_id, id);

--
-- Name: goods_receipts goods_receipts_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: goods_receipts goods_receipts_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: goods_receipts goods_receipts_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY goods_receipts
    ADD CONSTRAINT goods_receipts_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: import_jobs import_jobs_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_jobs
    ADD CONSTRAINT import_jobs_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: import_jobs import_jobs_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_jobs
    ADD CONSTRAINT import_jobs_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: import_mappings import_mappings_company_id_import_job_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_mappings
    ADD CONSTRAINT import_mappings_company_id_import_job_id_fkey FOREIGN KEY (company_id, import_job_id) REFERENCES import_jobs(company_id, id) ON DELETE CASCADE;

--
-- Name: import_row_results import_row_results_company_id_import_job_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY import_row_results
    ADD CONSTRAINT import_row_results_company_id_import_job_id_fkey FOREIGN KEY (company_id, import_job_id) REFERENCES import_jobs(company_id, id) ON DELETE CASCADE;

--
-- Name: instance_setup instance_setup_completed_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY instance_setup
    ADD CONSTRAINT instance_setup_completed_by_fk FOREIGN KEY (completed_by) REFERENCES users(id);

--
-- Name: inventory_company_policies inventory_company_policies_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY inventory_company_policies
    ADD CONSTRAINT inventory_company_policies_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: leave_types leave_types_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY leave_types
    ADD CONSTRAINT leave_types_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: locations locations_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY locations
    ADD CONSTRAINT locations_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: locations locations_company_id_warehouse_id_parent_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY locations
    ADD CONSTRAINT locations_company_id_warehouse_id_parent_id_fkey FOREIGN KEY (company_id, warehouse_id, parent_id) REFERENCES locations(company_id, warehouse_id, id);

--
-- Name: lots lots_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY lots
    ADD CONSTRAINT lots_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: membership_branch_scopes membership_branch_scopes_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_branch_scopes
    ADD CONSTRAINT membership_branch_scopes_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: membership_branch_scopes membership_branch_scopes_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_branch_scopes
    ADD CONSTRAINT membership_branch_scopes_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: membership_finance_account_scopes membership_finance_account_scopes_company_id_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_finance_account_scopes
    ADD CONSTRAINT membership_finance_account_scopes_company_id_account_id_fkey FOREIGN KEY (company_id, account_id) REFERENCES finance_accounts(company_id, id) ON DELETE CASCADE;

--
-- Name: membership_finance_account_scopes membership_finance_account_scopes_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_finance_account_scopes
    ADD CONSTRAINT membership_finance_account_scopes_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id) ON DELETE CASCADE;

--
-- Name: membership_roles membership_roles_company_id_role_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_roles
    ADD CONSTRAINT membership_roles_company_id_role_id_fkey FOREIGN KEY (company_id, role_id) REFERENCES roles(company_id, id);

--
-- Name: membership_roles membership_roles_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_roles
    ADD CONSTRAINT membership_roles_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: membership_warehouse_scopes membership_warehouse_scopes_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_warehouse_scopes
    ADD CONSTRAINT membership_warehouse_scopes_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: membership_warehouse_scopes membership_warehouse_scopes_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY membership_warehouse_scopes
    ADD CONSTRAINT membership_warehouse_scopes_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: outbox_events outbox_events_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY outbox_events
    ADD CONSTRAINT outbox_events_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: parties parties_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY parties
    ADD CONSTRAINT parties_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: parties parties_company_id_payment_term_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY parties
    ADD CONSTRAINT parties_company_id_payment_term_id_fkey FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: parties parties_company_id_sales_rep_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY parties
    ADD CONSTRAINT parties_company_id_sales_rep_user_id_fkey FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: parties parties_tax_office_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY parties
    ADD CONSTRAINT parties_tax_office_fk FOREIGN KEY (tax_office_id) REFERENCES turkish_tax_offices(id);

--
-- Name: party_addresses party_addresses_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_addresses
    ADD CONSTRAINT party_addresses_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_addresses party_addresses_district_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_addresses
    ADD CONSTRAINT party_addresses_district_fk FOREIGN KEY (province_id, district_id) REFERENCES turkish_districts(province_id, id);

--
-- Name: party_addresses party_addresses_neighborhood_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_addresses
    ADD CONSTRAINT party_addresses_neighborhood_fk FOREIGN KEY (district_id, neighborhood_id) REFERENCES turkish_neighborhoods(district_id, id);

--
-- Name: party_addresses party_addresses_province_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_addresses
    ADD CONSTRAINT party_addresses_province_fk FOREIGN KEY (province_id) REFERENCES turkish_provinces(id);

--
-- Name: party_contacts party_contacts_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_contacts
    ADD CONSTRAINT party_contacts_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_custom_field_definitions party_custom_field_definitions_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_definitions
    ADD CONSTRAINT party_custom_field_definitions_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: party_custom_field_values party_custom_field_values_company_id_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_values
    ADD CONSTRAINT party_custom_field_values_company_id_definition_id_fkey FOREIGN KEY (company_id, definition_id) REFERENCES party_custom_field_definitions(company_id, id);

--
-- Name: party_custom_field_values party_custom_field_values_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_custom_field_values
    ADD CONSTRAINT party_custom_field_values_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_group_memberships party_group_memberships_company_id_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_group_memberships
    ADD CONSTRAINT party_group_memberships_company_id_group_id_fkey FOREIGN KEY (company_id, group_id) REFERENCES party_groups(company_id, id);

--
-- Name: party_group_memberships party_group_memberships_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_group_memberships
    ADD CONSTRAINT party_group_memberships_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_groups party_groups_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_groups
    ADD CONSTRAINT party_groups_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_ledger_entries party_ledger_entries_company_id_reversal_of_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_ledger_entries
    ADD CONSTRAINT party_ledger_entries_company_id_reversal_of_id_party_id_fkey FOREIGN KEY (company_id, reversal_of_id, party_id) REFERENCES party_ledger_entries(company_id, id, party_id);

--
-- Name: party_search_documents party_search_documents_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_search_documents
    ADD CONSTRAINT party_search_documents_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id) ON DELETE CASCADE;

--
-- Name: party_tag_assignments party_tag_assignments_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tag_assignments
    ADD CONSTRAINT party_tag_assignments_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: party_tag_assignments party_tag_assignments_company_id_tag_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tag_assignments
    ADD CONSTRAINT party_tag_assignments_company_id_tag_id_fkey FOREIGN KEY (company_id, tag_id) REFERENCES party_tags(company_id, id);

--
-- Name: party_tags party_tags_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY party_tags
    ADD CONSTRAINT party_tags_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: payment_terms payment_terms_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payment_terms
    ADD CONSTRAINT payment_terms_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: payroll_calculation_generations payroll_calculation_generations_company_id_payroll_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_generations
    ADD CONSTRAINT payroll_calculation_generations_company_id_payroll_run_id_fkey FOREIGN KEY (company_id, payroll_run_id) REFERENCES payroll_runs(company_id, id);

--
-- Name: payroll_calculation_jobs payroll_calculation_jobs_company_id_generation_id_payroll__fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_calculation_jobs
    ADD CONSTRAINT payroll_calculation_jobs_company_id_generation_id_payroll__fkey FOREIGN KEY (company_id, generation_id, payroll_run_id) REFERENCES payroll_calculation_generations(company_id, id, payroll_run_id);

--
-- Name: payroll_component_definitions payroll_component_definitions_company_id_pack_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_component_definitions
    ADD CONSTRAINT payroll_component_definitions_company_id_pack_id_fkey FOREIGN KEY (company_id, pack_id) REFERENCES payroll_legislation_packs(company_id, id);

--
-- Name: payroll_component_treatments payroll_component_treatments_company_id_component_definiti_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_component_treatments
    ADD CONSTRAINT payroll_component_treatments_company_id_component_definiti_fkey FOREIGN KEY (company_id, component_definition_id) REFERENCES payroll_component_definitions(company_id, id);

--
-- Name: payroll_contribution_schemes payroll_contribution_schemes_company_id_pack_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_contribution_schemes
    ADD CONSTRAINT payroll_contribution_schemes_company_id_pack_id_fkey FOREIGN KEY (company_id, pack_id) REFERENCES payroll_legislation_packs(company_id, id);

--
-- Name: payroll_email_batches payroll_email_batches_company_id_payroll_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_batches
    ADD CONSTRAINT payroll_email_batches_company_id_payroll_run_id_fkey FOREIGN KEY (company_id, payroll_run_id) REFERENCES payroll_runs(company_id, id);

--
-- Name: payroll_email_batches payroll_email_batches_company_id_requested_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_batches
    ADD CONSTRAINT payroll_email_batches_company_id_requested_by_fkey FOREIGN KEY (company_id, requested_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_email_deliveries payroll_email_deliveries_company_id_batch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_deliveries
    ADD CONSTRAINT payroll_email_deliveries_company_id_batch_id_fkey FOREIGN KEY (company_id, batch_id) REFERENCES payroll_email_batches(company_id, id);

--
-- Name: payroll_email_deliveries payroll_email_deliveries_company_id_payslip_id_employee_pa_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_email_deliveries
    ADD CONSTRAINT payroll_email_deliveries_company_id_payslip_id_employee_pa_fkey FOREIGN KEY (company_id, payslip_id, employee_payroll_id) REFERENCES payroll_payslips(company_id, id, employee_payroll_id);

--
-- Name: payroll_export_jobs payroll_export_jobs_company_id_generation_id_payroll_run_i_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_jobs
    ADD CONSTRAINT payroll_export_jobs_company_id_generation_id_payroll_run_i_fkey FOREIGN KEY (company_id, generation_id, payroll_run_id) REFERENCES payroll_calculation_generations(company_id, id, payroll_run_id);

--
-- Name: payroll_export_jobs payroll_export_jobs_company_id_requested_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_jobs
    ADD CONSTRAINT payroll_export_jobs_company_id_requested_by_fkey FOREIGN KEY (company_id, requested_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_export_payslips payroll_export_payslips_company_id_export_job_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_payslips
    ADD CONSTRAINT payroll_export_payslips_company_id_export_job_id_fkey FOREIGN KEY (company_id, export_job_id) REFERENCES payroll_export_jobs(company_id, id);

--
-- Name: payroll_export_payslips payroll_export_payslips_company_id_payslip_id_employee_pay_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_export_payslips
    ADD CONSTRAINT payroll_export_payslips_company_id_payslip_id_employee_pay_fkey FOREIGN KEY (company_id, payslip_id, employee_payroll_id) REFERENCES payroll_payslips(company_id, id, employee_payroll_id);

--
-- Name: payroll_income_tax_brackets payroll_income_tax_brackets_company_id_pack_id_country_cod_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_income_tax_brackets
    ADD CONSTRAINT payroll_income_tax_brackets_company_id_pack_id_country_cod_fkey FOREIGN KEY (company_id, pack_id, country_code) REFERENCES payroll_legislation_packs(company_id, id, country_code);

--
-- Name: payroll_legislation_packs payroll_legislation_packs_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_legislation_packs payroll_legislation_packs_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: payroll_legislation_packs payroll_legislation_packs_company_id_supersedes_pack_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_legislation_packs
    ADD CONSTRAINT payroll_legislation_packs_company_id_supersedes_pack_id_fkey FOREIGN KEY (company_id, supersedes_pack_id) REFERENCES payroll_legislation_packs(company_id, id);

--
-- Name: payroll_manual_components payroll_manual_components_company_id_component_definition__fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_manual_components
    ADD CONSTRAINT payroll_manual_components_company_id_component_definition__fkey FOREIGN KEY (company_id, component_definition_id) REFERENCES payroll_component_definitions(company_id, id);

--
-- Name: payroll_manual_components payroll_manual_components_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_manual_components
    ADD CONSTRAINT payroll_manual_components_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: payroll_manual_components payroll_manual_components_company_id_payroll_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_manual_components
    ADD CONSTRAINT payroll_manual_components_company_id_payroll_run_id_fkey FOREIGN KEY (company_id, payroll_run_id) REFERENCES payroll_runs(company_id, id);

--
-- Name: payroll_payments payroll_payments_company_id_account_id_currency_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_account_id_currency_fkey FOREIGN KEY (company_id, account_id, currency) REFERENCES finance_accounts(company_id, id, currency);

--
-- Name: payroll_payments payroll_payments_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_payments payroll_payments_company_id_finance_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_finance_movement_id_fkey FOREIGN KEY (company_id, finance_movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: payroll_payments payroll_payments_company_id_payroll_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_payroll_run_id_fkey FOREIGN KEY (company_id, payroll_run_id) REFERENCES payroll_runs(company_id, id);

--
-- Name: payroll_payments payroll_payments_company_id_reversal_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_reversal_movement_id_fkey FOREIGN KEY (company_id, reversal_movement_id) REFERENCES finance_account_movements(company_id, id);

--
-- Name: payroll_payments payroll_payments_company_id_reversed_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payments
    ADD CONSTRAINT payroll_payments_company_id_reversed_by_fkey FOREIGN KEY (company_id, reversed_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_payslip_jobs payroll_payslip_jobs_company_id_employee_payroll_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslip_jobs
    ADD CONSTRAINT payroll_payslip_jobs_company_id_employee_payroll_id_fkey FOREIGN KEY (company_id, employee_payroll_id) REFERENCES employee_payrolls(company_id, id);

--
-- Name: payroll_payslip_jobs payroll_payslip_jobs_company_id_payslip_id_employee_payrol_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslip_jobs
    ADD CONSTRAINT payroll_payslip_jobs_company_id_payslip_id_employee_payrol_fkey FOREIGN KEY (company_id, payslip_id, employee_payroll_id) REFERENCES payroll_payslips(company_id, id, employee_payroll_id);

--
-- Name: payroll_payslips payroll_payslips_company_id_employee_payroll_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_payslips
    ADD CONSTRAINT payroll_payslips_company_id_employee_payroll_id_fkey FOREIGN KEY (company_id, employee_payroll_id) REFERENCES employee_payrolls(company_id, id);

--
-- Name: payroll_runs payroll_runs_active_generation_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_active_generation_fk FOREIGN KEY (company_id, active_generation_id, id) REFERENCES payroll_calculation_generations(company_id, id, payroll_run_id);

--
-- Name: payroll_runs payroll_runs_company_id_correction_of_run_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_company_id_correction_of_run_id_fkey FOREIGN KEY (company_id, correction_of_run_id) REFERENCES payroll_runs(company_id, id);

--
-- Name: payroll_runs payroll_runs_company_id_finalized_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_company_id_finalized_by_fkey FOREIGN KEY (company_id, finalized_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: payroll_runs payroll_runs_company_id_legislation_pack_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_company_id_legislation_pack_id_fkey FOREIGN KEY (company_id, legislation_pack_id) REFERENCES payroll_legislation_packs(company_id, id);

--
-- Name: payroll_runs payroll_runs_company_id_timesheet_period_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY payroll_runs
    ADD CONSTRAINT payroll_runs_company_id_timesheet_period_id_fkey FOREIGN KEY (company_id, timesheet_period_id) REFERENCES timesheet_periods(company_id, id);

--
-- Name: price_list_entries price_list_entries_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_list_entries
    ADD CONSTRAINT price_list_entries_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: price_list_entries price_list_entries_company_id_price_list_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_list_entries
    ADD CONSTRAINT price_list_entries_company_id_price_list_id_fkey FOREIGN KEY (company_id, price_list_id) REFERENCES price_lists(company_id, id) ON DELETE CASCADE;

--
-- Name: price_list_entries price_list_entries_item_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_list_entries
    ADD CONSTRAINT price_list_entries_item_fk FOREIGN KEY (company_id, item_id) REFERENCES products(company_id, id);

--
-- Name: price_list_entries price_list_entries_variant_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_list_entries
    ADD CONSTRAINT price_list_entries_variant_fk FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: price_lists price_lists_company_id_currency_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_lists
    ADD CONSTRAINT price_lists_company_id_currency_code_fkey FOREIGN KEY (company_id, currency_code) REFERENCES pricing_currencies(company_id, code);

--
-- Name: price_lists price_lists_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_lists
    ADD CONSTRAINT price_lists_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: price_lists price_lists_scope_category_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY price_lists
    ADD CONSTRAINT price_lists_scope_category_fk FOREIGN KEY (company_id, scope_category_id) REFERENCES product_categories(company_id, id);

--
-- Name: pricing_currencies pricing_currencies_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY pricing_currencies
    ADD CONSTRAINT pricing_currencies_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: product_attachments product_attachments_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: product_attachments product_attachments_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: product_attachments product_attachments_company_id_uploaded_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_company_id_uploaded_by_fkey FOREIGN KEY (company_id, uploaded_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: product_attachments product_attachments_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_attachments
    ADD CONSTRAINT product_attachments_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: product_barcodes product_barcodes_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_barcodes
    ADD CONSTRAINT product_barcodes_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id) ON DELETE CASCADE;

--
-- Name: product_barcodes product_barcodes_variant_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_barcodes
    ADD CONSTRAINT product_barcodes_variant_fk FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id) ON DELETE CASCADE;

--
-- Name: product_brands product_brands_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_brands
    ADD CONSTRAINT product_brands_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: product_categories product_categories_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_categories
    ADD CONSTRAINT product_categories_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: product_image_variants product_image_variants_company_id_product_image_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_image_variants
    ADD CONSTRAINT product_image_variants_company_id_product_image_id_fkey FOREIGN KEY (company_id, product_image_id) REFERENCES product_images(company_id, id) ON DELETE RESTRICT;

--
-- Name: product_images product_images_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_images
    ADD CONSTRAINT product_images_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: product_images product_images_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_images
    ADD CONSTRAINT product_images_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: product_images product_images_company_id_uploaded_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_images
    ADD CONSTRAINT product_images_company_id_uploaded_by_fkey FOREIGN KEY (company_id, uploaded_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: product_images product_images_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_images
    ADD CONSTRAINT product_images_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: product_tax_profile_components product_tax_profile_component_company_id_product_id_direct_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profile_components
    ADD CONSTRAINT product_tax_profile_component_company_id_product_id_direct_fkey FOREIGN KEY (company_id, product_id, direction) REFERENCES product_tax_profiles(company_id, product_id, direction) ON DELETE CASCADE;

--
-- Name: product_tax_profile_components product_tax_profile_component_company_id_tax_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profile_components
    ADD CONSTRAINT product_tax_profile_component_company_id_tax_definition_id_fkey FOREIGN KEY (company_id, tax_definition_id) REFERENCES tax_definitions(company_id, id);

--
-- Name: product_tax_profile_components product_tax_profile_components_company_id_tax_rate_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profile_components
    ADD CONSTRAINT product_tax_profile_components_company_id_tax_rate_id_fkey FOREIGN KEY (company_id, tax_rate_id) REFERENCES tax_rates(company_id, id);

--
-- Name: product_tax_profiles product_tax_profiles_company_id_exemption_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_company_id_exemption_id_fkey FOREIGN KEY (company_id, exemption_id) REFERENCES tax_exemptions(company_id, id);

--
-- Name: product_tax_profiles product_tax_profiles_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id) ON DELETE CASCADE;

--
-- Name: product_tax_profiles product_tax_profiles_company_id_tax_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_company_id_tax_definition_id_fkey FOREIGN KEY (company_id, tax_definition_id) REFERENCES tax_definitions(company_id, id);

--
-- Name: product_tax_profiles product_tax_profiles_company_id_tax_rate_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_company_id_tax_rate_id_fkey FOREIGN KEY (company_id, tax_rate_id) REFERENCES tax_rates(company_id, id);

--
-- Name: product_tax_profiles product_tax_profiles_company_id_withholding_rule_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_tax_profiles
    ADD CONSTRAINT product_tax_profiles_company_id_withholding_rule_id_fkey FOREIGN KEY (company_id, withholding_rule_id) REFERENCES tax_withholding_rules(company_id, id);

--
-- Name: product_units product_units_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_units
    ADD CONSTRAINT product_units_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id) ON DELETE CASCADE;

--
-- Name: product_units product_units_unit_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_units
    ADD CONSTRAINT product_units_unit_fk FOREIGN KEY (unit_code) REFERENCES units(code);

--
-- Name: product_variant_allowed_options product_variant_allowed_optio_company_id_definition_id_opt_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_allowed_options
    ADD CONSTRAINT product_variant_allowed_optio_company_id_definition_id_opt_fkey FOREIGN KEY (company_id, definition_id, option_id) REFERENCES variant_definition_options(company_id, definition_id, id);

--
-- Name: product_variant_allowed_options product_variant_allowed_optio_company_id_product_id_defini_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_allowed_options
    ADD CONSTRAINT product_variant_allowed_optio_company_id_product_id_defini_fkey FOREIGN KEY (company_id, product_id, definition_id) REFERENCES product_variant_definitions(company_id, product_id, definition_id) ON DELETE CASCADE;

--
-- Name: product_variant_definitions product_variant_definitions_company_id_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_definitions
    ADD CONSTRAINT product_variant_definitions_company_id_definition_id_fkey FOREIGN KEY (company_id, definition_id) REFERENCES variant_definitions(company_id, id);

--
-- Name: product_variant_definitions product_variant_definitions_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_definitions
    ADD CONSTRAINT product_variant_definitions_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id) ON DELETE CASCADE;

--
-- Name: product_variant_price_overrides product_variant_price_overrides_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_price_overrides
    ADD CONSTRAINT product_variant_price_overrides_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id) ON DELETE CASCADE;

--
-- Name: product_variant_values product_variant_values_company_id_definition_id_option_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_values
    ADD CONSTRAINT product_variant_values_company_id_definition_id_option_id_fkey FOREIGN KEY (company_id, definition_id, option_id) REFERENCES variant_definition_options(company_id, definition_id, id);

--
-- Name: product_variant_values product_variant_values_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variant_values
    ADD CONSTRAINT product_variant_values_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id) ON DELETE CASCADE;

--
-- Name: product_variants product_variants_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY product_variants
    ADD CONSTRAINT product_variants_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id) ON DELETE CASCADE;

--
-- Name: products products_company_id_brand_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_company_id_brand_id_fkey FOREIGN KEY (company_id, brand_id) REFERENCES product_brands(company_id, id);

--
-- Name: products products_company_id_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_company_id_category_id_fkey FOREIGN KEY (company_id, category_id) REFERENCES product_categories(company_id, id);

--
-- Name: products products_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY products
    ADD CONSTRAINT products_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: public_holiday_calendars public_holiday_calendars_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holiday_calendars
    ADD CONSTRAINT public_holiday_calendars_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: public_holidays public_holidays_company_id_calendar_id_calendar_year_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public_holidays
    ADD CONSTRAINT public_holidays_company_id_calendar_id_calendar_year_fkey FOREIGN KEY (company_id, calendar_id, calendar_year) REFERENCES public_holiday_calendars(company_id, id, calendar_year);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_company_id_goods_receipt_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_company_id_goods_receipt_line_id_fkey FOREIGN KEY (company_id, goods_receipt_line_id) REFERENCES goods_receipt_lines(company_id, id);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_company_id_invoice_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_company_id_invoice_id_fkey FOREIGN KEY (company_id, invoice_id) REFERENCES purchase_invoices(company_id, id) ON DELETE CASCADE;

--
-- Name: purchase_invoice_lines purchase_invoice_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_purchase_order_line_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_purchase_order_line_fk FOREIGN KEY (company_id, purchase_order_line_id) REFERENCES purchase_order_lines(company_id, id);

--
-- Name: purchase_invoice_lines purchase_invoice_lines_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoice_lines
    ADD CONSTRAINT purchase_invoice_lines_warehouse_fk FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_invoices purchase_invoices_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: purchase_invoices purchase_invoices_company_id_goods_receipt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_goods_receipt_id_fkey FOREIGN KEY (company_id, goods_receipt_id) REFERENCES goods_receipts(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_company_id_purchase_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_purchase_order_id_fkey FOREIGN KEY (company_id, purchase_order_id) REFERENCES purchase_orders(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: purchase_invoices purchase_invoices_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_invoices
    ADD CONSTRAINT purchase_invoices_warehouse_fk FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_landed_cost_lines purchase_landed_cost_lines_company_id_goods_receipt_line_i_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_cost_lines
    ADD CONSTRAINT purchase_landed_cost_lines_company_id_goods_receipt_line_i_fkey FOREIGN KEY (company_id, goods_receipt_line_id) REFERENCES goods_receipt_lines(company_id, id);

--
-- Name: purchase_landed_cost_lines purchase_landed_cost_lines_company_id_landed_cost_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_cost_lines
    ADD CONSTRAINT purchase_landed_cost_lines_company_id_landed_cost_id_fkey FOREIGN KEY (company_id, landed_cost_id) REFERENCES purchase_landed_costs(company_id, id) ON DELETE CASCADE;

--
-- Name: purchase_landed_costs purchase_landed_costs_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_landed_costs purchase_landed_costs_company_id_goods_receipt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_company_id_goods_receipt_id_fkey FOREIGN KEY (company_id, goods_receipt_id) REFERENCES goods_receipts(company_id, id);

--
-- Name: purchase_landed_costs purchase_landed_costs_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: purchase_landed_costs purchase_landed_costs_company_id_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_landed_costs
    ADD CONSTRAINT purchase_landed_costs_company_id_updated_by_fkey FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_order_lines purchase_order_lines_company_id_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_company_id_order_id_fkey FOREIGN KEY (company_id, order_id) REFERENCES purchase_orders(company_id, id) ON DELETE CASCADE;

--
-- Name: purchase_order_lines purchase_order_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: purchase_order_lines purchase_order_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: purchase_order_lines purchase_order_lines_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_order_lines
    ADD CONSTRAINT purchase_order_lines_warehouse_fk FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_orders purchase_orders_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: purchase_orders purchase_orders_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_orders purchase_orders_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: purchase_orders purchase_orders_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: purchase_orders purchase_orders_company_id_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_updated_by_fkey FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_orders purchase_orders_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_orders purchase_orders_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_orders
    ADD CONSTRAINT purchase_orders_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: purchase_return_lines purchase_return_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: purchase_return_lines purchase_return_lines_company_id_return_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_company_id_return_id_fkey FOREIGN KEY (company_id, return_id) REFERENCES purchase_returns(company_id, id) ON DELETE CASCADE;

--
-- Name: purchase_return_lines purchase_return_lines_company_id_source_receipt_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_company_id_source_receipt_line_id_fkey FOREIGN KEY (company_id, source_receipt_line_id) REFERENCES goods_receipt_lines(company_id, id);

--
-- Name: purchase_return_lines purchase_return_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: purchase_return_lines purchase_return_lines_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_return_lines
    ADD CONSTRAINT purchase_return_lines_warehouse_fk FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_returns purchase_returns_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: purchase_returns purchase_returns_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: purchase_returns purchase_returns_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: purchase_returns purchase_returns_company_id_source_receipt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_source_receipt_id_fkey FOREIGN KEY (company_id, source_receipt_id) REFERENCES goods_receipts(company_id, id);

--
-- Name: purchase_returns purchase_returns_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: purchase_returns purchase_returns_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: purchase_returns purchase_returns_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY purchase_returns
    ADD CONSTRAINT purchase_returns_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: recovery_codes recovery_codes_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY recovery_codes
    ADD CONSTRAINT recovery_codes_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);

--
-- Name: role_permissions role_permissions_company_id_role_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY role_permissions
    ADD CONSTRAINT role_permissions_company_id_role_id_fkey FOREIGN KEY (company_id, role_id) REFERENCES roles(company_id, id);

--
-- Name: role_permissions role_permissions_permission_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY role_permissions
    ADD CONSTRAINT role_permissions_permission_code_fkey FOREIGN KEY (permission_code) REFERENCES permissions(code);

--
-- Name: roles roles_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY roles
    ADD CONSTRAINT roles_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES sales_dispatches(company_id, id) ON DELETE CASCADE;

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_dispatch_lines sales_dispatch_lines_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatch_lines
    ADD CONSTRAINT sales_dispatch_lines_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_branch_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_branch_fk FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_created_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_created_by_fk FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_dispatches sales_dispatches_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_finance_posting_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_finance_posting_fk FOREIGN KEY (company_id, finance_posting_id) REFERENCES finance_invoice_postings(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_party_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_party_fk FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_payment_term_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_payment_term_fk FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_sales_rep_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_sales_rep_fk FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_dispatches sales_dispatches_source_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_source_document_fk FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_dispatches sales_dispatches_updated_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_updated_by_fk FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_dispatches sales_dispatches_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_dispatches
    ADD CONSTRAINT sales_dispatches_warehouse_fk FOREIGN KEY (company_id, default_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES sales_invoices(company_id, id) ON DELETE CASCADE;

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_invoice_lines sales_invoice_lines_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoice_lines
    ADD CONSTRAINT sales_invoice_lines_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_invoices sales_invoices_branch_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_branch_fk FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: sales_invoices sales_invoices_created_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_created_by_fk FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_invoices sales_invoices_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_invoices sales_invoices_finance_posting_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_finance_posting_fk FOREIGN KEY (company_id, finance_posting_id) REFERENCES finance_invoice_postings(company_id, id);

--
-- Name: sales_invoices sales_invoices_party_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_party_fk FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: sales_invoices sales_invoices_payment_term_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_payment_term_fk FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: sales_invoices sales_invoices_sales_rep_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_sales_rep_fk FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_invoices sales_invoices_source_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_source_document_fk FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_invoices sales_invoices_updated_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_updated_by_fk FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_invoices sales_invoices_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_invoices
    ADD CONSTRAINT sales_invoices_warehouse_fk FOREIGN KEY (company_id, default_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_order_lines sales_order_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES sales_orders(company_id, id) ON DELETE CASCADE;

--
-- Name: sales_order_lines sales_order_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_order_lines sales_order_lines_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_order_lines sales_order_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_order_lines sales_order_lines_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_lines
    ADD CONSTRAINT sales_order_lines_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_order_id_fkey FOREIGN KEY (company_id, order_id) REFERENCES sales_orders(company_id, id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_order_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_order_line_id_fkey FOREIGN KEY (company_id, order_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_order_reservations sales_order_reservations_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_order_reservations
    ADD CONSTRAINT sales_order_reservations_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_orders sales_orders_branch_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_branch_fk FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: sales_orders sales_orders_created_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_created_by_fk FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_orders sales_orders_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_orders sales_orders_finance_posting_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_finance_posting_fk FOREIGN KEY (company_id, finance_posting_id) REFERENCES finance_invoice_postings(company_id, id);

--
-- Name: sales_orders sales_orders_party_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_party_fk FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: sales_orders sales_orders_payment_term_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_payment_term_fk FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: sales_orders sales_orders_sales_rep_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_sales_rep_fk FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_orders sales_orders_source_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_source_document_fk FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_orders sales_orders_updated_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_updated_by_fk FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_orders sales_orders_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_orders
    ADD CONSTRAINT sales_orders_warehouse_fk FOREIGN KEY (company_id, default_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_quote_lines sales_quote_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES sales_quotes(company_id, id) ON DELETE CASCADE;

--
-- Name: sales_quote_lines sales_quote_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_quote_lines sales_quote_lines_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_quote_lines sales_quote_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_quote_lines sales_quote_lines_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quote_lines
    ADD CONSTRAINT sales_quote_lines_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_quotes sales_quotes_company_id_default_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_default_warehouse_id_fkey FOREIGN KEY (company_id, default_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_finance_posting_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_finance_posting_id_fkey FOREIGN KEY (company_id, finance_posting_id) REFERENCES finance_invoice_postings(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_party_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_party_id_fkey FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_source_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_source_document_id_fkey FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_quotes sales_quotes_company_id_updated_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_company_id_updated_by_fkey FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_quotes sales_quotes_payment_term_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_payment_term_fk FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: sales_quotes sales_quotes_sales_rep_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_quotes
    ADD CONSTRAINT sales_quotes_sales_rep_fk FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_return_lines sales_return_lines_company_id_document_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_document_id_fkey FOREIGN KEY (company_id, document_id) REFERENCES sales_returns(company_id, id) ON DELETE CASCADE;

--
-- Name: sales_return_lines sales_return_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sales_return_lines sales_return_lines_company_id_source_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_source_line_id_fkey FOREIGN KEY (company_id, source_line_id) REFERENCES commercial_line_registry(company_id, line_id);

--
-- Name: sales_return_lines sales_return_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: sales_return_lines sales_return_lines_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_return_lines
    ADD CONSTRAINT sales_return_lines_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: sales_returns sales_returns_branch_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_branch_fk FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: sales_returns sales_returns_created_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_created_by_fk FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_returns sales_returns_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_document_fk FOREIGN KEY (company_id, document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_returns sales_returns_finance_posting_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_finance_posting_fk FOREIGN KEY (company_id, finance_posting_id) REFERENCES finance_invoice_postings(company_id, id);

--
-- Name: sales_returns sales_returns_party_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_party_fk FOREIGN KEY (company_id, party_id) REFERENCES parties(company_id, id);

--
-- Name: sales_returns sales_returns_payment_term_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_payment_term_fk FOREIGN KEY (company_id, payment_term_id) REFERENCES payment_terms(company_id, id);

--
-- Name: sales_returns sales_returns_sales_rep_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_sales_rep_fk FOREIGN KEY (company_id, sales_rep_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_returns sales_returns_source_document_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_source_document_fk FOREIGN KEY (company_id, source_document_id) REFERENCES documents(company_id, id);

--
-- Name: sales_returns sales_returns_updated_by_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_updated_by_fk FOREIGN KEY (company_id, updated_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sales_returns sales_returns_warehouse_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sales_returns
    ADD CONSTRAINT sales_returns_warehouse_fk FOREIGN KEY (company_id, default_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: security_audit_events security_audit_events_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY security_audit_events
    ADD CONSTRAINT security_audit_events_actor_user_id_fkey FOREIGN KEY (actor_user_id) REFERENCES users(id);

--
-- Name: security_audit_events security_audit_events_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY security_audit_events
    ADD CONSTRAINT security_audit_events_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: serial_number_events serial_number_events_company_id_from_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_company_id_from_warehouse_id_fkey FOREIGN KEY (company_id, from_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: serial_number_events serial_number_events_company_id_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_company_id_movement_id_fkey FOREIGN KEY (company_id, movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: serial_number_events serial_number_events_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: serial_number_events serial_number_events_company_id_to_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_number_events
    ADD CONSTRAINT serial_number_events_company_id_to_warehouse_id_fkey FOREIGN KEY (company_id, to_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: serial_numbers serial_numbers_company_id_active_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_company_id_active_location_id_fkey FOREIGN KEY (company_id, active_location_id) REFERENCES locations(company_id, id);

--
-- Name: serial_numbers serial_numbers_company_id_active_warehouse_id_active_locat_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_company_id_active_warehouse_id_active_locat_fkey FOREIGN KEY (company_id, active_warehouse_id, active_location_id) REFERENCES locations(company_id, warehouse_id, id);

--
-- Name: serial_numbers serial_numbers_company_id_active_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_company_id_active_warehouse_id_fkey FOREIGN KEY (company_id, active_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: serial_numbers serial_numbers_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY serial_numbers
    ADD CONSTRAINT serial_numbers_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: sessions sessions_current_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sessions
    ADD CONSTRAINT sessions_current_company_id_user_id_fkey FOREIGN KEY (current_company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY sessions
    ADD CONSTRAINT sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);

--
-- Name: stock_cost_adjustments stock_cost_adjustments_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_adjustments
    ADD CONSTRAINT stock_cost_adjustments_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_cost_adjustments stock_cost_adjustments_company_id_layer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_adjustments
    ADD CONSTRAINT stock_cost_adjustments_company_id_layer_id_fkey FOREIGN KEY (company_id, layer_id) REFERENCES stock_cost_layers(company_id, id);

--
-- Name: stock_cost_consumptions stock_cost_consumptions_company_id_layer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_consumptions
    ADD CONSTRAINT stock_cost_consumptions_company_id_layer_id_fkey FOREIGN KEY (company_id, layer_id) REFERENCES stock_cost_layers(company_id, id);

--
-- Name: stock_cost_consumptions stock_cost_consumptions_company_id_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_consumptions
    ADD CONSTRAINT stock_cost_consumptions_company_id_movement_id_fkey FOREIGN KEY (company_id, movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_company_id_source_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_company_id_source_movement_id_fkey FOREIGN KEY (company_id, source_movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_cost_layers stock_cost_layers_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_layers
    ADD CONSTRAINT stock_cost_layers_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_cost_unpriced_events stock_cost_unpriced_events_company_id_layer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_unpriced_events
    ADD CONSTRAINT stock_cost_unpriced_events_company_id_layer_id_fkey FOREIGN KEY (company_id, layer_id) REFERENCES stock_cost_layers(company_id, id);

--
-- Name: stock_cost_unpriced_events stock_cost_unpriced_events_company_id_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_cost_unpriced_events
    ADD CONSTRAINT stock_cost_unpriced_events_company_id_movement_id_fkey FOREIGN KEY (company_id, movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_count_engine_assignments stock_count_engine_assignments_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_assignments
    ADD CONSTRAINT stock_count_engine_assignments_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_assignments stock_count_engine_assignments_company_id_count_id_pass_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_assignments
    ADD CONSTRAINT stock_count_engine_assignments_company_id_count_id_pass_id_fkey FOREIGN KEY (company_id, count_id, pass_id) REFERENCES stock_count_engine_passes(company_id, count_id, id);

--
-- Name: stock_count_engine_assignments stock_count_engine_assignments_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_assignments
    ADD CONSTRAINT stock_count_engine_assignments_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_commands stock_count_engine_commands_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_commands
    ADD CONSTRAINT stock_count_engine_commands_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_commands stock_count_engine_commands_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_commands
    ADD CONSTRAINT stock_count_engine_commands_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_counts stock_count_engine_counts_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_counts
    ADD CONSTRAINT stock_count_engine_counts_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: stock_count_engine_counts stock_count_engine_counts_company_id_posted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_counts
    ADD CONSTRAINT stock_count_engine_counts_company_id_posted_by_fkey FOREIGN KEY (company_id, posted_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_counts stock_count_engine_counts_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_counts
    ADD CONSTRAINT stock_count_engine_counts_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_count_id_pass_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_count_id_pass_id_fkey FOREIGN KEY (company_id, count_id, pass_id) REFERENCES stock_count_engine_passes(company_id, count_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_count_id_pass_id_sess_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_count_id_pass_id_sess_fkey FOREIGN KEY (company_id, count_id, pass_id, session_id) REFERENCES stock_count_engine_sessions(company_id, count_id, pass_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_count_id_scope_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_count_id_scope_id_fkey FOREIGN KEY (company_id, count_id, scope_id) REFERENCES stock_count_engine_scopes(company_id, count_id, id);

--
-- Name: stock_count_engine_events stock_count_engine_events_company_id_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_events
    ADD CONSTRAINT stock_count_engine_events_company_id_session_id_fkey FOREIGN KEY (company_id, session_id) REFERENCES stock_count_engine_sessions(company_id, id);

--
-- Name: stock_count_engine_number_sequences stock_count_engine_number_sequences_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_number_sequences
    ADD CONSTRAINT stock_count_engine_number_sequences_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: stock_count_engine_passes stock_count_engine_passes_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_passes
    ADD CONSTRAINT stock_count_engine_passes_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_passes stock_count_engine_passes_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_passes
    ADD CONSTRAINT stock_count_engine_passes_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_review_exceptions stock_count_engine_review_exception_company_id_resolved_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_review_exceptions
    ADD CONSTRAINT stock_count_engine_review_exception_company_id_resolved_by_fkey FOREIGN KEY (company_id, resolved_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_engine_review_exceptions stock_count_engine_review_exceptions_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_review_exceptions
    ADD CONSTRAINT stock_count_engine_review_exceptions_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_review_exceptions stock_count_engine_review_exceptions_company_id_scope_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_review_exceptions
    ADD CONSTRAINT stock_count_engine_review_exceptions_company_id_scope_id_fkey FOREIGN KEY (company_id, scope_id) REFERENCES stock_count_engine_scopes(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_location_id_fkey FOREIGN KEY (company_id, location_id) REFERENCES locations(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_count_engine_scopes stock_count_engine_scopes_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_scopes
    ADD CONSTRAINT stock_count_engine_scopes_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_count_engine_counts(company_id, id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_company_id_count_id_pass_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_company_id_count_id_pass_id_fkey FOREIGN KEY (company_id, count_id, pass_id) REFERENCES stock_count_engine_passes(company_id, count_id, id);

--
-- Name: stock_count_engine_sessions stock_count_engine_sessions_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_engine_sessions
    ADD CONSTRAINT stock_count_engine_sessions_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_count_lines stock_count_lines_company_id_count_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_count_id_fkey FOREIGN KEY (company_id, count_id) REFERENCES stock_counts(company_id, id) ON DELETE CASCADE;

--
-- Name: stock_count_lines stock_count_lines_company_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_location_id_fkey FOREIGN KEY (company_id, location_id) REFERENCES locations(company_id, id);

--
-- Name: stock_count_lines stock_count_lines_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: stock_count_lines stock_count_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_count_lines stock_count_lines_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: stock_count_lines stock_count_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_count_lines
    ADD CONSTRAINT stock_count_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_counts stock_counts_company_id_posted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_counts
    ADD CONSTRAINT stock_counts_company_id_posted_by_fkey FOREIGN KEY (company_id, posted_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_counts stock_counts_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_counts
    ADD CONSTRAINT stock_counts_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_company_id_movement_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_company_id_movement_id_fkey FOREIGN KEY (company_id, movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_company_id_operation_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_company_id_operation_id_fkey FOREIGN KEY (company_id, operation_id) REFERENCES stock_movement_operations(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_movement_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_movement_fk FOREIGN KEY (company_id, movement_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_operation_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_operation_fk FOREIGN KEY (company_id, operation_id) REFERENCES stock_movement_operations(company_id, id);

--
-- Name: stock_movement_operation_lines stock_movement_operation_lines_variant_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operation_lines
    ADD CONSTRAINT stock_movement_operation_lines_variant_fk FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_movement_operations stock_movement_operations_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_movement_operations stock_movement_operations_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: stock_movement_operations stock_movement_operations_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_movement_operations stock_movement_operations_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movement_operations
    ADD CONSTRAINT stock_movement_operations_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: stock_movements stock_movements_company_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_location_id_fkey FOREIGN KEY (company_id, location_id) REFERENCES locations(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_reversal_of_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_reversal_of_id_fkey FOREIGN KEY (company_id, reversal_of_id) REFERENCES stock_movements(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_movements stock_movements_company_id_warehouse_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_company_id_warehouse_id_location_id_fkey FOREIGN KEY (company_id, warehouse_id, location_id) REFERENCES locations(company_id, warehouse_id, id);

--
-- Name: stock_movements stock_movements_count_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_count_fk FOREIGN KEY (company_id, count_id) REFERENCES stock_counts(company_id, id);

--
-- Name: stock_movements stock_movements_count_line_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_count_line_fk FOREIGN KEY (company_id, count_line_id) REFERENCES stock_count_lines(company_id, id);

--
-- Name: stock_movements stock_movements_operation_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_operation_fk FOREIGN KEY (company_id, operation_id) REFERENCES stock_movement_operations(company_id, id);

--
-- Name: stock_movements stock_movements_transfer_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_transfer_fk FOREIGN KEY (company_id, transfer_id) REFERENCES warehouse_transfers(company_id, id);

--
-- Name: stock_movements stock_movements_transfer_line_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_movements
    ADD CONSTRAINT stock_movements_transfer_line_fk FOREIGN KEY (company_id, transfer_line_id) REFERENCES warehouse_transfer_lines(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_location_id_fkey FOREIGN KEY (company_id, location_id) REFERENCES locations(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: stock_positions stock_positions_company_id_warehouse_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY stock_positions
    ADD CONSTRAINT stock_positions_company_id_warehouse_id_location_id_fkey FOREIGN KEY (company_id, warehouse_id, location_id) REFERENCES locations(company_id, warehouse_id, id);

--
-- Name: supplier_product_references supplier_product_references_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_product_references
    ADD CONSTRAINT supplier_product_references_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: supplier_product_references supplier_product_references_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_product_references
    ADD CONSTRAINT supplier_product_references_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: supplier_product_references supplier_product_references_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_product_references
    ADD CONSTRAINT supplier_product_references_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: supplier_purchase_prices supplier_purchase_prices_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_purchase_prices
    ADD CONSTRAINT supplier_purchase_prices_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: supplier_purchase_prices supplier_purchase_prices_company_id_source_receipt_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_purchase_prices
    ADD CONSTRAINT supplier_purchase_prices_company_id_source_receipt_line_id_fkey FOREIGN KEY (company_id, source_receipt_line_id) REFERENCES goods_receipt_lines(company_id, id);

--
-- Name: supplier_purchase_prices supplier_purchase_prices_company_id_supplier_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_purchase_prices
    ADD CONSTRAINT supplier_purchase_prices_company_id_supplier_id_fkey FOREIGN KEY (company_id, supplier_id) REFERENCES parties(company_id, id);

--
-- Name: supplier_purchase_prices supplier_purchase_prices_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY supplier_purchase_prices
    ADD CONSTRAINT supplier_purchase_prices_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: tax_definitions tax_definitions_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_definitions
    ADD CONSTRAINT tax_definitions_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: tax_exemptions tax_exemptions_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_exemptions
    ADD CONSTRAINT tax_exemptions_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: tax_rates tax_rates_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_rates
    ADD CONSTRAINT tax_rates_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: tax_rates tax_rates_company_id_tax_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_rates
    ADD CONSTRAINT tax_rates_company_id_tax_definition_id_fkey FOREIGN KEY (company_id, tax_definition_id) REFERENCES tax_definitions(company_id, id) ON DELETE CASCADE;

--
-- Name: tax_withholding_rules tax_withholding_rules_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY tax_withholding_rules
    ADD CONSTRAINT tax_withholding_rules_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: timesheet_days timesheet_days_company_id_employee_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_company_id_employee_id_fkey FOREIGN KEY (company_id, employee_id) REFERENCES employees(company_id, id);

--
-- Name: timesheet_days timesheet_days_company_id_period_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_company_id_period_id_fkey FOREIGN KEY (company_id, period_id) REFERENCES timesheet_periods(company_id, id);

--
-- Name: timesheet_days timesheet_days_company_id_schedule_version_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_company_id_schedule_version_id_fkey FOREIGN KEY (company_id, schedule_version_id) REFERENCES work_schedule_template_versions(company_id, id);

--
-- Name: timesheet_days timesheet_days_leave_type_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_days
    ADD CONSTRAINT timesheet_days_leave_type_fk FOREIGN KEY (company_id, leave_type_id) REFERENCES leave_types(company_id, id);

--
-- Name: timesheet_periods timesheet_periods_company_id_finalized_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_periods
    ADD CONSTRAINT timesheet_periods_company_id_finalized_by_fkey FOREIGN KEY (company_id, finalized_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: timesheet_periods timesheet_periods_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_periods
    ADD CONSTRAINT timesheet_periods_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: timesheet_periods timesheet_periods_company_id_reopened_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY timesheet_periods
    ADD CONSTRAINT timesheet_periods_company_id_reopened_by_fkey FOREIGN KEY (company_id, reopened_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: turkish_districts turkish_districts_province_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_districts
    ADD CONSTRAINT turkish_districts_province_id_fkey FOREIGN KEY (province_id) REFERENCES turkish_provinces(id);

--
-- Name: turkish_neighborhoods turkish_neighborhoods_district_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_neighborhoods
    ADD CONSTRAINT turkish_neighborhoods_district_id_fkey FOREIGN KEY (district_id) REFERENCES turkish_districts(id);

--
-- Name: turkish_tax_offices turkish_tax_offices_province_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY turkish_tax_offices
    ADD CONSTRAINT turkish_tax_offices_province_id_fkey FOREIGN KEY (province_id) REFERENCES turkish_provinces(id);

--
-- Name: user_address_preferences user_address_preferences_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_address_preferences
    ADD CONSTRAINT user_address_preferences_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: user_address_preferences user_address_preferences_district_id_neighborhood_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_address_preferences
    ADD CONSTRAINT user_address_preferences_district_id_neighborhood_id_fkey FOREIGN KEY (district_id, neighborhood_id) REFERENCES turkish_neighborhoods(district_id, id);

--
-- Name: user_address_preferences user_address_preferences_province_id_district_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_address_preferences
    ADD CONSTRAINT user_address_preferences_province_id_district_id_fkey FOREIGN KEY (province_id, district_id) REFERENCES turkish_districts(province_id, id);

--
-- Name: user_address_preferences user_address_preferences_province_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_address_preferences
    ADD CONSTRAINT user_address_preferences_province_id_fkey FOREIGN KEY (province_id) REFERENCES turkish_provinces(id);

--
-- Name: user_agenda_events user_agenda_events_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_agenda_events
    ADD CONSTRAINT user_agenda_events_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id) ON DELETE CASCADE;

--
-- Name: user_dashboard_preferences user_dashboard_preferences_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_dashboard_preferences
    ADD CONSTRAINT user_dashboard_preferences_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id) ON DELETE CASCADE;

--
-- Name: user_table_preferences user_table_preferences_company_id_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_table_preferences
    ADD CONSTRAINT user_table_preferences_company_id_user_id_fkey FOREIGN KEY (company_id, user_id) REFERENCES company_memberships(company_id, user_id) ON DELETE CASCADE;

--
-- Name: variant_definition_options variant_definition_options_company_id_definition_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_options
    ADD CONSTRAINT variant_definition_options_company_id_definition_id_fkey FOREIGN KEY (company_id, definition_id) REFERENCES variant_definitions(company_id, id) ON DELETE CASCADE;

--
-- Name: variant_definition_package_definitions variant_definition_package_definitions_package_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_definitions
    ADD CONSTRAINT variant_definition_package_definitions_package_code_fkey FOREIGN KEY (package_code) REFERENCES variant_definition_packages(code) ON DELETE CASCADE;

--
-- Name: variant_definition_package_options variant_definition_package_op_package_code_definition_code_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definition_package_options
    ADD CONSTRAINT variant_definition_package_op_package_code_definition_code_fkey FOREIGN KEY (package_code, definition_code) REFERENCES variant_definition_package_definitions(package_code, definition_code) ON DELETE CASCADE;

--
-- Name: variant_definitions variant_definitions_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY variant_definitions
    ADD CONSTRAINT variant_definitions_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_company_id_transfer_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions
    ADD CONSTRAINT warehouse_transfer_discrepancy_company_id_transfer_line_id_fkey FOREIGN KEY (company_id, transfer_line_id) REFERENCES warehouse_transfer_lines(company_id, id);

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_re_company_id_actor_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions
    ADD CONSTRAINT warehouse_transfer_discrepancy_re_company_id_actor_user_id_fkey FOREIGN KEY (company_id, actor_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: warehouse_transfer_discrepancy_resolutions warehouse_transfer_discrepancy_reso_company_id_transfer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_discrepancy_resolutions
    ADD CONSTRAINT warehouse_transfer_discrepancy_reso_company_id_transfer_id_fkey FOREIGN KEY (company_id, transfer_id) REFERENCES warehouse_transfers(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_destination_location_i_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_destination_location_i_fkey FOREIGN KEY (company_id, destination_location_id) REFERENCES locations(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_source_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_source_location_id_fkey FOREIGN KEY (company_id, source_location_id) REFERENCES locations(company_id, id);

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_transfer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_transfer_id_fkey FOREIGN KEY (company_id, transfer_id) REFERENCES warehouse_transfers(company_id, id) ON DELETE CASCADE;

--
-- Name: warehouse_transfer_lines warehouse_transfer_lines_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_lines
    ADD CONSTRAINT warehouse_transfer_lines_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservation_company_id_transfer_line_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservation_company_id_transfer_line_id_fkey FOREIGN KEY (company_id, transfer_line_id) REFERENCES warehouse_transfer_lines(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_location_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_location_id_fkey FOREIGN KEY (company_id, location_id) REFERENCES locations(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_lot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_lot_id_fkey FOREIGN KEY (company_id, lot_id) REFERENCES lots(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_product_id_fkey FOREIGN KEY (company_id, product_id) REFERENCES products(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_serial_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_serial_id_fkey FOREIGN KEY (company_id, serial_id) REFERENCES serial_numbers(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_transfer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_transfer_id_fkey FOREIGN KEY (company_id, transfer_id) REFERENCES warehouse_transfers(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_variant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_variant_id_fkey FOREIGN KEY (company_id, variant_id) REFERENCES product_variants(company_id, id);

--
-- Name: warehouse_transfer_reservations warehouse_transfer_reservations_company_id_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfer_reservations
    ADD CONSTRAINT warehouse_transfer_reservations_company_id_warehouse_id_fkey FOREIGN KEY (company_id, warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_approved_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_approved_by_fkey FOREIGN KEY (company_id, approved_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_destination_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_destination_warehouse_id_fkey FOREIGN KEY (company_id, destination_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_requested_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_requested_by_fkey FOREIGN KEY (company_id, requested_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_source_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_source_warehouse_id_fkey FOREIGN KEY (company_id, source_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: warehouse_transfers warehouse_transfers_company_id_transit_warehouse_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouse_transfers
    ADD CONSTRAINT warehouse_transfers_company_id_transit_warehouse_id_fkey FOREIGN KEY (company_id, transit_warehouse_id) REFERENCES warehouses(company_id, id);

--
-- Name: warehouses warehouses_company_id_branch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouses
    ADD CONSTRAINT warehouses_company_id_branch_id_fkey FOREIGN KEY (company_id, branch_id) REFERENCES branches(company_id, id);

--
-- Name: warehouses warehouses_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouses
    ADD CONSTRAINT warehouses_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: warehouses warehouses_responsible_user_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY warehouses
    ADD CONSTRAINT warehouses_responsible_user_fk FOREIGN KEY (company_id, responsible_user_id) REFERENCES company_memberships(company_id, user_id);

--
-- Name: work_schedule_days work_schedule_days_company_id_schedule_version_id_template_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_days
    ADD CONSTRAINT work_schedule_days_company_id_schedule_version_id_template_fkey FOREIGN KEY (company_id, schedule_version_id, template_id) REFERENCES work_schedule_template_versions(company_id, id, template_id);

--
-- Name: work_schedule_template_versions work_schedule_template_versions_company_id_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_template_versions
    ADD CONSTRAINT work_schedule_template_versions_company_id_created_by_fkey FOREIGN KEY (company_id, created_by) REFERENCES company_memberships(company_id, user_id);

--
-- Name: work_schedule_template_versions work_schedule_template_versions_company_id_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_template_versions
    ADD CONSTRAINT work_schedule_template_versions_company_id_template_id_fkey FOREIGN KEY (company_id, template_id) REFERENCES work_schedule_templates(company_id, id);

--
-- Name: work_schedule_templates work_schedule_templates_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY work_schedule_templates
    ADD CONSTRAINT work_schedule_templates_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id);

--
-- Name: api_token_branch_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE api_token_branch_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: api_token_warehouse_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE api_token_warehouse_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: api_tokens; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE api_tokens ENABLE ROW LEVEL SECURITY;

--
-- Name: asset_assignments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE asset_assignments ENABLE ROW LEVEL SECURITY;

--
-- Name: branches; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE branches ENABLE ROW LEVEL SECURITY;

--
-- Name: command_idempotency_records; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE command_idempotency_records ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_document_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_document_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_document_sources; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_document_sources ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_effect_claims; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_effect_claims ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_line_allocations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_line_allocations ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_line_registry; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_line_registry ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_party_snapshots; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_party_snapshots ENABLE ROW LEVEL SECURITY;

--
-- Name: commercial_status_history; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE commercial_status_history ENABLE ROW LEVEL SECURITY;

--
-- Name: company_business_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_business_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: api_token_branch_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON api_token_branch_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: api_token_warehouse_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON api_token_warehouse_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: api_tokens company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON api_tokens USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: asset_assignments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON asset_assignments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: branches company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON branches USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: command_idempotency_records company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON command_idempotency_records USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_document_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_document_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_document_sources company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_document_sources USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_effect_claims company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_effect_claims USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_line_allocations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_line_allocations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_line_registry company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_line_registry USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_party_snapshots company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_party_snapshots USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: commercial_status_history company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON commercial_status_history USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_business_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_business_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_memberships company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_memberships USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_modules company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_modules USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_party_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_party_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_product_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_product_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_secrets company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_secrets USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_smtp_settings company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON company_smtp_settings USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: document_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON document_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: document_reversals company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON document_reversals USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: document_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON document_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: document_status_history company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON document_status_history USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: document_types company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON document_types USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: documents company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON documents USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: edocument_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON edocument_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: edocuments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON edocuments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: email_message_recipients company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON email_message_recipients USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: email_messages company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON email_messages USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: email_templates company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON email_templates USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_addresses company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_addresses USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_advance_transactions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_advance_transactions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_advances company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_advances USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_documents company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_documents USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_legal_deductions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_legal_deductions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_payroll_components company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_payroll_components USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_payroll_year_openings company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_payroll_year_openings USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_payrolls company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_payrolls USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_private_profiles company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_private_profiles USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employee_schedule_assignments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employee_schedule_assignments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employees company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employees USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employment_terms company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employment_terms USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: employments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON employments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: exchange_rate_settings company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON exchange_rate_settings USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: exchange_rates company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON exchange_rates USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: export_artifacts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON export_artifacts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: export_jobs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON export_jobs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_account_movements company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_account_movements USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_accounts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_accounts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_instrument_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_instrument_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_instruments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_instruments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_invoice_open_item_reversals company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_invoice_open_item_reversals USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_invoice_open_items company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_invoice_open_items USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_invoice_postings company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_invoice_postings USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_manual_entries company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_manual_entries USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_party_transfers company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_party_transfers USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_payment_allocations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_payment_allocations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_payments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_payments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_period_locks company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_period_locks USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: finance_transfers company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON finance_transfers USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: fixed_asset_categories company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON fixed_asset_categories USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: fixed_assets company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON fixed_assets USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: goods_receipt_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON goods_receipt_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: goods_receipts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON goods_receipts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: import_jobs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON import_jobs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: import_mappings company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON import_mappings USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: import_row_results company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON import_row_results USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: inventory_company_policies company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON inventory_company_policies USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: leave_types company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON leave_types USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: locations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON locations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: lots company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON lots USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: membership_branch_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON membership_branch_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: membership_finance_account_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON membership_finance_account_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: membership_roles company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON membership_roles USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: membership_warehouse_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON membership_warehouse_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: outbox_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON outbox_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: parties company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON parties USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_addresses company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_addresses USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_contacts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_contacts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_custom_field_definitions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_custom_field_definitions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_custom_field_values company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_custom_field_values USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_group_memberships company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_group_memberships USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_groups company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_groups USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_ledger_entries company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_ledger_entries USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_search_documents company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_search_documents USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_tag_assignments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_tag_assignments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: party_tags company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON party_tags USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payment_terms company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payment_terms USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_calculation_generations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_calculation_generations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_calculation_jobs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_calculation_jobs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_component_definitions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_component_definitions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_component_treatments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_component_treatments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_contribution_schemes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_contribution_schemes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_email_batches company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_email_batches USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_email_deliveries company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_email_deliveries USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_export_jobs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_export_jobs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_export_payslips company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_export_payslips USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_income_tax_brackets company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_income_tax_brackets USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_legislation_packs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_legislation_packs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_manual_components company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_manual_components USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_payments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_payments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_payslip_jobs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_payslip_jobs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_payslips company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_payslips USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: payroll_runs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON payroll_runs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: price_list_entries company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON price_list_entries USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: price_lists company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON price_lists USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: pricing_currencies company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON pricing_currencies USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_attachments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_attachments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_barcodes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_barcodes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_brands company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_brands USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_categories company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_categories USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_image_variants company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_image_variants USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_images company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_images USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_tax_profile_components company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_tax_profile_components USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_tax_profiles company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_tax_profiles USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_units company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_units USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_variant_allowed_options company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_variant_allowed_options USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_variant_definitions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_variant_definitions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_variant_price_overrides company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_variant_price_overrides USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_variant_values company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_variant_values USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: product_variants company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON product_variants USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: products company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON products USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: public_holiday_calendars company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON public_holiday_calendars USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: public_holidays company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON public_holidays USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_invoice_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_invoice_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_invoices company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_invoices USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_landed_cost_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_landed_cost_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_landed_costs company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_landed_costs USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_order_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_order_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_orders company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_orders USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_return_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_return_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: purchase_returns company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON purchase_returns USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: role_permissions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON role_permissions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: roles company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON roles USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: sales_order_reservations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON sales_order_reservations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: sales_quotes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON sales_quotes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: security_audit_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON security_audit_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: serial_number_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON serial_number_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: serial_numbers company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON serial_numbers USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_cost_adjustments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_cost_adjustments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_cost_consumptions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_cost_consumptions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_cost_layers company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_cost_layers USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_cost_unpriced_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_cost_unpriced_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_assignments company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_assignments USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_commands company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_commands USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_counts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_counts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_number_sequences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_number_sequences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_passes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_passes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_review_exceptions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_review_exceptions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_scopes company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_scopes USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_engine_sessions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_engine_sessions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_count_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_count_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_counts company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_counts USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_movement_operation_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_movement_operation_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_movement_operations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_movement_operations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_movements company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_movements USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: stock_positions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON stock_positions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: supplier_product_references company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON supplier_product_references USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: supplier_purchase_prices company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON supplier_purchase_prices USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: tax_definitions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON tax_definitions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: tax_exemptions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON tax_exemptions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: tax_rates company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON tax_rates USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: tax_withholding_rules company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON tax_withholding_rules USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: timesheet_days company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON timesheet_days USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: timesheet_periods company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON timesheet_periods USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: user_address_preferences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON user_address_preferences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: user_agenda_events company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON user_agenda_events USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: user_dashboard_preferences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON user_dashboard_preferences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: user_table_preferences company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON user_table_preferences USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: variant_definition_options company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON variant_definition_options USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: variant_definitions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON variant_definitions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: warehouse_transfer_discrepancy_resolutions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON warehouse_transfer_discrepancy_resolutions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: warehouse_transfer_lines company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON warehouse_transfer_lines USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: warehouse_transfer_reservations company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON warehouse_transfer_reservations USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: warehouse_transfers company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON warehouse_transfers USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: warehouses company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON warehouses USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: work_schedule_days company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON work_schedule_days USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: work_schedule_template_versions company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON work_schedule_template_versions USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: work_schedule_templates company_isolation; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY company_isolation ON work_schedule_templates USING (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true)))) WITH CHECK (((company_id IS NULL) OR (current_setting('varyaone.company_id'::text, true) IS NULL) OR (current_setting('varyaone.company_id'::text, true) = ''::text) OR ((company_id)::text = current_setting('varyaone.company_id'::text, true))));

--
-- Name: company_memberships; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_memberships ENABLE ROW LEVEL SECURITY;

--
-- Name: company_modules; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_modules ENABLE ROW LEVEL SECURITY;

--
-- Name: company_party_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_party_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: company_product_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_product_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: company_secrets; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_secrets ENABLE ROW LEVEL SECURITY;

--
-- Name: company_smtp_settings; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE company_smtp_settings ENABLE ROW LEVEL SECURITY;

--
-- Name: document_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE document_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: document_reversals; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE document_reversals ENABLE ROW LEVEL SECURITY;

--
-- Name: document_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE document_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: document_status_history; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE document_status_history ENABLE ROW LEVEL SECURITY;

--
-- Name: document_types; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE document_types ENABLE ROW LEVEL SECURITY;

--
-- Name: documents; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE documents ENABLE ROW LEVEL SECURITY;

--
-- Name: edocument_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE edocument_events ENABLE ROW LEVEL SECURITY;

--
-- Name: edocuments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE edocuments ENABLE ROW LEVEL SECURITY;

--
-- Name: email_message_recipients; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE email_message_recipients ENABLE ROW LEVEL SECURITY;

--
-- Name: email_messages; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE email_messages ENABLE ROW LEVEL SECURITY;

--
-- Name: email_templates; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE email_templates ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_addresses; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_addresses ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_advance_transactions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_advance_transactions ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_advances; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_advances ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_documents; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_documents ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_legal_deductions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_legal_deductions ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_payroll_components; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_payroll_components ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_payroll_year_openings; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_payroll_year_openings ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_payrolls; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_payrolls ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_private_profiles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_private_profiles ENABLE ROW LEVEL SECURITY;

--
-- Name: employee_schedule_assignments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employee_schedule_assignments ENABLE ROW LEVEL SECURITY;

--
-- Name: employees; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employees ENABLE ROW LEVEL SECURITY;

--
-- Name: employment_terms; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employment_terms ENABLE ROW LEVEL SECURITY;

--
-- Name: employments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE employments ENABLE ROW LEVEL SECURITY;

--
-- Name: exchange_rate_settings; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE exchange_rate_settings ENABLE ROW LEVEL SECURITY;

--
-- Name: exchange_rates; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE exchange_rates ENABLE ROW LEVEL SECURITY;

--
-- Name: export_artifacts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE export_artifacts ENABLE ROW LEVEL SECURITY;

--
-- Name: export_jobs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE export_jobs ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_account_movements; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_account_movements ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_accounts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_accounts ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_instrument_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_instrument_events ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_instruments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_instruments ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_open_item_reversals; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_invoice_open_item_reversals ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_open_items; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_invoice_open_items ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_invoice_postings; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_invoice_postings ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_manual_entries; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_manual_entries ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_party_transfers; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_party_transfers ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_payment_allocations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_payment_allocations ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_payments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_payments ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_period_locks; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_period_locks ENABLE ROW LEVEL SECURITY;

--
-- Name: finance_transfers; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE finance_transfers ENABLE ROW LEVEL SECURITY;

--
-- Name: fixed_asset_categories; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE fixed_asset_categories ENABLE ROW LEVEL SECURITY;

--
-- Name: fixed_assets; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE fixed_assets ENABLE ROW LEVEL SECURITY;

--
-- Name: goods_receipt_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE goods_receipt_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: goods_receipts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE goods_receipts ENABLE ROW LEVEL SECURITY;

--
-- Name: import_jobs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE import_jobs ENABLE ROW LEVEL SECURITY;

--
-- Name: import_mappings; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE import_mappings ENABLE ROW LEVEL SECURITY;

--
-- Name: import_row_results; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE import_row_results ENABLE ROW LEVEL SECURITY;

--
-- Name: inventory_company_policies; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE inventory_company_policies ENABLE ROW LEVEL SECURITY;

--
-- Name: leave_types; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE leave_types ENABLE ROW LEVEL SECURITY;

--
-- Name: locations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE locations ENABLE ROW LEVEL SECURITY;

--
-- Name: lots; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE lots ENABLE ROW LEVEL SECURITY;

--
-- Name: membership_branch_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE membership_branch_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: membership_finance_account_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE membership_finance_account_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: membership_roles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE membership_roles ENABLE ROW LEVEL SECURITY;

--
-- Name: membership_warehouse_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE membership_warehouse_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: outbox_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE outbox_events ENABLE ROW LEVEL SECURITY;

--
-- Name: parties; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE parties ENABLE ROW LEVEL SECURITY;

--
-- Name: party_addresses; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_addresses ENABLE ROW LEVEL SECURITY;

--
-- Name: party_contacts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_contacts ENABLE ROW LEVEL SECURITY;

--
-- Name: party_custom_field_definitions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_custom_field_definitions ENABLE ROW LEVEL SECURITY;

--
-- Name: party_custom_field_values; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_custom_field_values ENABLE ROW LEVEL SECURITY;

--
-- Name: party_group_memberships; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_group_memberships ENABLE ROW LEVEL SECURITY;

--
-- Name: party_groups; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_groups ENABLE ROW LEVEL SECURITY;

--
-- Name: party_ledger_entries; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_ledger_entries ENABLE ROW LEVEL SECURITY;

--
-- Name: party_search_documents; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_search_documents ENABLE ROW LEVEL SECURITY;

--
-- Name: party_tag_assignments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_tag_assignments ENABLE ROW LEVEL SECURITY;

--
-- Name: party_tags; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE party_tags ENABLE ROW LEVEL SECURITY;

--
-- Name: payment_terms; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payment_terms ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_calculation_generations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_calculation_generations ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_calculation_jobs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_calculation_jobs ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_component_definitions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_component_definitions ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_component_treatments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_component_treatments ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_contribution_schemes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_contribution_schemes ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_email_batches; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_email_batches ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_email_deliveries; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_email_deliveries ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_export_jobs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_export_jobs ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_export_payslips; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_export_payslips ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_income_tax_brackets; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_income_tax_brackets ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_legislation_packs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_legislation_packs ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_manual_components; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_manual_components ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_payments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_payments ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_payslip_jobs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_payslip_jobs ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_payslips; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_payslips ENABLE ROW LEVEL SECURITY;

--
-- Name: payroll_runs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE payroll_runs ENABLE ROW LEVEL SECURITY;

--
-- Name: price_list_entries; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE price_list_entries ENABLE ROW LEVEL SECURITY;

--
-- Name: price_lists; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE price_lists ENABLE ROW LEVEL SECURITY;

--
-- Name: pricing_currencies; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE pricing_currencies ENABLE ROW LEVEL SECURITY;

--
-- Name: product_attachments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_attachments ENABLE ROW LEVEL SECURITY;

--
-- Name: product_barcodes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_barcodes ENABLE ROW LEVEL SECURITY;

--
-- Name: product_brands; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_brands ENABLE ROW LEVEL SECURITY;

--
-- Name: product_categories; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_categories ENABLE ROW LEVEL SECURITY;

--
-- Name: product_image_variants; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_image_variants ENABLE ROW LEVEL SECURITY;

--
-- Name: product_images; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_images ENABLE ROW LEVEL SECURITY;

--
-- Name: product_tax_profile_components; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_tax_profile_components ENABLE ROW LEVEL SECURITY;

--
-- Name: product_tax_profiles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_tax_profiles ENABLE ROW LEVEL SECURITY;

--
-- Name: product_units; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_units ENABLE ROW LEVEL SECURITY;

--
-- Name: product_variant_allowed_options; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_variant_allowed_options ENABLE ROW LEVEL SECURITY;

--
-- Name: product_variant_definitions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_variant_definitions ENABLE ROW LEVEL SECURITY;

--
-- Name: product_variant_price_overrides; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_variant_price_overrides ENABLE ROW LEVEL SECURITY;

--
-- Name: product_variant_values; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_variant_values ENABLE ROW LEVEL SECURITY;

--
-- Name: product_variants; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE product_variants ENABLE ROW LEVEL SECURITY;

--
-- Name: products; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE products ENABLE ROW LEVEL SECURITY;

--
-- Name: public_holiday_calendars; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE public_holiday_calendars ENABLE ROW LEVEL SECURITY;

--
-- Name: public_holidays; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE public_holidays ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_invoice_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_invoice_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_invoices; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_invoices ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_landed_cost_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_landed_cost_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_landed_costs; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_landed_costs ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_order_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_order_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_orders; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_orders ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_return_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_return_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: purchase_returns; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE purchase_returns ENABLE ROW LEVEL SECURITY;

--
-- Name: role_permissions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE role_permissions ENABLE ROW LEVEL SECURITY;

--
-- Name: roles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE roles ENABLE ROW LEVEL SECURITY;

--
-- Name: sales_order_reservations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE sales_order_reservations ENABLE ROW LEVEL SECURITY;

--
-- Name: sales_quotes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE sales_quotes ENABLE ROW LEVEL SECURITY;

--
-- Name: security_audit_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE security_audit_events ENABLE ROW LEVEL SECURITY;

--
-- Name: serial_number_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE serial_number_events ENABLE ROW LEVEL SECURITY;

--
-- Name: serial_numbers; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE serial_numbers ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_cost_adjustments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_cost_adjustments ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_cost_consumptions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_cost_consumptions ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_cost_layers; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_cost_layers ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_cost_unpriced_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_cost_unpriced_events ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_assignments; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_assignments ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_commands; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_commands ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_counts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_counts ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_events ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_number_sequences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_number_sequences ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_passes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_passes ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_review_exceptions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_review_exceptions ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_scopes; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_scopes ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_engine_sessions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_engine_sessions ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_count_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_count_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_counts; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_counts ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_movement_operation_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_movement_operation_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_movement_operations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_movement_operations ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_movements; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_movements ENABLE ROW LEVEL SECURITY;

--
-- Name: stock_positions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE stock_positions ENABLE ROW LEVEL SECURITY;

--
-- Name: supplier_product_references; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE supplier_product_references ENABLE ROW LEVEL SECURITY;

--
-- Name: supplier_purchase_prices; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE supplier_purchase_prices ENABLE ROW LEVEL SECURITY;

--
-- Name: tax_definitions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE tax_definitions ENABLE ROW LEVEL SECURITY;

--
-- Name: tax_exemptions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE tax_exemptions ENABLE ROW LEVEL SECURITY;

--
-- Name: tax_rates; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE tax_rates ENABLE ROW LEVEL SECURITY;

--
-- Name: tax_withholding_rules; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE tax_withholding_rules ENABLE ROW LEVEL SECURITY;

--
-- Name: timesheet_days; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE timesheet_days ENABLE ROW LEVEL SECURITY;

--
-- Name: timesheet_periods; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE timesheet_periods ENABLE ROW LEVEL SECURITY;

--
-- Name: user_address_preferences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE user_address_preferences ENABLE ROW LEVEL SECURITY;

--
-- Name: user_agenda_events; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE user_agenda_events ENABLE ROW LEVEL SECURITY;

--
-- Name: user_dashboard_preferences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE user_dashboard_preferences ENABLE ROW LEVEL SECURITY;

--
-- Name: user_table_preferences; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE user_table_preferences ENABLE ROW LEVEL SECURITY;

--
-- Name: variant_definition_options; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE variant_definition_options ENABLE ROW LEVEL SECURITY;

--
-- Name: variant_definitions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE variant_definitions ENABLE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_discrepancy_resolutions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE warehouse_transfer_discrepancy_resolutions ENABLE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_lines; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE warehouse_transfer_lines ENABLE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfer_reservations; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE warehouse_transfer_reservations ENABLE ROW LEVEL SECURITY;

--
-- Name: warehouse_transfers; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE warehouse_transfers ENABLE ROW LEVEL SECURITY;

--
-- Name: warehouses; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE warehouses ENABLE ROW LEVEL SECURITY;

--
-- Name: work_schedule_days; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE work_schedule_days ENABLE ROW LEVEL SECURITY;

--
-- Name: work_schedule_template_versions; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE work_schedule_template_versions ENABLE ROW LEVEL SECURITY;

--
-- Name: work_schedule_templates; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE work_schedule_templates ENABLE ROW LEVEL SECURITY;

--
--

--
-- Company-isolation RLS for the typed sales documents. In the pre-squash
-- history these tables were created with CREATE TABLE ... (LIKE sales_quotes
-- INCLUDING ...), so the static CompanyScopedTables() parser never saw their
-- company_id column and 000147_row_level_security omitted them. The squashed
-- baseline emits their columns literally, so close the gap here. Same
-- transparent policy shape as every other company-scoped table.
--
DO $$
DECLARE
  t text;
BEGIN
  FOREACH t IN ARRAY ARRAY[
    'sales_orders','sales_order_lines',
    'sales_dispatches','sales_dispatch_lines',
    'sales_invoices','sales_invoice_lines',
    'sales_returns','sales_return_lines',
    'sales_quote_lines'
  ] LOOP
    EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t);
    EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY', t);
    EXECUTE format($p$
      CREATE POLICY company_isolation ON %I
        USING (
          company_id IS NULL
          OR current_setting('varyaone.company_id', true) IS NULL
          OR current_setting('varyaone.company_id', true) = ''
          OR company_id::text = current_setting('varyaone.company_id', true)
        )
        WITH CHECK (
          company_id IS NULL
          OR current_setting('varyaone.company_id', true) IS NULL
          OR current_setting('varyaone.company_id', true) = ''
          OR company_id::text = current_setting('varyaone.company_id', true)
        )$p$, t);
  END LOOP;
END
$$;
