CREATE OR REPLACE PROCEDURE IMPORTA_CUSTO_NO_CARDTRAB
(
    P_NRCARDAPIOTRAB IN VARCHAR2,
    P_DTCUSTO IN DATE,
    P_CDREGIAO IN VARCHAR2,
    P_VRPEACRESCUSTO IN FLOAT,
    P_CDFILIALLOGADA IN VARCHAR2,
    P_CDOPERADOR IN VARCHAR2,
    P_NRORG IN NUMBER,
    P_LISTAERROS IN OUT VARCHAR2
)
AS
    V_CDFILIAL VARCHAR2(4);
    V_CDFILCENTCMP VARCHAR2(4);
    V_IDTIPOAPUR VARCHAR2(1);
    V_NRLISTAPRECOTCO NUMBER;
    V_NRPRODUTOCARDTRAB NUMBER;
    V_EXISTE_CUSTO FLOAT;
    V_PRATO VARCHAR2(200);
    V_PRODUTO VARCHAR2(200);
    V_NRPRODLISTAPRECOCARDTRAB NUMBER;
    V_VRCUSTO FLOAT;
    -- 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
    SELECT MAX(CDFILIAL)
      INTO V_CDFILIAL
      FROM PARAMTCO;         
    
    IF V_CDFILIAL IS NULL THEN
    -- Unidade base para elaboracao do cardapio nao informada nos parametros comerciais
        I_L(MSG('TCOPROC_FILIAL_N_INF_PARAMTCO'));
    END IF;

    -- Busca a central de compras
    SELECT MAX(NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL))
    INTO V_CDFILCENTCMP
    FROM FILIAL
    WHERE CDFILIAL = V_CDFILIAL;
    -- Busca informacoes da PARASUPRI
    SELECT MAX(IDTIPOAPUR)
    INTO V_IDTIPOAPUR
    FROM PARASUPRI
    WHERE CDFILIAL = V_CDFILCENTCMP;

    -- 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;
    
    -- Apaga os custos da ultima importacao
    DELETE FROM PRODUTOCARDTRAB WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB;
    DELETE FROM PRODLISTAPRECOCARDTRAB 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 salva nova lista de precos
    IF V_NRLISTAPRECOTCO IS NOT NULL THEN
        -- Indica lista de precos tco utilizada no cardapio de trabalho
        UPDATE CARDAPIOTRAB
            SET NRLISTAPRECOTCO = V_NRLISTAPRECOTCO,
                CDREGIAO = P_CDREGIAO,
                VRPEACRESCUSTO = P_VRPEACRESCUSTO,
                DTCUSTO = P_DTCUSTO
            WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB;

        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) 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,
            C_CUSTOS.IDESCOLHIDO,  'N',  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_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_CUSTOS.CDPRODESTO, C_CUSTOS.CDMARCA, 
                V_VRCUSTO,
                C_CUSTOS.NRPRODLISTAPRECOTCO,
                V_NRPRODLISTAPRECOCARDTRAB,
                P_NRORG, P_NRORG, P_NRORG,
                P_CDOPERADOR, P_CDOPERADOR,
                SYSDATE, SYSDATE);
            END IF;
        END LOOP;            
    END IF;
END;
/