# 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;```