--liquibase formatted sql


-- ============================================================================
--changeset hs-office-partner-DETAILS-TABLE:1 endDelimiter:--//
-- ----------------------------------------------------------------------------

create table hs_office_partner_details
(
    uuid                uuid unique references RbacObject (uuid) initially deferred,
    registrationOffice  varchar(96),
    registrationNumber  varchar(96),
    birthPlace          varchar(96),
    birthName           varchar(96),
    birthday            date,
    dateOfDeath         date
);
--//


-- ============================================================================
--changeset hs-office-partner-DETAILS-TABLE-JOURNAL:1 endDelimiter:--//
-- ----------------------------------------------------------------------------

call create_journal('hs_office_partner_details');
--//

-- ============================================================================
--changeset hs-office-partner-MAIN-TABLE:1 endDelimiter:--//
-- ----------------------------------------------------------------------------

create table hs_office_partner
(
    uuid                uuid unique references RbacObject (uuid) initially deferred,
    partnerNumber       numeric(5) unique not null,
    partnerRelUuid     uuid not null references hs_office_relation(uuid), -- TODO: delete in after delete trigger
    personUuid          uuid not null references hs_office_person(uuid), -- TODO: remove, replaced by partnerRelUuid
    contactUuid         uuid not null references hs_office_contact(uuid), -- TODO: remove, replaced by partnerRelUuid
    detailsUuid         uuid not null references hs_office_partner_details(uuid) -- deleted in after delete trigger
);
--//


-- ============================================================================
--changeset hs-office-partner-DELETE-DETAILS-TRIGGER:1 endDelimiter:--//
-- ----------------------------------------------------------------------------


/**
    Trigger function to delete related details of a partner to delete.
 */
create or replace function deleteHsOfficeDetailsOnPartnerDelete()
    returns trigger
    language PLPGSQL
as $$
declare
    counter integer;
begin
    DELETE FROM hs_office_partner_details d WHERE d.uuid = OLD.detailsUuid;
    GET DIAGNOSTICS counter = ROW_COUNT;
    if counter = 0 then
        raise exception 'partner details % could not be deleted', OLD.detailsUuid;
    end if;
    RETURN OLD;
end; $$;

/**
    Triggers deletion of related details of a partner to delete.
 */
create trigger hs_office_partner_delete_details_trigger
    after delete
    on hs_office_partner
    for each row
        execute procedure deleteHsOfficeDetailsOnPartnerDelete();

-- ============================================================================
--changeset hs-office-partner-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
-- ----------------------------------------------------------------------------

call create_journal('hs_office_partner');
--//