Table of Contents

Task di sviluppo comuni (verticale RequestCenter)

Ricettario operativo per le modifiche ricorrenti sul verticale RequestCenter / Service Desk. Ogni task è ancorato al codice reale (file:line, oggetti DB) ed è pensato per essere seguito passo-passo. Questa pagina è il seed della sezione (spec §23): copre solo i task supportati dall'architettura reale osservata nel repository. Classificazione complessiva del pattern architetturale: VERIFIED.

Premesse comuni a tutti i task

Prima di toccare il verticale, tieni presente l'architettura effettiva (tutti i punti sono VERIFIED, salvo diversa indicazione):

  • Slice a cinque strati. UI (RequestCenterWeb, Web Forms) → BL (Descor.RequestCenter.Ticket.Request) → contratto (IRequestDAL) → DAL (RequestDAL) → package Oracle (GESTREQUEST, GESTREQUEST_T2) → tabelle. Non collassare gli strati.
  • Niente ORM, niente SQL inline. Il DAL invoca stored procedure via l'helper cm (GlobalDataManager) di DataManager: cm.ExecuteNonQuery/ExecuteReader/Fill("PACKAGE.PROC", OracleParameter…).
  • Il DAL è caricato per reflection. DALFactory.GetRequestDAL risolve l'implementazione a runtime (Reflection.Assembly.Load di Configuration.Settings.DALTypeName, con suffisso XNET sotto net8) e fa Activator.CreateInstance del tipo Descor.<DALTypeName>.RequestDAL (RequestCenter/DALFactory.vb:24,55). Conseguenza pratica: un metodo DAL senza chiamanti statici non è morto — è legato al BL tramite l'Implements IRequestDAL.<membro>, non tramite chiamata diretta. Non dichiararlo "inutilizzato" (regola §30 / punto 6).
  • Nessun test automatico nel repository (0 xUnit/NUnit/MSTest). La rete di sicurezza è la tracciabilità documentale (FLOW-REQ / BR-REQ / matrice CRUD) + l'harness manuale InfocadTester. Non dichiarare copertura non misurata.
  • Verifica di build limitata su questo host. I comandi msbuild/nuget girano solo su Windows + Visual Studio 2022 + Oracle Client e qui sono NON-verificati; i soli progetti *XNET (net8) compilano cross-platform, ma la chiusura delle dipendenze di RequestCenterXNET e RequestCenter.DAL.OracleODPXNET non è compilabile headless (dipendenze verso assembly 4.8 solo-Windows). Verificati su questo host solo docs-site/scripts/{build,serve,validate}.sh e python-oracledb read-only.
  • DB solo TEST38. Ogni impatto DB va verificato in read-only sullo schema REQUESTCENTER_TEST38; non affermare comportamento di PROD non osservato.

Cartografia dei file del verticale

Strato Progetto File chiave
UI (Web Forms) CASSANDRA/RequestCenterWeb UserControls/FlowActions/makeTicket.ascx(.vb); shell Default.aspx; WindowPages/ticketDetailsPage*
BL RequestCenter (Descor.RequestCenter) Classes/Request.vb; DALFactory.vb; Transaction/Transaction.vb; Interfaces/TicketInterfaces.vb
Contratto RequestCenter/Interfaces/TicketInterfaces.vb IRequestDAL (:39)
DAL RequestCenter.DAL.OracleODP RequestDAL.vb (~8433 righe, 246 Function pubbliche)
Motore dati DataManager GlobalDataManager.vb (helper cm)
DB schema REQUESTCENTER_TEST38 package GESTREQUEST, GESTREQUEST_T2

Cross-link permanenti: reference codice RequestDAL · flusso FLOW-REQ-001 · regole BR-REQ · dominio Service Desk · DB REQUESTCENTER_TEST38 (tabelle, procedure) · matrice CRUD · API SOAP/WCF · debito tecnico · guida sorella database-development (in preparazione).


Task 1 — Aggiungere una pagina frontend Web Forms (.ascx in RequestCenterWeb)

Caso d'uso. Introdurre una nuova azione/scheda di ticket nell'interfaccia RequestCenterWeb (es. un nuovo pannello dentro il flusso di apertura o di dettaglio ticket).

Prerequisiti. Comprendere che l'UI è componente-based su .ascx ospitati dentro shell .aspx (Default.aspx / WindowPages/ticketDetailsPage*), non route MVC. Nessun ApiController, nessun MVC. VERIFIED

File coinvolti.

  • CASSANDRA/RequestCenterWeb/UserControls/**/<NuovoControllo>.ascx + .ascx.vb + .designer.vb (generato).
  • La shell che lo ospita (registrazione <%@ Register Src=… %> come in makeTicket.ascx:3-6).

Sequenza di implementazione.

  1. Crea <NuovoControllo>.ascx con direttiva Control Language="vb" … Inherits="Descor.RequestCenterWeb.<NomeClasse>" (modello: makeTicket.ascx:1).
  2. Nel code-behind eredita la classe base appropriata: per un'azione di flusso, CreateUserControlBase (makeTicket.ascx.vb:5, Inherits BaseClasses.CreateUserControlBase); per altri contesti, RequestUserControlBase / MultiActionUserControlBase / AccountingControlBase (Classes/Base/*). SUPPORTED
  3. Registra il control nella shell/host con <%@ Register Src="…" TagName="…" TagPrefix="…" %>.
  4. Aggancia gli handler agli eventi del control base (es. Handles actSubmt.ActivityRun come btnPost_Click a makeTicket.ascx.vb:82).
  5. Per persistere, non aprire connessioni nel control: usa il pattern transazionale del BL (Task 4/5).

Esempio (scheletro).

' <NuovoControllo>.ascx.vb
Partial Public Class NuovoControllo
    Inherits BaseClasses.CreateUserControlBase

    Protected Sub OnRun(sender As Object, e As EventArgs, runcontinue As Boolean) Handles actSubmt.ActivityRun
        errLog.ErrorStrings = Me.DoValidation()          ' validazione UI (Task 6)
        If errLog.ErrorStrings.Count = 0 Then
            Dim objTransaction As New RequestCenter.Transaction
            objTransaction.OpenConnection()
            objTransaction.Begin()
            ' … chiamate al BL Ticket.Request …
            objTransaction.Commit()
        End If
    End Sub
End Class

Test. Nessun test automatico: verifica manuale nella shell RequestCenterWeb su ambiente TEST38; percorri il flusso in FLOW-REQ-001.

Impatto DB. Nullo se il control riusa metodi BL/DAL esistenti; altrimenti vedi Task 3/4.

Impatto sicurezza. Il control eredita il gate d'accesso della pagina ospitante (Page_PreInit delle shell, es. WebDefault.aspx.vb:41, WindowPages/ticketDetailsPageNew.aspx.vb:27). Attenzione TD-008: il gate UI non protegge le operazioni riservate oltre il confine di servizio — vedi Task 7.

Aggiornamenti doc. Aggiungi il control alla reference frontend/Service Desk e, se introduce un passo, aggiorna FLOW-REQ-001.

Checklist di review.

  • [ ] Inherits corretto della base *UserControlBase.
  • [ ] Registrazione <%@ Register %> nella shell.
  • [ ] Nessuna connessione DB aperta nel control (delega al BL/Transaction).
  • [ ] Validazione popolata (errLog.ErrorStrings).
  • [ ] .designer.vb non modificato a mano (è generato).

Errori comuni. Aprire connessioni Oracle nel code-behind (viola il pattern); dimenticare la registrazione del control; editare il .designer.vb.


Task 2 — Aggiungere una voce di menu

Caso d'uso. Esporre la nuova pagina/azione nel menu di navigazione di RequestCenterWeb (famiglia CASSANDRA).

Prerequisiti. La navigazione è guidata dalla shell CASSANDRA; il mapping runtime IIS della virtual directory RequestCenterWeb è tracciato come domanda aperta (OQ-2 in servicedesk). Il meccanismo esatto di registrazione della voce di menu (sitemap vs. control di menu vs. configurazione shell) non è stato confermato su questo host. Classificazione: UNKNOWN (non inventare la posizione).

File coinvolti / sequenza. Individua l'artefatto di navigazione della shell (Default.aspx / DefaultSplitter.aspx e relativi control) e aggiungi la voce accanto alle esistenti; associa la voce alla shell che ospita il control del Task 1. Verifica sul repository la posizione reale prima di procedere:

grep -rin "Requests\|MenuItem\|RadMenu\|sitemap" InfocadWeb/WebMachine/CASSANDRA/RequestCenterWeb

Test. Verifica manuale della visibilità e del routing verso la pagina.

Impatto DB / sicurezza. La sola voce di menu non è un controllo di sicurezza: la visibilità UI non sostituisce l'autorizzazione lato BL/servizio (TD-008, vedi Task 7).

Aggiornamenti doc. Registra la voce in servicedesk; se risolvi OQ-2, aggiorna la domanda aperta.

Checklist / errori comuni. Non affidare l'autorizzazione alla sola presenza/assenza della voce; non assumere un meccanismo di menu non verificato.


Task 3 — Aggiungere una chiamata a stored procedure

Caso d'uso. Il DAL deve invocare un nuovo package/procedura Oracle già esistente sullo schema.

Prerequisiti. La procedura esiste in REQUESTCENTER_TEST38 (verifica in procedure); conosci i parametri e la direzione (IN/OUT).

File coinvolti. RequestCenter.DAL.OracleODP/RequestDAL.vb; motore DataManager/GlobalDataManager.vb.

Sequenza di implementazione. Il pattern osservato in RequestDAL (VERIFIED, es. addRequest:5054, setDescription:5407):

  1. Ottieni l'helper: Dim cm As GlobalDataManager = Configuration.Settings.GetConnectionManager(True).
  2. Costruisci gli OracleParameter con nome, OracleDbType, .Value; per gli output imposta .Direction = ParameterDirection.Output.
  3. openResult = cm.Open.
  4. Invoca per nome qualificato "PACKAGE.PROC":
    • scrittura senza reader: cm.ExecuteNonQuery("GESTREQUEST.ADDDESCRIPTIONTOREQUEST", p1, p2) (RequestDAL.vb:5419);
    • lettura IDataReader: cm.ExecuteReader("PACKAGE.PROC", …);
    • riempimento DataSet: cm.Fill(ds, "PACKAGE.PROC", …). Overload disponibili con singolo DbParameter, ParamArray o DbCommand (GlobalDataManager.vb:214-226,297-317,423-473).
  5. Per un valore OUT numerico, converti in modo tipizzato: DirectCast(newIndexParam.Value, Types.OracleDecimal).ToInt32 (RequestDAL.vb:5081).
  6. In Finally, rilascia con cm.CloseIfNeeded(openResult) (GlobalDataManager.vb:574).

Esempio (dal codice reale, addRequestGESTREQUEST_T2.ADDREQUEST, RequestDAL.vb:5054).

Dim cm As GlobalDataManager = Configuration.Settings.GetConnectionManager(True)
Dim newIndexParam As New OracleParameter("NEWREQUESTINDEX", OracleDbType.Int32)
newIndexParam.Direction = ParameterDirection.Output
Dim openResult As OpenConnectionResult
Try
    openResult = cm.Open
    cm.ExecuteNonQuery("GESTREQUEST_T2.ADDREQUEST", idUserParam, idTenantParam, protocolParam,
                       protocolCodeParam, subCodeParam, protocolLevelParentParam, requestDateParam, newIndexParam)
    Return DirectCast(newIndexParam.Value, Types.OracleDecimal).ToInt32
Finally
    cm.CloseIfNeeded(openResult)
End Try

Test. Nessun test automatico; convalida con InfocadTester e/o lettura read-only su TEST38.

Impatto DB. Aggiungi la nuova coppia procedura→tabelle alla matrice CRUD; verifica i package coinvolti in procedure.

Impatto sicurezza. Le procedure girano con i privilegi dello schema applicativo; non passare input non validato (nessuna concatenazione SQL — i parametri sono bindati, il che mitiga l'iniezione).

Aggiornamenti doc. CRUD matrix + pagina RequestDAL.

Checklist di review.

  • [ ] Nome procedura qualificato PACKAGE.PROC.
  • [ ] OracleDbType corretto per ogni parametro.
  • [ ] OUT con ParameterDirection.Output e conversione tipizzata.
  • [ ] cm.CloseIfNeeded(openResult) nel Finally.

Errori comuni. Dimenticare cm.CloseIfNeeded (leak di connessione); usare CInt(param.Value) su OracleDecimal invece di .ToInt32; nome procedura non qualificato dal package.


Task 4 — Aggiungere un metodo di repository (Function in RequestDAL + membro in IRequestDAL)

Caso d'uso. Esporre al BL una nuova operazione dati (lettura o scrittura).

Prerequisiti. Task 3 (sai come invocare la procedura). Ricorda che il DAL è risolto per reflection (vedi Premesse): il legame BL↔DAL è l'Implements, non una chiamata diretta.

File coinvolti.

  • Contratto: RequestCenter/Interfaces/TicketInterfaces.vb (IRequestDAL a :39).
  • Implementazione: RequestCenter.DAL.OracleODP/RequestDAL.vb.
  • Factory (nessuna modifica per IRequestDAL, già mappato): RequestCenter/DALFactory.vb:55.

Sequenza di implementazione.

  1. Dichiara il membro in IRequestDAL (firma pubblica; convenzione: letture con gemello DataSet + DReader, es. Load/LoadDReader a TicketInterfaces.vb:42-43).
  2. Implementa in RequestDAL una Function … Implements IRequestDAL.<membro> seguendo il pattern del Task 3. Nota: il nome del membro d'interfaccia può differire dal nome della Function — es. Public Function setManagement(…) … Implements IRequestDAL.setManagementData (RequestDAL.vb:5429). Fai combaciare il nome dichiarato in Implements, non necessariamente quello della funzione.
  3. Non toccare DALFactory: GetRequestDAL istanzia per reflection Descor.<DALTypeName>.RequestDAL (DALFactory.vb:55), quindi la nuova Function è automaticamente disponibile una volta compilata la DLL DAL.
  4. Chiama dal BL via DALFactory.GetRequestDAL (Task 5).

Nota net8/XNET. RequestCenter.DAL.OracleODPXNET re-linka i file DAL con <Compile Include=… Link=…> e omette RequestCSDAL.vb e RequestCSReasonDAL.vb. Se aggiungi un nuovo file al DAL (non un metodo in un file già linkato), verifica che il .vbproj XNET lo includa se deve valere anche sotto net8. SUPPORTED

Esempio (contratto + impl).

' TicketInterfaces.vb (dentro IRequestDAL)
Function getFooByRequest(idrequest As Integer) As DataSet

' RequestDAL.vb
Public Function getFooByRequest(idrequest As Integer) As DataSet Implements IRequestDAL.getFooByRequest
    Dim cm As GlobalDataManager = Configuration.Settings.GetConnectionManager(True)
    Dim ds As New DataSet
    Dim p As New OracleParameter("PIDREQUEST", OracleDbType.Int32) With {.Value = idrequest}
    Dim openResult As OpenConnectionResult
    Try
        openResult = cm.Open
        cm.Fill(ds, "GESTREQUEST.GETFOO", p)   ' procedura reale da verificare su TEST38
        Return ds
    Finally
        cm.CloseIfNeeded(openResult)
    End Try
End Function

Test. Nessun test automatico; InfocadTester + lettura TEST38.

Impatto DB. Come Task 3 (nuova voce CRUD se tocca procedure/tabelle nuove).

Impatto sicurezza. Un metodo DAL non applica autorizzazione: il controllo va nel BL/servizio (Task 7, TD-008).

Aggiornamenti doc. RequestDAL

Checklist di review.

  • [ ] Membro presente sia in IRequestDAL sia in RequestDAL con Implements combaciante.
  • [ ] Pattern cm.Open / CloseIfNeeded rispettato.
  • [ ] Copertura XNET valutata (file nuovo vs. metodo in file linkato).
  • [ ] Nessun claim di "metodo inutilizzato" basato su assenza di chiamanti statici.

Errori comuni. Aggiungere la Function in RequestDAL senza dichiararla in IRequestDAL (il BL non la vede via interfaccia); disallineare il nome in Implements; assumere che manchi il wiring nel DALFactory (non serve).


Task 5 — Aggiungere un campo end-to-end (UI → BL Ticket.Request → DAL → proc → tabella)

Caso d'uso. Un nuovo attributo del ticket deve essere raccolto in UI, propagato al BL, persistito via procedura e memorizzato in tabella.

Prerequisiti. Task 1, 3, 4. Comprendere il flusso reale osservato in makeTicket.ascx.vb:82RequestCenter.Ticket.Request.CreateIRequestDAL.addRequestGESTREQUEST(_T2).

File coinvolti (in ordine di propagazione).

  1. UI: makeTicket.ascx(.vb) (o il control del Task 1).
  2. BL: RequestCenter/Classes/Request.vb (metodo Set* che delega al DAL — es. SetSpatialInfo:2946, SetManagement:3782 come info nested, e i Set… a Request.vb:~2325-2596).
  3. Contratto+DAL: IRequestDAL + RequestDAL (Task 4).
  4. DB: procedura del package GESTREQUEST(_T2) + colonna/tabella su REQUESTCENTER_TEST38.

Sequenza di implementazione.

  1. DB prima: aggiungi colonna e adegua/crea la procedura (attività DBA, fuori dal portale; qui solo read-only). Verifica in tabelle.
  2. DAL: aggiungi/estendi il metodo (Task 4) con il nuovo OracleParameter.
  3. BL: aggiungi il campo/proprietà a Request e un metodo Set… che invochi il DAL via DALFactory.GetRequestDAL (pattern in Request.vb, es. SetSpatialInfo che chiama dal.setSpatialInfo, Request.vb:~2237).
  4. UI: raccogli il valore nel control e chiamalo dopo Request.Create, entro la transazione (objTransaction.OpenConnection/Begin … Commit, come in makeTicket.ascx.vb:108-113).

Esempio (traccia reale della creazione).

' makeTicket.ascx.vb:82 (estratto)
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 = New Ticket.Request(…, idRequest, …)
_objRequest.SetSpatialInfo(…)        ' <-- qui aggiungi la Set del nuovo campo
' … objTransaction.Commit()

Test. Nessun test automatico; percorri manualmente FLOW-REQ-001 end-to-end e verifica la scrittura in TEST38.

Impatto DB. Nuova colonna + procedura → aggiorna tabelle, procedure e matrice CRUD.

Impatto sicurezza. Se il campo governa un'operazione riservata, applica il controllo lato BL (Task 7, TD-008), non solo in UI.

Aggiornamenti doc. Le 4 sezioni della cartografia + FLOW-REQ-001

Checklist di review.

  • [ ] Propagazione completa nei 4 strati (nessun anello mancante).
  • [ ] Scrittura DAL entro la transazione aperta dall'UI.
  • [ ] Parametro DB con OracleDbType corretto.
  • [ ] Doc DB + flusso aggiornati.

Errori comuni. Persistere fuori dalla transazione; aggiungere la proprietà al BL ma dimenticare la Set…/il parametro DAL; scrivere SQL inline invece di estendere la procedura.


Task 6 — Aggiungere validazione

Caso d'uso. Rifiutare input non validi prima della persistenza.

Prerequisiti. Sapere dove il flusso raccoglie l'errore. Il pattern UI osservato usa errLog.ErrorStrings = Me.DoValidation() + ValidateUpload(…) e procede solo se errLog.ErrorStrings.Count = 0 (makeTicket.ascx.vb:83-86). VERIFIED

File coinvolti. Control UI (*.ascx.vb) per la validazione di presentazione; BL Request.vb per le invarianti di dominio.

Sequenza di implementazione.

  1. UI: estendi DoValidation() del control (o aggiungi validator) così che popoli errLog.ErrorStrings per l'input mancante/errato.
  2. BL (raccomandato): replica l'invariante nel BL prima della chiamata DAL, perché la validazione UI non protegge i chiamanti server/WCF (stessa logica di TD-008 per l'autorizzazione).
  3. Consulta le regole formalizzate in BR-REQ per non contraddire una regola esistente.

Esempio.

errLog.ErrorStrings = Me.DoValidation()
ValidateUpload(uplFilesPanel, errLog)
If errLog.ErrorStrings.Count = 0 Then
    ' … procedi alla transazione …
End If

Test. Verifica manuale con input validi/non validi (non c'è suite automatica).

Impatto DB / sicurezza. La validazione UI è aggirabile fuori dall'UI: duplica le invarianti critiche nel BL. INFERRED (allineamento con TD-008).

Aggiornamenti doc. Se introduce/rafforza una regola, aggiorna BR-REQ (vedi Task 8).

Checklist / errori comuni. Validare solo in UI per regole di dominio; non allineare i messaggi alle risorse (GetGlobalResourceObject("RequestCenterDictionary", …), makeTicket.ascx.vb:10).


Task 7 — Aggiungere autorizzazione (⚠️ TD-008)

Caso d'uso. Rendere un'operazione eseguibile solo da utenti/ruoli abilitati.

Prerequisiti. L'autenticazione è ASP.NET Oracle Membership/Role (schema ASPNET); i gate di pagina sono nei Page_PreInit delle shell (WebDefault.aspx.vb:41, WindowPages/ticketDetailsPageNew.aspx.vb:27).

⚠️ TD-008 (sistemico, 9 domini). I grant applicati solo in UI non vengono ri-verificati oltre il confine .NET Remoting/WCF: un chiamante server-side/di integrazione può bypassare l'autorizzazione. Vedi debito tecnico → TD-008.

File coinvolti. Control/shell UI (gate di presentazione) e BL Request.vb / servizio (gate effettivo); equivalenti WCF del verticale: RequestsReaderWCF.svc, RequestsCacheService.svc, ExtraFlowActionsProxy.svc (API).

Sequenza di implementazione.

  1. Applica il controllo UI (visibilità/gate di pagina) per l'esperienza utente.
  2. Applica lo STESSO controllo lato BL/servizio (prima della chiamata DAL o nel metodo di servizio), perché è l'unico punto attraversato anche dai chiamanti WCF/Remoting/integrazione. Non fidarti del solo gate UI.
  3. Verifica i ruoli via i provider Oracle (Membership/Role), coerentemente con il resto del prodotto.

Test. Manuale: prova l'operazione (a) via UI senza permesso, (b) simulando la chiamata di servizio; non esiste suite automatica.

Impatto DB / sicurezza. È il task a più alto rischio: un gate solo-UI equivale ad assenza di autorizzazione per i canali di servizio.

Aggiornamenti doc. Registra la regola in BR-REQ e, se scopri un nuovo caso di gate bypassabile, aggiorna TD-008.

Checklist di review.

  • [ ] Controllo presente anche lato BL/servizio, non solo UI (TD-008).
  • [ ] Ruoli verificati contro i provider Oracle.
  • [ ] Percorso WCF (*.svc) coperto dallo stesso controllo.

Errori comuni. Fermarsi al gate Page_PreInit/visibilità di menu (Task 2); assumere che i client WCF riusino il gate UI.


Task 8 — Modificare una regola di business esistente (BR-REQ)

Caso d'uso. Cambiare il comportamento di una regola già documentata del verticale.

Prerequisiti. Identifica la regola in BR-REQ e i suoi punti di enforcement (UI/BL/procedura). Verifica l'impatto sul flusso in FLOW-REQ-001.

File coinvolti / sequenza.

  1. Trova tutti i punti di applicazione della regola (UI + BL Request.vb + eventuale procedura). Usa la matrice CRUD per i chiamanti DB.
  2. Modifica in modo coerente su tutti i punti (una regola applicata in più strati va aggiornata ovunque).
  3. Aggiorna la scheda BR-REQ con la nuova formulazione e la classificazione dell'evidenza.

Esempio. Cambiare l'obbligatorietà del selettore utente in apertura ticket è governato in UI da UserSelector1.IsRequired = True sotto la condizione Not …Configuration.Settings.HeavyLoadMode (makeTicket.ascx.vb:20-21): una modifica va riflessa anche nella regola BR e, se serve, nel BL.

Test. Manuale; percorri il flusso interessato end-to-end.

Impatto DB / sicurezza. Dipende dalla regola; se tocca autorizzazione, applica il Task 7.

Aggiornamenti doc. BR-REQ obbligatorio; FLOW-REQ-001 se cambia il flusso.

Checklist / errori comuni. Aggiornare un solo punto di enforcement lasciandone altri incoerenti; non aggiornare la scheda BR (perdita di tracciabilità).


Task 9 — Tracciare l'impatto di una modifica di colonna DB (reverse via CRUD / pagine DB)

Caso d'uso. Prima di alterare/rinominare/rimuovere una colonna o tabella, individuare tutto il codice che ne dipende.

Prerequisiti. Accesso read-only a REQUESTCENTER_TEST38 (python-oracledb, verificato su questo host) e alla reference generata del portale.

Sequenza di analisi (reverse).

  1. Parti dalla pagina per-tabella: i reverse-link elencano procedure/chiamanti noti.
  2. Nella matrice CRUD individua le procedure che leggono/scrivono la tabella e i chiamanti DAL (es. quali Function di RequestDAL invocano quel package).
  3. Risali dal DAL al BL: cerca chi chiama la Function DAL via DALFactory.GetRequestDAL e i metodi Set… di Request.vb.
  4. Risali dal BL all'UI (control in RequestCenterWeb).
  5. Considera i consumatori WCF (RequestsReaderWCF.svc, ecc., API) e i progetti cliente-specifici (TicketLoader<Customer>, ServiceJob.<Customer>).

Comando di supporto (grep testuale, complementare alla CRUD).

grep -rin "<NOME_COLONNA>\|GESTREQUEST" InfocadWeb/WebMachine/RequestCenter.DAL.OracleODP

Test. Analisi statica + verifica read-only su TEST38; nessuna suite automatica.

Impatto DB / sicurezza. Alto rischio di rottura silenziosa: i binding DAL sono per nome di parametro/procedura e la risoluzione DAL è per reflection — un simbolo senza chiamanti statici non è necessariamente morto (§30 / punto 6).

Aggiornamenti doc. Aggiorna le pagine tabelle / procedure e la matrice CRUD dopo la modifica.

Checklist di review.

  • [ ] Tutti i chiamanti (procedura → DAL → BL → UI → WCF → cliente) enumerati.
  • [ ] Nessun claim di "colonna inutilizzata" basato solo sull'assenza di riferimenti statici.
  • [ ] Doc DB + CRUD aggiornati.

Errori comuni. Fermarsi ai chiamanti diretti del BL ignorando reflection/WCF/progetti cliente; dimenticare i package GESTREQUEST_T2.


Vedi anche

Evidenze

  • Flusso UI di creazione ticket: InfocadWeb/WebMachine/CASSANDRA/RequestCenterWeb/UserControls/FlowActions/makeTicket.ascx.vb:82 (btnPost_Click … Handles actSubmt.ActivityRun), :83-86 (validazione DoValidation/ValidateUpload), :108-113 (New RequestCenter.TransactionOpenConnection/BeginRequest.Create), :20-21 (UserSelector1.IsRequired/HeavyLoadMode), :10 (risorse RequestCenterDictionary); direttiva makeTicket.ascx:1 (Inherits="Descor.RequestCenterWeb.makeTicket"), :3-6 (<%@ Register %>), makeTicket.ascx.vb:5 (Inherits BaseClasses.CreateUserControlBase). VERIFIED
  • BL Ticket.Request: InfocadWeb/WebMachine/RequestCenter/Classes/Request.vb:26 (Public Class Request), :2222/:2227 (Shared Function Createdal.addRequest), :2233-2261 (SetProtocol/SetSpatialInfo/ SetTenant delegano a DALFactory.GetRequestDAL). VERIFIED
  • Contratto IRequestDAL: InfocadWeb/WebMachine/RequestCenter/Interfaces/TicketInterfaces.vb:39 (Public Interface IRequestDAL Inherits IBaseDAL), :42-43 (Load/LoadDReader, pattern DataSet+DReader). VERIFIED
  • DAL RequestDAL: InfocadWeb/WebMachine/RequestCenter.DAL.OracleODP/RequestDAL.vb:5054 (addRequest … Implements IRequestDAL.addRequestcm.ExecuteNonQuery("GESTREQUEST_T2.ADDREQUEST", …), OUT NEWREQUESTINDEX, ritorno DirectCast(...OracleDecimal).ToInt32 :5081), :5089 (overload → GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL), :5407-5419 (setDescriptionGESTREQUEST.ADDDESCRIPTIONTOREQUEST), :5429 (setManagement … Implements IRequestDAL.setManagementData — nome membro ≠ nome funzione). Pattern cm.Open/CloseIfNeeded in ogni metodo. VERIFIED
  • Motore dati cm: InfocadWeb/WebMachine/DataManager/GlobalDataManager.vb:104 (Open), :214-226 (ExecuteNonQuery overload), :297-317 (ExecuteReader), :423-473 (Fill), :574 (CloseIfNeeded). VERIFIED
  • Wiring DAL per reflection: InfocadWeb/WebMachine/RequestCenter/DALFactory.vb:24-30 (Reflection.Assembly.Load di DALTypeName, suffisso XNET sotto #If NET5_0_OR_GREATER), :36-41 (Activator.CreateInstance del tipo risolto), :55-57 (GetRequestDAL). VERIFIED
  • Pattern transazionale: InfocadWeb/WebMachine/RequestCenter/Transaction/Transaction.vb:3-30 (Class Transaction con Begin/Commit/Rollback/OpenConnection/CloseConnection che delegano a DALFactory.GetTransactionDAL). VERIFIED
  • Gate di pagina (autorizzazione UI): InfocadWeb/WebMachine/CASSANDRA/RequestCenterWeb/WebDefault.aspx.vb:41, WindowPages/ticketDetailsPageNew.aspx.vb:27, DefaultSplitter.aspx.vb:77 (Page_PreInit). SUPPORTED
  • TD-008 (autorizzazione oltre WCF/Remoting): docs/14-technical-debt/index.md:59, docs/14-technical-debt/reperti-prioritari.md:12. SUPPORTED
  • Copertura XNET DAL (omissioni): vincolo di RequestCenter.DAL.OracleODPXNET (re-link di 36 file, omette RequestCSDAL.vb/RequestCSReasonDAL.vb) da specifica di incarico; non ri-verificato headless per chiusura dipendenze. SUPPORTED
  • Metadati di progetto: RequestCenter.DAL.OracleODP/RequestDAL.vb ~8433 righe / 246 Function pubbliche; package GESTREQUEST (~41 rif) e GESTREQUEST_T2 (~9) da specifica di incarico. INFERRED (conteggi non ricontati su questo host).
  • Meccanismo esatto voce di menu (Task 2): non confermato sul repository su questo host; OQ-2 in docs/06-functional-domains/servicedesk.md:52. UNKNOWN
  • Comandi msbuild/nuget: NON-verificati su questo host (macOS, no Oracle Client). Verificati: docs-site/scripts/{build,serve,validate}.sh, python-oracledb read-only.