# EVENTI_AGGIORNA_QTA_LISTA

## Codice Sorgente

```sql
PROCEDURE "EVENTI_AGGIORNA_QTA_LISTA" (
    p_id_evento NUMBER
) AS 
-- ricalcola tutte le qta della lista

    v_cod_art       VARCHAR2(10);
    v_coeff_a       NUMBER;
    v_coeff_s       NUMBER;
    v_coeff_b       NUMBER;
    v_ospiti        NUMBER;
    v_qta_a         NUMBER;
    v_qta_s         NUMBER;
    v_qta_b         NUMBER;
    v_qta_std_a     NUMBER;
    v_qta_std_s     NUMBER;
    v_qta_std_b     NUMBER;
    v_count_tov     NUMBER;
    v_count_tov_buf NUMBER;
    v_qta_giac      NUMBER;
    v_qta_imp       NUMBER;
    v_data_evt      DATE;
    v_qta_man       VARCHAR2(100);
BEGIN

-- Daniele Viti
-- Scorre tutti gli articoli dell'evento
---------
    FOR c IN (
        SELECT DISTINCT
            cod_articolo
        FROM
            eventi_det_prel
        WHERE
            id_evento = p_id_evento
    ) LOOP
        BEGIN

        --default su qta:

        --verifica qta standard
            SELECT
                nvl(qta_std_a, 0),
                nvl(qta_std_s, 0),
                nvl(qta_std_b, 0)
            INTO
                v_qta_std_a,
                v_qta_std_s,
                v_qta_std_b
            FROM
                articoli
            WHERE
                cod_articolo = c.cod_articolo;

            IF v_qta_std_a > 0 OR v_qta_std_s > 0 OR v_qta_std_b > 0 THEN
                UPDATE eventi_det_prel
                SET
                    qta_ape = v_qta_std_a,
                    qta_sedu = v_qta_std_s,
                    qta_bufdol = v_qta_std_b,
                    qta = qta_ape + qta_sedu + qta_bufdol + qta_man_ape + qta_man_sedu + qta_man_bufdol
                WHERE
                        id_evento = p_id_evento
                    AND cod_articolo = c.cod_articolo;

                COMMIT;
                CONTINUE; -- se esistono le qta standard aggiorna e passa il giro successivo!

            END IF;

            SELECT
                cod_relativo
            INTO v_cod_art
            FROM
                articoli
            WHERE
                cod_articolo = c.cod_articolo;

            IF v_cod_art IS NULL THEN
        --Articolo Relativo assente

            --verifica se cod_articolo  è di tipo TOVAGLE O CARAFFE etc...          
                SELECT
                    COUNT(*)
                INTO v_count_tov
                FROM
                         articoli a
                    JOIN tb_codici_categ c ON a.cod_categ = c.cod_categ
                    JOIN tb_tipi_mat     t ON c.cod_tipo = t.cod_tipo
                WHERE
                    ( c.cod_tipo IN ( 'CA-CARAFFE' )
                   -- or c.COD_CATEG in ('TOV-BUFF','TOV-SED')
                      OR c.cod_categ IN ( 'TOV-SED' ) )
                    AND a.cod_articolo = c.cod_articolo;        

            --verifica se cod_articolo  è di tipo TOVAGLE BUFFET 
                SELECT
                    COUNT(*)
                INTO v_count_tov_buf
                FROM
                         articoli a
                    JOIN tb_codici_categ c ON a.cod_categ = c.cod_categ
                    JOIN tb_tipi_mat     t ON c.cod_tipo = t.cod_tipo
                WHERE
                    c.cod_categ IN ( 'TOV-BUFF' )
                    AND a.cod_articolo = c.cod_articolo; -- 'CM-DANI'   

                IF v_count_tov > 0 THEN
            --c.COD_ARTICOLO è di tipo TOVAGLE O CARAFFE etc...

                -- reperisco le qta tot inserita per i tavoli
                    SELECT
                        nvl(SUM(qta_ape),
                            0),
                        nvl(SUM(qta_sedu),
                            0),
                        nvl(SUM(qta_bufdol),
                            0)
                    INTO
                        v_qta_a,
                        v_qta_s,
                        v_qta_b
                    FROM
                             eventi_det_prel e
                        JOIN articoli        a ON e.cod_articolo = a.cod_articolo
                        JOIN tb_codici_categ c ON a.cod_categ = c.cod_categ
                        JOIN tb_tipi_mat     t ON c.cod_tipo = t.cod_tipo
                    WHERE
                            id_evento = p_id_evento
                        AND c.cod_tipo IN ( 'TA' );     

                --recupero il coefficente dell'atricolo (tovagliato o caraffe) e lo moltiplico x la qta tavoli
                    SELECT
                        nvl(coeff_a, 0),
                        nvl(coeff_s, 0),
                        nvl(coeff_b, 0)
                    INTO
                        v_coeff_a,
                        v_coeff_s,
                        v_coeff_b
                    FROM
                        articoli
                    WHERE
                        cod_articolo = c.cod_articolo;

                    UPDATE eventi_det_prel
                    SET
                        qta_ape = v_qta_a * v_coeff_a,
                        qta_sedu = v_qta_s * v_coeff_s,
                        qta_bufdol = v_qta_b * v_coeff_b,
                        qta = qta_ape + qta_sedu + qta_bufdol + qta_man_ape + qta_man_sedu + qta_man_bufdol
                    WHERE
                            id_evento = p_id_evento
                        AND cod_articolo = c.cod_articolo;

                    COMMIT;
                ELSIF v_count_tov_buf > 0 THEN
            --c.COD_ARTICOLO è di tipo TOVAGLE BUFFET                

                -- reperisco le qta tot inserita per gli angoli buffet
                    SELECT
                        nvl(SUM(qta_ape),
                            0),
                        nvl(SUM(qta_sedu),
                            0),
                        nvl(SUM(qta_bufdol),
                            0)
                    INTO
                        v_qta_a,
                        v_qta_s,
                        v_qta_b
                    FROM
                             eventi_det_prel e
                        JOIN articoli        a ON e.cod_articolo = a.cod_articolo
                        JOIN tb_codici_categ c ON a.cod_categ = c.cod_categ
                        JOIN tb_tipi_mat     t ON c.cod_tipo = t.cod_tipo
                    WHERE
                            id_evento = p_id_evento
                        AND c.cod_tipo IN ( 'AN' );     

                --recupero il coefficente dell'atricolo (tovagliato buffet) e lo moltiplico x la qta angoli
                    SELECT
                        nvl(coeff_a, 0),
                        nvl(coeff_s, 0),
                        nvl(coeff_b, 0)
                    INTO
                        v_coeff_a,
                        v_coeff_s,
                        v_coeff_b
                    FROM
                        articoli
                    WHERE
                        cod_articolo = c.cod_articolo;

                    UPDATE eventi_det_prel
                    SET
                        qta_ape = v_qta_a * v_coeff_a,
                        qta_sedu = v_qta_s * v_coeff_s,
                        qta_bufdol = v_qta_b * v_coeff_b,
                        qta = qta_ape + qta_sedu + qta_bufdol + qta_man_ape + qta_man_sedu + qta_man_bufdol
                    WHERE
                            id_evento = p_id_evento
                        AND cod_articolo = c.cod_articolo;

                    COMMIT;
                ELSE
                    BEGIN
                        v_cod_art := c.cod_articolo;
                        SELECT
                            nvl(coeff_a, 0),
                            nvl(coeff_s, 0),
                            nvl(coeff_b, 0)
                        INTO
                            v_coeff_a,
                            v_coeff_s,
                            v_coeff_b
                        FROM
                            articoli
                        WHERE
                            cod_articolo = v_cod_art;

                        SELECT
                            nvl(tot_ospiti, 0)
                        INTO v_ospiti
                        FROM
                            eventi
                        WHERE
                            id = p_id_evento;

                    EXCEPTION
                        WHEN no_data_found THEN
                            raise_application_error(-20001, 'Errore: Coefficenti/Num Ospiti NON TROVATI - '
                                                            || sqlcode
                                                            || ' - '
                                                            || substr(sqlerrm, 1, 64));
                    END;

                    UPDATE eventi_det_prel
                    SET
                        qta_ape = trunc(v_coeff_a * v_ospiti),
                        qta_sedu = trunc(v_coeff_s * v_ospiti),
                        qta_bufdol = trunc(v_coeff_b * v_ospiti),
                        qta = qta_ape + qta_sedu + qta_bufdol + qta_man_ape + qta_man_sedu + qta_man_bufdol
                    WHERE
                            id_evento = p_id_evento
                        AND cod_articolo = c.cod_articolo;

                    COMMIT;
                END IF;

            ELSE
            -- cod relativo valorizzato
                BEGIN
                -- reperisco le qta inserite per il cod_relativo nella lista    
                    SELECT
                        nvl(qta_ape, 0),
                        nvl(qta_sedu, 0),
                        nvl(qta_bufdol, 0)
                    INTO
                        v_qta_a,
                        v_qta_s,
                        v_qta_b
                    FROM
                        eventi_det_prel
                    WHERE
                            cod_articolo = v_cod_art
                        AND id_evento = p_id_evento;

                EXCEPTION
                    WHEN no_data_found THEN
                        CONTINUE;
                                -- Disattivato temporaneamente per evitare spam
                                --RAISE_APPLICATION_ERROR(-20000, 'Errore: Qta NON TROVATA !!! - v_cod_art: ' || v_cod_art || ' - ' || SQLCODE || ' - ' || SUBSTR(SQLERRM, 1 , 64));                        
                END;

                BEGIN
                -- reperisco i coefficenti
                    SELECT
                        nvl(coeff_a, 0),
                        nvl(coeff_s, 0),
                        nvl(coeff_b, 0)
                    INTO
                        v_coeff_a,
                        v_coeff_s,
                        v_coeff_b
                    FROM
                        articoli
                    WHERE
                        cod_articolo = c.cod_articolo;

                EXCEPTION
                    WHEN no_data_found THEN
                        raise_application_error(-20001, 'Errore: Qta/Coefficenti del codice relativo NON TROVATI - '
                                                        || sqlcode
                                                        || ' - '
                                                        || substr(sqlerrm, 1, 64));
                END;

                UPDATE eventi_det_prel
                SET
                    qta_ape = trunc(v_coeff_a * v_qta_a),
                    qta_sedu = trunc(v_coeff_s * v_qta_s),
                    qta_bufdol = trunc(v_coeff_b * v_qta_b),
                    qta = qta_ape + qta_sedu + qta_bufdol + qta_man_ape + qta_man_sedu + qta_man_bufdol
                WHERE
                        id_evento = p_id_evento
                    AND cod_articolo = c.cod_articolo;

                COMMIT;
            END IF;

        -- NOTE SE SUPERO LA QTA DISPONBILE !!!
            BEGIN
                SELECT
                    data
                INTO v_data_evt
                FROM
                    eventi
                WHERE
                    id = p_id_evento;

            EXCEPTION
                WHEN no_data_found THEN
                    raise_application_error(-20001, 'v_data_evento - '
                                                    || v_data_evt
                                                    || ' - '
                                                    || sqlcode
                                                    || ' - '
                                                    || substr(sqlerrm, 1, 64));
            END;

            BEGIN
                SELECT
                    qta_giac
                INTO v_qta_giac
                FROM
                    articoli
                WHERE
                    cod_articolo = c.cod_articolo;

            EXCEPTION
                WHEN no_data_found THEN
                    raise_application_error(-20001, 'v_qta_giac - '
                                                    || v_qta_giac
                                                    || ' - '
                                                    || sqlcode
                                                    || ' - '
                                                    || substr(sqlerrm, 1, 64));
            END;

            BEGIN
                SELECT
                    nvl(f_get_qta_impegnata(c.cod_articolo, v_data_evt),
                        0)
                INTO v_qta_imp
                FROM
                    dual;

            EXCEPTION
                WHEN no_data_found THEN
                    raise_application_error(-20001, 'v_qta_imp - '
                                                    || v_qta_imp
                                                    || ' - '
                                                    || v_cod_art
                                                    || ', '
                                                    || v_data_evt
                                                    || ' - '
                                                    || sqlcode
                                                    || ' - '
                                                    || substr(sqlerrm, 1, 64));
            END;

        --RAISE_APPLICATION_ERROR(-20000, 'v_qta_giac - ' || v_qta_giac || ' - ' || SQLCODE || ' - ' || SUBSTR(SQLERRM, 1 , 64));  
            dbms_output.put_line('CodArt: '
                                 || c.cod_articolo
                                 || '; Qta Imp: '
                                 || v_qta_imp
                                 || '; Qta Giac: '
                                 || v_qta_giac);
        --NOTA: a differenza del trigger "BEFORE INSERT  ON EVENTI_DET_PREL", 
        --      in questo caso la qta_imp è già comprensiva della qta ricalcolata        
            IF v_qta_imp > v_qta_giac THEN
                v_qta_man := v_qta_imp - v_qta_giac;
            --:NEW.NOTE := 'QTA TOT NON Disponibile, mancano: ' || to_char(v_qta_man);
                UPDATE eventi_det_prel
                SET
                    note = 'QTA TOT NON Disponibile, mancano: ' || to_char(v_qta_man)
                WHERE
                        id_evento = p_id_evento
                    AND cod_articolo = c.cod_articolo;

                COMMIT;
            ELSE
                UPDATE eventi_det_prel
                SET
                    note = NULL
                WHERE
                        id_evento = p_id_evento
                    AND cod_articolo = c.cod_articolo
                    AND note LIKE '%QTA TOT NON Disponibile%';

                COMMIT;
            END IF;

        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error(-20001, 'Errore: '
                                                || sqlcode
                                                || ' - '
                                                || substr(sqlerrm, 1, 64));
        END;
    END LOOP;

    RETURN;
END eventi_aggiorna_qta_lista;```
