create or replace PROCEDURE CALC_CAPACIDADE_PROD_COZ ( 
    P_CDCENTRAL IN PLANPRODUCAO.CDFILIAL%TYPE, 
    P_DTPRODDINI IN PLANPRODUCAO.DTPRODUCAO%TYPE,
    P_DTPRODFIN IN PLANPRODUCAO.DTPRODUCAO%TYPE, 
    P_TEMPOPRODUCAO IN FLOAT,
    P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE DEFAULT NULL,
    P_NRORG VARCHAR2 DEFAULT 1,
    P_CDOPERADOR VARCHAR2 DEFAULT 1
) IS  

V_NRCAPACIDADE NUMBER;
V_AUX          NUMBER;
V_QTEQUIP      NUMBER;
V_NREQUIP_ANT  NUMBER;
V_SEQ          NUMBER;
 
V_CDPROD_ANT   VARCHAR2(10);
V_CDFILIAGREG_ANT VARCHAR2(4);
V_CDSERVFILIAGREG_ANT VARCHAR2(5);

V_TEMPOINIPREP FLOAT;
V_QTAPRODUZIR  FLOAT;
V_QTAPROD_CALC FLOAT;
V_PERCENT_ALTERACAO FLOAT;
V_HRINICIO FLOAT;
V_TEMPO    FLOAT;
V_TEMPO_ACUMULADO FLOAT;
V_EQUIP_NEC FLOAT;
V_MAX_QTAPRODUZIR FLOAT;

V_DTCONSUMO_ANT DATE;

BEGIN    
    V_TEMPO := 0;
    V_TEMPOINIPREP := 0;
    FOR PRODUCAO IN 
        (SELECT DISTINCT P.NRPLANPROD
           FROM PLANPRODUCAO P
          INNER JOIN PLANPRODACABADO PP ON PP.NRPLANPROD = P.NRPLANPROD AND PP.IDPRODUZIR <> 'S'
          WHERE (((P.DTPRODUCAO BETWEEN P_DTPRODDINI AND P_DTPRODFIN) AND P_NRPLANPROD IS NULL)
             OR (P.NRPLANPROD = P_NRPLANPROD)))
    LOOP
        DBMS_OUTPUT.PUT_LINE('APAGA CALCULO ANTERIOR PARA PRODUTOS SEM PRODUCAO INICIADA') ;
         DELETE
           FROM CAPACIDADEPRODCOZ
          WHERE CDCENTRAL = P_CDCENTRAL
            AND NRPLANPROD = PRODUCAO.NRPLANPROD
            AND CDPRODUTO || NRSEQPRODACABADO NOT IN
            (
                SELECT DISTINCT CDPRODACABADO || NRSEQPRODACABADO
                   FROM PLANPRODACABADO
                  WHERE NRPLANPROD = PRODUCAO.NRPLANPROD
                    AND IDPRODUZIR = 'S'
                  --  AND HRINICIO IS NOT NULL
            ) ;
        FOR C_DADOS IN
        (
             SELECT P.DTPRODUCAO, EQ.NREQUIPAMCOZ, PP.CDPRODACABADO,
                PP.CDPRATO, PP.CDFILAUXPRAT, EP.TEMPOPREP AS TEMPO,
                --EQ.QTDISPTOTAL AS NUM_EQUIP,
                PESO.NUM_EQUIP, 
                SUM(PP.QTAPRODUZIR) AS QTAPRODUZIR, PESO.PESO AS CAPAC_EQUIP,
                DECODE(PESO.NUM_EQUIP, 1, 1, CEIL(SUM(PP.QTAPRODUZIR) / PESO.PESO)) TOTAL_EQUIP_NEC, CEIL(CEIL(SUM(PP.QTAPRODUZIR) / PESO.PESO) / PESO.NUM_EQUIP) VEZES_EQ_USADO, EP.TEMPOPREP * CEIL(CEIL(SUM(PP.QTAPRODUZIR) / PESO.PESO) / PESO.NUM_EQUIP) AS TEMPO_TOTAL_PROD,
                P.NRORG, P.NRPLANPROD, PP.NRSEQPRODACABADO,
                PP.IDCOOKCHILL, PP.IDTPPRODCHILL, PP.IDESTADO,
                PP.IDFINALIZACAO, PP.CDPRATOORI, PP.CDFILAUXPRATORI,
                PP.NRSEQITLANEST, P.HRINICIO
               FROM PLANPRODUCAO P
            INNER JOIN PLANPRODACABADO PP
                 ON PP.NRPLANPROD = P.NRPLANPROD
                AND PP.IDPRODUZIR = 'N'
                AND PP.IDESTADO <> 'FINALIZACAO'
            LEFT JOIN EQUIPRATOCOZ EP
                 ON EP.CDPRATO = PP.CDPRATO
                AND EP.CDFILAUXPRAT = PP.CDFILAUXPRAT
            LEFT JOIN EQUIPAMCOZ EQ
                 ON EQ.NREQUIPAMCOZ = EP.NREQUIPAMENTO
            LEFT JOIN
                (
                     SELECT EQUIPAMCOZ.NREQUIPAMCOZ, EQUIPAMCOZ.PESO, EQUIPRATOCOZ.CDPRATO, EQUIPRATOCOZ.CDFILAUXPRAT,
                        EQUIPAMCOZ.QTDISPTOTAL AS NUM_EQUIP
                       FROM EQUIPAMCOZ
                    INNER JOIN EQUIPRATOCOZ
                         ON EQUIPAMCOZ.NREQUIPAMCOZ = EQUIPRATOCOZ.NREQUIPAMENTO
                   --GROUP BY EQUIPAMCOZ.NREQUIPAMCOZ, EQUIPAMCOZ.PESO, EQUIPRATOCOZ.CDPRATO, EQUIPRATOCOZ.CDFILAUXPRAT
                ) PESO ON PESO.CDPRATO = EP.CDPRATO
                AND PESO.CDFILAUXPRAT = EP.CDFILAUXPRAT
                AND PESO.NREQUIPAMCOZ = EQ.NREQUIPAMCOZ
              WHERE P.CDFILIAL = P_CDCENTRAL
                AND(P.NRPLANPROD = PRODUCAO.NRPLANPROD)
                AND PP.CDPRODACABADO || PP.NRSEQPRODACABADO NOT IN
                (
                    SELECT DISTINCT CDPRODACABADO || NRSEQPRODACABADO
                       FROM PLANPRODACABADO
                      WHERE NRPLANPROD = P.NRPLANPROD
                        AND HRINICIO IS NOT NULL
                )
           GROUP BY P.DTPRODUCAO, EQ.NREQUIPAMCOZ, PP.CDPRODACABADO,
                PP.CDPRATO, PP.CDFILAUXPRAT, EP.TEMPOPREP,
                --EQ.QTDISPTOTAL,
                PESO.NUM_EQUIP, PESO.PESO, P.NRORG,
                P.NRPLANPROD, PP.NRSEQPRODACABADO, PP.IDCOOKCHILL,
                PP.IDTPPRODCHILL, PP.IDESTADO, PP.IDFINALIZACAO,
                PP.CDPRATOORI, PP.CDFILAUXPRATORI, PP.NRSEQITLANEST,
                P.HRINICIO
           ORDER BY PP.CDPRODACABADO, PP.NRSEQPRODACABADO, PESO.PESO--, EQ.QTDISPTOTAL
        )
        LOOP
            V_HRINICIO := C_DADOS.HRINICIO;
            V_QTAPROD_CALC := C_DADOS.QTAPRODUZIR;
            V_EQUIP_NEC := C_DADOS.TOTAL_EQUIP_NEC;
            
            IF (C_DADOS.TOTAL_EQUIP_NEC > C_DADOS.NUM_EQUIP) THEN
                V_QTEQUIP := C_DADOS.NUM_EQUIP;
            ELSE
                V_QTEQUIP := C_DADOS.TOTAL_EQUIP_NEC;
            END IF;
            
            IF(C_DADOS.CDPRODACABADO <> V_CDPROD_ANT OR V_CDPROD_ANT IS NULL ) THEN
                V_MAX_QTAPRODUZIR := V_QTEQUIP * C_DADOS.CAPAC_EQUIP;
                V_AUX := C_DADOS.VEZES_EQ_USADO;
            ELSE
                V_QTEQUIP := CEIL(V_MAX_QTAPRODUZIR / C_DADOS.CAPAC_EQUIP);
                V_AUX := CEIL(C_DADOS.QTAPRODUZIR / V_MAX_QTAPRODUZIR);
            END IF;
            
            --V_AUX := CEIL(NVL(C_DADOS.QTAPRODUZIR, 1) / NVL(C_DADOS.CAPAC_EQUIP, 1));
            --V_AUX := C_DADOS.VEZES_EQ_USADO;
            IF (V_AUX = 0 OR C_DADOS.CAPAC_EQUIP IS NULL ) THEN
                V_AUX := 1;
            END IF;
            
            WHILE V_AUX > 0
            LOOP            
                IF (V_AUX = 1) THEN
                    V_SEQ := C_DADOS.NRSEQPRODACABADO;
                ELSE          
                    IF(C_DADOS.CDPRODACABADO <> V_CDPROD_ANT OR V_CDPROD_ANT IS NULL ) THEN
                        SELECT NVL(MAX(NRSEQPRODACABADO), 0) + 1 INTO V_SEQ
                          FROM PLANPRODACABADO 
                         WHERE NRPLANPROD = C_DADOS.NRPLANPROD
                           AND CDPRODACABADO = C_DADOS.CDPRODACABADO
                           AND CDPRATO = C_DADOS.CDPRATO
                           AND CDFILAUXPRAT = C_DADOS.CDFILAUXPRAT
                           AND IDCOOKCHILL = C_DADOS.IDCOOKCHILL
                           AND IDFINALIZACAO = C_DADOS.IDFINALIZACAO
                           AND IDESTADO = C_DADOS.IDESTADO
                           AND IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL;
                    ELSE 
                        IF(C_DADOS.NRSEQPRODACABADO > V_SEQ) THEN
                            V_SEQ := C_DADOS.NRSEQPRODACABADO + 1;
                        ELSE 
                            V_SEQ := V_SEQ + 1;
                        END IF;
                    END IF;
                END IF;
                
                --JA CALCULA O TEMPO QUE DEVE INICIAR A PRODUCAO ANTES DA HORA FINAL
                IF (C_DADOS.CDPRODACABADO <> V_CDPROD_ANT OR V_CDPROD_ANT IS NULL) THEN
                    V_TEMPOINIPREP := C_DADOS.TEMPO + V_TEMPOINIPREP;
                    V_NREQUIP_ANT := NULL;
                    V_TEMPO_ACUMULADO := 0;
                ELSE                     
                    V_TEMPO_ACUMULADO := V_TEMPO_ACUMULADO + V_TEMPO;
                    V_TEMPOINIPREP := C_DADOS.TEMPO + V_TEMPO_ACUMULADO;
                END IF;

                IF V_QTAPROD_CALC > NVL(C_DADOS.CAPAC_EQUIP, V_QTAPROD_CALC) THEN
                    V_QTAPRODUZIR := C_DADOS.CAPAC_EQUIP * V_QTEQUIP;
                    IF V_QTAPROD_CALC < V_QTAPRODUZIR THEN
                        V_QTAPRODUZIR := V_QTAPROD_CALC;
                    END IF;
                ELSE 
                    V_QTAPRODUZIR := V_QTAPROD_CALC;
                END IF;

                --QUEBRA DO PLANEJAMENTO DA PRODUCAO 
                IF ((C_DADOS.NREQUIPAMCOZ = V_NREQUIP_ANT OR V_NREQUIP_ANT IS NULL) AND
                    (C_DADOS.NREQUIPAMCOZ IS NOT NULL)) THEN 
                    IF (V_AUX = 1) THEN
                        DBMS_OUTPUT.PUT_LINE('ATUALIZA PLANPRODACABADO: ' || C_DADOS.NRPLANPROD || '-' || C_DADOS.CDPRODACABADO || '-' || 
                                            C_DADOS.IDCOOKCHILL || '-' || C_DADOS.IDFINALIZACAO || '-' || C_DADOS.IDTPPRODCHILL || '-' || 
                                            C_DADOS.IDESTADO || '-' || V_SEQ || '-' || V_QTAPRODUZIR); 

                        UPDATE PLANPRODACABADO
                           SET QTAPRODUZIR = V_QTAPRODUZIR, 
                               QTPRODACABADO = V_QTAPRODUZIR
                         WHERE NRPLANPROD = C_DADOS.NRPLANPROD
                           AND CDPRODACABADO = C_DADOS.CDPRODACABADO
                           AND IDCOOKCHILL = C_DADOS.IDCOOKCHILL
                           AND IDFINALIZACAO = C_DADOS.IDFINALIZACAO
                           AND IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL
                           AND IDESTADO = C_DADOS.IDESTADO
                           AND NRSEQPRODACABADO = C_DADOS.NRSEQPRODACABADO;

                        V_PERCENT_ALTERACAO := (V_QTAPRODUZIR / C_DADOS.QTAPRODUZIR);
                        
                        UPDATE PLANPRODFILIAGREGA 
                           SET QTCOMENSSERV = ROUND(V_PERCENT_ALTERACAO * QTCOMENSSERV, 3),
                               QTPRODSERV = ROUND(V_PERCENT_ALTERACAO * QTPRODSERV, 3), 
                               QTAPRODUZIR = ROUND(V_PERCENT_ALTERACAO * QTAPRODUZIR, 3),
                               VRTOTALPRODSERV = VRUNITPRODSERV * ROUND(V_PERCENT_ALTERACAO * QTAPRODUZIR, 3), 
                               DTULTATU = SYSDATE
                         WHERE NRPLANPROD = C_DADOS.NRPLANPROD
                           AND CDPRODACABADO = C_DADOS.CDPRODACABADO
                           AND IDCOOKCHILL = C_DADOS.IDCOOKCHILL
                           AND IDFINALIZACAO = C_DADOS.IDFINALIZACAO
                           AND IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL
                           AND IDESTADO = C_DADOS.IDESTADO
                           AND NRSEQPRODACABADO = C_DADOS.NRSEQPRODACABADO;
                           
                        UPDATE PLANRECPROD
                           SET QTPRODRECEPRAT = ROUND(V_PERCENT_ALTERACAO * QTPRODRECEPRAT, 3), 
                               QTAPRODUZIR = ROUND(V_PERCENT_ALTERACAO * QTAPRODUZIR, 5),
                               QTLIBERADA = ROUND(V_PERCENT_ALTERACAO * QTLIBERADA, 5),
                               VRTOTALRECEPRAT = VRUNITRECEPRAT * ROUND(V_PERCENT_ALTERACAO * QTAPRODUZIR, 3), 
                               DTULTATU = SYSDATE
                         WHERE NRPLANPROD = C_DADOS.NRPLANPROD
                           AND CDPRODACABADO = C_DADOS.CDPRODACABADO
                           AND IDCOOKCHILL = C_DADOS.IDCOOKCHILL
                           AND IDFINALIZACAO = C_DADOS.IDFINALIZACAO
                           AND IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL
                           AND IDESTADO = C_DADOS.IDESTADO
                           AND NRSEQPRODACABADO = C_DADOS.NRSEQPRODACABADO;
                    ELSE 
                        DBMS_OUTPUT.PUT_LINE('INSERE PLANPRODACABADO: ' || C_DADOS.NRPLANPROD || '-' || C_DADOS.CDPRODACABADO || '-' || 
                                            C_DADOS.IDCOOKCHILL || '-' || C_DADOS.IDFINALIZACAO || '-' || C_DADOS.IDTPPRODCHILL || '-' || 
                                            C_DADOS.IDESTADO || '-' || V_SEQ || '-' || V_QTAPRODUZIR);

                        INSERT INTO PLANPRODACABADO
                            (NRPLANPROD, CDPRODACABADO, CDPRATO, CDFILAUXPRAT, QTPRODACABADO, 
                            IDPRODUZIR, IDCONCLUIDO, NRSEQITLANEST, NRORG, IDATIVO, IDCOOKCHILL, 
                            IDFINALIZACAO, IDTPPRODCHILL, IDESTADO, NRSEQPRODACABADO, QTAPRODUZIR, 
                            QTPERDA, QTEXTRA, CDPRATOORI, CDFILAUXPRATORI,
                            DTINCLUSAO, DTULTATU, NRORGINCLUSAO, NRORGULTATU, CDOPERINCLUSAO, CDOPERULTATU)
                        VALUES
                            (C_DADOS.NRPLANPROD, C_DADOS.CDPRODACABADO, C_DADOS.CDPRATO, C_DADOS.CDFILAUXPRAT, V_QTAPRODUZIR, 
                            'N', 'N', C_DADOS.NRSEQITLANEST, C_DADOS.NRORG, 'S', C_DADOS.IDCOOKCHILL, 
                            C_DADOS.IDFINALIZACAO, C_DADOS.IDTPPRODCHILL, C_DADOS.IDESTADO, V_SEQ, V_QTAPRODUZIR, 
                            0.00, 0.00, C_DADOS.CDPRATOORI, C_DADOS.CDFILAUXPRATORI,
                            SYSDATE, SYSDATE, P_NRORG, P_NRORG, P_CDOPERADOR, P_CDOPERADOR);
                          
                        --INICIO - RATEIO DO PLANEJAMENTO
                        FOR C_AGREGA IN
                            (SELECT F.CDFILIAGREG, F.CDSERVFILIAGREG, F.DTCONSUMO, F.QTPRODSERV, NVL(F.VRUNITPRODSERV, 0.00) AS VRUNITPRODSERV,
                                   NVL(F.VRTOTALPRODSERV, 0.00) AS VRTOTALPRODSERV, F.QTCOMENSSERV, F.IDPRODUZIR, F.IDCONCLUIDO, F.NRORG, F.IDATIVO,
                                   R.CDPRODUTO, R.CDTIPOPRAT, R.QTPRODRECEPRAT, R.VRUNITRECEPRAT, R.VRTOTALRECEPRAT,
                                   R.IDTPRECEITA, R.IDADIANTADO, R.NRSEQITRETI, R.QTAPRODUZIR AS QTREC,
                                   R.QTEXTRA, R.QTDEVOLVIDA, R.QTLIBERADA
                              FROM PLANPRODFILIAGREGA F
                             INNER JOIN PLANRECPROD R ON R.NRPLANPROD = F.NRPLANPROD
                                                     AND R.CDPRODACABADO = F.CDPRODACABADO
                                                     AND R.IDCOOKCHILL = F.IDCOOKCHILL
                                                     AND R.IDFINALIZACAO = F.IDFINALIZACAO
                                                     AND R.IDTPPRODCHILL = F.IDTPPRODCHILL
                                                     AND R.IDESTADO = F.IDESTADO
                                                     AND R.NRSEQPRODACABADO = F.NRSEQPRODACABADO
                                                     AND R.CDFILIAGREG = F.CDFILIAGREG
                                                     AND R.CDSERVFILIAGREG = F.CDSERVFILIAGREG
                                                     AND R.DTCONSUMO = F.DTCONSUMO
                             WHERE F.NRPLANPROD = C_DADOS.NRPLANPROD
                               AND F.CDPRODACABADO = C_DADOS.CDPRODACABADO
                               AND F.IDCOOKCHILL = C_DADOS.IDCOOKCHILL
                               AND F.IDFINALIZACAO = C_DADOS.IDFINALIZACAO
                               AND F.IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL
                               AND F.IDESTADO = C_DADOS.IDESTADO
                               AND F.NRSEQPRODACABADO = C_DADOS.NRSEQPRODACABADO
                             ORDER BY F.CDPRODACABADO, F.IDCOOKCHILL, F.IDFINALIZACAO, F.IDTPPRODCHILL,
                                   F.IDESTADO, F.NRSEQPRODACABADO, F.CDFILIAGREG, F.CDSERVFILIAGREG, 
                                   F.DTCONSUMO, R.CDTIPOPRAT, R.CDPRODUTO)
                        LOOP
                            V_PERCENT_ALTERACAO := (V_QTAPRODUZIR / C_DADOS.QTAPRODUZIR);
                            
                            IF ((C_AGREGA.CDFILIAGREG <> V_CDFILIAGREG_ANT OR V_CDFILIAGREG_ANT IS NULL) OR
                                (C_AGREGA.CDSERVFILIAGREG <> V_CDSERVFILIAGREG_ANT OR V_CDSERVFILIAGREG_ANT IS NULL) OR 
                                (C_AGREGA.DTCONSUMO <> V_DTCONSUMO_ANT OR V_DTCONSUMO_ANT IS NULL)
                            ) THEN 
                            
                                DBMS_OUTPUT.PUT_LINE('INSERE PLANPRODFILIAGREGA: ' || C_DADOS.CDPRODACABADO || '-' || 
                                            C_AGREGA.CDFILIAGREG || '-' || C_AGREGA.CDSERVFILIAGREG || '-' || C_AGREGA.DTCONSUMO || '-' ||
                                            V_SEQ);

                                INSERT INTO PLANPRODFILIAGREGA 
                                 (NRSEQPRODACABADO, NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, 
                                  DTCONSUMO, QTCOMENSSERV, 
                                  QTPRODSERV, QTAPRODUZIR,
                                  VRTOTALPRODSERV, VRUNITPRODSERV,
                                  NRORG, NRORGINCLUSAO, NRORGULTATU, DTINCLUSAO, DTULTATU, CDOPERINCLUSAO, CDOPERULTATU,
                                  IDCOOKCHILL, IDFINALIZACAO, IDESTADO, IDTPPRODCHILL)
                                 VALUES
                                 (V_SEQ, C_DADOS.NRPLANPROD, C_DADOS.CDPRODACABADO, C_AGREGA.CDFILIAGREG, C_AGREGA.CDSERVFILIAGREG,
                                  C_AGREGA.DTCONSUMO, ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTCOMENSSERV, 3), 
                                  ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODSERV, 3), ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODSERV, 3), 
                                  C_AGREGA.VRUNITPRODSERV * ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODSERV, 3), C_AGREGA.VRUNITPRODSERV,
                                  P_NRORG, P_NRORG, P_NRORG, SYSDATE, SYSDATE, P_CDOPERADOR, P_CDOPERADOR,
                                  C_DADOS.IDCOOKCHILL, C_DADOS.IDFINALIZACAO, C_DADOS.IDESTADO, C_DADOS.IDTPPRODCHILL);
                                
                                V_CDFILIAGREG_ANT := C_AGREGA.CDFILIAGREG;
                                V_CDSERVFILIAGREG_ANT := C_AGREGA.CDSERVFILIAGREG;
                                V_DTCONSUMO_ANT := C_AGREGA.DTCONSUMO;
                            END IF;   
                            
                            DBMS_OUTPUT.PUT_LINE('INSERE PLANRECPROD: ' || C_DADOS.CDPRODACABADO || '-' || 
                                        C_AGREGA.CDFILIAGREG || '-' || C_AGREGA.CDSERVFILIAGREG || '-' || C_AGREGA.DTCONSUMO || '-' || 
                                        V_SEQ || '-' || C_AGREGA.CDPRODUTO);

                            INSERT INTO PLANRECPROD
                                (NRSEQPRODACABADO, NRPLANPROD, CDFILIAL, 
                                CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO, 
                                CDPRODUTO, QTPRODRECEPRAT, QTAPRODUZIR, 
                                QTLIBERADA,
                                VRUNITRECEPRAT, VRTOTALRECEPRAT, 
                                CDTIPOPRAT, IDTPRECEITA, IDADIANTADO,
                                NRORG, NRORGINCLUSAO, NRORGULTATU, DTINCLUSAO, DTULTATU, CDOPERINCLUSAO, CDOPERULTATU,
                                IDCOOKCHILL, IDFINALIZACAO, IDESTADO, IDTPPRODCHILL)
                            VALUES
                                (V_SEQ, C_DADOS.NRPLANPROD, P_CDCENTRAL, 
                                C_DADOS.CDPRODACABADO, C_AGREGA.CDFILIAGREG, C_AGREGA.CDSERVFILIAGREG, C_AGREGA.DTCONSUMO, 
                                C_AGREGA.CDPRODUTO, ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODRECEPRAT, 3), ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODRECEPRAT, 5), 
                                ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTLIBERADA, 5), 
                                C_AGREGA.VRUNITRECEPRAT, C_AGREGA.VRUNITRECEPRAT * ROUND(V_PERCENT_ALTERACAO * C_AGREGA.QTPRODRECEPRAT, 3), 
                                C_AGREGA.CDTIPOPRAT, C_AGREGA.IDTPRECEITA, C_AGREGA.IDADIANTADO, 
                                P_NRORG, P_NRORG, P_NRORG, SYSDATE, SYSDATE, P_CDOPERADOR, P_CDOPERADOR, 
                                  C_DADOS.IDCOOKCHILL, C_DADOS.IDFINALIZACAO, C_DADOS.IDESTADO, C_DADOS.IDTPPRODCHILL);
                        END LOOP;                    
                        -- FIM - RATEIO DO PLANEJAMENTO
                        
                        V_CDFILIAGREG_ANT := NULL;
                        V_CDSERVFILIAGREG_ANT := NULL;
                        V_DTCONSUMO_ANT := NULL;
                        
                    END IF;
                
                V_NREQUIP_ANT := C_DADOS.NREQUIPAMCOZ;
                END IF;
               

                NOVO_CODIGO_NT('CAPACIDADEPRODCOZ', V_NRCAPACIDADE);            
                DBMS_OUTPUT.PUT_LINE('INSERE CAPACIDADE ' || V_NRCAPACIDADE); 
               
                INSERT INTO CAPACIDADEPRODCOZ 
                    (NRCAPACIDADEPRODCOZ, CDCENTRAL, DTPRODUCAO, CDPRODUTO, 
                     NREQUIPAMCOZ, QTEQUIP, TEMPOTOTAL, IDEXCEDETEMPO, NRORG,
                     NRPLANPROD, NRSEQPRODACABADO, IDCOOKCHILL, IDTPPRODCHILL, 
                     IDESTADO, IDFINALIZACAO, TEMPOINIPREP,
                     DTINCLUSAO, DTULTATU, NRORGINCLUSAO, NRORGULTATU, CDOPERINCLUSAO, CDOPERULTATU)
                VALUES 
                    (V_NRCAPACIDADE, P_CDCENTRAL, C_DADOS.DTPRODUCAO, C_DADOS.CDPRODACABADO,
                     C_DADOS.NREQUIPAMCOZ, V_QTEQUIP, C_DADOS.TEMPO, 'N', C_DADOS.NRORG,
                     C_DADOS.NRPLANPROD, V_SEQ, C_DADOS.IDCOOKCHILL, C_DADOS.IDTPPRODCHILL, 
                     C_DADOS.IDESTADO, C_DADOS.IDFINALIZACAO, V_TEMPOINIPREP,
                     SYSDATE, SYSDATE, P_NRORG, P_NRORG, P_CDOPERADOR, P_CDOPERADOR);
               
                V_AUX := V_AUX - 1;
                V_QTAPROD_CALC := V_QTAPROD_CALC - V_QTAPRODUZIR;

                IF (V_EQUIP_NEC - V_QTEQUIP) < V_QTEQUIP THEN 
                    V_QTEQUIP := (V_EQUIP_NEC - V_QTEQUIP);
                END IF;
                
                IF(V_QTEQUIP <= 0) THEN 
                    V_QTEQUIP := 1;
                END IF;
                V_EQUIP_NEC := V_EQUIP_NEC - V_QTEQUIP;

            END LOOP;
            
            IF(C_DADOS.CDPRODACABADO <> V_CDPROD_ANT OR V_CDPROD_ANT IS NULL ) THEN
                V_SEQ := 1; 
            END IF;
            
            V_TEMPO := C_DADOS.TEMPO;
            V_TEMPOINIPREP := 0;
            V_CDPROD_ANT := C_DADOS.CDPRODACABADO;
        END LOOP;   
    
        /* TRATA PRODUTO ACABADO QUE E INSUMO DE OUTRO PA, O PA FILHO DEVE SER PRODUZIDO ANTES DO PA PAI */
        FOR PA_FILHO IN 
            (SELECT R.CDPRODACABADO PROD_PAI, C_PAI.TEMPOTOTAL AS TEMPOTOTAL_PAI, MAX(C_PAI.TEMPOINIPREP) AS TEMPOINIPREP_PAI,
                    P.CDPRODACABADO PROD_FILHO, C_FILHO.TEMPOTOTAL AS TEMPOTOTAL_FILHO, C_FILHO.TEMPOINIPREP AS TEMPOINIPREP_FILHO,
                    C_FILHO.NRSEQPRODACABADO AS NRSEQPRODACABADO_FILHO
               FROM PLANPRODACABADO P
              INNER JOIN PLANRECPROD R ON P.NRPLANPROD = R.NRPLANPROD AND P.CDPRODACABADO = R.CDPRODUTO
               LEFT JOIN CAPACIDADEPRODCOZ C_FILHO ON C_FILHO.NRPLANPROD = P.NRPLANPROD AND C_FILHO.CDPRODUTO = P.CDPRODACABADO
               LEFT JOIN CAPACIDADEPRODCOZ C_PAI ON C_PAI.NRPLANPROD = P.NRPLANPROD AND C_PAI.CDPRODUTO = R.CDPRODACABADO
              WHERE P.NRPLANPROD = PRODUCAO.NRPLANPROD
                AND P.IDESTADO <> 'FINALIZACAO'
              GROUP BY R.CDPRODACABADO, C_PAI.TEMPOTOTAL, 
                    P.CDPRODACABADO, C_FILHO.TEMPOTOTAL, C_FILHO.TEMPOINIPREP,
                    C_FILHO.NRSEQPRODACABADO)
        LOOP
            UPDATE CAPACIDADEPRODCOZ 
               SET TEMPOINIPREP = TEMPOINIPREP + PA_FILHO.TEMPOINIPREP_PAI
             WHERE NRPLANPROD = PRODUCAO.NRPLANPROD
               AND CDPRODUTO = PA_FILHO.PROD_FILHO
               AND NRSEQPRODACABADO = PA_FILHO.NRSEQPRODACABADO_FILHO;
        END LOOP;
    
        /* CALCULA O HORARIO DA PRODUCAO CONSIDERANDO OS EQUIPAMENTOS PARA NAO SEREM UTILIZADOS AO MESMO TEMPO */
        FOR CALCULO IN 
            -- CARREGA OS HORARIOS DE PREPARACAO
            (SELECT DISTINCT P_TEMPOPRODUCAO - C.TEMPOINIPREP HORA_INICIO, 
                    (P_TEMPOPRODUCAO - C.TEMPOINIPREP) + C.TEMPOTOTAL HORA_FIM, C.NRPLANPROD
               FROM CAPACIDADEPRODCOZ C
              WHERE C.CDCENTRAL = P_CDCENTRAL
                AND C.NRPLANPROD = PRODUCAO.NRPLANPROD
                AND C.TEMPOINIPREP IS NOT NULL
              ORDER BY C.NRPLANPROD, (P_TEMPOPRODUCAO - C.TEMPOINIPREP))
        LOOP
            -- CARREGA OS EQUIPAMENTOS UTILIZADOS NO MESMO HORARIO
            FOR EXCEDE IN
                (SELECT * 
                  FROM (SELECT E.NREQUIPAMCOZ, COUNT(E.NREQUIPAMCOZ) NUM_EQUIP_NEC, 
                               EQ.QTDISPTOTAL, E.IDEXCEDETEMPO
                          FROM CAPACIDADEPRODCOZ E
                         INNER JOIN EQUIPAMCOZ EQ ON EQ.NREQUIPAMCOZ = E.NREQUIPAMCOZ
                         WHERE E.CDCENTRAL = P_CDCENTRAL
                           AND E.NRPLANPROD = CALCULO.NRPLANPROD
                           AND (P_TEMPOPRODUCAO - E.TEMPOINIPREP) BETWEEN CALCULO.HORA_INICIO AND CALCULO.HORA_FIM
                         GROUP BY E.NREQUIPAMCOZ, EQ.QTDISPTOTAL, E.IDEXCEDETEMPO
                           ORDER BY E.NREQUIPAMCOZ) EQUIP_EXCED
                 WHERE NUM_EQUIP_NEC > QTDISPTOTAL)
            LOOP        
                DBMS_OUTPUT.PUT_LINE('ATUALIZA QUEM EXCEDE O NUMERO TOTAL DE EQUIPAMENTOS DISPONIVEIS');
                
                UPDATE CAPACIDADEPRODCOZ
                   SET IDEXCEDETEMPO = 'S'
                 WHERE CDCENTRAL = P_CDCENTRAL
                   AND NRPLANPROD = CALCULO.NRPLANPROD
                   AND (P_TEMPOPRODUCAO - TEMPOINIPREP) BETWEEN CALCULO.HORA_INICIO AND CALCULO.HORA_FIM
                   AND NREQUIPAMCOZ = EXCEDE.NREQUIPAMCOZ;
            END LOOP;
        END LOOP;
    
        DBMS_OUTPUT.PUT_LINE('ATUALIZA QUEM EXCEDE O TEMPO');
        
        --ATUALIZA OS PRATOS QUE A SOMA DO PREPARO EXCEDE O TEMPO DISPONIVEL
        --E QUE O HORARIO DE INICIO EXCEDE O TEMPO DE INICIO DO PREPARO
        UPDATE CAPACIDADEPRODCOZ 
           SET IDEXCEDETEMPO = 'S'
         WHERE CDPRODUTO IN ( SELECT DISTINCT CDPRODUTO 
                                FROM (SELECT C.CDPRODUTO, --CEIL(SUM(C.QTEQUIP) / EQ.QTDISPTOTAL) AS VEZES_USADO, 
                                             CASE 
                                                WHEN HORADEC_HORACHAR(MAX(C.TEMPOTOTAL) * CEIL(SUM(C.QTEQUIP) / EQ.QTDISPTOTAL)) > HORADEC_HORACHAR(P_TEMPOPRODUCAO  - V_HRINICIO)
                                                    THEN 'S' 
                                                WHEN HORADEC_HORACHAR(P_TEMPOPRODUCAO - C.TEMPOINIPREP) < HORADEC_HORACHAR(V_HRINICIO)
                                                    THEN 'S'
                                                ELSE 'N' 
                                             END AS EXCEDE
                                        FROM CAPACIDADEPRODCOZ C
                                       INNER JOIN EQUIPAMCOZ EQ ON EQ.NREQUIPAMCOZ = C.NREQUIPAMCOZ
                                       WHERE C.CDCENTRAL = P_CDCENTRAL
                                         AND C.NRPLANPROD = PRODUCAO.NRPLANPROD
                                       GROUP BY C.CDPRODUTO, EQ.QTDISPTOTAL, C.TEMPOINIPREP
                                       UNION ALL
                                      SELECT DISTINCT CC.CDPRODUTO, CC.IDEXCEDETEMPO AS EXCEDE
                                        FROM CAPACIDADEPRODCOZ CC
                                       WHERE CC.CDCENTRAL = P_CDCENTRAL
                                         AND CC.NRPLANPROD = PRODUCAO.NRPLANPROD
                                         AND CC.IDEXCEDETEMPO = 'S') A 
                              WHERE EXCEDE = 'S')
           AND CDCENTRAL = P_CDCENTRAL
           AND NRPLANPROD = PRODUCAO.NRPLANPROD; 
        
        UPDATE PLANPRODUCAO
           SET HRFIM = P_TEMPOPRODUCAO
         WHERE NRPLANPROD = PRODUCAO.NRPLANPROD;

    END LOOP;
END;