Table of Contents

RequestCenter (Business Logic)

Progetto di Business Logic del verticale RequestCenter / Service Desk: modella ticket (Request), interventi, allegati, approvazioni, tipologie e la logica di dominio invocata dal front-end RequestCenterWeb e dai servizi WCF. Class library VB.NET su .NET Framework 4.8, con sibling net8 di re-link RequestCenterXNET. Classificazione complessiva: VERIFIED per struttura, dipendenze e pattern (evidenza diretta da .vbproj + sorgenti); alcune affermazioni di runtime marcate INFERRED.

Scopo

Contiene le entità di dominio e le regole del modulo Service Desk: la classe Request (ticket) con le sue classi annidate (TenantInfo, SpatialInfo, ContractInfo, CompanyInfo, CostInfo, …), gli oggetti collegati (Intervent, Approval, Complaint, File, RequestType, RequestCategory, CallType, …), le loro collezioni tipizzate e gli helper di configurazione/transazione. Non apre connessioni né esegue SQL in proprio: delega ogni accesso ai dati alla DAL selezionata a runtime tramite DALFactory (vedi Accesso ai dati).

Posizione nel repository

  • Repo: InfocadWeb
  • Percorso progetto: WebMachine/RequestCenter/RequestCenter.vbproj
  • AssemblyName = RequestCenter; RootNamespace = Descor.RequestCenter.

Tipo di progetto

Libreria di classi (OutputType=Library), MSBuild legacy (non-SDK, ToolsVersion="12.0"), linguaggio VB.NET, OptionStrict On. Il sibling RequestCenterXNET è una libreria SDK-style net8 che re-linka i medesimi sorgenti (vedi sezione dedicata).

Framework e runtime

  • TargetFrameworkVersion = v4.8 (net48). VERIFIED (RequestCenter.vbproj:23).
  • Piattaforme di build definite: AnyCPU, x64, x86, più una config TestParam — tutte Debug/Release. VERIFIED (RequestCenter.vbproj:41-156).
  • Codice condizionale per il porting net8 tramite guardia #If NET5_0_OR_GREATER presente in vari file (es. Classes/Request.vb:15, DALFactory.vb:1). VERIFIED.

Responsabilità

  • Modellazione del ticket e del suo ciclo di vita: creazione, descrizione, classificazione (tipo/categoria/tipologia/call type), associazione a tenant, spazio, contratto, azienda, costo, chiusura, cancellazione logica.
  • Orchestrazione della persistenza attraverso le interfacce DAL (IRequestDAL e famiglia) senza conoscere il provider concreto.
  • Gestione della transazione applicativa (Transaction / MobileTransaction).
  • Localizzazione dei messaggi (risorse dictionary.*).

Dettaglio della classe centrale nella pagina class-Ticket-Request.md.

Entry point

Il progetto è una libreria: non ha un Main. È invocato da due famiglie di consumatori (INFERRED dai riferimenti e dal contesto di batch, coerente con FLOW-REQ-001):

  • Front-end Web Forms RequestCenterWeb — es. il control UserControls/FlowActions/makeTicket.ascx (code-behind makeTicket.ascx.vb, trigger btnPost_Click a :82) istanzia New RequestCenter.Transaction, apre la connessione/transazione e costruisce/salva un Request. SUPPORTED (FLOW-REQ-001).
  • Servizi WCF del verticale (RequestsReaderWCF.svc, RequestsCacheService.svc, ExtraFlowActionsProxy.svc) che espongono operazioni di lettura/azione sui ticket appoggiandosi alla stessa BL. INFERRED.

Punto di ingresso interno chiave: DALFactory (DALFactory.vb:19), factory Shared che risolve per riflessione l'assembly DAL e le sue implementazioni (GetRequestDAL(), GetTransactionDAL(), ecc.).

Struttura interna

Cartelle principali (da RequestCenter.vbproj):

  • Classes/ — entità di dominio (es. Request.vb, Intervent.vb, Approval.vb, Complaint.vb, File.vb, RequestType.vb, CallType.vb, SystemSettings.vb, …).
  • Classes/Bases/ — basi comuni (LogicalDeleteBase.vb).
  • Classes/Collections/ — collezioni tipizzate (RequestCollection.vb, InterventCollection.vb, …).
  • Collections/ — primitive di collezione generiche (KeyedCollection.vb, IndexedKeyedCollection.vb, varianti concurrent/read-only).
  • Interfaces/ — contratti (TicketInterfaces.vb con IRequestDAL a :39, BaseInterfaces.vb, TransactionInterfaces.vb, TenantInterfaces.vb, DataAnalysisInterfaces.vb, ExtensionInterfaces.vb, SystemSettingsInterfaces.vb, UserInterfaces.vb).
  • Transaction/Transaction.vb (Transaction e MobileTransaction).
  • Configuration/Settings.vb, SettingsSection.vb, Elements/* (elementi di configurazione tipizzati).
  • Constants/Constants.vb.
  • Exceptions/ControlNotFoundException, ExternalDataNotFoundException, NotLoadedException.
  • Helpers/Utility.vb.
  • Resources/ — dizionari di localizzazione (dictionary.resx, .it, .it-IT, .de, .de-DE) con Designer generati.
  • My Project/ — file generati (AssemblyInfo.vb, *.Designer.vb). NON documentati come simboli.
  • DALFactory.vb (radice del progetto).

Namespace principali

  • Descor.RequestCenter (radice).
  • Descor.RequestCenter.Ticket (contiene Request e le sue classi annidate — Classes/Request.vb:22,25).
  • Descor.RequestCenter.Interfaces con sotto-namespace Ticket, Transaction, DataAnalysis, System, UserPolicy (usati in DALFactory.vb:10-14).
  • Descor.RequestCenter.Configuration, Descor.RequestCenter.Constants, Descor.RequestCenter.Exceptions.

Dipendenze in ingresso

  • RequestCenterWeb (front-end Web Forms del verticale) — consuma la BL per creare/leggere/gestire ticket. INFERRED (nessun ProjectReference diretto verificabile qui; consumo tipico via reference d'assembly / codice web).
  • Servizi WCF del verticale (.svc sopra elencati). INFERRED.
  • Sibling di porting RequestCenterXNET re-linka i sorgenti (vedi sotto). VERIFIED (RequestCenterXNET.vbproj:18-131).

Dipendenze in uscita

ProjectReference (unico):

  • ..\DataManager\DataManager.vbproj (RequestCenter.vbproj:411) — motore cm (GlobalDataManager) usato dalla DAL. VERIFIED.

Reference con HintPath verso ..\..\..\Assembly\ (assembly 4.8, VERIFIED RequestCenter.vbproj:157-193):

  • Descor.Common
  • Descor.Global.GlobalControllers, Descor.Global.GlobalInterface, Descor.Global.GlobalSharedObjects
  • Descor.Property.PropertyControllers, Descor.Property.PropertyInterface, Descor.Property.PropertySharedObjects
  • Descor.Stock.StockControllers, Descor.Stock.StockInterface, Descor.Stock.StockSharedObjects

Reference framework: System, System.configuration, System.Data, System.Data.OracleClient, System.Runtime.Serialization, System.ServiceModel, System.Web, System.Web.ApplicationServices, System.Xml (:194-202).

Nota: System.Data.OracleClient è referenziato dal progetto BL, ma l'accesso Oracle effettivo avviene nella DAL (RequestCenter.DAL.OracleODP); la BL delega e non apre connessioni inline. SUPPORTED.

Configurazione

Configurazione tipizzata via Configuration/Settings.vb + SettingsSection.vb + Configuration/Elements/*. Chiavi rilevanti esposte come proprietà Shared ReadOnly:

  • DALTypeName → legge DALType (Settings.vb:131-135) — nome dell'assembly/namespace DAL da caricare per riflessione. VERIFIED.
  • DataProviderNameDataProviderName (Settings.vb:125-128).
  • DALUseReadersDALUseReaders (Settings.vb:137-141) — commuta letture DataSet vs DataReader.
  • Altri: MailingMode, ExpireTarget, ExpireStart, ecc.

Il file app.config è incluso come None (RequestCenter.vbproj:396).

API esposte

Nessuna API diretta (no .asmx/.svc/ApiController in questo progetto). L'esposizione remota avviene nel front-end/WCF del verticale, che consuma questa BL. Vedi ../../../04-api/index.md.

Accesso ai dati

Pattern Factory + interfacce + riflessione:

  • DALFactory (DALFactory.vb:19) carica l'assembly DAL con Reflection.Assembly.Load (:24-34): in net48 usa Configuration.Settings.DALTypeName; sotto #If NET5_0_OR_GREATER appende il suffisso "XNET" (:27), selezionando RequestCenter.DAL.OracleODPXNET.
  • Ogni Get<Entità>DAL() risolve un tipo Descor.<DALType>.<Entità>DAL e ne cachea l'istanza (_instances, :22,36-41), restituendola come interfaccia (IRequestDAL, ITransactionDAL, …).
  • La classe Transaction (Transaction/Transaction.vb:3) espone OpenConnection(), Begin(), Commit(), Rollback(), CloseConnection() delegando a DALFactory.GetTransactionDAL (:5-28); MobileTransaction fa lo stesso su GetMobileTransactionDAL (:32-58).

La DAL concreta invoca i package Oracle GESTREQUEST / GESTREQUEST_T2 via l'helper cm di GlobalDataManager. Dettaglio nella pagina project-RequestCenter-DAL.md. Schema e oggetti DB: ../../../05-databases/REQUESTCENTER_TEST38/index.md, tables.md, procedures.md; mappa CRUD ../../../05-databases/crud-matrix.md.

Il caricamento DAL per riflessione implica che la ricerca statica dei chiamanti non è affidabile per stabilire l'uso delle implementazioni DAL: i tipi <Entità>DAL sono risolti per nome a runtime. VERIFIED (DALFactory.vb:24-41,199-217).

Job e processi in background

Nessun servizio Windows o job schedulato definito in questo progetto (libreria pura). Job del verticale risiedono altrove (ServiceJob.RequestCenter). INFERRED.

Integrazioni

  • Localizzazione: Microsoft.Extensions.Localization sotto net8 (DALFactory.vb:203-206), HttpContext.GetGlobalResourceObject sotto net48 (:208). VERIFIED.
  • Dipendenza dai domini Global, Property, Stock (assembly Descor, vedi Dipendenze in uscita).

Gestione degli errori

Eccezioni di dominio dedicate in Exceptions/: ControlNotFoundException, ExternalDataNotFoundException, NotLoadedException. DALFactory lancia una Exception localizzata (notAllowedAction) quando il nome classe DAL è vuoto (DALFactory.vb:200-209). VERIFIED. La gestione transazionale (commit/rollback) è orchestrata dal chiamante web (FLOW-REQ-001, passi commit :216 / rollback nel Catch).

Logging

Nessun framework di logging dedicato individuato in questo progetto oltre a NullLoggerFactory usato per costruire il localizer net8 (DALFactory.vb:15,203). UNKNOWN per un canale di logging applicativo proprio del BL.

Test

Nessun test automatico nel repository (0 progetti xUnit/NUnit/MSTest). Copertura non misurata — non dichiarata.

Procedure di build

  • .NET Framework 4.8 (Windows, NON-verificato su questo host macOS/no Oracle Client):
    msbuild InfocadWeb/WebMachine/RequestCenter/RequestCenter.vbproj -p:Configuration=Debug
    
    Richiede la presenza degli assembly Descor.* sotto ..\..\..\Assembly\ e la build di DataManager.
  • Il progetto fa parte delle solution web (WebMachine.sln e affini) — build completa via WebMachine.sln.

Procedure di debug

Debug tramite il processo host web (IIS/ASP.NET Web Forms di RequestCenterWeb) o i servizi WCF che caricano l'assembly. Il selettore DAL dipende dalla chiave di config DALType: verificare tale valore quando si diagnostica quale provider è in uso. NON-verificato su questo host.

Come estendere il progetto

  • Nuova entità DAL: definire l'interfaccia in Interfaces/, aggiungere un Get<Entità>DAL() in DALFactory.vb seguendo il pattern GetInstanceOfType(Of I…)(GetAssemblyNamespace("Descor", Settings.DALTypeName, "…DAL")), e implementarla nel progetto DAL.
  • Nuova entità di dominio: aggiungere la classe in Classes/ (ed eventuale collezione in Classes/Collections/), registrandola sia in RequestCenter.vbproj sia nel re-link RequestCenterXNET.vbproj.
  • Mantenere OptionStrict On; rispettare le guardie #If NET5_0_OR_GREATER per il porting net8.
  • Per un nuovo cliente, seguire il pattern di customizzazione del prodotto (progetti dedicati) anziché ramificare la BL condivisa.

Aree rischiose

  • Classes/Request.vb monolite (~5790 righe): singola classe con numerose classi annidate e responsabilità multiple; alto rischio di regressione su modifiche. SUPPORTED (dimensione file). Dettaglio in class-Ticket-Request.md.
  • Autorizzazione bypassabile oltre il confine WCF/.NET Remoting (TD-008): i grant verificati solo nella UI Web Forms possono non essere ri-verificati quando la stessa BL è invocata da chiamanti server-side/integrazione. Vedi ../../../14-technical-debt/reperti-prioritari.md (TD-008, sistemico su 9 domini).
  • Caricamento DAL per riflessione: errori di configurazione (DALType errato) si manifestano solo a runtime come tipo non trovato. INFERRED.

Debito tecnico


Sibling net8: RequestCenterXNET

Progetto SDK-style net8 (RequestCenterXNET.vbproj:1) che non duplica i sorgenti ma li re-linka dal progetto 4.8 tramite <Compile Include="..\RequestCenter\...vb" Link="..." />.

  • TargetFramework = net8.0; RootNamespace = Descor.RequestCenter; AssemblyName = RequestCenterXNET; FileVersion = 2.0.0.0. VERIFIED (:2-7).
  • OutputPath = ..\..\..\Assembly\ (Debug e Release, :9-15).
  • Re-link di ~115 file BL (Classes/*, Classes/Collections/*, Collections/*, Configuration/*, Constants/*, Exceptions/*, Helpers/*, Interfaces/*, Transaction/*, Designer dizionari) con Link= (:18-131). VERIFIED.
  • EmbeddedResource re-linkati: dictionary.it-IT.resx, dictionary.it.resx, dictionary.resx (:135-137).
  • PackageReference (:141-143): Microsoft.AspNetCore.SystemWebAdapters 1.3.2, Microsoft.Extensions.Localization 8.0.4, System.Configuration.ConfigurationManager 8.0.0. VERIFIED.
  • Reference con HintPath (11) (:147-179): DataManagerXNET (da ..\..\..\Assembly\net8.0\DataManagerXNET.dll) più 10 assembly Descor.* 4.8Descor.Common, Descor.Global.GlobalControllers, Descor.Global.GlobalInterface, Descor.Global.GlobalSharedObjects, Descor.Property.PropertyControllers, Descor.Property.PropertyInterface, Descor.Property.PropertySharedObjects, Descor.Stock.StockControllers, Descor.Stock.StockInterface, Descor.Stock.StockSharedObjects. VERIFIED.

Scostamento rispetto alla scheda incarico: le HintPath verso assembly Descor.* sono 10 (Descor.Common + 3 Global.* + 3 Property.* + 3 Stock.*); complessivamente le Reference con HintPath sono 11 includendo DataManagerXNET. Segnalato in issues.

NON compilabile headless (macOS): la chiusura delle dipendenze termina in assembly 4.8 solo-WindowsDescor.Stock.* e i vari *.Controllers (Global.GlobalControllers, Property.PropertyControllers, Stock.StockControllers) referenziati come DLL binarie. Sebbene il target sia net8, quelle DLL restano compilate per il Framework 4.8 e legano ODP.NET unmanaged/WCF/Web tipici del solo Windows. INFERRED (coerente con la scheda incarico e con la natura degli assembly).

Selezione del driver/DAL sotto net8: la guardia #If NET5_0_OR_GREATER in DALFactory.vb:27 fa sì che a runtime venga caricato RequestCenter.DAL.OracleODPXNET (suffisso XNET), che a sua volta usa Oracle.ManagedDataAccess. VERIFIED.

Ricetta build (Windows, NON-verificata su questo host):

dotnet build InfocadWeb/WebMachine/RequestCenterXNET/RequestCenterXNET.vbproj

Prerequisiti: gli assembly 4.8 Descor.* e DataManagerXNET.dll devono essere già presenti in ..\..\..\Assembly\ (e net8.0\); l'ambiente deve poter caricare le DLL 4.8 solo-Windows.

Flussi correlati

  • FLOW-REQ-001 — creazione ticket via makeTicket.ascx con RequestCenter.Transaction (Open/Begin/Commit/Rollback).

Regole di business correlate

Pagine collegate

Evidenze

  • InfocadWeb/WebMachine/RequestCenter/RequestCenter.vbproj:9-11OutputType=Library, RootNamespace=Descor.RequestCenter, AssemblyName=RequestCenter. VERIFIED
  • RequestCenter.vbproj:13OptionStrict On. VERIFIED
  • RequestCenter.vbproj:23TargetFrameworkVersion=v4.8. VERIFIED
  • RequestCenter.vbproj:157-202Reference/HintPath (Descor.Common, Global., Property., Stock.*) + framework refs (incl. System.Data.OracleClient, System.ServiceModel, System.Web). VERIFIED
  • RequestCenter.vbproj:411-414 — unico ProjectReference = ..\DataManager\DataManager.vbproj. VERIFIED
  • RequestCenter.vbproj:218-365 — inventario Compile (cartelle Classes, Collections, Configuration, Constants, Exceptions, Helpers, Interfaces, Transaction, Resources). VERIFIED
  • RequestCenter/DALFactory.vb:19,22,24-41,199-217 — factory Shared, cache istanze, Reflection.Assembly.Load, suffisso XNET sotto #If NET5_0_OR_GREATER, risoluzione tipi Descor.<DALType>.<Entità>DAL. VERIFIED
  • RequestCenter/DALFactory.vb:55-56GetRequestDAL()IRequestDAL. VERIFIED
  • RequestCenter/DALFactory.vb:159-165GetTransactionDAL()/GetMobileTransactionDAL(). VERIFIED
  • RequestCenter/Transaction/Transaction.vb:3-58Transaction/MobileTransaction (Begin/Commit/Rollback/OpenConnection/CloseConnection) delegano a DALFactory. VERIFIED
  • RequestCenter/Configuration/Settings.vb:131-141DALTypeName (→ DALType), DALUseReaders. VERIFIED
  • RequestCenter/Classes/Request.vb:1-25 — Imports (Descor.Property, Descor.Global.*), guardia #If NET5_0_OR_GREATER (:15), Namespace Ticket + Public Class Request (:22,25). VERIFIED
  • RequestCenterXNET.vbproj:2-7 — net8.0, RootNamespace Descor.RequestCenter, AssemblyName RequestCenterXNET. VERIFIED
  • RequestCenterXNET.vbproj:18-131 — re-link <Compile Include=..\RequestCenter\...vb Link=...> (~115 file). VERIFIED
  • RequestCenterXNET.vbproj:141-143 — PackageReference (SystemWebAdapters 1.3.2, Extensions.Localization 8.0.4, Configuration.ConfigurationManager 8.0.0). VERIFIED
  • RequestCenterXNET.vbproj:147-179 — 11 Reference/HintPath: DataManagerXNET (net8.0) + 10 assembly Descor.* 4.8. VERIFIED
  • docs/14-technical-debt/reperti-prioritari.md (riga TD-008) — grant UI non ri-verificati oltre WCF/.NET Remoting, sistemico su 9 domini. VERIFIED
  • docs/07-business-flows/FLOW-REQ-001.md:39-65,131 — uso di makeTicket.ascx + RequestCenter.Transaction (Open/Begin/Commit/Rollback). SUPPORTED
  • Assenza di test automatici nel repo (istruzioni di progetto CLAUDE.md). VERIFIED
  • Comandi msbuild/dotnet build Windows: NON-verificati su questo host (macOS, no Oracle Client).