extracted objects

This commit is contained in:
2025-12-17 13:02:12 +01:00
commit 7dd4ea08e1
195 changed files with 70591 additions and 0 deletions

View File

@@ -0,0 +1,419 @@
# 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;```

View File

@@ -0,0 +1,45 @@
# EVENTI_AGGIORNA_TOT_OSPITI
## Codice Sorgente
```sql
PROCEDURE "EVENTI_AGGIORNA_TOT_OSPITI" (
p_id_evento IN NUMBER DEFAULT 0
) AS
--aggiorna la qta toto ospiti
--job aggiorna_tot_ospiti
CURSOR c_eventi IS
SELECT
id
FROM
eventi
WHERE
id = p_id_evento;
v_tot_ospiti NUMBER;
BEGIN
/*
for c in c_eventi
loop
*/
BEGIN
v_tot_ospiti := f_get_tot_ospiti(p_id_evento);
UPDATE eventi
SET
tot_ospiti = v_tot_ospiti
WHERE
id = p_id_evento;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, 'Errore nel calcolo del totale ospiti: '
|| sqlcode
|| ' - '
|| sqlerrm);
END;
-- end loop;
END eventi_aggiorna_tot_ospiti;```

View File

@@ -0,0 +1,214 @@
# 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;```

View File

@@ -0,0 +1,205 @@
# EVENTI_RICALCOLA_ACCONTI
## Codice Sorgente
```sql
procedure EVENTI_RICALCOLA_ACCONTI(p_event_id number) as
v_cnt number;
v_calc_only_saldo number := 0;
v_totale_tipi number;
v_totale_degus number;
v_totale_ris number;
v_totale_ospiti number;
v_totale_evento number;
v_totale_altricosti number;
v_primo_acconto number := 0;
v_secondo_acconto number := 0;
v_terzo_acconto number := 0;
v_prima_perc number := 0.3;
v_seconda_perc number := 0.5;
v_terza_perc number := 0.2;
begin
select count(*)
into v_cnt
from eventi_acconti
where id_evento = p_event_id
and "DATA" is not null;
/*
if v_cnt > 0 then
raise_application_error(-20001, 'Impossibile ricalcolare gli acconti per un evento già saldato o parzialmente saldato');
end if;
*/
select count(*)
into v_cnt
from eventi_acconti
where id_evento = p_event_id
and (ORDINE = 10 OR ORDINE = 20) -- primo acconto (o anche secondo) dato quindi evento confermato
and "DATA" is not null;
if v_cnt > 0 then
v_calc_only_saldo := 1;
end if;
select sum(costo_ivato)
into v_totale_tipi
from get_costo_tipi_evt
where id_evento = p_event_id;
select sum(costo)
into v_totale_degus
from get_costo_degus_evt
where id_evento = p_event_id;
select sum(costo)
into v_totale_ris
from get_costo_ris_evt
where id_evento = p_event_id;
select sum(costo+costo*0.10)
into v_totale_ospiti
from get_costo_ospiti_evt
where id_evento = p_event_id;
select sum((costo * quantity)+(case when costo > 0 then costo * quantity * 0.10 else 0 end))
into v_totale_altricosti
from eventi_altricosti
where id_evento = p_event_id;
v_totale_evento :=
nvl(v_totale_tipi, 0) -
nvl(v_totale_degus, 0) +
nvl(v_totale_ris, 0) +
nvl(v_totale_ospiti, 0) +
nvl(v_totale_altricosti, 0);
if v_calc_only_saldo = 0 then
-- Se nessun acconto è stato pagato allora ricalcola tutti gli acconti
delete
from eventi_acconti
where id_evento = p_event_id
and ordine in (10, 20, 30);
insert into eventi_acconti
(DESCRIZIONE, ACCONTO, ID_EVENTO, A_CONFERMA, ORDINE)
values
('PRIMA CAPARRA (art.7 punto A del contratto) a conferma evento nella cifra di euro:',
v_totale_evento * v_prima_perc, p_event_id, 1, 10);
insert into eventi_acconti
(DESCRIZIONE, ACCONTO, ID_EVENTO, A_CONFERMA, ORDINE)
values
('SECONDA CAPARRA (art. 7 punto B - circa 60 giorni prima dell''evento) nella cifra di euro:',
v_totale_evento * v_seconda_perc, p_event_id, 0, 20);
insert into eventi_acconti
(DESCRIZIONE, ACCONTO, ID_EVENTO, A_CONFERMA, ORDINE)
values
('SALDO A RICEVIMENTO CONSUNTIVO (art.7 punto c del contratto) 5 giorni prima dell''evento',
v_totale_evento * v_terza_perc, p_event_id, 0, 30);
else
-- Controllo se gli acconti sono stato pagati e in caso ricalcolo soltanto i saldi
begin
select acconto
into v_primo_acconto
from eventi_acconti
where id_evento = p_event_id
and ORDINE = 10
and data is not null; -- Il primo acconto è stato pagato
exception when no_data_found then
v_primo_acconto := 0;
end;
begin
select acconto
into v_secondo_acconto
from eventi_acconti
where id_evento = p_event_id
and ORDINE = 20
and data is not null; -- Il secondo acconto è stato pagato
exception when no_data_found then
v_secondo_acconto := 0;
end;
begin
select acconto
into v_terzo_acconto
from eventi_acconti
where id_evento = p_event_id
and ORDINE = 30
and data is not null; -- Il terzo acconto è stato pagato
exception when no_data_found then
v_terzo_acconto := 0;
end;
-- Se non hanno pagato il primo acconto lo calcolo in automatico
if v_primo_acconto = 0 then
v_primo_acconto := v_totale_evento * v_prima_perc;
end if;
-- Ricalcolo la percentuale del secondo acconto in base al primo se non è stato pagato
if v_secondo_acconto = 0 then
v_secondo_acconto := (v_totale_evento - v_primo_acconto) * (v_seconda_perc/(v_seconda_perc + v_terza_perc));
end if;
-- Calcolo il terzo acconto come la rimanenza tra il totale e il primo + secondo se non è stato pagato
if v_terzo_acconto = 0 then
v_terzo_acconto := v_totale_evento - (v_primo_acconto + v_secondo_acconto);
end if;
-- Controllo se i totali acconti superano il totale dell'evento
if v_primo_acconto > v_totale_evento then
raise_application_error(-20001, 'Attenzione! Il primo acconto supera il costo totale del''evento');
end if;
if v_primo_acconto + v_secondo_acconto > v_totale_evento then
raise_application_error(-20001, 'Attenzione! Il primo e il secondo acconto superano il costo totale del''evento');
end if;
if v_primo_acconto + v_secondo_acconto + v_terzo_acconto > v_totale_evento then
raise_application_error(-20001, 'Attenzione! Gli acconti superano il costo totale del''evento');
end if;
-- Se gli acconti successivi sono validi allora li aggiorno, se l'acconto precendente salda tutto li elimino
if v_secondo_acconto > 0 then
update eventi_acconti
set ACCONTO = v_secondo_acconto
where id_evento = p_event_id
and ordine = 20;
if SQL%ROWCOUNT = 0 then
insert into eventi_acconti
(DESCRIZIONE, ACCONTO, ID_EVENTO, A_CONFERMA, ORDINE)
values
('SECONDA CAPARRA (art. 7 punto B - circa 60 giorni prima dell''evento) nella cifra di euro:',
v_secondo_acconto, p_event_id, 0, 20);
end if;
else
delete
from eventi_acconti
where id_evento = p_event_id
and ordine = 20;
end if;
if v_terzo_acconto > 0 then
update eventi_acconti
set ACCONTO = v_terzo_acconto
where id_evento = p_event_id
and ordine = 30;
if SQL%ROWCOUNT = 0 then
insert into eventi_acconti
(DESCRIZIONE, ACCONTO, ID_EVENTO, A_CONFERMA, ORDINE)
values
('SALDO A RICEVIMENTO CONSUNTIVO (art.7 punto c del contratto) ', v_terzo_acconto, p_event_id, 0, 30);
end if;
else
delete
from eventi_acconti
where id_evento = p_event_id
and ordine = 30;
end if;
end if;
end;```

View File

@@ -0,0 +1,12 @@
# EVENTO_ELIMINA_PRELIEVI
## Codice Sorgente
```sql
PROCEDURE EVENTO_ELIMINA_PRELIEVI
(
P_ID_EVENTO IN NUMBER
) AS
BEGIN
NULL;
END EVENTO_ELIMINA_PRELIEVI;```

22
docs/procedures/HTPPRN.md Normal file
View File

@@ -0,0 +1,22 @@
# HTPPRN
## Codice Sorgente
```sql
PROCEDURE "HTPPRN" (pclob in out nocopy clob) is
v_excel varchar2(32000);
v_clob clob := pclob;
begin
while length(v_clob) > 0 loop begin
if length(v_clob) > 32000 then v_excel:= substr(v_clob,1,32000);
htp.prn(v_excel);
v_clob:= substr(v_clob,length(v_excel)+1);
else
v_excel := v_clob;
htp.prn(v_excel);
v_clob:=''; v_excel := ''; end if;
end;
end loop;
end;
```

View File

@@ -0,0 +1,308 @@
# 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;```

View File

@@ -0,0 +1,41 @@
# P_CANCEL_SAME_LOCATION_EVENTS
## Codice Sorgente
```sql
PROCEDURE "P_CANCEL_SAME_LOCATION_EVENTS" (p_good_event_id number) as
-- ---------------------------
-- Autore: Daniele Viti
-- Data: 17/01/2020
-- Descrizione: Controlla che ci siano più eventi con la stessa locazione e data di quello in esame e li annulla
-- ---------------------------
v_date date;
v_idloc number;
begin
begin
-- Seleziono la data e la location per confrontarle dopo
select data, id_location
into v_date, v_idloc
from eventi
where id = p_good_event_id;
exception when no_data_found then
raise_application_error(-20001, 'Impossibile trovare l''evento da confermare');
end;
for c in (
select *
from eventi
where data = v_date
and id_location = v_idloc
and id != p_good_event_id
) loop
-- Imposta l'evento come obsoleto (annullato)
UPDATE EVENTI
SET
FLG_SUPERATO = 1,
STATO = 900
WHERE ID = c.id;
end loop;
end;```

90
docs/procedures/README.md Normal file
View File

@@ -0,0 +1,90 @@
# Stored Procedures
Questa cartella contiene la documentazione di tutte le 11 stored procedures del database.
## Procedures Business Logic
| Procedura | Descrizione |
|-----------|-------------|
| [EVENTI_AGGIORNA_QTA_LISTA](EVENTI_AGGIORNA_QTA_LISTA.md) | Ricalcola tutte le quantità della lista prelievo |
| [EVENTI_AGGIORNA_TOT_OSPITI](EVENTI_AGGIORNA_TOT_OSPITI.md) | Aggiorna il totale ospiti in testata evento |
| [EVENTI_COPIA](EVENTI_COPIA.md) | Duplica un evento con tutti i dettagli |
| [EVENTI_RICALCOLA_ACCONTI](EVENTI_RICALCOLA_ACCONTI.md) | Ricalcola gli importi degli acconti |
| [EVENTO_ELIMINA_PRELIEVI](EVENTO_ELIMINA_PRELIEVI.md) | Elimina i prelievi di un evento |
| [LISTE_COPIA](LISTE_COPIA.md) | Copia selettiva di liste tra due eventi |
| [P_CANCEL_SAME_LOCATION_EVENTS](P_CANCEL_SAME_LOCATION_EVENTS.md) | Annulla eventi nella stessa location/data |
## Procedures Utility
| Procedura | Descrizione |
|-----------|-------------|
| [ROWSORT_TIPI](ROWSORT_TIPI.md) | Riordina i tipi materiale |
| [HTPPRN](HTPPRN.md) | Output HTTP per APEX |
| [SEND_DATA_TO_DROPBOX](SEND_DATA_TO_DROPBOX.md) | Export dati verso Dropbox |
| [XLOG](XLOG.md) | Procedura di logging |
## Dettaglio Procedures Critiche
### EVENTI_AGGIORNA_QTA_LISTA
**Parametri:**
- `p_id_evento NUMBER` - ID dell'evento
**Logica:**
1. Cicla su tutti gli articoli nella lista prelievo
2. Per ogni articolo determina il metodo di calcolo:
- **Quantità Standard**: Se `QTA_STD_A/S/B` sono valorizzate
- **Tovagliato/Caraffe**: Moltiplica per quantità tavoli/angoli
- **Codice Relativo**: Moltiplica per quantità articolo di riferimento
- **Standard**: Moltiplica coefficienti per totale ospiti
3. Verifica disponibilità rispetto alla giacenza
4. Aggiorna note con warning se quantità insufficiente
### EVENTI_COPIA
**Parametri:**
- `id_evento_old NUMBER` - ID evento da copiare
- `nuova_versione NUMBER DEFAULT 0` - 1 per creare nuova versione
- `id_evento_new OUT NUMBER` - ID nuovo evento creato
**Logica:**
1. Copia testata evento
2. Se nuova versione: imposta `ID_EVT_PADRE`, incrementa `VERS_NUMBER`
3. Aggiorna evento vecchio con `ID_EVT_FIGLIO`
4. Copia tutte le tabelle dettaglio:
- `EVENTI_DET_DEGUST`
- `EVENTI_DET_OSPITI` (via UPDATE, non INSERT)
- `EVENTI_DET_PREL`
- `EVENTI_DET_RIS`
- `EVENTI_ACCONTI`
- `EVENTI_ALTRICOSTI`
5. In caso di errore: elimina evento creato e solleva eccezione
### EVENTI_RICALCOLA_ACCONTI
**Parametri:**
- `p_event_id NUMBER` - ID evento
**Logica:**
1. Calcola totale evento dalle viste costo
2. Se nessun acconto pagato:
- Elimina acconti esistenti
- Inserisce nuovi acconti con percentuali 30%-50%-20%
3. Se acconti parzialmente pagati:
- Mantiene importi pagati
- Ricalcola solo acconti non pagati
- Verifica che totale acconti ≤ totale evento
### LISTE_COPIA
**Parametri:**
- `id_evento_from NUMBER` - Evento sorgente
- `id_evento_to NUMBER` - Evento destinazione
- `copia_degustazioni NUMBER DEFAULT 0`
- `copia_prelievi NUMBER DEFAULT 0`
- `copia_risorse NUMBER DEFAULT 0`
- `copia_acconti NUMBER DEFAULT 0`
- `copia_altricosti NUMBER DEFAULT 0`
**Logica:**
Per ogni flag > 0 esegue un MERGE (UPDATE se esiste, INSERT altrimenti).

View File

@@ -0,0 +1,145 @@
# ROWSORT_TIPI
## Codice Sorgente
```sql
PROCEDURE "ROWSORT_TIPI" (
p_direc_cod IN VARCHAR2,
o_return OUT CLOB
) AS
v_direc VARCHAR2(4);
v_cod_tipo VARCHAR2(10);
v_cod_step NUMBER;
v_cod_step_new NUMBER;
v_return CLOB;
BEGIN
-- Separo i valori in entrata su p_direc_cod 'direc_cod' in un array ( Es: 'desc_AN' => [ 'desc', 'AN' ] )
---- Seleziono la direzione (asc o desc)
SELECT
upper(result)
INTO v_direc
FROM
TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
WHERE
id = 1;
---- Seleziono l'cod_tipo della riga da spostare
SELECT
upper(result)
INTO v_cod_tipo
FROM
TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
WHERE
id = 2;
IF v_direc = 'ASC' THEN
-- Seleziono i numeri di riga
SELECT
cod_step,
cod_step - 1
INTO
v_cod_step,
v_cod_step_new
FROM
tb_tipi_mat
WHERE
upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));
-- Libero i numeri di riga richiesti
-- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)
UPDATE tb_tipi_mat
SET
cod_step = cod_step - 0.5
WHERE
cod_tipo = v_cod_tipo;
UPDATE tb_tipi_mat
SET
cod_step = cod_step - 0.5
WHERE
cod_step = v_cod_step_new;
-- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)
UPDATE tb_tipi_mat
SET
cod_step = v_cod_step
WHERE
cod_step = v_cod_step_new - 0.5;
-- Sposto la riga selezionata al nuovo posto
UPDATE tb_tipi_mat
SET
cod_step = v_cod_step_new
WHERE
cod_tipo = v_cod_tipo;
v_return := 'cod_tipo: '
|| v_cod_tipo
|| ' - From Row '
|| v_cod_step
|| ' - To Row '
|| v_cod_step_new;
ELSIF v_direc = 'DESC' THEN
-- Seleziono i numeri di riga
SELECT
cod_step,
cod_step + 1
INTO
v_cod_step,
v_cod_step_new
FROM
tb_tipi_mat
WHERE
upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));
-- Libero i numeri di riga richiesti
-- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)
UPDATE tb_tipi_mat
SET
cod_step = cod_step + 0.5
WHERE
cod_tipo = v_cod_tipo;
UPDATE tb_tipi_mat
SET
cod_step = cod_step + 0.5
WHERE
cod_step = v_cod_step_new;
-- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)
UPDATE tb_tipi_mat
SET
cod_step = v_cod_step
WHERE
cod_step = v_cod_step_new + 0.5;
-- Sposto la riga selezionata al nuovo posto
UPDATE tb_tipi_mat
SET
cod_step = v_cod_step_new
WHERE
cod_tipo = v_cod_tipo;
v_return := 'cod_tipo: '
|| v_cod_tipo
|| ' - From row. '
|| v_cod_step
|| ' - To row: '
|| v_cod_step_new;
END IF;
o_return := v_return;
END;```

View File

@@ -0,0 +1,61 @@
# SEND_DATA_TO_DROPBOX
## Codice Sorgente
```sql
PROCEDURE "SEND_DATA_TO_DROPBOX" (ondemand boolean := false) AS
v_queryres clob := EMPTY_CLOB();
v_file_name varchar2(255);
l_file UTL_FILE.FILE_TYPE;
l_buffer RAW(32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
l_blob BLOB := EMPTY_BLOB();
l_blob_len INTEGER;
BEGIN
if ondemand then
for c in (
select 'test' as a from dual
union all
select 'test2' as a from dual
) loop
v_queryres := v_queryres || c.a;
end loop;
else
v_queryres := 'test';
end if;
l_blob := CLOB2BLOB(v_queryres);
l_blob_len := DBMS_LOB.getlength(l_blob);
if ondemand then
v_file_name := 'backup_ondemand_'||to_char(sysdate, 'YYYYMMDDHH24MISS')||'.sql';
else
v_file_name := 'backup_'||to_char(sysdate, 'YYYYMMDD')||'.sql';
end if;
l_file := UTL_FILE.fopen('DROPBOXBCK', v_file_name, 'wb', 32767);
-- Read chunks of the BLOB and write them to the file
-- until complete.
WHILE l_pos <= l_blob_len LOOP
DBMS_LOB.read(l_blob, l_amount, l_pos, l_buffer);
UTL_FILE.put_raw(l_file, l_buffer, TRUE);
l_pos := l_pos + l_amount;
END LOOP;
-- Close the file.
UTL_FILE.fclose(l_file);
EXCEPTION
WHEN OTHERS THEN
-- Close the file if something goes wrong.
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
RAISE;
END SEND_DATA_TO_DROPBOX;```

19
docs/procedures/XLOG.md Normal file
View File

@@ -0,0 +1,19 @@
# XLOG
## Codice Sorgente
```sql
PROCEDURE "XLOG" (
p_module IN VARCHAR2,
p_msg IN VARCHAR2,
p_type IN VARCHAR2 DEFAULT 'DEBUG',
p_level PLS_INTEGER DEFAULT 15
)
IS
BEGIN
xlib_log.m (p_module => p_module,
p_msg => p_msg,
p_type => p_type,
p_level => p_level
);
END xlog;```