CREATE OR REPLACE PROCEDURE FCT_ADD_MOEDA_PADRAO
AS
    V_NRTABPRECESCOPOFAT NUMBER;
    V_NRMOEDA            NUMBER;
    V_NRORG              NUMBER;
    V_CDOPERADOR         VARCHAR2(12);
    V_DATAATUAL          DATE;
    V_EXISTE             NUMBER;
BEGIN
    V_DATAATUAL := SYSDATE;
    V_NRORG := NVL(SYS_CONTEXT('nrorg_ctx', 'nrorg'), 1);
    V_CDOPERADOR := '1';

    BEGIN
        SELECT NRMOEDA
          INTO V_NRMOEDA
          FROM FCT_MOEDA
         WHERE IDPADRAO = 'S';
    EXCEPTION WHEN NO_DATA_FOUND THEN
        V_NRMOEDA := NULL;
    END;

    IF (V_NRMOEDA IS NULL) THEN

        NOVO_CODIGO_SC('FCT_MOEDA', V_NRMOEDA, 1, V_NRORG);

        INSERT INTO FCT_MOEDA (
            NRMOEDA,        NMMOEDA,        SIMBOLOMOEDA,
            CDISOMOEDA,     IDATIVO,        NRORG,
            DTINCLUSAO,     NRORGINCLUSAO,  CDOPERINCLUSAO,
            IDPADRAO
        )
        VALUES (
            V_NRMOEDA,     'Real',          'R$',
            'BRL',         'S',             V_NRORG,
            V_DATAATUAL,   V_NRORG,         V_CDOPERADOR,
            'S'
        );

    END IF; --V_NRMOEDA IS NULL
    

    IF (V_NRMOEDA IS NOT NULL) THEN

        --Atualiza a moeda das tabelas de preco
        UPDATE FCT_PRECBASESERV
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        --Atualiza a moeda da proposta e de seus itens
        UPDATE FCT_ORCAMENTO
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        UPDATE FCT_ITEMORCAMENTO
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        --Atualiza a moeda do contrato e de seus itens
        UPDATE FCT_CONTRATO
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        UPDATE FCT_ITEMCONTRATO
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        --Atualiza a moeda das tabelas de faturamento
        UPDATE FCT_MEDICAOFATURA
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        UPDATE FCT_FATURACONT
           SET NRMOEDA = V_NRMOEDA
         WHERE NRMOEDA IS NULL;

        --Inserir uma tabela de preco pro idioma padrao para os escopos de faturamento existentes
        FOR C_ESCOPOS IN (
            SELECT NRTIPOORCAMENTO,
                   CDPRECBASEVEND,
                   CDPRECBASESERV,
                   NRORG,
                   DTINCLUSAO, 
                   NRORGINCLUSAO,
                   CDOPERINCLUSAO
              FROM FCT_TIPOORCAMENTO
             WHERE IDATIVO = 'S'
        ) LOOP

            SELECT COUNT(*)
              INTO V_EXISTE
              FROM FCT_TABPRECESCOPOFAT
             WHERE NRTIPOORCAMENTO = C_ESCOPOS.NRTIPOORCAMENTO
               AND NRMOEDA         = V_NRMOEDA;

            IF (V_EXISTE = 0) THEN

                NOVO_CODIGO_SC('FCT_TABPRECESCOPOFAT', V_NRTABPRECESCOPOFAT, 1, V_NRORG);

                INSERT INTO FCT_TABPRECESCOPOFAT (
                    NRTABPRECESCOPOFAT,   NRTIPOORCAMENTO,    NRMOEDA,
                    CDPRECBASEVEND,       CDPRECBASESERV,     IDATIVO,
                    NRORG,                DTINCLUSAO,         NRORGINCLUSAO,
                    CDOPERINCLUSAO
                )
                VALUES (
                    V_NRTABPRECESCOPOFAT,       C_ESCOPOS.NRTIPOORCAMENTO,  V_NRMOEDA,
                    C_ESCOPOS.CDPRECBASEVEND,   C_ESCOPOS.CDPRECBASESERV,   'S',
                    V_NRORG,                    V_DATAATUAL,                V_NRORG,
                    V_CDOPERADOR
                );

                END IF; --V_EXISTE = 0

        END LOOP; --C_ESCOPOS
    
    ELSE
        RAISE_APPLICATION_ERROR(-20000, 'Nao foi possivel encontrar/inserir uma moeda padrao.');
    END IF; --V_NRMOEDA IS NOT NULL
END;
/