# EVENTI_COPIA

## Codice Sorgente

```sql
PROCEDURE eventi_copia (
    id_evento_old  IN NUMBER,
    nuova_versione IN NUMBER DEFAULT 0,
    id_evento_new  OUT NUMBER
) AS
    r_evento     eventi%rowtype;
    v_new_evt_id eventi.id%TYPE;
BEGIN
    SELECT
        *
    INTO r_evento
    FROM
        eventi
    WHERE
        id = id_evento_old;

    r_evento.id := NULL;
    r_evento.is_template := 0;
    IF nuova_versione = 1 THEN
        r_evento.id_evt_padre := id_evento_old;
        r_evento.vers_number := nvl(r_evento.vers_number, 0) + 1; -- aggiorno il numero versione
    ELSE
        r_evento.id_evt_padre := NULL;
        r_evento.vers_number := 0;
    END IF;

    -- Copio l'evento facendo creare il nuovo id dal trigger
    INSERT INTO eventi VALUES r_evento RETURNING id INTO v_new_evt_id;

    IF nuova_versione = 1 THEN
        -- Aggiorno il vecchio evento col nuovo id
        UPDATE eventi
        SET
            id_evt_figlio = v_new_evt_id
        WHERE
            id = id_evento_old;

    END IF;

    COMMIT;

    -- Aggiungo i figli alla nuova versione
    -- Degustazioni
    INSERT INTO eventi_det_degust (
        id_evento,
        data,
        ora,
        nome,
        telefono,
        email,
        location,
        n_persone,
        menu,
        n_paganti,
        note,
        n_degustazione,
        consumata,
        costo_degustazione
    )
        SELECT
            v_new_evt_id,
            data,
            ora,
            nome,
            telefono,
            email,
            location,
            n_persone,
            menu,
            n_paganti,
            note,
            n_degustazione,
            consumata,
            costo_degustazione
        FROM
            eventi_det_degust
        WHERE
            id_evento = id_evento_old;

    -- Ospiti
    -- Devo fare una update... DIO TRIGGER
    FOR c IN (
        SELECT
            id_evento,
            cod_tipo_ospite,
            numero,
            note
        FROM
            eventi_det_ospiti
        WHERE
            id_evento = id_evento_old
    ) LOOP
        UPDATE eventi_det_ospiti
        SET
            numero = c.numero,
            note = c.note
        WHERE
                id_evento = v_new_evt_id
            AND cod_tipo_ospite = c.cod_tipo_ospite;

    END LOOP;
    -- insert into eventi_det_ospiti (ID_EVENTO, COD_TIPO_OSPITE, NUMERO, NOTE)
    -- select v_new_evt_id, COD_TIPO_OSPITE, NUMERO, NOTE
    -- from eventi_det_ospiti
    -- where id_evento = ID_EVENTO_OLD;

    -- Prelievi
    /* COME DA RICHIESTA DEL 01/2024 NON COPIO LA LISTA PRELIEVO NELLA NUOVA VERSIONE */
    /* RIATTIVO NUOVAMENTE LA COPIA IL 12/02/2024 */
    INSERT INTO eventi_det_prel (
        id_evento,
        cod_articolo,
        qta,
        note,
        qta_ape,
        qta_sedu,
        qta_bufdol,
        qta_man_ape,
        qta_man_sedu,
        qta_man_bufdol,
        costo_articolo
    )
        SELECT
            v_new_evt_id,
            cod_articolo,
            qta,
            note,
            qta_ape,
            qta_sedu,
            qta_bufdol,
            qta_man_ape,
            qta_man_sedu,
            qta_man_bufdol,
            costo_articolo
        FROM
            eventi_det_prel
        WHERE
            id_evento = id_evento_old;

    -- Risorse
    INSERT INTO eventi_det_ris (
        id_evento,
        id_risorsa,
        ore_lav,
        costo,
        note
    )
        SELECT
            v_new_evt_id,
            id_risorsa,
            ore_lav,
            costo,
            note
        FROM
            eventi_det_ris
        WHERE
            id_evento = id_evento_old;

    -- Costi
    INSERT INTO eventi_acconti (
        data,
        acconto,
        id_evento,
        a_conferma,
        ordine,
        descrizione
    )
        SELECT
            data,
            acconto,
            v_new_evt_id,
            a_conferma,
            ordine,
            descrizione
        FROM
            eventi_acconti
        WHERE
            id_evento = id_evento_old;

    -- Altri Costi
    INSERT INTO eventi_altricosti (
        id_evento,
        descrizione,
        costo,
        quantity
    )
        SELECT
            v_new_evt_id,
            descrizione,
            costo,
            quantity
        FROM
            eventi_altricosti
        WHERE
            id_evento = id_evento_old;

    -- Carico il nuovo id nella pagina
    id_evento_new := v_new_evt_id;
EXCEPTION
    WHEN OTHERS THEN
        DELETE FROM eventi
        WHERE
            id = v_new_evt_id;

        COMMIT;
        raise_application_error(-20001, sqlcode
                                        || ' - '
                                        || sqlerrm);
END eventi_copia;```
