SET TERM ^ ;

CREATE OR ALTER procedure SP_NOTIFICAR_ALTERACAO_CARDAPIO (
    CARDAPIO_ID integer,
    TAG integer)
as
declare variable PESSOA_ID integer;
declare variable TOPO_PESSOA_ID integer;
declare variable RESERVA_PRATO_ID integer;
declare variable CARDAPIO_PRATO_ID integer;
declare variable LIVRE integer;
declare variable TIPO_REFEICAO varchar(100);
declare variable TIPO_DESC varchar(100);
declare variable PRATO_DESC varchar(100);
declare variable PRATOS varchar(500);
declare variable DATA_REFEICAO date;
declare variable OLD_DATA_REFEICAO date;
declare variable OLD_PRATO_DESC varchar(100);
declare variable PRATO_ID integer;
declare variable OLD_PRATO_ID integer;
declare variable COM_ALTERACAO integer;
begin

    COM_ALTERACAO = 0;
    TAG = coalesce(TAG,CARDAPIO_ID);
    for
        select
            r.tipo_registro as TOPO_PESSOA_ID,
            r.pessoa_id,
            coalesce(t.descricao,'') as TIPO_REFEICAO,
            r.cardapio_prato_id,
            C.data_refeicao,
            coalesce(c.old_data_refeicao, C.data_refeicao) as old_data_refeicao,
            C.livre
        from tbrefeicoes_reserva r
        left JOIN tbrefeicoes_cardapio C ON C.id = :CARDAPIO_ID
        left join tbrefeicoes_tipo t on t.id = C.tipo_id
        where r.cardapio_id = :CARDAPIO_ID
     into
        TOPO_PESSOA_ID,
        PESSOA_ID,
        TIPO_REFEICAO,
        cardapio_prato_id,
        data_refeicao,
        old_data_refeicao,
        livre
     do begin

        pratos = '';

        for
            select
                p.id,
                prato_id,
                old_prato_id as old_prato_id,
                coalesce(t.descricao,'Não Definido') as tipo_desc,
                coalesce(s1.descricao,'(VAZIO)') as prato_desc,
                coalesce(s2.descricao,'(VAZIO)') as old_prato_desc
            from tbrefeicoes_card_pratos p
            left join tbrefeicoes_tipo_prato t on t.id = p.tipo_prato_id
            left join tbrefeicoes_prato s1 on s1.id = p.prato_id
            left join tbrefeicoes_prato s2 on s2.id = p.old_prato_id
            where p.cardapio_id = :CARDAPIO_ID
        into
            reserva_prato_id,
            prato_id,
            old_prato_id,
            tipo_desc,
            prato_desc,
            old_prato_desc
        do begin
            if(old_prato_id is null)then
            begin
                pratos = pratos || '<br><strong>' || tipo_desc || ':</strong> ' || prato_desc     || ''||iif(reserva_prato_id = cardapio_prato_id, ' <label style="color: red">(RESERVADO)</label>', '');
            end else
            begin
                COM_ALTERACAO = 1;
                pratos = pratos || '<br><strong>' || tipo_desc || ':</strong>'  || old_prato_desc ||' <label style="color: red">alterado para</label> '|| prato_desc || ''||iif(reserva_prato_id = cardapio_prato_id, ' <label style="color: red">(RESERVADO)</label>', '');
            end
        end

        if(:data_refeicao is distinct from :old_data_refeicao)then
        begin
            COM_ALTERACAO = 1;
        end

        INSERT INTO TBNOTIFICACAO_COLABORADOR (TIPO, CARDAPIO_ID, TAG, PESSOA_ID, TOPO_PESSOA_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                   VALUES (
                    1,
                    :CARDAPIO_ID,
                    :TAG,
                    :PESSOA_ID,
                    :TOPO_PESSOA_ID,
                    0,
                    0,
                    'REFEIÇÃO "'||:TIPO_REFEICAO||'" DE '||formatdate(:data_refeicao)||' FOI ALTERADA',
                    0,
                    0,
                    current_timestamp,
                    0,
                    current_timestamp,
                    0,
                    '',
                    0,
                    '<h3>'||:TIPO_REFEICAO||' ('||formatdate(:data_refeicao)||')</h3>'||
                    iif(:data_refeicao is distinct from :old_data_refeicao, 'REFEIÇÃO FOI REPROGRAMADA DE '||formatdate(:old_data_refeicao)||' PARA '||formatdate(:data_refeicao)||'<br>','')||
                    coalesce(:pratos,'')||'<br><strong>Livre:</strong> '||iif(:livre = 1, 'Sim', 'Não')||'');
            
     end

     update tbrefeicoes_cardapio c set c.old_data_refeicao = null where c.id = :CARDAPIO_ID;
     update tbrefeicoes_card_pratos s set s.old_prato_id = null where s.cardapio_id = :CARDAPIO_ID;

     if(COM_ALTERACAO = 0)then
     begin
        delete from TBNOTIFICACAO_COLABORADOR h where h.cardapio_id = :CARDAPIO_ID and h.tag = :TAG;
     end
end
^

SET TERM ; ^

ALTER TABLE TBREFEICOES_RESERVA
    ADD AUTOMATICO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_RESERVA.AUTOMATICO IS
'reservado automaticamente';

SET TERM ^ ;

CREATE trigger ttbrefeicoes_reserva_b03u for tbrefeicoes_reserva
active before update position 3
AS
begin
  new.automatico = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_RESERVA_AUTOMATICA (
    PESSOA_ID integer,
    TIPO_PESSOA_ID integer,
    CARDAPIO_ID integer)
as
declare variable PROX_REFEICAO integer;
declare variable COLB_RESERVA integer;
declare variable PRATO_PADRAO integer;
begin
    --encontrar proxima refeicao

    for
        select
            coalesce((select first 1 a.id from tbrefeicoes_cardapio a where a.tipo_id = c.tipo_id and a.data_refeicao > c.data_refeicao order by a.data_refeicao asc),0) as PROX_REFEICAO
        from tbrefeicoes_cardapio c
        where c.id = :CARDAPIO_ID
    into
        :PROX_REFEICAO
    do begin

        if(PROX_REFEICAO > 0)then
        begin

            --encontrar se colaborador tem reserva para esta refeicao
            COLB_RESERVA = coalesce((select first 1
                                        r.cardapio_prato_id
                                    from tbrefeicoes_reserva r
                                    where r.cardapio_id = :PROX_REFEICAO
                                    and r.pessoa_id = :PESSOA_ID
                                    and r.tipo_registro = :TIPO_PESSOA_ID
                                ),0);

            if(COLB_RESERVA = 0)then
            begin
                --encontrar prato padrao
                PRATO_PADRAO = coalesce((select first 1
                                            c.id
                                        from tbrefeicoes_card_pratos c, tbrefeicoes_tipo_prato t
                                        where c.cardapio_id = :PROX_REFEICAO
                                        and t.id = c.tipo_prato_id
                                        and t.padrao = 1
                                    ),0);

                if(PRATO_PADRAO > 0)then
                begin
                    insert into TBREFEICOES_RESERVA (TIPO_REGISTRO, CARDAPIO_ID, CARDAPIO_PRATO_ID, PESSOA_ID, DATA, DATA_HORA, AUTOMATICO)
                    values (:TIPO_PESSOA_ID, :PROX_REFEICAO, :PRATO_PADRAO, :PESSOA_ID, current_date, current_timestamp, 1);
                end
            end
        end
    end
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE trigger ttbrefeicoes_registro_b02i for tbrefeicoes_registro
active before insert position 2
AS
begin
  execute procedure SPC_RESERVA_AUTOMATICA(new.pessoa_id, new.tipo_registro, new.cardapio_id);
end
^

SET TERM ; ^

