Files
2025-12-17 13:02:12 +01:00

12 KiB

APEX Processes Documentation

This document contains all 98 processes defined in the APEX application, organized by page.

Process Overview

Process Type Count
NATIVE_FORM_INIT Multiple
NATIVE_FORM_DML Multiple
NATIVE_PLSQL Multiple
NATIVE_IG_DML Multiple
NATIVE_SESSION_STATE Multiple

Shared (Application-Level) Processes

SET_USER_READONLY

Process Point: Before Header (runs on every page) Type: NATIVE_PLSQL

Sets the APP_READ_ONLY application item based on user permissions.

begin
    if F_USER_IN_ROLE(:APP_USER, 'READONLY') then
        :APP_READ_ONLY := 1;
    else
        :APP_READ_ONLY := 0;
    end if;
end;

Page 3 - Articoli (Article Form)

Fetch Row from ARTICOLI

Process Point: After Header Type: NATIVE_FORM_INIT

Initializes form with article data.

Process Row of ARTICOLI

Process Point: After Submit Type: NATIVE_FORM_DML

Saves/updates article record.

Delete Image

Process Point: After Submit Type: NATIVE_PLSQL Button: Delete Image

begin
    update articoli
    set
        raw_data = null,
        last_update = null,
        charset = null,
        mimetype = null,
        filename = null
    where rowid = :P3_ROWID;
end;

Page 22 - Nuovo Evento (Main Event Form)

Page 22 is the most complex page with 32 processes.

After Header Processes

Get Event Details

Sequence: 10 Type: NATIVE_FORM_INIT

Fetches event record into form items.

Set Ospiti on load

Sequence: 20 Type: NATIVE_PLSQL

begin
    EVENTI_AGGIORNA_TOT_OSPITI(:P22_EVENT_ID);
end;

Default Values

Sequence: 40 Type: NATIVE_PLSQL

begin
    select trim(l.location)
    into :P22_LOCATION_DESCRI
    from eventi e
    join location l on l.id = e.id_location
    where e.id = :P22_EVENT_ID;
exception when no_data_found then
    null;
end;

Normalizza dati

Sequence: 50 Type: NATIVE_PLSQL

Formats time values for display:

:P22_ORA_INI_CER := to_char(to_date(:P22_ORA_CERIMONIA, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_INI_EVENTO := to_char(to_date(:P22_ORA_EVENTO, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_FI_CER := to_char(to_date(:ORA_FINE_CERIMONIA, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_FI_EVENTO := to_char(to_date(:ORA_FINE_EVENTO, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');

New Template Default Data

Sequence: 60 Condition: P22_IS_TEMPLATE is not null

:P22_DATA := sysdate;

After Submit Processes

Set Date Default if Template

Sequence: 10 Condition: P22_IS_TEMPLATE is not null

:P22_DATA := sysdate;

Delete Template

Sequence: 20 Button: Delete Template Condition: P22_IS_TEMPLATE is not null

delete from eventi where id = :P22_EVENT_ID;

Genera Evento da Template

Sequence: 30 Button: Generate from Template Condition: P22_IS_TEMPLATE is not null

EVENTI_COPIA
(
    ID_EVENTO_OLD  => :P22_EVENT_ID,
    NUOVA_VERSIONE => 0,
    ID_EVENTO_NEW  => :P22_EVENT_ID
);

Formatta Ore Inizio

Sequence: 40

Combines date and time for storage:

:P22_ORA_EVENTO := :P22_DATA || ' ' || :P22_ORA_INI_EVENTO;
:P22_ORA_CERIMONIA := :P22_DATA || ' ' || :P22_ORA_INI_CER;

Prepara Acconti Automatici

Sequence: 50 Condition: REQUEST in ('PREPARA_ACCONTI', 'PRINT_PREVENTIVO')

EVENTI_RICALCOLA_ACCONTI(p_event_id => :P22_EVENT_ID);

Comment: Default 3 deposits: 30%, 50%, 20%

Go Forward

Sequence: 60 Button: NEXT

Navigates to next wizard step:

declare
    v_step number;
begin
    begin
        select min(cod_step)
        into v_step
        from tb_tipi_mat
        where cod_step > TO_NUMBER(:P22_STEP);
    end;
    
    begin
        select cod_tipo
        into :P22_COD_TIPO_FILTER
        from tb_tipi_mat
        where cod_step = v_step;
        exception when no_data_found
            then raise_application_error(-20001, 'Errore sconosciuto');
    end;
    
    :P22_STEP := v_step;
end;

Go Backward

Sequence: 70 Button: PREVIOUS

Navigates to previous wizard step.

Tipo Ospiti - Save Interactive Grid Data

Sequence: 80 Region: Guest Types Grid Type: NATIVE_IG_DML Condition: APP_READ_ONLY = 0

Saves guest type records.

Tipo Ospiti - Aggiorna Lista Prelievo

Sequence: 90 Type: NATIVE_PLSQL Condition: APP_READ_ONLY = 0

Recalculates pick list quantities after guest changes:

EVENTI_AGGIORNA_QTA_LISTA(
    P_ID_EVENTO => :P22_EVENT_ID
);

Degustazioni - Save Interactive Grid Data

Sequence: 100 Region: Tastings Grid Type: NATIVE_IG_DML

Delete Eventi Childs

Sequence: 110 Button: DELETE Condition: NEVER (disabled)

begin
    delete from eventi_det_ospiti
    where id_evento = :P22_EVENT_ID;
    
    delete from eventi_det_prel
    where id_evento = :P22_EVENT_ID;
    
    delete from eventi_det_ris
    where id_evento = :P22_EVENT_ID;
            
    delete from eventi_det_degust
    where id_evento = :P22_EVENT_ID;
end;

Set Obsoleto

Sequence: 120 Button: Set Obsolete Condition: APP_READ_ONLY = 0

Marks event as expired/cancelled:

begin
    UPDATE EVENTI
    SET FLG_SUPERATO = 1, STATO = 900, MAIL_ENABLED = 0
    WHERE ID = :P22_EVENT_ID;
end;

Salva Evento

Sequence: 130 Condition: Complex (handles CREATE, SAVE, DELETE)

Main event save process. Full implementation handles:

  • All event fields mapping
  • Email validation
  • Status-based logic
  • Versioning support
  • Soft delete

Key excerpts:

declare
    r_eventi eventi%rowtype;
begin
    if :REQUEST = 'PREVIOUS' or :REQUEST = 'NEXT'
    then
        return;
    end if;

    if(:P22_DATA is null)
    then
        raise_application_error(-20001, 'Inserire la data evento');
    end if;

    -- Set all row fields
    r_eventi."ID" := :P22_EVENT_ID;
    r_eventi.DESCRIZIONE := :P22_DESCRIZIONE;
    r_eventi.COD_TIPO := :P22_COD_TIPO;
    -- ... (all other fields)
    
    -- Email validation
    IF REGEXP_LIKE(:P22_CLIENTE_EMAIL, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') 
       OR :P22_CLIENTE_EMAIL IS NULL THEN
        r_eventi.CLIENTE_EMAIL := :P22_CLIENTE_EMAIL;
    ELSE
        RAISE_APPLICATION_ERROR(-20005, 'Formato email cliente non valido');
    END IF;
    
    -- Versioning
    r_eventi.VERS_NUMBER := nvl(:P22_VERS_NUMBER, 0);
    r_eventi.VERS_TOKEN := :P22_VERS_TOKEN;
    
    case :REQUEST
        when 'SAVE' then
            update eventi set row = r_eventi where id = :P22_EVENT_ID;
        when 'CREATE' then
            insert into eventi values r_eventi returning id into :P22_EVENT_ID;
        when 'DELETE' then
            if r_eventi.ID_EVT_FIGLIO is not null or r_eventi.ID_EVT_PADRE is not null
            then
                raise_application_error(-20001, 'Impossibile eliminare un evento...');
            end if;
            update eventi
               set deleted = 1,
                   deleted_by = :APP_USER,
                   deleted_date = sysdate
            where id = r_eventi."ID";
        else
            null;
    end case;
end;

Nuova Versione

Sequence: 140 Button: New Version

Creates a new version of the event:

EVENTI_COPIA
(
    ID_EVENTO_OLD  => :P22_EVENT_ID,
    NUOVA_VERSIONE => 1,
    ID_EVENTO_NEW  => :P22_NEW_EVENT_ID
);

Lista Prelievo - Save Interactive Grid Data

Sequence: 150 Type: NATIVE_IG_DML Table: EVENTI_DET_PREL

Saves pick list records.

Continue Event

Sequence: 160 Button: Continue

Advances event to "Confermata" status (300):

declare
  v_count       number;
  v_count_evt   number;
begin
  -- Check if confirmed event exists for same location/date
  select count(*) into v_count
    from eventi
   where data = (select data from eventi where id = :P22_EVENT_ID)
     and stato = 300
     and id_location = (select id_location from eventi where id = :P22_EVENT_ID);      
    
  if v_count > 0 then   
      raise_application_error(-20001, 'Esiste un evento Confermato per la location - Impossibile proseguire'); 
      return;
  end if;

  -- Update status
  update eventi
  set stato = 300 
  where id = :P22_EVENT_ID;

  -- Check total confirmed events for date
  select count(*) into v_count_evt
    from eventi
   where data = (select data from eventi where id = :P22_EVENT_ID)
     and stato = 300;      
     
  if v_count_evt > 6 then   
      RAISE_APPLICATION_ERROR(-20000, 'Ci sono già 6 eventi Confermati per la data'); 
  end if;    
end;

Almost Continue Event

Sequence: 170 Button: Almost Continue

Sets status to "Quasi Confermato" (350):

begin
  update eventi
  set stato = 350 
  where id = :P22_EVENT_ID;
end;

Confirm Event

Sequence: 180 Button: Confirm Condition: APP_READ_ONLY = 0

Final confirmation (status 400) and cancels competing events:

begin
    update eventi
    set stato = 400
    where id = :P22_EVENT_ID;
    
    -- Cancel events with same date and location
    p_cancel_same_location_events(
        p_good_event_id => :P22_EVENT_ID
    );
end;

Unconfirm Event

Sequence: 190 Button: Unconfirm

Returns event to initial status (100):

begin
    update eventi
    set stato = 100
    where id = :P22_EVENT_ID;
end;

Reopen Event

Sequence: 200 Button: Reopen

Clears the expired flag:

begin
    update eventi
    set flg_superato = 0
    where id = :P22_EVENT_ID;
end;

Return to Preparazione

Sequence: 210 Button: Return to Preparation

Sets status back to preparation (200):

begin
    update eventi
    set stato = 200
    where id = :P22_EVENT_ID;
end;

Risorse - Save Interactive Grid Data

Sequence: 220 Type: NATIVE_IG_DML

Saves resource assignments.

Aggiorna QTA Lista

Sequence: 230 Condition: APP_READ_ONLY = 0 AND REQUEST = 'AGGIORNA_QTA'

Manual quantity recalculation:

EVENTI_AGGIORNA_QTA_LISTA(
    P_ID_EVENTO => :P22_EVENT_ID
);

Restore Deleted Event

Sequence: 240

Restores soft-deleted event.


Event Status Workflow Summary

Status Code Status Name Italian Next Action
100 Preventivo Quote Continue Event → 300
200 Scheda Preparation -
300 Confermata Confirmed (Pending) Almost Continue → 350
350 Quasi Almost Confirmed Confirm → 400
400 Confermato Confirmed -
900 Superato Expired/Cancelled Reopen → clears flag

Common Process Patterns

Read-Only Check

All write processes include this condition:

:APP_READ_ONLY = 0

Error Handling

Standard error pattern:

exception when no_data_found then
    raise_application_error(-20001, 'Error message in Italian');

Interactive Grid Save

Standard IG DML process:

  • Type: NATIVE_IG_DML
  • Attributes: REGION_SOURCE, Allow Insert (Y), Allow Update (Y), Allow Delete (Y)

Migration Notes

When migrating these processes to .NET:

  1. Form Initialization - Use API endpoints to fetch entity data
  2. Form DML - Implement CRUD endpoints with proper validation
  3. Custom PL/SQL - Convert to C# methods or stored procedures
  4. IG DML - Implement batch update endpoints for grid data
  5. Session State - Use application state management (Redux, Context)
  6. Validation - Implement in both frontend and backend
  7. Workflow - Consider state machine pattern for event status