Table of Contents

Request (Descor.RequestCenter.Ticket.Request)

Aggregato di dominio della richiesta/ticket del vertical RequestCenter: incapsula l'anagrafica di una richiesta e i suoi dati collegati (spaziali, contratto, gestione, azienda, costi), esponendo l'orchestrazione di creazione, aggiornamento incrementale, chiusura e cancellazione. Classificazione complessiva: VERIFIED (definizione a Request.vb:25, delega sistematica a IRequestDAL verificata sui singoli metodi).

Scopo

Request è la classe di business (BL) che rappresenta una singola richiesta di servizio (ticket, anomalia, informazione). Non apre connessioni né esegue SQL: ogni operazione di scrittura o lettura viene inoltrata all'implementazione di IRequestDAL ottenuta tramite DALFactory.GetRequestDAL (verificato: pattern ripetuto in tutti i metodi Set*/Create/Close/Delete, es. Request.vb:2223, :2326, :2597, :2759, :2814). La classe è marcata <DataContract(), Serializable()> (Request.vb:24), quindi partecipa alla serializzazione WCF/DataContract.

Namespace e progetto

  • Namespace: Descor.RequestCenter.Ticket (blocco Namespace Ticket a Request.vb:22, entro RootNamespace Descor.RequestCenter).
  • Progetto: RequestCenter/RequestCenter.vbproj (VB.NET, net48, layer BL). ProjectReference verso DataManager.
  • File: Classes/Request.vb (~5790 righe; nome pienamente qualificato Descor.RequestCenter.Ticket.Request).
  • Il tipo è re-linkato anche nel progetto RequestCenterXNET (net8.0) via <Compile Include=.. Link=..>; tale progetto non è compilabile headless su questo host (dipendenze da assembly 4.8 solo-Windows). Classificazione: SUPPORTED (da configurazione di progetto del batch; non ricompilato qui).

Responsabilità

  • Fare da facciata BL sopra IRequestDAL per il ciclo di vita della richiesta.
  • Mantenere lo stato in-memory della richiesta e dei suoi sotto-oggetti (*Info).
  • Orchestrare la creazione (insert + eventuale protocollo) e transizioni (chiusura, scadenza/SLA).
  • Calcolare la data di scadenza SLA rispetto agli orari di lavoro del contratto (ExpireEngine).

Perché esiste

UNKNOWN — la motivazione storica/di business non è documentata nel sorgente; si omette per evitare inferenze non supportate (regola §4 del programma).

Contratto pubblico

Membri pubblici principali (elenco non esaustivo; ancore verificate):

  • Costruttori/factory: Create (Shared, due overload) Request.vb:2222 e :2227; GetInstance (3 overload Overridable) :4987, :4991, :4995; Delete (Shared) :2813.
  • Setter con doppia forma (senza argomenti = persiste lo stato interno corrente; con argomenti = imposta e persiste): SetProtocol :2232, SetTenant :2244/:2251, SetRequestDate :2257/:2264, SetSpatialInfo :2237/:2270, SetContactInfo :2302/:2307, SetOpenerUser :2314/:2319, SetType :2470/:2477, SetCallType :2496/:2512, SetManagement :2537/:2544, SetContract :2550/:2557, SetCompany :2563/:2570, SetCost :2576/:2583, SetReference :2602/:2607, SetCategory :2615/:2622, SetTypology :2627/:2634.
  • Descrizione: SetDescription() :2325, PrepareDescription :2330, WriteDescription :2342, SetDescription(dsrequest, appendmode) :2349.
  • Workflow: SetWorkflowInterface :2596.
  • Ciclo di vita: Close :2758, CloseWithExpireSet :2781, SetWasExpired :2807.
  • SLA/funzionalità: ExpireEngine (due overload) :4721, :4790.
  • Navigazione figli: GetAllChildRequests (due overload) :4999, :5017.
  • Classi annidate pubbliche *Info (vedi sezione dedicata).

Reference generata (quando disponibile): vedere il portale ../../../../api/ (reference DocFX; nota: la reference per i tipi net8 di questo vertical è rinviata, cfr. stato del batch).

Implementazioni o classi derivate

Request è una classe concreta con vari membri Overridable (GetInstance, GetAllChildRequests), quindi predisposta all'override in sottotipi. Non risultano derivazioni verificate nell'intervallo esaminato. Classificazione: INFERRED (presenza di Overridable suggerisce estendibilità, ma nessun sottotipo confermato qui).

Dipendenze

  • IRequestDAL (contratto DAL, Interfaces/TicketInterfaces.vb:39) risolto via DALFactory.GetRequestDAL.
  • Sotto-oggetti *Info annidati e collezioni (RequestCollection, UrgeCollection, ComplaintCollection, ApprovalCollection).
  • RequestCenter.Configuration.Settings (es. ExpireTarget, Request.vb:2796).
  • WorkTimeController / WorkTimeExceptionController per il calcolo SLA (Request.vb:4738).
  • Imports significativi (Request.vb:1-19): Descor.Property, Descor.Global.GlobalControllers, Descor.Global.GlobalSharedObjects.*; sotto #If NET5_0_OR_GREATER anche System.Data, Descor.DataManager, Descor.Common.DTO.

Ciclo di vita

  1. Creazione tramite Create (Shared) → restituisce idrequest (Integer).
  2. Popolamento incrementale tramite i vari Set*/Write* sull'istanza caricata.
  3. Chiusura tramite Close / CloseWithExpireSet.
  4. Cancellazione tramite Delete (Shared).

Il metodo privato Populate (Request.vb:2210) inizializza i campi chiave dopo la creazione.

Stato interno

Ampio insieme di campi privati (Request.vb:29-60 e oltre): identificativi (_idrequest, _protocol, _iduser, _idelement), classificazione (_calltype, _callmaintype, _requesttype, _requestcategory, _requesttypology), date (_opendate, _requestdate, _closedate, _estimateexpirydate, _expirationdate), stato (_closed, _wasexpired), e i sotto-oggetti *Info. I setter con argomenti aggiornano sia il DB (via DAL) sia il campo/*Info corrispondente (es. SetType(idtype) :2477).

Metodi principali

Public Shared Function Create(iduser, idtenant, protocol, protocolcode, subcode, protocollevelparent, requestdate) As Integer

  • Scopo: creare la riga di richiesta e restituire il nuovo idrequest. È l'entry point BL condiviso da UI interattiva e portali (cfr. FLOW-REQ-001).
  • Attese del chiamante: disporre di iduser e idtenant validi; per l'overload con protocollo, aver già generato il protocollo (il momento di generazione Before/After è deciso a monte, cfr. FLOW-REQ-001).
  • Parametri: overload completo con protocollo (:2222); overload minimale Create(iduser, idtenant, requestdate) (:2227) senza protocollo.
  • Valore di ritorno: Integer = idrequest appena creato.
  • Precondizioni / Postcondizioni: post: esiste una riga richiesta con l'id restituito.
  • Autorizzazione: nessun controllo di autorizzazione nel corpo BL (vedi sezione Autorizzazione, TD-008).
  • Letture DB / Scritture DB: W. Overload :2222dal.addRequest(...)GESTREQUEST_T2.ADDREQUEST (parametro OUT NEWREQUESTINDEX), RequestDAL.vb:5054. Overload :2227dal.addRequest(iduser, idtenant, requestdate)GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL, RequestDAL.vb:5089. Tabelle: cfr. 05-databases/REQUESTCENTER_TEST38 (radice REQUESTREGISTRY, INFERRED) e crud-matrix.
  • Ambito transazionale: la Create non gestisce la transazione; il chiamante la avvolge in RequestCenter.Transaction (Begin/Commit/Rollback), vedi FLOW-REQ-001.
  • Side effect: persistenza della riga; nel flusso completo seguono protocollo, elemento DEM di workflow e notifiche (non dentro Create).
  • Comportamento in errore e ripristino: eccezioni propagate al chiamante; il rollback della transazione è responsabilità del chiamante (objTransaction.Rollback()).
  • Classificazione: VERIFIED (corpo a Request.vb:2222-2230; mappatura DAL→package da RequestDAL e FLOW-REQ-001).

Sequenza semplificata (Create nel flusso di makeTicket.ascx.vb):

Transaction.OpenConnection() + Begin()            (makeTicket.ascx.vb:111-112)
  -> Request.Create(iduser, tenant, protocol, ...) -> dal.addRequest -> GESTREQUEST_T2.ADDREQUEST  (:114)
  -> WriteDescription() -> GESTREQUEST.ADDDESCRIPTIONTOREQUEST                                       (:185)
  -> setter vari (SetCallType, SetContactInfo, SetType, ...)                                          (:191-203)
  -> creazione elemento DEM di workflow: _currentAct.Run + ElementMessage.Create                      (:210-211)
  -> SetWorkflowInterface(newIdElement) -> GESTREQUEST.ADDWORKFLOWINTERFACE                            (:214)
Transaction.Commit()                                                                                  (:216)

Public Sub SetDescription() / Public Sub WriteDescription()

  • Scopo: persistere la descrizione della richiesta. SetDescription() scrive incondizionatamente lo stato corrente _dsrequest; WriteDescription() scrive solo se _dsrequest non è vuota (If Not String.IsNullOrEmpty(...), :2344).
  • Attese del chiamante: aver popolato _dsrequest (tipicamente via PrepareDescription :2330, che accoda Before/After) prima di WriteDescription.
  • Parametri: nessuno negli overload senza argomenti; l'overload SetDescription(dsrequest, appendmode) (:2349) accoda e persiste in un colpo solo.
  • Letture DB / Scritture DB: W → dal.setDescription(Me._idrequest, ...)GESTREQUEST.ADDDESCRIPTIONTOREQUEST (RequestDAL.vb:5407).
  • Side effect: l'overload SetDescription(dsrequest, appendmode) aggiorna anche _dsrequest (:2360); WriteDescription non modifica lo stato.
  • Ambito transazionale: nessuno proprio; opera sulla connessione/transazione del chiamante.
  • Classificazione: VERIFIED (corpi a Request.vb:2325-2361; package da RequestDAL).

Public Sub SetWorkflowInterface(idworkflowelement As Integer)

  • Scopo: collegare la richiesta all'elemento di workflow DEM appena creato.
  • Parametri: idworkflowelement — id dell'elemento DEM (newIdElement nel flusso).
  • Letture DB / Scritture DB: W → dal.setWorkflowInterface(Me._idrequest, idworkflowelement)GESTREQUEST.ADDWORKFLOWINTERFACE (RequestDAL.vb:5641). Tabella collegata REQUESTWORKFLOWINTERFACE (cfr. tables).
  • Side effect: aggiorna Me._idelement = idworkflowelement (:2599).
  • Ambito transazionale: invocato entro la transazione del chiamante, subito prima di Commit (makeTicket.ascx.vb:214-216).
  • Classificazione: VERIFIED (Request.vb:2596-2600; package da RequestDAL/FLOW-REQ-001).

Public Sub Close(Optional forceCloseDate As DateTime? = Nothing)

  • Scopo: chiudere la richiesta impostando la data di chiusura.
  • Parametri: forceCloseDate opzionale; se assente usa DateTime.Now (:2760-2761).
  • Precondizioni / Postcondizioni: post: _closed = True, _closedate valorizzata (:2777-2778).
  • Letture DB / Scritture DB: W → dal.closeRequest(Me._idrequest, dtnow)closeRequest (RequestDAL.vb:6242).
  • Side effect: se il costo previsto è valorizzato ma manca il costo effettivo, allinea i costi via SetCost(intvCost, intvCost) e aggiorna l'eventuale intervento registrato (:2763-2774) — quindi una Close può comportare scritture aggiuntive di costo. CloseWithExpireSet (:2781) estende Close con il calcolo/scrittura dello stato di scadenza (SetWasExpired).
  • Ambito transazionale: nessuno proprio.
  • Classificazione: VERIFIED (Request.vb:2758-2779).

Public Shared Sub Delete(idrequest As Integer)

  • Scopo: cancellare una richiesta per id (metodo statico, non richiede istanza).
  • Parametri: idrequest.
  • Letture DB / Scritture DB: W → dal.deleteRequest(idrequest)deleteRequest (RequestDAL.vb:6264).
  • Side effect: eventuali cascate lato package Oracle non sono mappate qui (UNKNOWN).
  • Ambito transazionale: nessuno proprio.
  • Classificazione: VERIFIED (Request.vb:2813-2816).

Public Function ExpireEngine(startdate As Date, days As Int32, Optional idContract As Integer = 0) As Nullable(Of Date)

  • Scopo: calcolare la data di scadenza SLA a partire da startdate, avanzando di days giorni lavorativi (overload analogo con TimeSpan, :4790) secondo gli orari di lavoro/eccezioni del contratto.
  • Attese del chiamante: richiesta con contratto valorizzato, oppure passare esplicitamente idContract.
  • Parametri: startdate; days (giorni lavorativi) o tspan; idContract opzionale (0 = usa il contratto della richiesta, :4724-4728).
  • Valore di ritorno: Nullable(Of Date)Nothing se _idcontract <= 0.
  • Letture DB / Scritture DB: nessuna scrittura. Letture indirette tramite WorkTimeController.SelectByContract / WorkTimeExceptionController.SelectByContract (:4740-4741) quando il contratto differisce da quello caricato; altrimenti usa ContractInformation.ContractWorkTimes già in memoria.
  • Algoritmo: ciclo che scorre i giorni saltando i giorni di riposo (IsRestDay) e applicando le eccezioni di calendario (WorkTimeException), fino a raggiungere days giorni lavorativi, fissando l'orario a fine giornata (EndTime), :4756-4783.
  • Side effect: nessuno (funzione di calcolo puro sullo stato/dati contratto).
  • Prestazioni: loop giorno-per-giorno; costo proporzionale ai giorni di calendario attraversati.
  • Classificazione: VERIFIED (Request.vb:4721-4788).

Public Overridable Function GetInstance(...) As Request

  • Scopo: factory d'istanza (tre overload: da idrequest+usereader, da DataRow, da IDataReader) che incapsula i costruttori privati (:4988, :4992, :4996).
  • Valore di ritorno: nuova istanza Request.
  • Classificazione: VERIFIED (Request.vb:4987-4997).

Collaborazioni

  • IRequestDAL/RequestDAL per ogni accesso dati (vedi class-RequestDAL).
  • RequestCenter.Transaction per l'unità di lavoro (vedi class-Transaction).
  • DEM (WorkflowCreatingActivity, ElementMessage, Element) nel flusso di creazione — collaborazione dal lato chiamante (makeTicket.ascx.vb:210-214).
  • Endpoint SOAP/WCF equivalenti per lettura/cache (RequestsReaderWCF.svc, RequestsCacheService.svc, ExtraFlowActionsProxy.svc): cfr. 04-api.

Accesso al database

Sempre indiretto, via IRequestDAL → package Oracle GESTREQUEST / GESTREQUEST_T2. Mappature verificate dai metodi documentati:

Metodo BL Metodo DAL Package.Proc Direzione
Create (con protocollo) addRequest (RequestDAL.vb:5054) GESTREQUEST_T2.ADDREQUEST (OUT NEWREQUESTINDEX) W
Create (senza protocollo) addRequest (:5089) GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL W
SetDescription/WriteDescription setDescription (:5407) GESTREQUEST.ADDDESCRIPTIONTOREQUEST W
SetWorkflowInterface setWorkflowInterface (:5641) GESTREQUEST.ADDWORKFLOWINTERFACE W
Close closeRequest (:6242) (package GESTREQUEST*) W
Delete deleteRequest (:6264) (package GESTREQUEST*) W

Dettaglio tabelle e procedure: 05-databases/REQUESTCENTER_TEST38/index.md, procedures.md, crud-matrix.md.

Transazioni

Request non apre/gestisce connessioni o transazioni: la delega al chiamante tramite RequestCenter.Transaction (OpenConnection()Begin() → operazioni → Commit()/Rollback()CloseConnection()), come nel flusso makeTicket.ascx.vb:111-254. Classificazione: VERIFIED (nessuna gestione transazionale nei corpi esaminati; wrapping lato chiamante confermato).

Autorizzazione

Nessun controllo di autorizzazione risulta nei corpi BL esaminati (Create, Set*, Close, Delete non verificano permessi). Il gating RequestCenterEnabled è un controllo lato UI (shell/pagina RequestCenterWeb, RequestCenterPage.Page_PreInit), non ri-verificato a livello BL: vedere debito TD-008. Classificazione: SUPPORTED (assenza di check nei corpi letti; gate UI noto da TD-008). ATTENZIONE: chiamare i metodi BL fuori dalla UI aggira il gate.

Side effect

  • Scritture DB via DAL (vedi tabella sopra).
  • Nel flusso completo di creazione (non dentro Create): generazione del protocollo, creazione dell'elemento DEM di workflow e messaggio iniziale (ElementMessage.Create), notifiche mail. La parte protocollo/DEM/mail è orchestrata dal chiamante; l'unico legame BL è SetWorkflowInterface. Classificazione: SUPPORTED (dal flusso makeTicket.ascx.vb e FLOW-REQ-001; l'invio mail non è stato ri-verificato in questo intervallo — vedi Limitazioni).
  • Close può innescare scritture di costo aggiuntive (SetCost) e aggiornare un intervento registrato in memoria.

Gestione degli errori

I metodi non intercettano eccezioni: le propagano al chiamante, che gestisce Rollback e tracciamento (InfocadTraceWrapper.CreateError, cfr. FLOW-REQ-001). Classificazione: VERIFIED (assenza di Try/Catch nei corpi esaminati).

Thread safety

Classe con stato mutabile per-istanza e non sincronizzata; non thread-safe per istanze condivise. I metodi Shared (Create, Delete) operano solo sui parametri. Classificazione: INFERRED.

Considerazioni sulle prestazioni

ExpireEngine itera giorno-per-giorno sul calendario; GetAllChildRequests supporta due modalità (DReader in modalità _usereader, altrimenti DataSet) per adattarsi al percorso di lettura (Request.vb:5002-5012).

Esempio di utilizzo

Estratto reale dal flusso di creazione ticket (verificato staticamente, non eseguito su questo host):

Dim objTransaction As New RequestCenter.Transaction
objTransaction.OpenConnection()
objTransaction.Begin()
idRequest = RequestCenter.Ticket.Request.Create(iduser, _currentuser.CurrentTenantId, ltlProtocol.Text, hidProtocol.Value, CInt(hidSub.Value), CInt(hidProtLevelParent.Value), DateTime.Now)
' ... _objRequest caricato, setter vari ...
_objRequest.WriteDescription()
_objRequest.SetWorkflowInterface(newIdElement)
objTransaction.Commit()

(makeTicket.ascx.vb:88,111-216)

Test correlati

Nessun test automatico nel repository (0 test in tutta la codebase). Non è possibile dichiarare copertura.

Flussi correlati

Regole di business correlate

Limitazioni

  • Non gestisce transazioni/connessioni proprie: la coerenza dipende dal wrapping del chiamante.
  • L'invio notifiche mail e la generazione protocollo non sono stati ri-verificati riga-per-riga in questa pagina (orchestrati a monte; vedi FLOW-REQ-001). Classificazione degli aspetti mail: SUPPORTED.
  • Cascate DB di deleteRequest/closeRequest a livello di package Oracle: UNKNOWN (il catalogo aggrega a livello di package body).

Debito tecnico

  • TD-008: il gate RequestCenterEnabled è verificato solo lato UI; i metodi BL di Request non ricontrollano l'autorizzazione. Rischio di bypass se i metodi vengono invocati fuori dal percorso UI (WCF, job, integrazioni).

Classi annidate

Classi pubbliche annidate in Request (sotto-oggetti descrittivi/DTO della richiesta). Scopo sintetico; ancore verificate su Request.vb:

Classe annidata Riga Scopo (sintetico)
TenantInfo :2822 Dati dell'ente/tenant associato (codice, descrizione, nome esteso; caricamento esterno lazy).
SpatialInfo :2946 Localizzazione (regione/città/distretto/piano/stanza, coordinate). Contiene ulteriori collezioni annidate (RegionInfoCollection :3641, CityInfoCollection :3663, DistrictInfoCollection :3681, BuildingInfoCollection :3698, FloorInfoCollection :3715, RoomInfoCollection :3736).
MaintenanceInfo :3752 Informazioni di manutenzione associate alla richiesta.
ManagementInfo :3782 Dati di gestione (IdManagement).
CenterOfResponsabilityInfo :3905 Centro di responsabilità (idCenter).
ContractInfo :4144 Contratto associato, incl. orari di lavoro (ContractWorkTimes, ContractWorkTimesException) usati da ExpireEngine.
MaintenanceObjectInfo :4327 Oggetto di manutenzione collegato.
CompanyInfo :4463 Azienda/fornitore (IdCompany).
CostInfo :4600 Costi previsto/effettivo (PrevCost, EffectiveCost), usati da SetCost/Close.

Nota: i file My Project/*.Designer.vb sono GENERATI e non documentati.

Evidenze

  • Definizione classe e attributi: RequestCenter/Classes/Request.vb:22 (Namespace Ticket), :24 (<DataContract(), Serializable()>), :25 (Public Class Request).
  • Campi privati (stato): Request.vb:29-60.
  • Create (Shared, 2 overload): Request.vb:2222, :2227.
  • Populate (privato): Request.vb:2210.
  • SetDescription()/PrepareDescription/WriteDescription/SetDescription(...): Request.vb:2325, :2330, :2342, :2349.
  • SetCallType: :2496/:2512; SetType: :2470/:2477; SetManagement: :2537/:2544; SetContract: :2550/:2557; SetCompany: :2563/:2570; SetCost: :2576/:2583.
  • SetWorkflowInterface: Request.vb:2596.
  • Close: Request.vb:2758; CloseWithExpireSet: :2781; SetWasExpired: :2807.
  • Delete (Shared): Request.vb:2813.
  • ExpireEngine (2 overload): Request.vb:4721, :4790.
  • GetInstance (3 overload): Request.vb:4987, :4991, :4995.
  • GetAllChildRequests (2 overload): Request.vb:4999, :5017.
  • Classi annidate *Info: Request.vb:2822, 2946, 3752, 3782, 3905, 4144, 4327, 4463, 4600 (+ collezioni annidate 3641-3736).
  • Delega DAL: Request.vb:2223, 2326, 2343-2345, 2597, 2759/2776, 2814 (pattern DALFactory.GetRequestDAL + chiamata IRequestDAL).
  • Contratto DAL: Interfaces/TicketInterfaces.vb:39 (IRequestDAL).
  • Mappature package (autoritative dal batch): RequestCenter.DAL.OracleODP/RequestDAL.vb:5054 (addRequestGESTREQUEST_T2.ADDREQUEST), :5089 (ADDREQUESTWITHOUTPROTOCOL), :5407 (ADDDESCRIPTIONTOREQUEST), :5641 (ADDWORKFLOWINTERFACE), :6242 (closeRequest), :6264 (deleteRequest).
  • Flusso e sequenza Create: CASSANDRA/RequestCenterWeb/UserControls/FlowActions/makeTicket.ascx.vb:88, 111-112, 114, 185, 191-214, 216, 240, 254.
  • Oggetti DB: package Oracle GESTREQUEST, GESTREQUEST_T2; tabelle radice/collegate documentate in docs/05-databases/REQUESTCENTER_TEST38/ (schema REQUESTCENTER_TEST38).
  • Metadati: file Request.vb codifica ISO-8859, terminatori LF, ~5790 righe (grep binario richiede flag -a).