# F_LIST_PRELIEVO_ADD_ARTICOLO

## Codice Sorgente

```sql
function f_list_prelievo_add_articolo(
	p_event_id number,
	p_articolo_add varchar2,
	p_qta_aperitivo NUMBER := 0,
	p_qta_seduto NUMBER := 0,
	p_qta_dolci NUMBER := 0
)
return varchar2
as
    v_qta_imp           number;
    v_qta_giac          number;
    v_data_evento       date;
    v_cod_art           varchar2(10);
    v_error_json        varchar2(4000);
    v_qta_da_imp        NUMBER;
    v_qta_da_imp_test   NUMBER;
    v_num_evt_imp       number;
BEGIN

    v_cod_art := p_articolo_add;
    v_qta_da_imp := nvl(p_qta_aperitivo, 0) + nvl(p_qta_seduto, 0) + nvl(p_qta_dolci, 0);

    begin

        select trunc(data) as data
          into v_data_evento
          from eventi where id = p_event_id;
         exception when no_data_found then
            rollback;
            RETURN '{"type":"error","code":"'||SQLCODE||'","stack":"'||SQLERRM||'","message":"Evento non trovato"}';
    end;
    begin
        select qta_giac 
          into v_qta_giac
          from articoli
         where COD_ARTICOLO =  v_cod_art; 
         exception when no_data_found then
            rollback;
            RETURN '{"type":"error","code":"'||SQLCODE||'","stack":"'||SQLERRM||'","message":"Articolo non trovato"}';
    end;
    

    select count(*) 
    into v_num_evt_imp
    from V_IMPEGNI_ARTICOLI
    where COD_ARTICOLO = v_cod_art
      and data between v_data_evento - 2 and v_data_evento + 2;

    v_qta_imp := nvl(f_get_qta_impegnata (v_cod_art, v_data_evento - 2, v_data_evento + 2 ) , 0);
    
    --insert impegno articolo
    begin        
        insert into eventi_det_prel (id_evento, cod_articolo,QTA_MAN_APE,QTA_MAN_SEDU,QTA_MAN_BUFDOL, COSTO_ARTICOLO)
        values (p_event_id, p_articolo_add, p_qta_aperitivo, p_qta_seduto, p_qta_dolci, f_get_costo_articolo(v_cod_art, v_data_evento));

        -- aggiorna liste prelievo
		EVENTI_AGGIORNA_QTA_LISTA(
		    P_ID_EVENTO => p_event_id
		);

        -- Controlla banalmente se sono stati prelevati su altri eventi
	    if  v_qta_imp + v_qta_da_imp > v_qta_giac then
	        RETURN '{"type":"warning","message":"Attenzione: Non hai abbastanza articoli di questo tipo a magazzino"}';
	    end if;
        
        -- Se trovo articoli già impegnati in quel giorno mostro un messaggio - 16/11/2022
        -- Continuo lo stesso ma do un messaggio di errore anzichè di successo
        if(v_qta_imp > 0 and v_num_evt_imp > 0) then
            RETURN '{"type":"warning","code":"'||SQLCODE||'","stack":"'||SQLERRM||'","message":"Attenzione! Articolo '||p_articolo_add||' già impegnato '||v_num_evt_imp||' '||(case when v_num_evt_imp > 1 then 'volte' else 'volta' end)||' dal '||to_char(v_data_evento - 2, 'dd-mm-yyyy')||' al '||to_char(v_data_evento + 2, 'dd-mm-yyyy')||'"}';
        end if;

        RETURN '{"type":"success","message":"Articolo aggiunto con successo"}';
    exception when others then
        RETURN '{"type":"success","message":"Articolo aggiunto con errori: '||replace(replace(SQLERRM, 'ORA-20000: Errore:', ''), '-20000 - ', '')||'"}';
    end;

    rollback;
    return '{"type":"error","code":"","stack":"","message":"Errore sconosciuto"}';
end f_list_prelievo_add_articolo;```
