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);
    -- 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;

    -- 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 NRPRODLISTAPRECOTCO, CDPRODESTO, VRCUSTO, CDMARCA
            FROM PRODLISTAPRECOTCO
            WHERE NRLISTAPRECOTCO = V_NRLISTAPRECOTCO
            AND IDESCOLHIDO = 'S') LOOP

            V_NRPRODUTOCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('PRODUTOCARDTRAB', 1));

            INSERT INTO PRODUTOCARDTRAB
            (NRPRODUTOCARDTRAB, NRCARDAPIOTRAB, 
            CDPRODUTO, CDMARCA, 
            VRCUSTO,
            NRPRODLISTAPRECOTCO,
            NRORG, NRORGINCLUSAO, NRORGULTATU,
            CDOPERINCLUSAO, CDOPERULTATU,
            DTINCLUSAO, DTULTATU)
            VALUES
            (V_NRPRODUTOCARDTRAB, P_NRCARDAPIOTRAB,
            C_CUSTOS.CDPRODESTO, C_CUSTOS.CDMARCA, 
            C_CUSTOS.VRCUSTO + ( C_CUSTOS.VRCUSTO * (NVL(P_VRPEACRESCUSTO, 0)/100)),
            C_CUSTOS.NRPRODLISTAPRECOTCO,
            P_NRORG, P_NRORG, P_NRORG,
            P_CDOPERADOR, P_CDOPERADOR,
            SYSDATE, SYSDATE);
        END LOOP;            
    END IF;

    -- Percorre pratos na planilha do cardapio
    FOR C_COMPCARDTRAB IN
    (
        SELECT DISTINCT CDFILAUXPRAT, CDPRATO
          FROM COMPCARDTRAB
         WHERE NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
    ) LOOP
        SELECT MAX(P.CDPRATO || ' - ' || P.NMPRATO)
          INTO V_PRATO
          FROM PRATO P
         WHERE P.CDFILAUXPRAT = C_COMPCARDTRAB.CDFILAUXPRAT
           AND P.CDPRATO = C_COMPCARDTRAB.CDPRATO;
        -- Percorre os produtos da receita do cardapio que nao possuem custo
        FOR C_RECEPRATCARDTRAB IN
        (
            SELECT R.CDPRODUTO
              FROM RECEPRATCARDTRAB R
                   LEFT JOIN PRODUTOCARDTRAB P ON P.NRCARDAPIOTRAB = R.NRCARDAPIOTRAB AND
                                                  P.CDPRODUTO = R.CDPRODUTO AND
                                                  P.NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
             WHERE R.NRCARDAPIOTRAB = P_NRCARDAPIOTRAB
               AND R.CDFILAUXPRAT = C_COMPCARDTRAB.CDFILAUXPRAT
               AND R.CDPRATO = C_COMPCARDTRAB.CDPRATO
               AND P.CDPRODUTO IS NULL
        ) LOOP
            SELECT MAX(P.CDARVPROD || ' - ' || P.NMPRODUTO)
              INTO V_PRODUTO
              FROM PRODUTO P
             WHERE CDPRODUTO = C_RECEPRATCARDTRAB.CDPRODUTO;
            
            -- Produto __PARAM0__ do prato __PARAM1__ nao possui custo
            I_L(MSG('TCOPROC_PRODUTO_SEM_CUSTO_PRATO', V_PRODUTO, V_PRATO));
        END LOOP;
    END LOOP;
END;
/