CREATE OR REPLACE PROCEDURE IMPPRECO_CARDTRAB
(
    P_NRCARDAPIOTRAB NUMBER,
    P_PRODUTOS VARCHAR2,
    P_DTCUSTO DATE,
    P_CDREGIAO VARCHAR2,
    P_VRPEACRESCUSTO FLOAT,
    P_CDFILIALLOGADA IN VARCHAR2,
    P_CDOPERADOR IN VARCHAR2,
    P_NRORG IN NUMBER,
    P_LISTAERROS IN OUT VARCHAR2
)
AS
    V_NRLISTAPRECOTCO NUMBER;
    V_NRPRODLISTAPRECOCARDTRAB NUMBER;
    V_NRPRODLISTAPRECOTCO NUMBER;
    V_NRPROD_ESCOLHIDO NUMBER;
    V_NRPRODUTOCARDTRAB NUMBER;
    V_VRCUSTO FLOAT;
    V_VRCUSTOESCOLHIDO FLOAT;
    V_CDMARCA VARCHAR2(5);

    V_NRDETALHESERVPROPCOM NUMBER;
    V_NRPRODUTOPROPCOM NUMBER;

    -- Procedure auxiliar para agilizar inclusao na lista de erros
    PROCEDURE I_L(MENSAGEM IN VARCHAR2)
    AS
    BEGIN
        INSERE_LISTA_ERROS(P_CDFILIALLOGADA, MENSAGEM,
                           P_CDOPERADOR, P_NRORG, P_LISTAERROS);
    END;
BEGIN
    -- Procura a lista de precos calculada para a data.
    SELECT MAX(NRLISTAPRECOTCO)
    INTO V_NRLISTAPRECOTCO
    FROM LISTAPRECOTCO
    WHERE DTREFERENCIA = P_DTCUSTO
    AND CDREGIAO = P_CDREGIAO;

    SELECT MAX(NRDETALHESERVPROPCOM)
      INTO V_NRDETALHESERVPROPCOM
      FROM DETALHESERVPROPCOM
     WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB;

    -- Caso nao encontre uma lista ja salva, gera uma nova lista de precos do TCO
    IF V_NRLISTAPRECOTCO IS NULL THEN
        GRAVA_LISTAPRECOTCO(P_DTCUSTO, P_CDREGIAO, P_NRORG, P_CDOPERADOR, V_NRLISTAPRECOTCO);              
    END IF;

    -- Se foi encontrada lista de precos, percorre cada um dos produtos selecionados
    IF V_NRLISTAPRECOTCO IS NOT NULL THEN
        FOR C_PRODUTOS IN 
        (
            SELECT CDPRODUTO, CDARVPROD || ' - '|| NMPRODUTO AS NMPRODUTO
              FROM PRODUTO
             WHERE VALOR_NA_LISTA(CDPRODUTO, P_PRODUTOS) > 0
        ) LOOP
            V_NRPROD_ESCOLHIDO := NULL;
            -- Verifica se ja existe PRODUTOCARDTRAB
            SELECT MAX(NRPRODUTOCARDTRAB)
              INTO V_NRPRODUTOCARDTRAB
              FROM PRODUTOCARDTRAB
             WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
               AND CDPRODUTO = C_PRODUTOS.CDPRODUTO;
            
            --Percorre os custos existentes na nova lista de preços para o produto selecionado
            FOR C_CUSTOS IN 
            (SELECT NRLISTAPRECOTCO, NRPRODLISTAPRECOTCO, IDESCOLHIDO, CDPRODESTO, 
                    VRCUSTO, CDMARCA, CDREGIAO, CDFORNECED, CDPRODUTO,
                    DTINIVALITM, DTFINVALITM, VRPRECUNIITM, VRPRECOITMPI, VRPRECECOITM, VRFATOCONV,
                    IDFORNECEDOROL, IDCUSTOPELAMEDIA, IDFORNEPRIOTCO,
                    CDFILIAL, NRCOLEPRECO
                FROM PRODLISTAPRECOTCO
                WHERE NRLISTAPRECOTCO = V_NRLISTAPRECOTCO
                  AND CDPRODESTO = C_PRODUTOS.CDPRODUTO) LOOP

                V_VRCUSTO := C_CUSTOS.VRCUSTO + ( C_CUSTOS.VRCUSTO * (NVL(P_VRPEACRESCUSTO, 0.0)/100) );
                V_NRPRODLISTAPRECOCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('PRODLISTAPRECOCARDTRAB', 1));

                INSERT INTO PRODLISTAPRECOCARDTRAB
                (NRPRODLISTAPRECOCARDTRAB, NRCARDAPIOTRAB,
                NRPRODLISTAPRECOTCO, NRLISTAPRECOTCO,
                IDESCOLHIDO,  IDIMPORTADO,  CDPRODESTO,  
                VRCUSTO,  VRPEACRESCIMO,  CDMARCA,  
                CDREGIAO,  CDFORNECED,  CDPRODUTO,  
                DTINIVALITM,  DTFINVALITM,  VRPRECUNIITM,  
                VRPRECOITMPI,  VRPRECECOITM,  VRFATOCONV,  
                IDFORNECEDOROL,  IDCUSTOPELAMEDIA,  IDFORNEPRIOTCO,
                CDFILIAL, NRCOLEPRECO, DTCUSTO, 
                NRORG,  NRORGINCLUSAO,  NRORGULTATU,  
                DTINCLUSAO,  DTULTATU,  
                CDOPERINCLUSAO,  CDOPERULTATU)
                VALUES
                (V_NRPRODLISTAPRECOCARDTRAB, P_NRCARDAPIOTRAB,
                C_CUSTOS.NRPRODLISTAPRECOTCO, C_CUSTOS.NRLISTAPRECOTCO,
                'N',  'S',  C_CUSTOS.CDPRODESTO,  
                V_VRCUSTO,  NVL(P_VRPEACRESCUSTO, 0.0),  C_CUSTOS.CDMARCA,  
                C_CUSTOS.CDREGIAO,  C_CUSTOS.CDFORNECED,  C_CUSTOS.CDPRODUTO,  
                C_CUSTOS.DTINIVALITM,  C_CUSTOS.DTFINVALITM,  C_CUSTOS.VRPRECUNIITM,  
                C_CUSTOS.VRPRECOITMPI,  C_CUSTOS.VRPRECECOITM,  C_CUSTOS.VRFATOCONV,  
                C_CUSTOS.IDFORNECEDOROL,  C_CUSTOS.IDCUSTOPELAMEDIA,  C_CUSTOS.IDFORNEPRIOTCO,
                C_CUSTOS.CDFILIAL, C_CUSTOS.NRCOLEPRECO,  P_DTCUSTO, 
                P_NRORG,  P_NRORG,  P_NRORG,  
                SYSDATE,  SYSDATE,  
                P_CDOPERADOR,  P_CDOPERADOR);

                IF C_CUSTOS.IDESCOLHIDO = 'S' THEN
                    V_NRPROD_ESCOLHIDO := V_NRPRODLISTAPRECOCARDTRAB;
                    V_CDMARCA := C_CUSTOS.CDMARCA; 
                    V_VRCUSTOESCOLHIDO := V_VRCUSTO;                  
                END IF;                
            END LOOP;
            IF V_NRPROD_ESCOLHIDO > 0 THEN
                -- Se encontrou preço para o produto
                IF V_NRPRODUTOCARDTRAB IS NULL THEN
                    V_NRPRODUTOCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('PRODUTOCARDTRAB', 1));

                    INSERT INTO PRODUTOCARDTRAB
                    (NRPRODUTOCARDTRAB, NRCARDAPIOTRAB, 
                    CDPRODUTO, CDMARCA, 
                    VRCUSTO,
                    NRPRODLISTAPRECOTCO,
                    NRPRODLISTAPRECOCARDTRAB,
                    NRORG, NRORGINCLUSAO, NRORGULTATU,
                    CDOPERINCLUSAO, CDOPERULTATU,
                    DTINCLUSAO, DTULTATU)
                    VALUES
                    (V_NRPRODUTOCARDTRAB, P_NRCARDAPIOTRAB,
                    C_PRODUTOS.CDPRODUTO, V_CDMARCA, 
                    V_VRCUSTOESCOLHIDO,
                    V_NRPRODLISTAPRECOTCO,
                    V_NRPROD_ESCOLHIDO,
                    P_NRORG, P_NRORG, P_NRORG,
                    P_CDOPERADOR, P_CDOPERADOR,
                    SYSDATE, SYSDATE);
                ELSE
                    UPDATE PRODUTOCARDTRAB
                        SET CDMARCA = V_CDMARCA,
                            VRCUSTO = V_VRCUSTOESCOLHIDO,
                            NRPRODLISTAPRECOCARDTRAB = V_NRPROD_ESCOLHIDO
                    WHERE NRPRODUTOCARDTRAB = V_NRPRODUTOCARDTRAB;
                END IF;                
            

                -- Atualiza todos os produtos para não escolhidos
                UPDATE PRODLISTAPRECOCARDTRAB
                SET IDESCOLHIDO = 'N'
                WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
                AND CDPRODESTO = C_PRODUTOS.CDPRODUTO;

                -- indica o produto escolhido
                UPDATE PRODLISTAPRECOCARDTRAB
                SET IDESCOLHIDO = 'S'
                WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
                AND NRPRODLISTAPRECOCARDTRAB = V_NRPROD_ESCOLHIDO;

                -- Atualiza histórico de preços
                SELECT MAX(NRPRODUTOPROPCOM)
                  INTO V_NRPRODUTOPROPCOM
                  FROM PRODUTOPROPCOM
                 WHERE NRDETALHESERVPROPCOM = V_NRDETALHESERVPROPCOM
                   AND CDPRODUTO = C_PRODUTOS.CDPRODUTO;

                IF V_NRPRODUTOPROPCOM IS NULL THEN
                    V_NRPRODUTOPROPCOM := TO_NUMBER(RETORNA_NOVO_CODIGO('PRODUTOPROPCOM', 1));
                    INSERT INTO PRODUTOPROPCOM
                    (NRPRODUTOPROPCOM, NRDETALHESERVPROPCOM,
                    CDPRODUTO, CDMARCAESCOLHIDA,
                    VRPEACRESCIMO,          
                    NRORG, NRORGINCLUSAO, NRORGULTATU,
                    CDOPERINCLUSAO, CDOPERULTATU,
                    DTINCLUSAO, DTULTATU)
                    VALUES
                    (V_NRPRODUTOPROPCOM, V_NRDETALHESERVPROPCOM,
                    C_PRODUTOS.CDPRODUTO, V_CDMARCA,
                    NVL(P_VRPEACRESCUSTO, 0.0),          
                    P_NRORG, P_NRORG, P_NRORG,
                    P_CDOPERADOR, P_CDOPERADOR,
                    SYSDATE, SYSDATE);
                ELSE
                    UPDATE PRODUTOPROPCOM
                       SET CDMARCAESCOLHIDA = V_CDMARCA,
                           VRPEACRESCIMO = NVL(P_VRPEACRESCUSTO, 0.0),          
                           CDOPERULTATU = P_CDOPERADOR,
                           DTULTATU = SYSDATE
                     WHERE NRPRODUTOPROPCOM = V_NRPRODUTOPROPCOM;
                END IF;
            ELSE
                -- Produto __PARAM0__ não possui custo na lista de preços da região  na data informada
                I_L(MSG('TCOPROC_PRODUTO_SEM_CUSTO_LISTAPRECO', C_PRODUTOS.NMPRODUTO));
            END IF;

        END LOOP;
    ELSE
        -- Não há lista de preços vigente para a região na data informada
        I_L(MSG('TCOPROC_REGIAO_SEM_LISTAPRECO'));
    END IF;
END;
/