SET TERM ^ ;

CREATE OR ALTER procedure PP_EST_REL_CBCTRLCONSUMONEW (
    TIPO char(1),
    DT_INI date,
    DT_FIM date)
returns (
    CD_PRODUTO_BASE integer,
    NM_PRODUTO_BASE varchar(100),
    CD_PRODUTO integer,
    NM_PRODUTO varchar(100),
    UNIDADE varchar(3),
    CONCENTRACAO varchar(100),
    CD_PRINCIPIO varchar(15),
    NM_PRINCIPIO varchar(100),
    CD_CLIENTE integer,
    NM_CLIENTE varchar(100),
    TP_ATENDIMENTO varchar(14),
    CD_ATENDIMENTO integer,
    QUARTO_LEITO varchar(10),
    DT_INICIAL_ATENDIMENTO date,
    DT_FINAL_ATENDIMENTO date,
    CD_CONVENIO integer,
    NM_CONVENIO varchar(100),
    CD_MEDICO integer,
    NM_MEDICO varchar(100),
    CPF_MEDICO varchar(18),
    CRM_MEDICO varchar(15),
    QT_SAIDA double precision,
    QT_DEVOLVIDO double precision,
    DT_MOVIMENTO varchar(1000),
    DT_MOV_ORDER date)
as
declare variable VAR_FL_CAMPO varchar(100);
declare variable VAR_COD_GRP_PSICOTROPICO varchar(20);
declare variable VAR_DT_MOV date;
declare variable VAR_QT integer;
declare variable VAR_DT_MOV_ORDER date;
declare variable SIGLA varchar(10);
declare variable VAR_TEMP_DT_MOVIMENTO varchar(1000);
BEGIN
    
    -- Selecionando / Extraindo / Setando ---> DATA INICIAL
    SELECT ONLY_DATE FROM DATE_EXTRACT_DATE(:DT_INI) INTO :DT_INI;
    DT_INI = :DT_INI || ' 00:00:00';

    -- Selecionando / Extraindo / Setando ---> DATA FINAL
    SELECT ONLY_DATE FROM DATE_EXTRACT_DATE(:DT_FIM) INTO :DT_FIM;
    DT_FIM = :DT_FIM || ' 23:59:59';

    -- Setando VAR_FL_CAMPO com null para deixa-la 'vazia/limpa'
    VAR_FL_CAMPO = '';

    -- Conforme o TIPO setar corretamente o valor de VAR_FL_CAMPO
    IF (:TIPO = 'A') THEN --Antibioticos
        BEGIN
            VAR_FL_CAMPO = '(''FL_CD_GRP_ANTIBIOTICO'')';
        END
    ELSE IF (:TIPO = 'P') THEN --Psicotropicos
        BEGIN
            VAR_FL_CAMPO = '(''FL_CD_GRP_PSICOTROPICO_A'',''FL_CD_GRP_PSICOTROPICO_B'')';
        END

    FOR
        EXECUTE STATEMENT
        'SELECT VALOR FROM CONFIGSYSTEM WHERE TABELA = ''EMPRESA'' AND COD1=''1'' AND CAMPO IN '||:VAR_FL_CAMPO
        INTO :VAR_COD_GRP_PSICOTROPICO

        -- Pega os dados do cliente e o tipo do atendimento
        DO BEGIN
            FOR
                select
                    codigo, nome, cd_produto_hosp, nm_produto, cd_unidade, apresentacao, cliente,
                    cl_nome, tp_operacao, cod_operacao, codconvenio, convenio, sigla, qt, qt_dev
                from(
                    SELECT
                        PR.CODIGO,
                        PR.NOME,
                        --PR.UNIDADE,
                        --PR.CONCENTRACAO,
                        PH.CD_PRODUTO_HOSP,
                        PH.NM_PRODUTO,
                        PH.CD_UNIDADE,
                        PH.APRESENTACAO,
                        EM.CLIENTE,
                        CL.NOME AS CL_NOME,
                        CASE EQ.TIPO_OPERACAO
                            WHEN 'SPP' THEN 'P. Atendimento'
                            WHEN 'SPA' THEN 'Internamento'
                        END AS TP_OPERACAO,
                        CASE EQ.TIPO_OPERACAO
                            WHEN 'SPP' THEN EM.CD_PRONTOATENDIMENTO
                            WHEN 'SPA' THEN EM.INTERNACAO
                        END AS COD_OPERACAO,
                        EM.CODCONVENIO,
                        CO.CONVENIO,
                        '' AS SIGLA,
                        SUM(COALESCE(EQ.QUANTIDADE, 0)) AS QT,
                        SUM(COALESCE(EQ.QUANTIDADE_DEVOLVIDA, 0)) AS QT_DEV
                    FROM
                        ESTMOVIMENTOS EM
                        INNER JOIN CLIENTES CL ON (EM.CLIENTE = CL.REGISTRO)
                        INNER JOIN CONVENIOS CO ON (CO.COD = EM.CODCONVENIO)
                        INNER JOIN ESTMOVIQUANTIDADE EQ ON (EQ.CONTROL = EM.CONTROL)
                        INNER JOIN PRODUTOS PR ON (PR.CODIGO = EQ.PRODUTO)
                        INNER JOIN EST_PRODUTOS_HOSPITAL PH ON (PH.CD_PRODUTO_HOSP = PR.CD_PRODUTO_HOSP)
                    WHERE
                        (EM.DATA_MOVIMENTO BETWEEN :DT_INI AND :DT_FIM) AND
                        EM.REG_CONFIRMADO = 'T' AND
                        EQ.REG_CONFIRMADO = 'T' AND
                        PH.FL_CONTROLE_ESPECIAL = 'F' AND
                        PH.CD_GRUPO  = :VAR_COD_GRP_PSICOTROPICO
                    GROUP BY
                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
                    UNION ALL
                    SELECT
                        PR.CODIGO,
                        PR.NOME,
                        --PR.UNIDADE,
                        --PR.CONCENTRACAO,
                        PH.CD_PRODUTO_HOSP,
                        PH.NM_PRODUTO,
                        PH.CD_UNIDADE,
                        PH.APRESENTACAO,
                        EM.CLIENTE,
                        CL.NOME AS CL_NOME,
                        CASE EMC.TIPO_OPERACAO
                            WHEN 'SPP' THEN 'P. Atendimento'
                            WHEN 'SPA' THEN 'Internamento'
                        END AS TP_OPERACAO,
                        CASE EMC.TIPO_OPERACAO
                            WHEN 'SPP' THEN EM.CD_PRONTOATENDIMENTO
                            WHEN 'SPA' THEN EM.INTERNACAO
                        END AS COD_OPERACAO,
                        EM.CODCONVENIO,
                        CO.CONVENIO,
                        ICE.SG_ICE_TIPO_USO,
                        SUM(COALESCE(EQI.QUANTIDADE, 0)) AS QT,
                        SUM(COALESCE(0, 0)) AS QT_DEV
                    FROM
                        ESTMOVIMENTOS EM
                        INNER JOIN CLIENTES CL ON (EM.CLIENTE = CL.REGISTRO)
                        INNER JOIN CONVENIOS CO ON (CO.COD = EM.CODCONVENIO)
                        INNER JOIN ESTMOVIQUANTIDADE_ICE EQI ON (EQI.CONTROL = EM.CONTROL)
                        INNER JOIN ESTMOVICONTROL EMC ON (EMC.NUMERO = EM.CONTROL)
                        INNER JOIN EST_LOTE_ESTOQUE_ITENS ELE ON (ELE.CD_BARCODE = EQI.CD_BARCODE)
                        INNER JOIN PRODUTOS PR ON (PR.CODIGO = ELE.CD_PRODUTO)
                        INNER JOIN EST_PRODUTOS_HOSPITAL PH ON (PH.CD_PRODUTO_HOSP = PR.CD_PRODUTO_HOSP)
                        INNER JOIN EST_ICE_TIPO_USO ICE ON (ICE.ID = PH.CD_ICE_TIPO_USO)
                    WHERE
                        (EM.DATA_MOVIMENTO BETWEEN :DT_INI AND :DT_FIM) AND
                        --EM.REG_CONFIRMADO = 'T' AND
                        PH.FL_CONTROLE_ESPECIAL = 'T' AND
                        PH.CD_GRUPO  = :VAR_COD_GRP_PSICOTROPICO
                    GROUP BY
                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
                )
                ORDER BY
                    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
                INTO
                    :CD_PRODUTO_BASE, :NM_PRODUTO_BASE, :CD_PRODUTO, :NM_PRODUTO, :UNIDADE, :CONCENTRACAO, :CD_CLIENTE,
                    :NM_CLIENTE, :TP_ATENDIMENTO, :CD_ATENDIMENTO, :CD_CONVENIO,
                    :NM_CONVENIO, :SIGLA, :QT_SAIDA, :QT_DEVOLVIDO


                -- Setar as variaveis de acordo com a necessiadade entao pega a data do movimento e a quantidade que foi usada para esta data
                DO BEGIN
                    VAR_QT = 0;
                    VAR_DT_MOV_ORDER = NULL;
                    DT_MOV_ORDER = NULL;
                    DT_MOVIMENTO = '';
                    FOR
                        select
                            data_movimento, data_mov_order, quantidade
                        from(
                            SELECT
                                EM.DATA_MOVIMENTO,
                                EM.DATA_MOVIMENTO AS DATA_MOV_ORDER,
                                SUM(COALESCE(EQ.QUANTIDADE, 0)) - SUM(COALESCE(EQ.QUANTIDADE_DEVOLVIDA, 0)) AS QUANTIDADE
                            FROM
                                ESTMOVIMENTOS EM
                                INNER JOIN CLIENTES CL ON (EM.CLIENTE = CL.REGISTRO)
                                INNER JOIN CONVENIOS CONV ON (CONV.COD = EM.CODCONVENIO)
                                INNER JOIN ESTMOVIQUANTIDADE EQ ON (EQ.CONTROL = EM.CONTROL)
                                INNER JOIN PRODUTOS PR ON (PR.CODIGO = EQ.PRODUTO)
                                INNER JOIN EST_PRODUTOS_HOSPITAL PH ON (PH.CD_PRODUTO_HOSP = PR.CD_PRODUTO_HOSP)
                            WHERE
                                (EM.DATA_MOVIMENTO BETWEEN :DT_INI AND :DT_FIM) AND
                                EM.REG_CONFIRMADO = 'T' AND
                                EQ.REG_CONFIRMADO = 'T' AND
                                PH.CD_GRUPO  = :VAR_COD_GRP_PSICOTROPICO AND
                                PH.CD_PRODUTO_HOSP = :CD_PRODUTO AND
                                PH.FL_CONTROLE_ESPECIAL = 'F' AND
                                EM.CODCONVENIO = :CD_CONVENIO AND
                                EM.CLIENTE = :CD_CLIENTE
                            GROUP BY
                                1
                            UNION ALL
                            SELECT
                                EM.DATA_MOVIMENTO,
                                EM.DATA_MOVIMENTO AS DATA_MOV_ORDER,
                                SUM(COALESCE(EQI.QUANTIDADE, 0)) AS QUANTIDADE
                            FROM
                                ESTMOVIMENTOS EM
                                INNER JOIN CLIENTES CL ON (EM.CLIENTE = CL.REGISTRO)
                                INNER JOIN CONVENIOS CONV ON (CONV.COD = EM.CODCONVENIO)
                                INNER JOIN ESTMOVIQUANTIDADE_ICE EQI ON (EQI.CONTROL = EM.CONTROL)
                                INNER JOIN EST_LOTE_ESTOQUE_ITENS ELE ON (ELE.CD_BARCODE = EQI.CD_BARCODE)
                                INNER JOIN PRODUTOS PR ON (PR.CODIGO = ELE.CD_PRODUTO)
                                INNER JOIN EST_PRODUTOS_HOSPITAL PH ON (PH.CD_PRODUTO_HOSP = PR.CD_PRODUTO_HOSP)
                            WHERE
                                (EM.DATA_MOVIMENTO BETWEEN :DT_INI AND :DT_FIM) AND
                                EM.REG_CONFIRMADO = 'T' AND
                                PH.CD_GRUPO  = :VAR_COD_GRP_PSICOTROPICO AND
                                PH.CD_PRODUTO_HOSP = :CD_PRODUTO AND
                                PH.FL_CONTROLE_ESPECIAL = 'T' AND
                                EM.CODCONVENIO = :CD_CONVENIO AND
                                EM.CLIENTE = :CD_CLIENTE
                            GROUP BY
                                1
                        )
                        ORDER BY
                            1
                        INTO
                            :VAR_DT_MOV, :VAR_DT_MOV_ORDER, :VAR_QT

                        -- Se DT_MOVIMENTO tiver vazio extrair a data e setar ao DT_MOVIMENTO, DT_MOV_ORDER guarda essa que sera a primeira data da sequencia
                        -- Senao DT_MOVIMENTO recebe ela mesma concatenando junto a data da vez
                        DO BEGIN
                            var_temp_dt_movimento = '';

                            var_temp_dt_movimento = EXTRACT(DAY FROM :VAR_DT_MOV)
                                            ||'/'||EXTRACT(MONTH FROM :VAR_DT_MOV)
                                            ||'/'||EXTRACT(YEAR FROM :VAR_DT_MOV);

                            if  (:SIGLA = '') THEN
                              var_temp_dt_movimento = :var_temp_dt_movimento
                                                ||'('||:VAR_QT||')';

                            if  (:SIGLA <> '') THEN
                              var_temp_dt_movimento = :var_temp_dt_movimento
                                                ||'('||:VAR_QT||' '||:SIGLA||')';

                            if (:DT_MOVIMENTO = '') THEN
                              DT_MOV_ORDER = VAR_DT_MOV_ORDER;

                            IF(:DT_MOVIMENTO <> '')THEN
                            begin
                              if ( (CHAR_LENGTH(:DT_MOVIMENTO || ', '||:var_temp_dt_movimento) < 1000)) THEN
                                var_temp_dt_movimento = :DT_MOVIMENTO || ', '||:var_temp_dt_movimento;

                              if ( (CHAR_LENGTH(:DT_MOVIMENTO || ', '||:var_temp_dt_movimento) > 1000)
                                and (CHAR_LENGTH(:DT_MOVIMENTO || ', ... ') < 1000)) THEN
                                var_temp_dt_movimento = :DT_MOVIMENTO  || ', ... ';

                            end


                            DT_MOVIMENTO = :var_temp_dt_movimento;

                        END

                        -- Se TP_ATENDIMENTO for Pronto Atendimento pegue os dados do medico para este atendimento
                        -- Senao se TP_ATENDIMENTO for Internamento pegue os dados do medico para este atendimento
                        -- Senao sete os campos como null
                        IF (:TP_ATENDIMENTO = 'P. Atendimento') THEN
                            BEGIN
                                SELECT
                                    COD_MEDICO,
                                    MEDICO,
                                    CPF,
                                    CRM,
                                    DATA,
                                    DATA
                                FROM
                                    PARANAGUA_ENTIQUETAS
                                    INNER JOIN MEDICOS ON (COD = COD_MEDICO)
                                WHERE
                                    COD_ID = :CD_ATENDIMENTO
                                INTO
                                    :CD_MEDICO, :NM_MEDICO, :CPF_MEDICO, :CRM_MEDICO,
                                    :DT_INICIAL_ATENDIMENTO, :DT_FINAL_ATENDIMENTO;
                                QUARTO_LEITO = ' - ';
                            END
                        ELSE IF (:TP_ATENDIMENTO = 'Internamento') THEN
                            BEGIN
                                SELECT
                                    CD_MEDICO,
                                    NM_MEDICO,
                                    MED_INT_CPF,
                                    MED_INT_NR_CONSELHO,
                                    DT_INTERNACAO,
                                    COALESCE(DT_ALTA,cast(CURRENT_TIMESTAMP as date)),
                                    CD_QUARTO||'/'||LEITO
                                FROM
                                    PP_INT_GET_DETALHES_INTERNACAO(:CD_ATENDIMENTO)
                                INTO
                                    :CD_MEDICO,:NM_MEDICO,:CPF_MEDICO,:CRM_MEDICO,
                                    :DT_INICIAL_ATENDIMENTO,:DT_FINAL_ATENDIMENTO,:QUARTO_LEITO;
                            END
                        ELSE
                            BEGIN
                                CD_MEDICO = NULL;
                                NM_MEDICO = NULL;
                                CPF_MEDICO = NULL;
                                CRM_MEDICO = NULL;
                                DT_INICIAL_ATENDIMENTO = NULL;
                                DT_FINAL_ATENDIMENTO = NULL;
                            END

                        -- CD_PRINCIPIO e NM_PRINCIPIO setados com vazios para deixalos 'limpos/vazio'
                        CD_PRINCIPIO = '';
                        NM_PRINCIPIO = '';

                        -- Pegar o primeiro CD_PRINCIPIO e NM_PRINCIPIO para este produto
                        SELECT FIRST 1
                            DCB.COD_PADRAO,
                            DCB.DESCRICAO
                        FROM
                            EST_DCB DCB
                            INNER JOIN EST_PRODUTOS_PRINCIPIO PP ON (DCB.CODIGO=PP.CD_PRINCIPIO)
                        WHERE
                            PP.CD_PRODUTO = :CD_PRODUTO_BASE
                        INTO
                            :CD_PRINCIPIO, :NM_PRINCIPIO;

                        -- Se CD_PRINCIPIO for nulo CD_PRINCIPIO recebe vazio
                        IF (:CD_PRINCIPIO IS NULL) THEN
                            CD_PRINCIPIO = '';

                        ---- Se NM_PRINCIPIO for nulo NM_PRINCIPIO recebe vazio
                        IF(:NM_PRINCIPIO IS NULL) THEN
                            NM_PRINCIPIO = '';

                    SUSPEND;
                END
        END
END^

SET TERM ; ^

