Vai al contenuto

# LISTE_COPIA

## Codice Sorgente

```sql PROCEDURE liste_copia ( id_evento_from IN NUMBER, id_evento_to IN NUMBER, copia_degustazioni IN NUMBER DEFAULT 0, copia_prelievi IN NUMBER DEFAULT 0, copia_risorse IN NUMBER DEFAULT 0, copia_acconti IN NUMBER DEFAULT 0, copia_altricosti IN NUMBER DEFAULT 0 ) AS BEGIN -- Validate that mandatory parameters are provided IF id_evento_from IS NULL OR id_evento_to IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'Both id_evento_from and id_evento_to must be provided.'); END IF;

    ----------------------------------------------------------------------------
    -- Degustazioni (Tastings)
    ----------------------------------------------------------------------------
    IF copia_degustazioni > 0 THEN
        FOR rec IN (
            SELECT
                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_from
        ) LOOP
            -- Try to update using the unique key (assumed here as n_degustazione)
            UPDATE eventi_det_degust
            SET
                data               = rec.data,
                ora                = rec.ora,
                nome               = rec.nome,
                telefono           = rec.telefono,
                email              = rec.email,
                location           = rec.location,
                n_persone          = rec.n_persone,
                menu               = rec.menu,
                n_paganti          = rec.n_paganti,
                note               = rec.note,
                consumata          = rec.consumata,
                costo_degustazione = rec.costo_degustazione
            WHERE id_evento       = id_evento_to
              AND id  = rec.id;

            IF SQL%ROWCOUNT = 0 THEN
                INSERT INTO eventi_det_degust (
                    id_evento,
                    data,
                    ora,
                    nome,
                    telefono,
                    email,
                    location,
                    n_persone,
                    menu,
                    n_paganti,
                    note,
                    n_degustazione,
                    consumata,
                    costo_degustazione
                )
                VALUES (
                    id_evento_to,
                    rec.data,
                    rec.ora,
                    rec.nome,
                    rec.telefono,
                    rec.email,
                    rec.location,
                    rec.n_persone,
                    rec.menu,
                    rec.n_paganti,
                    rec.note,
                    rec.n_degustazione,
                    rec.consumata,
                    rec.costo_degustazione
                );
            END IF;
        END LOOP;

        ----------------------------------------------------------------------------
        -- Ospiti (Guests)
        ----------------------------------------------------------------------------
        FOR rec IN (
            SELECT
                cod_tipo_ospite,
                numero,
                note
            FROM eventi_det_ospiti
            WHERE id_evento = id_evento_from
        ) LOOP
            UPDATE eventi_det_ospiti
            SET
                numero = rec.numero,
                note   = rec.note
            WHERE id_evento      = id_evento_to
              AND cod_tipo_ospite = rec.cod_tipo_ospite;

            IF SQL%ROWCOUNT = 0 THEN
                INSERT INTO eventi_det_ospiti (
                    id_evento,
                    cod_tipo_ospite,
                    numero,
                    note
                )
                VALUES (
                    id_evento_to,
                    rec.cod_tipo_ospite,
                    rec.numero,
                    rec.note
                );
            END IF;
        END LOOP;
    END IF;

    ----------------------------------------------------------------------------
    -- Prelievi (Sampling): inserisce solo i record mancanti
    ----------------------------------------------------------------------------
    IF copia_prelievi > 0 THEN
        MERGE INTO eventi_det_prel dest
        USING (
            SELECT
                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_from
        ) src
        ON (
            dest.id_evento   = id_evento_to
            AND dest.cod_articolo = src.cod_articolo
        )
        WHEN NOT MATCHED THEN
            INSERT (
                id_evento,
                cod_articolo,
                qta,
                note,
                qta_ape,
                qta_sedu,
                qta_bufdol,
                qta_man_ape,
                qta_man_sedu,
                qta_man_bufdol,
                costo_articolo
            )
            VALUES (
                id_evento_to,
                src.cod_articolo,
                src.qta,
                src.note,
                src.qta_ape,
                src.qta_sedu,
                src.qta_bufdol,
                src.qta_man_ape,
                src.qta_man_sedu,
                src.qta_man_bufdol,
                src.costo_articolo
            );
    END IF;

    ----------------------------------------------------------------------------
    -- Risorse (Resources)
    ----------------------------------------------------------------------------
    IF copia_risorse > 0 THEN
        FOR rec IN (
            SELECT
                id,
                id_risorsa,
                ore_lav,
                costo,
                note
            FROM eventi_det_ris
            WHERE id_evento = id_evento_from
        ) LOOP
            UPDATE eventi_det_ris
            SET
                ore_lav = rec.ore_lav,
                costo   = rec.costo,
                note    = rec.note
            WHERE id_evento = id_evento_to
              AND id = rec.id;

            IF SQL%ROWCOUNT = 0 THEN
                INSERT INTO eventi_det_ris (
                    id_evento,
                    id_risorsa,
                    ore_lav,
                    costo,
                    note
                )
                VALUES (
                    id_evento_to,
                    rec.id_risorsa,
                    rec.ore_lav,
                    rec.costo,
                    rec.note
                );
            END IF;
        END LOOP;
    END IF;

    ----------------------------------------------------------------------------
    -- Acconti (Payments)
    ----------------------------------------------------------------------------
    IF copia_acconti > 0 THEN
        FOR rec IN (
            SELECT
                id,
                data,
                acconto,
                a_conferma,
                ordine,
                descrizione
            FROM eventi_acconti
            WHERE id_evento = id_evento_from
        ) LOOP
            UPDATE eventi_acconti
            SET
                data         = rec.data,
                acconto      = rec.acconto,
                a_conferma   = rec.a_conferma,
                descrizione  = rec.descrizione
            WHERE id_evento = id_evento_to
              AND id    = rec.id;

            IF SQL%ROWCOUNT = 0 THEN
                INSERT INTO eventi_acconti (
                    data,
                    acconto,
                    id_evento,
                    a_conferma,
                    ordine,
                    descrizione
                )
                VALUES (
                    rec.data,
                    rec.acconto,
                    id_evento_to,
                    rec.a_conferma,
                    rec.ordine,
                    rec.descrizione
                );
            END IF;
        END LOOP;
    END IF;

    ----------------------------------------------------------------------------
    -- Altri Costi (Other Costs)
    ----------------------------------------------------------------------------
    IF copia_altricosti > 0 THEN
        FOR rec IN (
            SELECT
                id,
                descrizione,
                costo,
                quantity
            FROM eventi_altricosti
            WHERE id_evento = id_evento_from
        ) LOOP
            UPDATE eventi_altricosti
            SET
                costo    = rec.costo,
                quantity = rec.quantity
            WHERE id_evento   = id_evento_to
              AND id = rec.id;

            IF SQL%ROWCOUNT = 0 THEN
                INSERT INTO eventi_altricosti (
                    id_evento,
                    descrizione,
                    costo,
                    quantity
                )
                VALUES (
                    id_evento_to,
                    rec.descrizione,
                    rec.costo,
                    rec.quantity
                );
            END IF;
        END LOOP;
    END IF;

END liste_copia;```