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 aIRequestDALverificata 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(bloccoNamespace TicketaRequest.vb:22, entro RootNamespaceDescor.RequestCenter). - Progetto:
RequestCenter/RequestCenter.vbproj(VB.NET,net48, layer BL). ProjectReference versoDataManager. - File:
Classes/Request.vb(~5790 righe; nome pienamente qualificatoDescor.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
IRequestDALper 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:2222e:2227;GetInstance(3 overloadOverridable):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 viaDALFactory.GetRequestDAL.- Sotto-oggetti
*Infoannidati e collezioni (RequestCollection,UrgeCollection,ComplaintCollection,ApprovalCollection). RequestCenter.Configuration.Settings(es.ExpireTarget,Request.vb:2796).WorkTimeController/WorkTimeExceptionControllerper 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_GREATERancheSystem.Data,Descor.DataManager,Descor.Common.DTO.
Ciclo di vita
- Creazione tramite
Create(Shared) → restituisceidrequest(Integer). - Popolamento incrementale tramite i vari
Set*/Write*sull'istanza caricata. - Chiusura tramite
Close/CloseWithExpireSet. - 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
idusereidtenantvalidi; 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 minimaleCreate(iduser, idtenant, requestdate)(:2227) senza protocollo. - Valore di ritorno:
Integer=idrequestappena 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
:2222→dal.addRequest(...)→GESTREQUEST_T2.ADDREQUEST(parametro OUTNEWREQUESTINDEX),RequestDAL.vb:5054. Overload:2227→dal.addRequest(iduser, idtenant, requestdate)→GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL,RequestDAL.vb:5089. Tabelle: cfr. 05-databases/REQUESTCENTER_TEST38 (radiceREQUESTREGISTRY, INFERRED) e crud-matrix. - Ambito transazionale: la
Createnon gestisce la transazione; il chiamante la avvolge inRequestCenter.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_dsrequestnon è vuota (If Not String.IsNullOrEmpty(...),:2344). - Attese del chiamante: aver popolato
_dsrequest(tipicamente viaPrepareDescription:2330, che accoda Before/After) prima diWriteDescription. - 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);WriteDescriptionnon 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 (newIdElementnel flusso). - Letture DB / Scritture DB: W →
dal.setWorkflowInterface(Me._idrequest, idworkflowelement)→GESTREQUEST.ADDWORKFLOWINTERFACE(RequestDAL.vb:5641). Tabella collegataREQUESTWORKFLOWINTERFACE(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:
forceCloseDateopzionale; se assente usaDateTime.Now(:2760-2761). - Precondizioni / Postcondizioni: post:
_closed = True,_closedatevalorizzata (: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 unaClosepuò comportare scritture aggiuntive di costo.CloseWithExpireSet(:2781) estendeClosecon 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 didaysgiorni lavorativi (overload analogo conTimeSpan,: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) otspan;idContractopzionale (0 = usa il contratto della richiesta,:4724-4728). - Valore di ritorno:
Nullable(Of Date)—Nothingse_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 usaContractInformation.ContractWorkTimesgià in memoria. - Algoritmo: ciclo che scorre i giorni saltando i giorni di riposo (
IsRestDay) e applicando le eccezioni di calendario (WorkTimeException), fino a raggiungeredaysgiorni 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, daDataRow, daIDataReader) che incapsula i costruttori privati (:4988,:4992,:4996). - Valore di ritorno: nuova istanza
Request. - Classificazione: VERIFIED (
Request.vb:4987-4997).
Collaborazioni
IRequestDAL/RequestDALper ogni accesso dati (vedi class-RequestDAL).RequestCenter.Transactionper 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 flussomakeTicket.ascx.vbe FLOW-REQ-001; l'invio mail non è stato ri-verificato in questo intervallo — vedi Limitazioni). Closepuò 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
- FLOW-REQ-001 — Creazione richiesta/ticket
- Dominio funzionale: Service Desk
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/closeRequesta 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 diRequestnon 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 annidate3641-3736). - Delega DAL:
Request.vb:2223, 2326, 2343-2345, 2597, 2759/2776, 2814(patternDALFactory.GetRequestDAL+ chiamataIRequestDAL). - Contratto DAL:
Interfaces/TicketInterfaces.vb:39(IRequestDAL). - Mappature package (autoritative dal batch):
RequestCenter.DAL.OracleODP/RequestDAL.vb:5054(addRequest→GESTREQUEST_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 indocs/05-databases/REQUESTCENTER_TEST38/(schemaREQUESTCENTER_TEST38). - Metadati: file
Request.vbcodifica ISO-8859, terminatori LF, ~5790 righe (grep binario richiede flag-a).