206 lines
6.9 KiB
Markdown
206 lines
6.9 KiB
Markdown
# 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;```
|