Table of Contents

Modulo: RequestCenter (verticale Service Desk)

Landing del verticale RequestCenter / Service Desk lato InfocadWeb. Raccoglie i progetti, namespace e tipi che realizzano apertura, protocollazione e gestione delle richieste/ticket, dalla UI Web Forms fino ai package Oracle. Confidenza complessiva SUPPORTED (sintesi da codice sorgente + metadati di progetto + catalogo DB read-only; il significato di business dei singoli oggetti resta UNKNOWN dove non confermato). Legenda: Legenda di classificazione.

Scopo del modulo

Il verticale implementa il ciclo di vita di una richiesta di servizio (Request): creazione e protocollazione, associazione a inquilino (Tenant), informazioni spaziali, oggetto/attività di manutenzione, gestione, contratto, azienda e costo, fino a chiusura e cancellazione. La classe aggregata Descor.RequestCenter.Ticket.Request orchestra la logica di business e delega ogni accesso dati all'interfaccia IRequestDAL, la cui implementazione Oracle (RequestDAL) invoca i package PL/SQL GESTREQUEST / GESTREQUEST_T2. Classificazione: SUPPORTED (Classes/Request.vb, RequestDAL.vb).

Dominio funzionale

Service Desk — vedi il dominio servicedesk. Attori, gating di autenticazione e componenti sono descritti lì; questa pagina è la vista code-reference.

Layer architetturale

Il verticale copre più layer della vertical-slice RequestCenter:

Layer Progetto Ruolo
Web (Web Forms) RequestCenterWeb shell Default.aspx, control makeTicket.ascx (vedi frontend)
Business Logic RequestCenter (Descor.RequestCenter) aggregato Ticket.Request, contratti Interfaces, Transaction
Data Access RequestCenter.DAL.OracleODP RequestDAL (proc-wrappers Oracle), driver Oracle.DataAccess
Motore connessioni DataManager (Descor.DataManager) GlobalDataManager (cm.Execute*)
Database REQUESTCENTER_TEST38 (+ cross-schema DEM_TEST38, INFOCAD_TEST38) package GESTREQUEST*, tabelle

Le varianti net8 RequestCenterXNET e RequestCenter.DAL.OracleODPXNET ricollegano lo stesso sorgente (side-by-side per la migrazione .NET 8) e non sono compilabili headless su questo host. Classificazione VERIFIED (metadati .vbproj + <Compile Include=... Link=...>).

Tipi principali

Tipo Kind Progetto Pagina Sorgente
Descor.RequestCenter.Ticket.Request Class (aggregato) RequestCenter class-Request Classes/Request.vb:25
Descor.RequestCenter.Interfaces.Ticket.IRequestDAL Interface RequestCenter interface-IRequestDAL Interfaces/TicketInterfaces.vb:39
Descor.RequestCenter.DAL.OracleODP.RequestDAL Class (DAL) RequestCenter.DAL.OracleODP class-RequestDAL RequestDAL.vb:12
Descor.RequestCenter.Transaction Class RequestCenter class-Transaction Transaction/Transaction.vb:3
Descor.RequestCenter.Ticket.RequestCollection Class (collection) RequestCenter Classes/Collections/RequestCollection.vb
Descor.DataManager.GlobalDataManager Class (motore cm) DataManager DataManager GlobalDataManager.vb

Classi annidate pubbliche di Request (dettaglio in class-Request): TenantInfo (:2822), SpatialInfo (:2946), MaintenanceInfo (:3752), ManagementInfo (:3782), CenterOfResponsabilityInfo (:3905), ContractInfo (:4144), MaintenanceObjectInfo (:4327), CompanyInfo (:4463), CostInfo (:4600). SUPPORTED.

Pagine di progetto: project-RequestCenter · project-RequestCenter.DAL.OracleODP · project-RequestCenter.DAL.OracleODPXNET · project-RequestCenterXNET.

Entry point

  • UI: makeTicket.ascx → handler btnPost_Click (makeTicket.ascx.vb:82) — vedi frontend-makeTicket e il flusso FLOW-REQ-001.
  • BL: Request.Create(...) (Classes/Request.vb:2222 e overload :2227), GetInstance (:4987), Close (:2758), Delete (Shared, :2813). Tutti risolvono la DAL via DALFactory.GetRequestDAL.
  • WCF (accesso esterno): RequestsReaderWCF.svc, RequestsCacheService.svc, ExtraFlowActionsProxy.svc — vedi API. SUPPORTED.

Contratti pubblici

Il contratto centrale è IRequestDAL (eredita IBaseDAL), con ~246 Function implementate da RequestDAL. Comprende scritture (addRequest, setProtocol, setDescription, setManagement, setContract, setCompany, setType, setCallType, setWorkflowInterface, closeRequest, deleteRequest, …) e letture con tipico gemello DataSet + DReader (Load/LoadDReader, getIdRequestListByFilter, getByProtocol, getRequestList, …). L'aggregato Request espone i metodi pubblici Set* / Write* / Create / Close / Delete come façade di dominio. Dettaglio in interface-IRequestDAL e class-Request. SUPPORTED.

Collaborazione interna

makeTicket.ascx.vb  →  Request (BL)  →  DALFactory.GetRequestDAL : IRequestDAL  →  RequestDAL (Oracle)
                                                                                        │ cm = GlobalDataManager
                                                                                        ▼
                                                                          GESTREQUEST / GESTREQUEST_T2 (PL/SQL)

Request non apre connessioni: ottiene un IRequestDAL da DALFactory e delega. RequestDAL ottiene il motore cm via Configuration.Settings.GetConnectionManager(True) (tipo GlobalDataManager) e chiama cm.ExecuteReader / cm.ExecuteNonQuery / cm.Fill passando "PACKAGE.PROC" + OracleParameter. Classificazione VERIFIED (Request.vb:2223-2224, RequestDAL.vb:5055,5077-5078).

Dipendenze in ingresso

  • RequestCenterWeb (control makeTicket.ascx) e le facciate WCF consumano RequestCenter (BL).
  • Progetti net8 RequestCenterXNET ricollegano ~115 file BL di RequestCenter. VERIFIED (metadati).

Dipendenze in uscita

  • RequestCenterDataManager (ProjectReference) e assembly condivisi Descor.* (Descor.Property, Descor.Global.*, Descor.Common, Descor.Stock.*).
  • RequestCenter.DAL.OracleODPOracle.DataAccess (unmanaged, net48) e GlobalDataManager.
  • La chiusura delle dipendenze net8 termina in assembly 4.8 solo-Windows (Descor.Stock.*, *.Controllers): perciò RequestCenterXNET / …OracleODPXNET non compilano headless. VERIFIED.

Oggetti di database

Hub del dominio: schema REQUESTCENTER_TEST38.

Package Rif. in RequestDAL.vb Note
GESTREQUEST 41 es. ADDREQUESTWITHOUTPROTOCOL, ADDDESCRIPTIONTOREQUEST, ADDWORKFLOWINTERFACE
GESTREQUEST_T2 9 es. ADDREQUEST (OUT NEWREQUESTINDEX)

Procedure e tabelle: procedures · tables. Matrice CRUD codice→DB: crud-matrix. Accessi cross-schema in lettura verso DEM_TEST38 (workflow) e INFOCAD_TEST38 (anagrafiche/stock). Il significato di business degli oggetti è UNKNOWN (non dedurre dai nomi). VERIFIED (conteggi rif. package) / SUPPORTED (mapping proc→tabelle).

API

Superficie SOAP/WCF del verticale (dettaglio in 04-api): ASMX AsyncLoader.asmx, WFActionsWS.asmx; WCF RequestsReaderWCF.svc, RequestsCacheService.svc, ExtraFlowActionsProxy.svc. SUPPORTED.

Configurazione

Il motore cm è risolto tramite Configuration.Settings.GetConnectionManager(True); la connessione Oracle in uso è MainConnection (riscritta al deploy da ConnectionsService, vedi CLAUDE.md / developer-guides). SUPPORTED (RequestDAL.vb:5055).

Regole di business

Regole del dominio richieste: BR-REQ.

Punti di estensione comuni

  • DAL sostituibile: Request dipende da IRequestDAL risolto via DALFactory.GetRequestDAL; un provider dati alternativo si aggancia implementando l'interfaccia. SUPPORTED (Request.vb:2223).
  • Migrazione net8: aggiungere/estendere i re-link *XNET (<Compile Include=... Link=...>), guardati da #If NET5_0_OR_GREATER per selezionare il driver Oracle managed. VERIFIED.
  • Personalizzazione per cliente: pattern EntityLayer<Customer> / ServiceJob.<Customer> / TicketLoader<Customer> a livello di prodotto (vedi CLAUDE.md); non tramite fork del codice condiviso.

Ciclo di vita

  1. Request.Create(...)IRequestDAL.addRequestGESTREQUEST_T2.ADDREQUEST (o GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL), restituisce il nuovo idrequest (OUT NEWREQUESTINDEX).
  2. Arricchimento tramite i Set* (protocollo, tenant, spaziale, gestione, contratto, azienda, costo, tipo, callType, workflow, categoria, tipologia) → rispettive set* DAL / proc GESTREQUEST.*.
  3. Request.Close(...)IRequestDAL.closeRequest; Request.Delete(idrequest) (Shared) → IRequestDAL.deleteRequest.

Per la transazionalità end-to-end vedi RequestCenter.Transaction e il flusso FLOW-REQ-001: New RequestCenter.TransactionOpenConnection()Begin() / Commit() / Rollback()CloseConnection() (delega a ITransactionDAL via DALFactory). SUPPORTED (Transaction/Transaction.vb:3-30).

Thread-safety / concorrenza

UNKNOWN. Il motore cm è ottenuto per-chiamata (GetConnectionManager(True)) e la connessione è aperta/chiusa nel perimetro del metodo DAL; non è documentata condivisione di stato mutabile tra thread. Non osservato direttamente — da confermare.

Comportamento in caso di errore

Nei metodi DAL il pattern ricorrente è:

Try
    openResult = cm.Open
    cm.ExecuteNonQuery("GESTREQUEST_T2.ADDREQUEST", ...)
    Return DirectCast(newIndexParam.Value, Types.OracleDecimal).ToInt32
#If DEBUG Then
Catch ex As Exception
    Throw
#End If
Finally
    cm.CloseIfNeeded(openResult)
End Try

Il Catch è compilato solo in DEBUG (#If DEBUG Then): in Release le eccezioni Oracle propagano al chiamante senza intercettazione locale; il Finally chiude comunque la connessione (cm.CloseIfNeeded). Classificazione VERIFIED (RequestDAL.vb:5076-5086, :5103-5113).

Strategia di test

Nel repository non esistono test automatici (0 xUnit/NUnit/MSTest) e non è misurata alcuna copertura per questo verticale. La verifica avviene tramite harness manuale (InfocadServer/InfocadTester) e connettività DB read-only (python-oracledb). I comandi msbuild sono NON verificati su questo host (macOS, senza Oracle Client). VERIFIED (assenza test) / comandi Windows NON-verificati.

Esempi

Creazione minima di una richiesta dal layer BL (delega alla DAL, poi arricchimento):

Dim idrequest As Integer = Request.Create(iduser, idtenant, requestdate:=Nothing)  ' -> GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL
Dim req As Request = New Request().GetInstance(usereader:=False, idrequest:=idrequest, externaldata:=False)
req.SetDescription(...)   ' -> GESTREQUEST.ADDDESCRIPTIONTOREQUEST
req.Close()               ' -> IRequestDAL.closeRequest

Snippet illustrativo dagli anchor verificati (Request.vb:2227, :4987, :2758); i parametri esatti dei Set* sono in class-Request.

Diagramma del modulo

flowchart TD
    UI["RequestCenterWeb<br/>makeTicket.ascx.vb : btnPost_Click"]
    WCF["WCF/ASMX<br/>RequestsReaderWCF.svc · RequestsCacheService.svc"]
    BL["RequestCenter (BL)<br/>Ticket.Request · Transaction"]
    IF["IRequestDAL : IBaseDAL<br/>(via DALFactory.GetRequestDAL)"]
    DAL["RequestCenter.DAL.OracleODP<br/>RequestDAL"]
    CM["DataManager.GlobalDataManager<br/>cm.ExecuteReader/NonQuery/Fill"]
    DB[("REQUESTCENTER_TEST38<br/>GESTREQUEST · GESTREQUEST_T2")]
    XDB[("DEM_TEST38 · INFOCAD_TEST38<br/>(lettura cross-schema)")]

    UI -->|statically verified| BL
    WCF -->|inferred| BL
    BL -->|statically verified| IF
    IF -.->|implements / DALFactory| DAL
    DAL -->|statically verified| CM
    CM -->|statically verified| DB
    DAL -.->|configuration-dependent| XDB

Legenda archi: statically verified = riscontrato nel sorgente; inferred = dedotto; implements = risoluzione via factory/interfaccia; configuration-dependent = dipende da grant/sinonimi cross-schema.

Evidenze

  • BL aggregato: InfocadWeb/WebMachine/RequestCenter/Classes/Request.vb:25 (classe Request); Create :2222 / overload :2227; Close :2758; Delete (Shared) :2813; GetInstance :4987; GetAllChildRequests :4999; classi annidate TenantInfo:2822, SpatialInfo:2946, MaintenanceInfo:3752, ManagementInfo:3782, CenterOfResponsabilityInfo:3905, ContractInfo:4144, MaintenanceObjectInfo:4327, CompanyInfo:4463, CostInfo:4600. Imports/guardia net8 :1-19.
  • Contratto: InfocadWeb/WebMachine/RequestCenter/Interfaces/TicketInterfaces.vb:39 (Public Interface IRequestDAL Inherits IBaseDAL; Load :42, LoadDReader :43).
  • Transaction: InfocadWeb/WebMachine/RequestCenter/Transaction/Transaction.vb:3-30 (Begin/Commit/Rollback/OpenConnection/CloseConnection via DALFactory.GetTransactionDAL).
  • DAL: InfocadWeb/WebMachine/RequestCenter.DAL.OracleODP/RequestDAL.vb:12 (Public Class RequestDAL), :14 (Implements IRequestDAL); addRequest :5054GESTREQUEST_T2.ADDREQUEST (OUT NEWREQUESTINDEX) :5078; overload :5089GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL :5105; cm = Configuration.Settings.GetConnectionManager(True) :5055; pattern errore #If DEBUG :5080-5086.
  • Conteggi package (grep su RequestDAL.vb): GESTREQUEST. = 41, GESTREQUEST_T2. = 9.
  • Collections: InfocadWeb/WebMachine/RequestCenter/Classes/Collections/RequestCollection.vb (dir con ~36 collection).
  • Oggetti DB: schema REQUESTCENTER_TEST38 (60 tabelle, 5 package, 345 procedure — snapshot catalogo 2026-07-21, docs/05-databases/REQUESTCENTER_TEST38/index.md).
  • Assenza di test automatici e vincoli headless: CLAUDE.md (progetto) + docs/16-code-reference/index.md.