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) diDataManager:cm.ExecuteNonQuery/ExecuteReader/Fill("PACKAGE.PROC", OracleParameter…). - Il DAL è caricato per reflection.
DALFactory.GetRequestDALrisolve l'implementazione a runtime (Reflection.Assembly.LoaddiConfiguration.Settings.DALTypeName, con suffissoXNETsotto net8) e faActivator.CreateInstancedel tipoDescor.<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/nugetgirano 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 diRequestCenterXNETeRequestCenter.DAL.OracleODPXNETnon è compilabile headless (dipendenze verso assembly 4.8 solo-Windows). Verificati su questo host solodocs-site/scripts/{build,serve,validate}.shepython-oracledbread-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 inmakeTicket.ascx:3-6).
Sequenza di implementazione.
- Crea
<NuovoControllo>.ascxcon direttivaControl Language="vb" … Inherits="Descor.RequestCenterWeb.<NomeClasse>"(modello:makeTicket.ascx:1). - 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 - Registra il control nella shell/host con
<%@ Register Src="…" TagName="…" TagPrefix="…" %>. - Aggancia gli handler agli eventi del control base (es.
Handles actSubmt.ActivityRuncomebtnPost_ClickamakeTicket.ascx.vb:82). - 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.
- [ ]
Inheritscorretto della base*UserControlBase. - [ ] Registrazione
<%@ Register %>nella shell. - [ ] Nessuna connessione DB aperta nel control (delega al BL/
Transaction). - [ ] Validazione popolata (
errLog.ErrorStrings). - [ ]
.designer.vbnon 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):
- Ottieni l'helper:
Dim cm As GlobalDataManager = Configuration.Settings.GetConnectionManager(True). - Costruisci gli
OracleParametercon nome,OracleDbType,.Value; per gli output imposta.Direction = ParameterDirection.Output. openResult = cm.Open.- 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 singoloDbParameter,ParamArrayoDbCommand(GlobalDataManager.vb:214-226,297-317,423-473).
- scrittura senza reader:
- Per un valore
OUTnumerico, converti in modo tipizzato:DirectCast(newIndexParam.Value, Types.OracleDecimal).ToInt32(RequestDAL.vb:5081). - In
Finally, rilascia concm.CloseIfNeeded(openResult)(GlobalDataManager.vb:574).
Esempio (dal codice reale, addRequest → GESTREQUEST_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. - [ ]
OracleDbTypecorretto per ogni parametro. - [ ]
OUTconParameterDirection.Outpute conversione tipizzata. - [ ]
cm.CloseIfNeeded(openResult)nelFinally.
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(IRequestDALa:39). - Implementazione:
RequestCenter.DAL.OracleODP/RequestDAL.vb. - Factory (nessuna modifica per
IRequestDAL, già mappato):RequestCenter/DALFactory.vb:55.
Sequenza di implementazione.
- Dichiara il membro in
IRequestDAL(firma pubblica; convenzione: letture con gemelloDataSet+DReader, es.Load/LoadDReaderaTicketInterfaces.vb:42-43). - Implementa in
RequestDALunaFunction … Implements IRequestDAL.<membro>seguendo il pattern del Task 3. Nota: il nome del membro d'interfaccia può differire dal nome dellaFunction— es.Public Function setManagement(…) … Implements IRequestDAL.setManagementData(RequestDAL.vb:5429). Fai combaciare il nome dichiarato inImplements, non necessariamente quello della funzione. - Non toccare
DALFactory:GetRequestDAListanzia per reflectionDescor.<DALTypeName>.RequestDAL(DALFactory.vb:55), quindi la nuovaFunctionè automaticamente disponibile una volta compilata la DLL DAL. - 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
IRequestDALsia inRequestDALconImplementscombaciante. - [ ] Pattern
cm.Open/CloseIfNeededrispettato. - [ ] 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:82 →
RequestCenter.Ticket.Request.Create → IRequestDAL.addRequest → GESTREQUEST(_T2).
File coinvolti (in ordine di propagazione).
- UI:
makeTicket.ascx(.vb)(o il control del Task 1). - BL:
RequestCenter/Classes/Request.vb(metodoSet*che delega al DAL — es.SetSpatialInfo:2946,SetManagement:3782come info nested, e iSet…aRequest.vb:~2325-2596). - Contratto+DAL:
IRequestDAL+RequestDAL(Task 4). - DB: procedura del package
GESTREQUEST(_T2)+ colonna/tabella suREQUESTCENTER_TEST38.
Sequenza di implementazione.
- DB prima: aggiungi colonna e adegua/crea la procedura (attività DBA, fuori dal portale; qui solo read-only). Verifica in tabelle.
- DAL: aggiungi/estendi il metodo (Task 4) con il nuovo
OracleParameter. - BL: aggiungi il campo/proprietà a
Requeste un metodoSet…che invochi il DAL viaDALFactory.GetRequestDAL(pattern inRequest.vb, es.SetSpatialInfoche chiamadal.setSpatialInfo,Request.vb:~2237). - UI: raccogli il valore nel control e chiamalo dopo
Request.Create, entro la transazione (objTransaction.OpenConnection/Begin … Commit, come inmakeTicket.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
- eventuale BR-REQ.
Checklist di review.
- [ ] Propagazione completa nei 4 strati (nessun anello mancante).
- [ ] Scrittura DAL entro la transazione aperta dall'UI.
- [ ] Parametro DB con
OracleDbTypecorretto. - [ ] 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.
- UI: estendi
DoValidation()del control (o aggiungi validator) così che popolierrLog.ErrorStringsper l'input mancante/errato. - 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).
- 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.
- Applica il controllo UI (visibilità/gate di pagina) per l'esperienza utente.
- 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.
- 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.
- Trova tutti i punti di applicazione della regola (UI + BL
Request.vb+ eventuale procedura). Usa la matrice CRUD per i chiamanti DB. - Modifica in modo coerente su tutti i punti (una regola applicata in più strati va aggiornata ovunque).
- 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).
- Parti dalla pagina per-tabella: i reverse-link elencano procedure/chiamanti noti.
- Nella matrice CRUD individua le procedure che leggono/scrivono
la tabella e i chiamanti DAL (es. quali
FunctiondiRequestDALinvocano quel package). - Risali dal DAL al BL: cerca chi chiama la
FunctionDAL viaDALFactory.GetRequestDALe i metodiSet…diRequest.vb. - Risali dal BL all'UI (control in
RequestCenterWeb). - 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
- Guide per sviluppatori (panoramica) · Onboarding
- database-development (in preparazione)
- Reference codice:
RequestDAL·Transaction· indice RequestCenter - FLOW-REQ-001 · BR-REQ · Service Desk
- DB
REQUESTCENTER_TEST38· matrice CRUD · API · Debito tecnico (TD-008)
Evidenze
- Flusso UI di creazione ticket:
InfocadWeb/WebMachine/CASSANDRA/RequestCenterWeb/UserControls/FlowActions/makeTicket.ascx.vb:82(btnPost_Click … Handles actSubmt.ActivityRun),:83-86(validazioneDoValidation/ValidateUpload),:108-113(New RequestCenter.Transaction→OpenConnection/Begin→Request.Create),:20-21(UserSelector1.IsRequired/HeavyLoadMode),:10(risorseRequestCenterDictionary); direttivamakeTicket.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 Create→dal.addRequest),:2233-2261(SetProtocol/SetSpatialInfo/SetTenantdelegano aDALFactory.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.addRequest→cm.ExecuteNonQuery("GESTREQUEST_T2.ADDREQUEST", …), OUTNEWREQUESTINDEX, ritornoDirectCast(...OracleDecimal).ToInt32:5081),:5089(overload →GESTREQUEST.ADDREQUESTWITHOUTPROTOCOL),:5407-5419(setDescription→GESTREQUEST.ADDDESCRIPTIONTOREQUEST),:5429(setManagement … Implements IRequestDAL.setManagementData— nome membro ≠ nome funzione). Patterncm.Open/CloseIfNeededin ogni metodo.VERIFIED - Motore dati
cm:InfocadWeb/WebMachine/DataManager/GlobalDataManager.vb:104(Open),:214-226(ExecuteNonQueryoverload),:297-317(ExecuteReader),:423-473(Fill),:574(CloseIfNeeded).VERIFIED - Wiring DAL per reflection:
InfocadWeb/WebMachine/RequestCenter/DALFactory.vb:24-30(Reflection.Assembly.LoaddiDALTypeName, suffissoXNETsotto#If NET5_0_OR_GREATER),:36-41(Activator.CreateInstancedel tipo risolto),:55-57(GetRequestDAL).VERIFIED - Pattern transazionale:
InfocadWeb/WebMachine/RequestCenter/Transaction/Transaction.vb:3-30(Class TransactionconBegin/Commit/Rollback/OpenConnection/CloseConnectionche delegano aDALFactory.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, ometteRequestCSDAL.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 / 246Functionpubbliche; packageGESTREQUEST(~41 rif) eGESTREQUEST_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-verificatisu questo host (macOS, no Oracle Client). Verificati:docs-site/scripts/{build,serve,validate}.sh,python-oracledbread-only.