SET TERM ^ ;

ALTER PROCEDURE PP_EST_REL_CBCTRLCONSUMONEW(TIPO CHAR,
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
^

/* Alter (PP_EST_REL_CBESTOQUEATUAL) */
ALTER PROCEDURE PP_EST_REL_CBESTOQUEATUAL(DT_ESTOQUE DATE,
SUBESTOQUE VARCHAR(250))
 RETURNS(CD_SUBESTOQUE INTEGER,
NM_SUBESTOQUE VARCHAR(100),
CD_PRODUTO INTEGER,
NM_PRODUTO VARCHAR(100),
CD_GRUPO VARCHAR(15),
NM_GRUPO VARCHAR(100),
APRESENTACAO VARCHAR(100),
UNIDADE CHAR(3),
QT_ESTOQUE DOUBLE PRECISION,
VL_TOTAL DOUBLE PRECISION,
VL_ENTRADA DOUBLE PRECISION,
VL_ULT_COMPRA DOUBLE PRECISION)
 AS
declare variable VAR_CD_GRUPO_A varchar(15);
declare variable VAR_CD_PRODUTO_A integer;
declare variable VAR_CD_SUBESTOQUE_A integer;
declare variable VAR_CD_PRODUTO integer;
begin
  if (:dt_estoque is null) then
    dt_estoque = current_timestamp;

  var_cd_grupo_a      = '';
  var_cd_produto_a    = 0;
  var_cd_subestoque_a = 0;
  vl_ult_compra       = 0;

  if(:subestoque = '0')then
    begin
      for
        select li.cd_subestoque,li.cd_produto,li.vl_entrada,p.cd_produto_hosp,count(*),sum(li.vl_entrada)
        from est_lote_estoque_itens li
        inner join produtos p on (li.cd_produto=p.codigo)
        where li.dt_entrada <= :dt_estoque and
        (((li.dt_saida is null) and (li.is_utilizado='F'))
        or ((not (li.dt_saida is null))
        and (li.dt_saida >:dt_estoque)))
        and p.fl_ativo='T'
        group by 1,2,3,4 order by 1,2,3,4
        into :cd_subestoque,:var_cd_produto,:vl_entrada,:cd_produto,:qt_estoque,:vl_total
      do begin
        if (:cd_subestoque <> :var_cd_subestoque_a) then
        begin
          select descricao from estsubestoque where codigo=:cd_subestoque into :nm_subestoque;
          var_cd_subestoque_a = :cd_subestoque;
        end

        if (:var_cd_produto <> :var_cd_produto_a) then
        begin
          var_cd_produto_a = :var_cd_produto;

          select nm_produto,cd_grupo,cd_unidade,apresentacao from est_produtos_hospital
          where cd_produto_hosp = :cd_produto
          into :nm_produto,:cd_grupo,:unidade,:apresentacao;

          if (:cd_grupo <> :var_cd_grupo_a) then
          begin
            select descricao from  estgrupos where codgrupo=:cd_grupo into :nm_grupo;
            var_cd_grupo_a = :cd_grupo;
          end


          vl_ult_compra = 0;
          select first 1
            e.valor_total / e.quantidade
          from
            estentradanf nf
            inner join estmoviquantidade e on (nf.control=e.control)
            inner join produtos p on (p.codigo=e.produto)
          where
            p.cd_produto_hosp=:cd_produto
            and e.tipo_operacao = 'ENF'
            and nf.reg_confirmado='T'
          order by nf.control desc
          into :vl_ult_compra;

          if (:vl_ult_compra is null) then vl_ult_compra = 0;
  
        end

        suspend;

      end
    end
  else
    begin
      for execute statement
        ' select li.cd_subestoque,li.cd_produto,li.vl_entrada,count(*),sum(li.vl_entrada)'||
        ' from est_lote_estoque_itens li'||
        ' inner join produtos p on (li.cd_produto=p.codigo)'||
        ' where li.cd_subestoque in ('||:subestoque||') and'||
        ' li.dt_entrada <= '''||:dt_estoque||''' and'||
        ' (((li.dt_saida is null) and (li.is_utilizado=''F''))'||
        ' or ((not (li.dt_saida is null))'||
        ' and (li.dt_saida >'''||:dt_estoque||''')))'||
        ' and p.fl_ativo=''T'''||
        ' group by 1,2,3 order by 1,2,3'
        into :cd_subestoque,:var_cd_produto,:vl_entrada,:qt_estoque,:vl_total
      do begin
        if (:cd_subestoque <> :var_cd_subestoque_a) then
        begin
          select descricao from estsubestoque where codigo=:cd_subestoque into :nm_subestoque;
          var_cd_subestoque_a = :cd_subestoque;
        end

        if (:var_cd_produto <> :var_cd_produto_a) then
        begin
          select cd_produto_hosp from produtos where codigo = :var_cd_produto
          into :cd_produto;
          var_cd_produto_a = :var_cd_produto;

          select nm_produto,cd_grupo,cd_unidade,apresentacao from est_produtos_hospital
          where cd_produto_hosp = :cd_produto
          into :nm_produto,:cd_grupo,:unidade,:apresentacao;

          if (:cd_grupo <> :var_cd_grupo_a) then
          begin
            select descricao from  estgrupos where codgrupo=:cd_grupo into :nm_grupo;
            var_cd_grupo_a = :cd_grupo;
          end

          vl_ult_compra = 0;
          select first 1
            e.valor_total / e.quantidade
          from
            estentradanf nf
            inner join estmoviquantidade e on (nf.control=e.control)
            inner join produtos p on (p.codigo=e.produto)
          where
            p.cd_produto_hosp=:cd_produto
            and e.tipo_operacao = 'ENF'
            and nf.reg_confirmado='T'
          order by nf.control desc
          into :vl_ult_compra;

          if (:vl_ult_compra is null) then vl_ult_compra = 0;

        end

        suspend;
      end
    end
end
^

/* Alter (PP_FAT_TISS_PROC_CONTAS_LOTE) */
ALTER PROCEDURE PP_FAT_TISS_PROC_CONTAS_LOTE(CD_FATURA INTEGER)
 RETURNS(DT_INICIAL_ITEM DATE,
DT_FINAL_ITEM DATE,
CD_TABELA_TISS VARCHAR(10),
IS_CD_TUSS CHAR,
CD_ITEM_TEXT VARCHAR(20),
NM_ITEM VARCHAR(200),
QT_ITEM DOUBLE PRECISION,
CD_TP_VIA_ACESSO CHAR,
VL_UNIT_ITEM DOUBLE PRECISION,
VL_TOTAL_ITEM DOUBLE PRECISION,
TP_TABELA CHAR(3),
CD_DESPESA_REALIZADA INTEGER,
CD_TP_PROFISSIONAL VARCHAR(10),
CD_PROFISSIONAL INTEGER,
CPF_PROFISSIONAL VARCHAR(18),
CBO_PROFISSIONAL VARCHAR(10),
NM_PROFISSIONAL VARCHAR(100),
CRM_PROFISSIONAL VARCHAR(15),
CONS_PROFISSIONAL VARCHAR(10),
UF_PROFISSIONAL CHAR(2),
CNS_PROFISSIONAL VARCHAR(20),
IS_PROFISSIONAL_CONVENIADO CHAR,
IS_PROFISSIONAL_LABORATORIO CHAR,
CD_OPERADORA_PROFISSIONAL VARCHAR(20),
IS_CIRURGIA_VIDEO CHAR,
CD_GRUPO VARCHAR(6),
IS_GASOTERAPIA CHAR,
IS_ALUGUEL CHAR)
 AS
declare variable VAR_CD_MEDICO_HOSPITAL integer;
declare variable VAR_ITEM_VALOR_HOSPITAL char(1);
declare variable VAR_CD_TABELA integer;
declare variable VAR_CD_ITEM integer;
declare variable VAR_CD_TP_VIA_ACESSO integer;
declare variable VAR_CD_GRUPO_PAI varchar(6);
declare variable VAR_TP_ATENDIMENTO char(1);
declare variable VAR_CD_TP_PROFISSIONAL integer;
declare variable VAR_CD_PROFISSIONAL integer;
declare variable VAR_CD_CONVENIO integer;
declare variable VAR_WHILE smallint;
declare variable VAR_CD_HOSPITAL integer;
begin
  select cast(valor as integer) from configsystem c
  where c.tabela='EMPRESA'
  and c.campo='FL_MEDICO_HOSPITAL'
  and c.cod1='1' into :var_cd_medico_hospital;

  select f.tp_atendimento,f.cd_convenio from fat_faturamento f where f.id=:cd_fatura
  into :var_tp_atendimento,:var_cd_convenio;

  for
    select fi.dt_inicial_item,fi.dt_final_item,
    fi.cd_tabela,
    v.is_cd_tuss, fi.cd_item_txt, v.nm_completo, fi.qt_item,
    fi.cd_tiss_tp_via_acesso,
    fi.vl_unit_item,fi.vl_total_item,
    t.tp_tabela,
    substring(fi.cd_grupo from 1 for 2)||'.000',fi.cd_grupo,
    fi.cd_tiss_tp_profissional, fi.cd_profissional,
    coalesce(fi.is_cirurgia_video,'F'),
    fi.cd_item,
    coalesce(v.is_cobrar_valor_hospital,'F')
    from fat_faturamento_itens fi
    inner join fat_conf_tabelas_det_valor v on (v.cd_item=fi.cd_item and v.cd_tabela=fi.cd_tabela)
    inner join fat_conf_tabelas t on t.cd_conf_tabela=v.cd_tabela
    where fi.cd_faturamento = :cd_fatura
  into
    :dt_inicial_item,:dt_final_item,:var_cd_tabela,:is_cd_tuss,:cd_item_text,
    :nm_item,:qt_item,:var_cd_tp_via_acesso,:vl_unit_item,:vl_total_item,:tp_tabela,
    :var_cd_grupo_pai,:cd_grupo,:var_cd_tp_profissional,:var_cd_profissional,
    :is_cirurgia_video,:var_cd_item, :var_item_valor_hospital
  do begin
    var_while = 1;
    is_gasoterapia = 'F';
    is_aluguel = 'F';

    while(:var_while = 1) do
    begin
      var_while = 0;


      --controle para repassar os itens do profissional nao conveniado para
      --o hospital, gerando somente um registro de guia no XML TISS
      --a principio o controle so deve ser feito para externos
      --ignorando UNIMED de MARTINOPOLIS
      select nm_codcliente from EMPRESA into :var_cd_hospital;
      if ( not ((:var_cd_hospital = 30)
        and ((:var_cd_convenio = 3166) or (:var_cd_convenio = 2700)))) then
      begin
        select coalesce(pago_pelo_convenio,'4') from conv_paga_medico
          where codmedico = :var_cd_profissional and codconvenio = :var_cd_convenio
          into :is_profissional_conveniado;
        if ((:is_profissional_conveniado='4') and (:var_tp_atendimento='P')) then
        begin
          select valor from configsystem c
            where c.tabela='EMPRESA'
            and c.campo='FL_MEDICO_HOSPITAL'
            and c.cod1='1'
          into :var_cd_profissional;
        end
      end

    
      --tipo de profissional pelo padrao tiss
      cd_tp_profissional = null;
      if (:var_cd_tp_profissional is null) then
      begin
        select first 1 p.cd_prestador,p.cd_tp_profissional
        from fat_faturamento_guias_proc p
        inner join fat_faturamento_guias g on g.id_guia=p.id_guia
        where g.cd_fatura=:cd_fatura and p.cd_procedimento=:var_cd_item and p.cd_prestador=:var_cd_profissional --g.fl_principal='T'
        into :var_cd_profissional,:var_cd_tp_profissional;

        select cd_nm_tiss from fat_tiss where cd_tiss = :var_cd_tp_profissional
        into :cd_tp_profissional;
      end
      else if (not :var_cd_tp_profissional is null) then
      begin
        select cd_nm_tiss from fat_tiss where cd_tiss = :var_cd_tp_profissional
          into :cd_tp_profissional;
      end

      select m.cod,m.cpf,m.medico,m.crm,m.uf_conselho,t.cd_nm_tiss,coalesce(m.is_laboratorio,'F'),
      m.cns_profissional
      from medicos m
            inner join fat_tiss t on
                (m.cd_tp_conselho_tiss=t.cd_tiss and t.tp_tiss = 152)
      where m.cod = :var_cd_profissional
      into :cd_profissional,:cpf_profissional,:nm_profissional,:crm_profissional,
        :uf_profissional,:cons_profissional,:is_profissional_laboratorio,
        :cns_profissional;

      is_profissional_conveniado = null;
      cd_operadora_profissional = '';
      select coalesce(pago_pelo_convenio,''),codigo_prestador from conv_paga_medico
      where codmedico = :cd_profissional and codconvenio = :var_cd_convenio
      into :is_profissional_conveniado,:cd_operadora_profissional;

      if (:is_profissional_conveniado is null) then --nao tem registro recebe pelo hospital
        is_profissional_conveniado = 'F';
      else if (:is_profissional_conveniado = '5') then --tem registro recebe direto
        is_profissional_conveniado = 'T';
      else if (:is_profissional_conveniado = '4') then --tem registro recebe pelo hospital
        is_profissional_conveniado = 'F';
      if (:cd_operadora_profissional is null) then
        cd_operadora_profissional = '';

      --seleciona o cbo do profissional
      cbo_profissional = null;
      select first 1 cd_nm_tiss from glo_prestador_cbo pc
        inner join fat_tiss ft on
            (pc.cd_cbo_tiss = ft.cd_tiss and ft.tp_tiss = 151)
      where pc.cd_prestador = :var_cd_profissional
        and pc.is_principal = 'T'
        and pc.fl_ativo = 'T'
      into :cbo_profissional;

      --codigo e descricao da tabela pelo padrao tiss
      select ft.cd_nm_tiss from fat_tiss ft
      inner join fat_conf_tabelas fct on (fct.cd_tiss = ft.cd_tiss and
                                    fct.cd_conf_tabela = :var_cd_tabela)
      into :cd_tabela_tiss;

      --tipo de via do procedimento pelo padrao tiss
      if (not :var_cd_tp_via_acesso is null) then
        select cd_nm_tiss from fat_tiss where cd_tiss = :var_cd_tp_via_acesso
          into :cd_tp_via_acesso;

      --tipo de despesa realizada
      if (:var_cd_grupo_pai = '01.000') then
        cd_despesa_realizada = 5;
      else if ((:var_cd_grupo_pai = '02.000')
        or (:var_cd_grupo_pai = '04.000')) then
      begin
        if (:var_tp_atendimento = 'I') then
          cd_despesa_realizada = 7;
        else
          cd_despesa_realizada = 5;
      end
      else if (:cd_grupo = '03.001') then
        cd_despesa_realizada = 2;
      else if (:cd_grupo = '03.002') then
        cd_despesa_realizada = 3;
      else
      begin
        select coalesce(is_gas,'F'),coalesce(is_aluguel,'F') from fat_grupo_faturamento
        where cd_grupo = :cd_grupo into :is_gasoterapia, :is_aluguel;

        if ((:is_gasoterapia = 'T') or (:is_aluguel = 'T')) then
            cd_despesa_realizada = 7;
        else
          cd_despesa_realizada = 1; --numeracao de controle NM
      end

      suspend;

      if(:var_item_valor_hospital = 'T') then
      begin
        var_cd_profissional = :var_cd_medico_hospital;
        var_while = 1;
        var_item_valor_hospital = 'F';
      end
    end
  end
end
^

/* Alter (PP_FIN_REL_SALDOS_CC) */
ALTER PROCEDURE PP_FIN_REL_SALDOS_CC(DATA_SALDO DATE)
 RETURNS(NM_CORRENTISTA VARCHAR(100),
CONTA_CORRENTE_DV CHAR,
CONTA_CORRENTE VARCHAR(10),
AGENCIA VARCHAR(10),
AGENCIA_DV CHAR,
NM_BANCO VARCHAR(100),
VL_SALDO_NAO_CONCILIADO DOUBLE PRECISION,
VL_SALDO_CONCILIADO DOUBLE PRECISION,
VL_DIFERENCA DOUBLE PRECISION,
DEB_CRED_SALDO_CONCILIADO CHAR,
DEB_CRED_SALDO_NAO_CONCILIADO CHAR,
DEB_CRED_VL_DIFERENCA CHAR)
 AS
declare variable var_id_conta integer;
declare variable var_vl_cheque_transportado double precision;
declare variable var_vl_dinheiro_transportado double precision;
declare variable var_ano integer;
declare variable var_mes integer;
begin
  for
    select
      fbc.id, fbc.conta, fbc.conta_dv, fbc.nm_correntista, fba.agencia, fba.agencia_dv, gb.nm_banco
    from
      fin_banco_conta fbc
      inner join fin_banco_agencia fba on (fba.id = fbc.cd_agencia)
      inner join glo_banco gb on (gb.cd_banco = fba.cd_banco)
    --where
      --fbc.id <> 9999
	into
	  :var_id_conta,
	  :conta_corrente,
	  :conta_corrente_dv,
	  :nm_correntista,
	  :agencia,
	  :agencia_dv,
	  :nm_banco
  do
  begin

    --pegar as varias para usar na procedure do movimento de caixa
    var_mes = extract(month from :data_saldo);
    var_ano = extract(year from :data_saldo);

    --para a conta caixa do hospital
    if (:var_id_conta = 9999) then
    begin

      --selecionar os valores do movimento de caixa em dinheiro e cheque
      select
        pp_fin_rel_regime_caixa_mensal.vl_dinheiro_transportado,
        pp_fin_rel_regime_caixa_mensal.vl_cheque_transportado
      from
        pp_fin_rel_regime_caixa_mensal(:var_mes, :var_ano)
      where
        pp_fin_rel_regime_caixa_mensal.dt_regime = :data_saldo and
        (pp_fin_rel_regime_caixa_mensal.vl_dinheiro_transportado <> 0 or
        pp_fin_rel_regime_caixa_mensal.vl_cheque_transportado <> 0)
      into
        :var_vl_cheque_transportado,
        :var_vl_dinheiro_transportado;

      --somar e entao atribuir os valores de cheque e dinheiro para os valores dos saldos
      vl_saldo_conciliado = var_vl_cheque_transportado + var_vl_dinheiro_transportado;
      vl_saldo_nao_conciliado = 0;

    end

    --para as demais contas do hospital
    else
    begin
      
      --pegar o saldo integralizado
      select
        pp_fin_gera_saldo_conta.vl_saldo_integralizado
      from
        pp_fin_gera_saldo_conta(:var_id_conta, :data_saldo)
      into
        :vl_saldo_conciliado;

      --pegar o saldo nao integralizado
      select
        pp_fin_rel_saldo_empresa.saldo_empresa
      from
        pp_fin_rel_saldo_empresa(:data_saldo)
	  where
		pp_fin_rel_saldo_empresa.var_id_conta = :var_id_conta
      into
        :vl_saldo_nao_conciliado;

    end

    --setar zero quando nulo os saldos
    if (vl_saldo_conciliado is null) then
      vl_saldo_conciliado = 0;
    if (vl_saldo_nao_conciliado is null) then
      vl_saldo_nao_conciliado = 0;

    --verifica se saldo conciliado esta em debito ou credito
    if (vl_saldo_conciliado > 0) then
    begin
      deb_cred_saldo_conciliado = 'C';
    end
    else if (vl_saldo_conciliado < 0) then
    begin
      deb_cred_saldo_conciliado = 'D';
	  --vl_saldo_conciliado = (vl_saldo_conciliado * -1);
    end
    else
    begin
      deb_cred_saldo_conciliado = '-';
    end

    --verifica se saldo nao conciliado esta em debito ou credito
    if (vl_saldo_nao_conciliado > 0) then
    begin
      deb_cred_saldo_nao_conciliado = 'C';
    end
    else if (vl_saldo_nao_conciliado < 0) then
    begin
      deb_cred_saldo_nao_conciliado = 'D';
	  --vl_saldo_nao_conciliado = (vl_saldo_nao_conciliado * -1);
    end
    else
    begin
      deb_cred_saldo_nao_conciliado = '-';
    end

    --sempre pega a diferenca subtraindo o menor do maior
    /*if (vl_saldo_conciliado > vl_saldo_nao_conciliado) then
      vl_diferenca = vl_saldo_conciliado - vl_saldo_nao_conciliado;
    if (vl_saldo_nao_conciliado > vl_saldo_conciliado) then
      vl_diferenca = vl_saldo_nao_conciliado - vl_saldo_conciliado;

    --se forem iguais a diferenca nao existe
    if (vl_saldo_conciliado = vl_saldo_nao_conciliado) then
      vl_diferenca = 0;

    --atribui credito ou debito para o valor da diferenca
    if (vl_diferenca > 0) then
    begin
      deb_cred_vl_diferenca = 'C';
    end
    else if (vl_diferenca < 0) then
    begin
      deb_cred_vl_diferenca = 'D';
    end
    else
    begin
      deb_cred_vl_diferenca = '-';
    end*/

    suspend;
  end
end
^

/* Alter (PP_REL_BALANCO_CONTROLADOS) */
ALTER PROCEDURE PP_REL_BALANCO_CONTROLADOS(TIPO CHAR,
DT_INI DATE,
DT_FIM DATE)
 RETURNS(CD_PRODUTO_HOSP INTEGER,
NM_PRODUTO_HOSP VARCHAR(100),
EST_INI INTEGER,
EST_FIM INTEGER,
AQUISICAO INTEGER,
CONSUMO INTEGER,
DESCARTE INTEGER)
 AS
declare variable VAR_FL_CAMPO varchar(100);
declare variable VAR_COD_GRP_CONTROLADO varchar(20);
begin

    --inicializa variavel limpa e testa tipo de controlado para pegar o grupo adequado nas pesquisas
    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

    --pegar todos os grupos de controlados de acordo com o tipo selecionado
    FOR
        EXECUTE STATEMENT
        'SELECT VALOR FROM CONFIGSYSTEM WHERE TABELA = ''EMPRESA'' AND COD1=''1'' AND CAMPO IN '||:VAR_FL_CAMPO
        INTO :VAR_COD_GRP_CONTROLADO
    DO BEGIN
        
        --pegar o codigo de todos os produtos controlados do grupo selecionado
        for
            select
                eph.cd_produto_hosp,
                eph.nm_produto
            from
                est_produtos_hospital eph
            where
                eph.cd_grupo in (:var_cod_grp_controlado)
            order by
                2,1
            into
                :cd_produto_hosp,
                :nm_produto_hosp
        do begin

            -- para cada produto pegar a quantidade no estoque no inicio do periodo
            select 
                count(elei.cd_barcode)
            from
                est_lote_estoque_itens elei
                inner join produtos pro on (pro.codigo = elei.cd_produto)
            where
                pro.cd_produto_hosp = :cd_produto_hosp and

                --data entrada menor que data inicial
                (((elei.dt_entrada < :dt_ini) and (elei.is_utilizado = 'F')) or
                ((elei.dt_entrada < :dt_ini) and (elei.is_utilizado = 'T') and elei.dt_saida > :dt_ini))
            into
                :est_ini;

            if (:est_ini is null) then begin est_ini = 0; end

            -- para cada produto pegar a quantidade que entro no periodo
            select
                sum(emq.quantidade - emq.quantidade_devolvida)
            from
                estmoviquantidade emq
                inner join produtos pro on (pro.codigo = emq.produto)
            where
                pro.cd_produto_hosp = :cd_produto_hosp and
                emq.data_movimento >= :dt_ini and
                emq.data_movimento <= :dt_fim and
                emq.tipo_operacao = 'ENF'
            into
                :aquisicao;

            if (:aquisicao is null) then begin aquisicao = 0; end

            -- para cada produto pegar a quantidade que saiu por INT + PA no periodo
            select
                sum(emq.quantidade - emq.quantidade_devolvida)
            from
                estmoviquantidade emq
                inner join produtos pro on (pro.codigo = emq.produto)
            where
                pro.cd_produto_hosp = :cd_produto_hosp and
                emq.data_movimento >= :dt_ini and
                emq.data_movimento <= :dt_fim and
                emq.tipo_operacao in ('SPP','SPA')
            into
                :consumo;

            if (:consumo is null) then begin consumo = 0; end

            -- para cada produto pegar a quantidade que saiu por descarte independente do motivo
            -- todas as outras saidas s\E3o "descarte"
            select
                sum(emq.quantidade - emq.quantidade_devolvida)
            from
                estmoviquantidade emq
                inner join produtos pro on (pro.codigo = emq.produto)
            where
                pro.cd_produto_hosp = :cd_produto_hosp and
                (emq.data_movimento >= :dt_ini and
                emq.data_movimento <= :dt_fim) and
                emq.tipo_operacao in (
          --     'SPP', --'SAIDA POR PACIENTE PRONTO ATENDIMENTO'
          --      'SPA', --'SAIDA POR PACIENTE INTERNADO'
                'SCO', --'SAIDA CONSUMO'
                'STR', --'SAIDA POR TRANSFERENCIA'
                'SAC', --'SAIDA POR ACERTO'
                'PDV', --'SAIDA POR VENDA'
                'SPV', --'SAIDA POR VENCIMENTO'
                'SPE', --'SAIDA POR EMPRESTIMO'
                'SPD', --'SAIDA POR DESCARTE'
                'SAD', --'SAIDA POR DOACAO'
                'SIC', --'SAIDA POR FINALIZACAO DE ICE'
                'SDE' --'SAIDA POR DEVOLUCAO DE EMPRESTIMO'
              )
            into
                :descarte;

            if (:descarte is null) then begin descarte = 0; end

            -- para cada produto pegar a quantidade final do estoque no periodo
            select 
                count(elei.cd_barcode)
            from
                est_lote_estoque_itens elei
                inner join produtos pro on (pro.codigo = elei.cd_produto)
            where
                pro.cd_produto_hosp = :cd_produto_hosp and
                ((elei.is_utilizado = 'F') or (elei.is_utilizado = 'T' and elei.dt_saida > :dt_fim))
            into
                :est_fim;

            if (:est_fim is null) then begin est_fim = 0; end

            suspend;
        end
    end
end
^

/* Alter (PP_REL_EST_INT_CC_CIDADE) */
ALTER PROCEDURE PP_REL_EST_INT_CC_CIDADE(ANO INTEGER)
 RETURNS(CD_FILTRO INTEGER,
NM_FILTRO VARCHAR(100),
M01 INTEGER,
M02 INTEGER,
M03 INTEGER,
M04 INTEGER,
M05 INTEGER,
M06 INTEGER,
M07 INTEGER,
M08 INTEGER,
M09 INTEGER,
M10 INTEGER,
M11 INTEGER,
M12 INTEGER,
MEDIA DOUBLE PRECISION,
TOTAL INTEGER)
 AS
declare variable VAR_COUNT integer;
declare variable VAR_MES integer;
begin
  M01 = 0;
  M02 = 0;
  M03 = 0;
  M04 = 0;
  M05 = 0;
  M06 = 0;
  M07 = 0;
  M08 = 0;
  M09 = 0;
  M10 = 0;
  M11 = 0;
  M12 = 0;
  MEDIA = 0;
  TOTAL = 0;

  for
    select
      cli.codcidade
    from
      int_internamentos ii
      inner join clientes cli on (cli.registro = ii.cd_paciente)
    WHERE
      extract(year from ii.dt_internacao) = :ANO and
	  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
    GROUP BY 1
    ORDER BY 1
    INTO
      :CD_FILTRO
  DO BEGIN
    FOR
      SELECT
        EXTRACT(MONTH FROM ii.dt_internacao) AS MES,
          COUNT(*)
        FROM
          int_internamentos ii
          inner join clientes cli on (cli.registro = ii.cd_paciente)
        WHERE
          extract(year from ii.dt_internacao) = :ANO AND
          cli.codcidade = :CD_FILTRO and
		  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
        GROUP BY 1
        ORDER BY 1
      INTO
        :VAR_MES,
        :VAR_COUNT
      DO BEGIN
        SELECT CEP.CIDADE FROM CEP WHERE CEP.COD = :CD_FILTRO INTO :NM_FILTRO;
          if (:VAR_MES = 1) then
              M01 = :M01 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 2) THEN 
              M02 = :M02 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 3) THEN
              M03 = :M03 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 4) THEN
              M04 = :M04 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 5) THEN
              M05 = :M05 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 6) THEN
              M06 = :M06 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 7) THEN
              M07 = :M07 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 8) THEN
              M08 = :M08 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 9) THEN
              M09 = :M09 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 10) THEN
              M10 = :M10 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 11) THEN
              M11 = :M11 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 12) THEN
              M12 = :M12 + :VAR_COUNT;
      END
      TOTAL = M01 + M02 + M03 + M04 + M05 + M06 + M07 + M08 + M09 + M10 + M11 + M12;
      if (:TOTAL IS NULL) then
          TOTAL = 0;
      MEDIA = TOTAL / 12;
      if (:MEDIA IS NULL) then
          MEDIA = 0;
      SUSPEND;
      M01 = 0;
      M02 = 0;
      M03 = 0;
      M04 = 0;
      M05 = 0;
      M06 = 0;
      M07 = 0;
      M08 = 0;
      M09 = 0;
      M10 = 0;
      M11 = 0;
      M12 = 0;
      VAR_COUNT = 0;
  END
end
^

/* Alter (PP_REL_EST_INT_CC_CONVENIO) */
ALTER PROCEDURE PP_REL_EST_INT_CC_CONVENIO(ANO INTEGER)
 RETURNS(CD_FILTRO INTEGER,
NM_FILTRO VARCHAR(100),
M01 INTEGER,
M02 INTEGER,
M03 INTEGER,
M04 INTEGER,
M05 INTEGER,
M06 INTEGER,
M07 INTEGER,
M08 INTEGER,
M09 INTEGER,
M10 INTEGER,
M11 INTEGER,
M12 INTEGER,
MEDIA DOUBLE PRECISION,
TOTAL INTEGER)
 AS
declare variable var_mes integer;
declare variable var_count integer;
begin
  M01 = 0;
  M02 = 0;
  M03 = 0;
  M04 = 0;
  M05 = 0;
  M06 = 0;
  M07 = 0;
  M08 = 0;
  M09 = 0;
  M10 = 0;
  M11 = 0;
  M12 = 0;
  MEDIA = 0;
  TOTAL = 0;

  for
    select
      ii.cd_convenio
    from
      int_internamentos ii
    WHERE
      extract(year from ii.dt_internacao) = :ANO and
	  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
    GROUP BY 1
    ORDER BY 1
    INTO
      :cd_filtro
  DO BEGIN
    FOR
      SELECT
        EXTRACT(MONTH FROM ii.dt_internacao) AS MES,
          COUNT(*)
        FROM
          int_internamentos ii
        WHERE
          extract(year from ii.dt_internacao) = :ANO AND
          ii.cd_convenio = :cd_filtro and
		  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
        GROUP BY 1
        ORDER BY 1
      INTO
        :VAR_MES,
        :VAR_COUNT
      DO BEGIN
        SELECT CO.CONVENIO FROM CONVENIOS CO WHERE CO.COD = :cd_filtro INTO :nm_filtro;
          if (:VAR_MES = 1) then
              M01 = :M01 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 2) THEN 
              M02 = :M02 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 3) THEN
              M03 = :M03 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 4) THEN
              M04 = :M04 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 5) THEN
              M05 = :M05 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 6) THEN
              M06 = :M06 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 7) THEN
              M07 = :M07 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 8) THEN
              M08 = :M08 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 9) THEN
              M09 = :M09 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 10) THEN
              M10 = :M10 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 11) THEN
              M11 = :M11 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 12) THEN
              M12 = :M12 + :VAR_COUNT;
      END
      TOTAL = M01 + M02 + M03 + M04 + M05 + M06 + M07 + M08 + M09 + M10 + M11 + M12;
      if (:TOTAL IS NULL) then
          TOTAL = 0;
      MEDIA = TOTAL / 12;
      if (:MEDIA IS NULL) then
          MEDIA = 0;
      SUSPEND;
      M01 = 0;
      M02 = 0;
      M03 = 0;
      M04 = 0;
      M05 = 0;
      M06 = 0;
      M07 = 0;
      M08 = 0;
      M09 = 0;
      M10 = 0;
      M11 = 0;
      M12 = 0;
      VAR_COUNT = 0;
  END
end
^

/* Alter (PP_REL_EST_INT_CC_GENERO) */
ALTER PROCEDURE PP_REL_EST_INT_CC_GENERO(ANO INTEGER)
 RETURNS(CD_FILTRO INTEGER,
NM_FILTRO VARCHAR(100),
M01 INTEGER,
M02 INTEGER,
M03 INTEGER,
M04 INTEGER,
M05 INTEGER,
M06 INTEGER,
M07 INTEGER,
M08 INTEGER,
M09 INTEGER,
M10 INTEGER,
M11 INTEGER,
M12 INTEGER,
MEDIA DOUBLE PRECISION,
TOTAL INTEGER)
 AS
declare variable var_mes integer;
declare variable var_count integer;
declare variable var_sexo varchar(100);
declare variable var_updown smallint;
begin
  M01 = 0;
  M02 = 0;
  M03 = 0;
  M04 = 0;
  M05 = 0;
  M06 = 0;
  M07 = 0;
  M08 = 0;
  M09 = 0;
  M10 = 0;
  M11 = 0;
  M12 = 0;
  MEDIA = 0;
  TOTAL = 0;
  cd_filtro = null;

  for
    select
      cli.sexo,
      iif(datediff(year, cli.nascimento, ii.dt_internacao) < 12, 0,
       iif(datediff(year, cli.nascimento, ii.dt_internacao) < 18, 1, 2)
     ) as updown,
      case cli.sexo
        when 'MASCULINO' then
          case
            when datediff(year, cli.nascimento, ii.dt_internacao) < 12 then 'Masculino - Crian\E7a'
            when (datediff(year, cli.nascimento, ii.dt_internacao) >= 12 and datediff(year, cli.nascimento, ii.dt_internacao) < 18) then 'Masculino - Adolescente'
            else 'Masculino - Adulto'
          end
        when 'FEMININO' then
          case
            when datediff(year, cli.nascimento, ii.dt_internacao) < 12 then 'Feminino - Crian\E7a'
            when (datediff(year, cli.nascimento, ii.dt_internacao) >= 12 and datediff(year, cli.nascimento, ii.dt_internacao) < 18) then 'Feminino - Adolescente'
            else 'Feminino - Adulto'
          end
      end as filtro
    from
      int_internamentos ii
      inner join clientes cli on (cli.registro = ii.cd_paciente)
    WHERE
      extract(year from ii.dt_internacao) = :ANO and
	  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
    GROUP BY 1,2,3 ORDER BY 1,2,3
    INTO :var_sexo, :var_updown, :nm_filtro
  DO BEGIN
    FOR
      SELECT
          EXTRACT(MONTH FROM ii.dt_internacao) AS MES,
          COUNT(*)
        FROM
          int_internamentos ii
          inner join clientes cli on (cli.registro = ii.cd_paciente)
        WHERE
          extract(year from ii.dt_internacao) = :ANO and
		  ii.cd_especialidade = (select c.valor from configsystem c where c.tabela = 'EMPRESA' and c.campo = 'FL_REL_CC_ESP')
          AND cli.sexo = :var_sexo
          and iif(datediff(year, cli.nascimento, ii.dt_internacao) < 12, 0,
              iif(datediff(year, cli.nascimento, ii.dt_internacao) < 18, 1, 2)) = :var_updown
        GROUP BY 1 ORDER BY 1
      INTO :VAR_MES, :VAR_COUNT
      DO BEGIN
          if (:VAR_MES = 1) then
              M01 = :M01 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 2) THEN 
              M02 = :M02 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 3) THEN
              M03 = :M03 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 4) THEN
              M04 = :M04 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 5) THEN
              M05 = :M05 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 6) THEN
              M06 = :M06 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 7) THEN
              M07 = :M07 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 8) THEN
              M08 = :M08 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 9) THEN
              M09 = :M09 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 10) THEN
              M10 = :M10 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 11) THEN
              M11 = :M11 + :VAR_COUNT;
          ELSE IF (:VAR_MES = 12) THEN
              M12 = :M12 + :VAR_COUNT;
      END
      TOTAL = M01 + M02 + M03 + M04 + M05 + M06 + M07 + M08 + M09 + M10 + M11 + M12;
      if (:TOTAL IS NULL) then
          TOTAL = 0;
      MEDIA = TOTAL / 12;
      if (:MEDIA IS NULL) then
          MEDIA = 0;
      SUSPEND;
      M01 = 0;
      M02 = 0;
      M03 = 0;
      M04 = 0;
      M05 = 0;
      M06 = 0;
      M07 = 0;
      M08 = 0;
      M09 = 0;
      M10 = 0;
      M11 = 0;
      M12 = 0;
      VAR_COUNT = 0;
  END
end
^

/* Alter (PP_REL_EST_PA_OBITOS_CIDADE) */
ALTER PROCEDURE PP_REL_EST_PA_OBITOS_CIDADE(ANO INTEGER)
 RETURNS(CD_FILTRO INTEGER,
NM_FILTRO VARCHAR(100),
M01 INTEGER,
M02 INTEGER,
M03 INTEGER,
M04 INTEGER,
M05 INTEGER,
M06 INTEGER,
M07 INTEGER,
M08 INTEGER,
M09 INTEGER,
M10 INTEGER,
M11 INTEGER,
M12 INTEGER,
MEDIA DOUBLE PRECISION,
TOTAL INTEGER)
 AS
declare variable var_count integer;
declare variable var_mes integer;
begin
  M01 = 0;
  M02 = 0;
  M03 = 0;
  M04 = 0;
  M05 = 0;
  M06 = 0;
  M07 = 0;
  M08 = 0;
  M09 = 0;
  M10 = 0;
  M11 = 0;
  M12 = 0;
  MEDIA = 0;
  TOTAL = 0;

  for
    select
      cli.codcidade
    from
      paranagua_entiquetas pe
      inner join clientes cli on (cli.registro = pe.cod_paciente)
    where
      extract(year from pe.dt_saida) = :ANO and
      not pe.dt_saida is null and
      pe.tp_saida in (6)
    group by 1 order by 1
    into
      :CD_FILTRO
  do begin
    for
      select
          extract(month from PE.dt_saida) as MES,
          count(*)
        from
          paranagua_entiquetas pe
          inner join clientes cli on (cli.registro = pe.cod_paciente)
        where
          extract(year from pe.dt_saida) = :ANO
          and cli.codcidade = :CD_FILTRO and
          not pe.dt_saida is null and
		  pe.tp_saida in (6)
        group by 1 order by 1
      into
        :VAR_MES,
        :VAR_COUNT
      do begin
        select CEP.CIDADE from CEP where CEP.COD = :CD_FILTRO into :NM_FILTRO;
          if (:VAR_MES = 1) then
              M01 = :M01 + :VAR_COUNT;
          else if (:VAR_MES = 2) then 
              M02 = :M02 + :VAR_COUNT;
          else if (:VAR_MES = 3) then
              M03 = :M03 + :VAR_COUNT;
          else if (:VAR_MES = 4) then
              M04 = :M04 + :VAR_COUNT;
          else if (:VAR_MES = 5) then
              M05 = :M05 + :VAR_COUNT;
          else if (:VAR_MES = 6) then
              M06 = :M06 + :VAR_COUNT;
          else if (:VAR_MES = 7) then
              M07 = :M07 + :VAR_COUNT;
          else if (:VAR_MES = 8) then
              M08 = :M08 + :VAR_COUNT;
          else if (:VAR_MES = 9) then
              M09 = :M09 + :VAR_COUNT;
          else if (:VAR_MES = 10) then
              M10 = :M10 + :VAR_COUNT;
          else if (:VAR_MES = 11) then
              M11 = :M11 + :VAR_COUNT;
          else if (:VAR_MES = 12) then
              M12 = :M12 + :VAR_COUNT;
      end
      TOTAL = M01 + M02 + M03 + M04 + M05 + M06 + M07 + M08 + M09 + M10 + M11 + M12;
      if (:TOTAL is null) then
          TOTAL = 0;
      MEDIA = TOTAL / 12;
      if (:MEDIA is null) then
          MEDIA = 0;
      suspend;
      M01 = 0;
      M02 = 0;
      M03 = 0;
      M04 = 0;
      M05 = 0;
      M06 = 0;
      M07 = 0;
      M08 = 0;
      M09 = 0;
      M10 = 0;
      M11 = 0;
      M12 = 0;
      VAR_COUNT = 0;
  end
end
^

SET TERM ; ^

