FLOW-QC-001 — Registrazione esito di un controllo qualità (DoCheck) — QualityCheck
Flusso end-to-end di registrazione dell'esito di un controllo di qualità (esecuzione di un check: salvataggio delle risposte alle domande del survey e chiusura del controllo con data/utente di esecuzione). Path pilota: servizio WCF
QualityCheckReaderWCF.DoCheck(compilazione di un controllo dall'app mobile / MobileCenter). Backend OracleINFOCAD_TEST38, accesso via stored procedure ODP.NETQCK_DOCHECK(nessun ORM). L'esito è persistito nelle tabelleQCHECK_CHECK_DETAILS(risposte) eQCHECK_CHECK(header del controllo).
- Flow ID: FLOW-QC-001
- Repository: InfocadWeb (WCF
QualityCheckReaderWCF.svc, VB.NET) + InfocadServer (QualityCheckControllers/QualityCheckDAL, C#) + OracleINFOCAD_TEST38 - Confidence complessiva: VERIFIED (catena UI/service → WCF → controller → DAL → stored procedure → tabelle, confermata su codice E su sorgente DB
user_source/user_dependencies/user_tab_columns)
Obiettivo di business
Consentire a un operatore/ispettore della qualità di compilare ed eseguire un controllo (check):
per ogni domanda del survey associato viene registrata la risposta (RESPONSEVALUE) sui dettagli del
controllo, e il controllo viene chiuso stampando data e utente di esecuzione
(EXECUTIONDATE/EXECUTIONUSER). Al termine il check risulta "eseguito" e i suoi dettagli riportano
le risposte fornite; se il controllo è agganciato a uno SCHEDULE/ODL di manutenzione, il contatore
dei controlli aperti dell'ODL viene decrementato (via trigger).
Attori
- Ispettore/operatore qualità (utente autenticato con grant azione
22540"esegui controllo" o SuperAdmin) — path interattivo mobile/desktop. - App mobile / MobileCenter — client del contratto WCF
IQualityCheckReaderWCF(DoCheck), autenticazione tramiteloginkey. - Operatore su scheda web (path alternativo) — UserControl
CheckSurveyControl.ascxdel QualityCheckCenter web (bottone "Eseguito"). - Oracle
INFOCAD_TEST38(hub qualità; procedureQCK_DOCHECK/QCK_SAVERESPONSES).
Trigger
Invocazione dell'operazione WCF DoCheck(loginkey, idCheck, idsDetail, responses)
(QualityCheckReaderWCF.svc.vb:254) da parte del client mobile al momento del salvataggio/esecuzione
del controllo. Path alternativo web: click sul pulsante Eseguito della scheda controllo →
btnExecuted_Click (CheckSurveyControl.ascx.vb:999).
Frontend / service entry point
- Servizio WCF:
CommonWeb/QualityCheckCenter/WebServices/QualityCheckReaderWCF.svc(.vb), contrattoIQualityCheckReaderWCF(IQualityCheckReaderWCF.vb:26), operazioneDoCheck(QualityCheckReaderWCF.svc.vb:254). - Scheda web (path alternativo):
CommonWeb/QualityCheckCenter/UserControls/CheckSurveyControl.ascx(.vb)(bottonibtnExecuted/btnSave/btnReset), ospitata nel QualityCheckCenter (QualityCheck.aspx). - Gate di accesso: WCF →
ValidateLoginKey(loginkey)(:257); web → grant azioneHasUserGrant("22540")oSuperAdminper abilitare il bottone di salvataggio (CheckSurveyControl.ascx.vb:244,279).
Sequenza principale (main sequence)
- L'ispettore compila le risposte del survey e conferma l'esecuzione del controllo; il client mobile
invoca
QualityCheckReaderWCF.DoCheck(loginkey, idCheck, idsDetail, responses)(:254). - Il servizio valida la sessione con
ValidateLoginKey(loginkey)(:257); se non valida →setAsAccessDenied()(:278). - Ricarica lo stato corrente del check con
ctrl.GetCheckByID(idCheck)(:259) e applica i guardie di stato (:260-265):- se
Suspenddatevalorizzata → errore "controllo sospeso" (:261); - se
ExecutionDatevalorizzata → errore "controllo già chiuso" (:263); - se
CancelDatevalorizzata →setAsNoDataFound()(:265).
- se
- Altrimenti invoca
ctrl.DoCheck(UserName, idCheck, idsDetail, responses)(:267). QualityCheckController.DoCheck(QualityCheckController.cs:264) inoltra al DAO/DAL:((IQualityCheck)this.DAO).DoCheck(username, idCheck, idDetails, resValues)(:266).QualityCheck_DAL.DoCheck(QualityCheck_DAL.cs:1397) prepara i parametri Oracle (PUSERNAME,PIDCHECK,PIDDETAILSarray associativo Int32,PRESPONSEVALUESarray associativo Varchar2,POUTOUT) (:1407-1425) e chiamadl.ExecuteNonQueryStoredProcedure("QCK_DOCHECK")(:1428); restituiscePOUT(:1430).- Oracle
QCK_DOCHECK(INFOCAD_TEST38):- chiama
QCK_SAVERESPONSES(PIDDETAILS, PRESPONSEVALUES, PIDCHECK, POUT)(src:12), che itera sugli array e per ogni dettaglio esegueUPDATE QCHECK_CHECK_DETAILS SET RESPONSEVALUE = ... WHERE IDDETAILS = ... AND CHECKID = PIDCHECK(QCK_SAVERESPONSES src:16-19), accumulando le righe aggiornate inPOUT(src:21,25); - esegue
UPDATE QCHECK_CHECK SET EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME WHERE IDCHECK = PIDCHECK(QCK_DOCHECK src:14-16) — chiusura del controllo.
- chiama
- Effetto trigger: l'
UPDATEsuQCHECK_CHECKattivaQCHECK_CHECK_SCHEDULE(INSERT OR UPDATE); se il check è legato a un'entitàSCHEDULEeEXECUTIONDATEpassa da NULL a valorizzata, il trigger esegueUPDATE MAINT_ODL SET COUNT_QCHECKS = COUNT_QCHECKS - 1 WHERE ID_ODL = ENTITYID. - Il DAL legge
POUT(righe risposte aggiornate) e lo propaga fino al WCF, che interpretanrow <> 0come successo (setAsOK,:268-270), altrimenti errore generico (:272).
API / service
- Path interattivo/mobile: WCF
QualityCheckReaderWCF.svc(IQualityCheckReaderWCF):DoCheck(loginkey, idCheck, idsDetail, responses)→MobileResult(Of Integer)(svc.vb:254).- operazioni correlate stesso servizio:
StartCheck(:284),GetChecks*,GetAttachments*.
- Path web: nessun servizio SOAP — postback ASP.NET Web Forms sulla scheda
CheckSurveyControl.ascx→ controller in-processQualityCheckController.SaveResponses+UpdateCheck.
Backend
- Service/Code-behind:
QualityCheckReaderWCF.svc.vb(WCF),CheckSurveyControl.ascx.vb(web). - Controller server:
Descor.QualityCheck.QualityCheckControllers.QualityCheckController(InfocadServer/QualityCheckControllers/QualityCheckController.cs), inoltra al DAO via((IQualityCheck)this.DAO). - Interfaccia DAO:
IQualityCheck(InfocadServer/QualityCheckInterface/IQualityCheck.cs:105). - DAL:
QualityCheck_DAL(InfocadServer/QualityCheckDAL/OracleODP/QualityCheck_DAL.cs), metodoDoCheck(:1397). - Pattern DAL:
DataLayer dl = new DataLayer(ConnectionName)→dl.Parameters.Add(OracleParameter...)con array PL/SQL associativi (OracleCollectionType.PLSQLAssociativeArray) →dl.ExecuteNonQueryStoredProcedure("QCK_DOCHECK"); ritorno via parametro OUTPOUT(Int32);dl.Kill()nelfinally.
Query / stored procedure
| Passo | Stored procedure (Oracle) | Chiamata da (DAL) |
|---|---|---|
| Registrazione esito (risposte + chiusura check) | INFOCAD_TEST38.QCK_DOCHECK (OUT POUT) |
QualityCheck_DAL.cs:1428 |
| Salvataggio risposte sui dettagli (interna a DoCheck) | INFOCAD_TEST38.QCK_SAVERESPONSES |
QCK_DOCHECK src:12 · anche diretta QualityCheck_DAL.cs:3036 |
| Aggiornamento header check (path web) | INFOCAD_TEST38.QCK_UPDATECHECK |
QualityCheck_DAL.cs:1600 |
| Lettura stato check per guardie (READ-ONLY) | INFOCAD_TEST38.QCK_GETCHECK* (GetCheckByID) |
QualityCheckReaderWCF.svc.vb:259 |
Tabelle lette (read)
INFOCAD_TEST38:QCHECK_CHECK(guardie di stato lato WCF viaGetCheckByID:Suspenddate,ExecutionDate,CancelDate), letta anche implicitamente nelleWHEREdegliUPDATE.- Nel trigger
QCHECK_CHECK_SCHEDULE: lettura di:OLD/:NEW(ENTITYTABLE,ENTITYID,PLANNEDDATE,EXECUTIONDATE) della rigaQCHECK_CHECK.
(da user_dependencies di QCK_DOCHECK e QCK_SAVERESPONSES e da user_tab_columns)
Tabelle modificate (write)
INFOCAD_TEST38:QCHECK_CHECK_DETAILS(RW —UPDATE RESPONSEVALUEper ogni dettaglio; VERIFIED su sorgenteQCK_SAVERESPONSESe suuser_tab_columns),QCHECK_CHECK(RW —UPDATE EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME WHERE IDCHECK; VERIFIED su sorgenteQCK_DOCHECKe suuser_dependencies).- Effetto indiretto (trigger
QCHECK_CHECK_SCHEDULE):MAINT_ODL(RW —UPDATE COUNT_QCHECKS = COUNT_QCHECKS - 1quandoEXECUTIONDATEpassa da NULL a valorizzata su un check di tipoSCHEDULE).
Validazione
- Lato WCF:
ValidateLoginKey(loginkey)(sessione,:257); guardie di stato del check (Suspenddate/ExecutionDate/CancelDate,:260-265) che impediscono la ri-esecuzione di un controllo sospeso/chiuso/annullato. - Lato web: abilitazione del salvataggio solo con grant azione
22540oSuperAdmin(CheckSurveyControl.ascx.vb:244,279), eCheckAllWithAnswer()che pretende una risposta per ogni domanda prima diExecutedSurvey(:1001,1073). - Lato DB:
QCK_SAVERESPONSESaggiorna solo i dettagli il cuiIDDETAILSè nell'array E il cuiCHECKID = PIDCHECK(isolamento per check);POUT= numero di righe effettivamente aggiornate.
Side effects
- Stamping di esecuzione:
EXECUTIONDATE = SYSDATE,EXECUTIONUSER = PUSERNAMEsuQCHECK_CHECK. - Decremento del contatore controlli aperti dell'ODL di manutenzione (
MAINT_ODL.COUNT_QCHECKS) via triggerQCHECK_CHECK_SCHEDULEper i check agganciati a unoSCHEDULE. - Logging eccezioni DAL:
Descor.Infrastructure.LogManager.ExceptionLogger.LogException(QualityCheck_DAL.cs:1436). - Nota transazionalità: la versione
INFOCAD_TEST38diQCK_DOCHECKnon contieneCOMMITesplicito (il commit dipende dalla gestione delDataLayer); vedi Open questions.
Percorsi alternativi / di errore
- Path web (scheda
CheckSurveyControl.ascx):btnExecuted_Click(:999) →ExecutedSurvey(:1201) →SaveUserResponses(:1283) →qcheckCtrl.SaveResponses(iddetails, respvalues, idCheck)(:1291, → DALSaveResponses:3009→QCK_SAVERESPONSES:3036), quindi impostaExecutionDate/ExecutionUser/Igce chiamaqcheckCtrl.UpdateCheck(CurrentCheck, False)(:1211, → DALUpdateCheck:1536→QCK_UPDATECHECK:1600). Stessa semantica diQCK_DOCHECKma su due stored procedure distinte, con l'IGC calcolato lato UI. - Annullamento/reset controllo (web):
btnReset_Click(:1015) →CancelSurvey(:1255) →SaveResponses+UpdateCheckconCancelDatevalorizzata. - Errori WCF: sessione non valida →
setAsAccessDenied(:278); check sospeso/chiuso/annullato →setAsERROR/setAsNoDataFound(:261-265);nrow = 0(nessuna risposta aggiornata) →setAsERRORgenerico (:272). - Eccezione DB: catturata in
QualityCheck_DAL.DoCheck(:1434-1438), loggata e rilanciata.
Diagramma di sequenza
sequenceDiagram
actor Op as Ispettore Qualità
participant Cli as App mobile / MobileCenter
participant WCF as QualityCheckReaderWCF.DoCheck
participant Ctrl as QualityCheckController.DoCheck
participant DAL as QualityCheck_DAL.DoCheck
participant DB as Oracle INFOCAD_TEST38 (QCK_DOCHECK)
participant TRG as Trigger QCHECK_CHECK_SCHEDULE
Op->>Cli: compila risposte + Esegui controllo
Cli->>WCF: DoCheck(loginkey, idCheck, idsDetail, responses)
WCF->>WCF: ValidateLoginKey + GetCheckByID (guardie stato)
alt sessione valida e check aperto
WCF->>Ctrl: DoCheck(user, idCheck, idDetails, resValues)
Ctrl->>DAL: DoCheck(...)
DAL->>DB: QCK_DOCHECK (PUSERNAME, PIDCHECK, PIDDETAILS[], PRESPONSEVALUES[], OUT POUT)
DB->>DB: QCK_SAVERESPONSES -> UPDATE QCHECK_CHECK_DETAILS.RESPONSEVALUE
DB->>DB: UPDATE QCHECK_CHECK SET EXECUTIONDATE=SYSDATE, EXECUTIONUSER=user
DB->>TRG: (UPDATE) fired
TRG->>TRG: UPDATE MAINT_ODL.COUNT_QCHECKS -1 (se SCHEDULE)
DB-->>DAL: POUT = righe aggiornate
DAL-->>WCF: nrow
WCF-->>Cli: MobileResult OK (Data=nrow)
else sessione non valida / check chiuso
WCF-->>Cli: AccessDenied / ERROR
end
Matrice di tracciabilità (file:riga)
| Livello | Artefatto | File:riga |
|---|---|---|
| Service entry (WCF) | QualityCheckReaderWCF.DoCheck |
InfocadWeb/.../QualityCheckCenter/WebServices/QualityCheckReaderWCF.svc.vb:254 |
| Contratto WCF | IQualityCheckReaderWCF.DoCheck |
InfocadWeb/.../QualityCheckCenter/WebServices/IQualityCheckReaderWCF.vb:26 |
| Validazione/guardie | ValidateLoginKey + stato check |
QualityCheckReaderWCF.svc.vb:257,260-265,267 |
| UI web (alternativo) | btnExecuted_Click → ExecutedSurvey → SaveUserResponses |
InfocadWeb/.../QualityCheckCenter/UserControls/CheckSurveyControl.ascx.vb:999,1201,1283,1291,1211 |
| Controller | QualityCheckController.DoCheck |
InfocadServer/QualityCheckControllers/QualityCheckController.cs:264-267 |
| Interfaccia DAO | IQualityCheck.DoCheck |
InfocadServer/QualityCheckInterface/IQualityCheck.cs:105 |
| DAL | QualityCheck_DAL.DoCheck (params + SP) |
InfocadServer/QualityCheckDAL/OracleODP/QualityCheck_DAL.cs:1397,1407-1425,1428,1430 |
| Stored procedure | QCK_DOCHECK |
Oracle INFOCAD_TEST38 user_source QCK_DOCHECK:12,14-16 |
| Stored procedure interna | QCK_SAVERESPONSES |
Oracle INFOCAD_TEST38 user_source QCK_SAVERESPONSES:16-19,25 |
| Trigger side effect | QCHECK_CHECK_SCHEDULE |
Oracle INFOCAD_TEST38 user_triggers |
| Tabelle write | QCHECK_CHECK_DETAILS, QCHECK_CHECK, MAINT_ODL |
user_dependencies + user_tab_columns |
Evidenza (INLINE)
Report di evidenza completo (estratti file:riga da codice VB/C# e da sorgente/catalogo Oracle) in
docs/_evidence/FLOW-QC-001/report.md.
Confidence
- VERIFIED: catena WCF → controller → DAL →
QCK_DOCHECK→QCK_SAVERESPONSES→ tabelleQCHECK_CHECK_DETAILS/QCHECK_CHECK, confermata simultaneamente su codice (VB/C#) e su DB (user_source,user_dependencies,user_tab_columns,user_triggers). Forward e reverse concordano. - SUPPORTED: side effect su
MAINT_ODL(dipende dal ramoSCHEDULE/ENTITYTABLE del trigger, verificato sul corpo del trigger ma non eseguito).
Open questions
- Transazionalità di
QCK_DOCHECK: la versioneINFOCAD_TEST38non contieneCOMMITesplicito (altre copie in schemi diversi sì); da chiarire se il commit è demandato alDataLayer/connessione. - Calcolo dell'IGC: nel path web l'IGC è calcolato lato UI (
txtIgc) e salvato viaUpdateCheck; nel pathQCK_DOCHECKl'IGC non viene ricalcolato (a differenza diQCK_UPDATELQRMOBILEpresente in altri schemi). Da confermare dove/quando l'IGC viene aggiornato per il path mobile. - Grant azione
22540: verificato l'uso come gate UI web; non verificato un controllo grant equivalente lato WCF oltre aValidateLoginKey.