Vai al contenuto

# 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