Table of Contents

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 Oracle INFOCAD_TEST38, accesso via stored procedure ODP.NET QCK_DOCHECK (nessun ORM). L'esito è persistito nelle tabelle QCHECK_CHECK_DETAILS (risposte) e QCHECK_CHECK (header del controllo).

  • Flow ID: FLOW-QC-001
  • Repository: InfocadWeb (WCF QualityCheckReaderWCF.svc, VB.NET) + InfocadServer (QualityCheckControllers / QualityCheckDAL, C#) + Oracle INFOCAD_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 tramite loginkey.
  • Operatore su scheda web (path alternativo) — UserControl CheckSurveyControl.ascx del QualityCheckCenter web (bottone "Eseguito").
  • Oracle INFOCAD_TEST38 (hub qualità; procedure QCK_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), contratto IQualityCheckReaderWCF (IQualityCheckReaderWCF.vb:26), operazione DoCheck (QualityCheckReaderWCF.svc.vb:254).
  • Scheda web (path alternativo): CommonWeb/QualityCheckCenter/UserControls/CheckSurveyControl.ascx(.vb) (bottoni btnExecuted/btnSave/btnReset), ospitata nel QualityCheckCenter (QualityCheck.aspx).
  • Gate di accesso: WCF → ValidateLoginKey(loginkey) (:257); web → grant azione HasUserGrant("22540") o SuperAdmin per abilitare il bottone di salvataggio (CheckSurveyControl.ascx.vb:244,279).

Sequenza principale (main sequence)

  1. L'ispettore compila le risposte del survey e conferma l'esecuzione del controllo; il client mobile invoca QualityCheckReaderWCF.DoCheck(loginkey, idCheck, idsDetail, responses) (:254).
  2. Il servizio valida la sessione con ValidateLoginKey(loginkey) (:257); se non valida → setAsAccessDenied() (:278).
  3. Ricarica lo stato corrente del check con ctrl.GetCheckByID(idCheck) (:259) e applica i guardie di stato (:260-265):
    • se Suspenddate valorizzata → errore "controllo sospeso" (:261);
    • se ExecutionDate valorizzata → errore "controllo già chiuso" (:263);
    • se CancelDate valorizzata → setAsNoDataFound() (:265).
  4. Altrimenti invoca ctrl.DoCheck(UserName, idCheck, idsDetail, responses) (:267).
  5. QualityCheckController.DoCheck (QualityCheckController.cs:264) inoltra al DAO/DAL: ((IQualityCheck)this.DAO).DoCheck(username, idCheck, idDetails, resValues) (:266).
  6. QualityCheck_DAL.DoCheck (QualityCheck_DAL.cs:1397) prepara i parametri Oracle (PUSERNAME, PIDCHECK, PIDDETAILS array associativo Int32, PRESPONSEVALUES array associativo Varchar2, POUT OUT) (:1407-1425) e chiama dl.ExecuteNonQueryStoredProcedure("QCK_DOCHECK") (:1428); restituisce POUT (:1430).
  7. Oracle QCK_DOCHECK (INFOCAD_TEST38):
    • chiama QCK_SAVERESPONSES(PIDDETAILS, PRESPONSEVALUES, PIDCHECK, POUT) (src:12), che itera sugli array e per ogni dettaglio esegue UPDATE QCHECK_CHECK_DETAILS SET RESPONSEVALUE = ... WHERE IDDETAILS = ... AND CHECKID = PIDCHECK (QCK_SAVERESPONSES src:16-19), accumulando le righe aggiornate in POUT (src:21,25);
    • esegue UPDATE QCHECK_CHECK SET EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME WHERE IDCHECK = PIDCHECK (QCK_DOCHECK src:14-16) — chiusura del controllo.
  8. Effetto trigger: l'UPDATE su QCHECK_CHECK attiva QCHECK_CHECK_SCHEDULE (INSERT OR UPDATE); se il check è legato a un'entità SCHEDULE e EXECUTIONDATE passa da NULL a valorizzata, il trigger esegue UPDATE MAINT_ODL SET COUNT_QCHECKS = COUNT_QCHECKS - 1 WHERE ID_ODL = ENTITYID.
  9. Il DAL legge POUT (righe risposte aggiornate) e lo propaga fino al WCF, che interpreta nrow <> 0 come 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-process QualityCheckController.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), metodo DoCheck (: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 OUT POUT (Int32); dl.Kill() nel finally.

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 via GetCheckByID: Suspenddate, ExecutionDate, CancelDate), letta anche implicitamente nelle WHERE degli UPDATE.
  • Nel trigger QCHECK_CHECK_SCHEDULE: lettura di :OLD/:NEW (ENTITYTABLE, ENTITYID, PLANNEDDATE, EXECUTIONDATE) della riga QCHECK_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 RESPONSEVALUE per ogni dettaglio; VERIFIED su sorgente QCK_SAVERESPONSES e su user_tab_columns), QCHECK_CHECK (RW — UPDATE EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME WHERE IDCHECK; VERIFIED su sorgente QCK_DOCHECK e su user_dependencies).
  • Effetto indiretto (trigger QCHECK_CHECK_SCHEDULE): MAINT_ODL (RW — UPDATE COUNT_QCHECKS = COUNT_QCHECKS - 1 quando EXECUTIONDATE passa da NULL a valorizzata su un check di tipo SCHEDULE).

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 22540 o SuperAdmin (CheckSurveyControl.ascx.vb:244,279), e CheckAllWithAnswer() che pretende una risposta per ogni domanda prima di ExecutedSurvey (:1001,1073).
  • Lato DB: QCK_SAVERESPONSES aggiorna solo i dettagli il cui IDDETAILS è nell'array E il cui CHECKID = PIDCHECK (isolamento per check); POUT = numero di righe effettivamente aggiornate.

Side effects

  • Stamping di esecuzione: EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME su QCHECK_CHECK.
  • Decremento del contatore controlli aperti dell'ODL di manutenzione (MAINT_ODL.COUNT_QCHECKS) via trigger QCHECK_CHECK_SCHEDULE per i check agganciati a uno SCHEDULE.
  • Logging eccezioni DAL: Descor.Infrastructure.LogManager.ExceptionLogger.LogException (QualityCheck_DAL.cs:1436).
  • Nota transazionalità: la versione INFOCAD_TEST38 di QCK_DOCHECK non contiene COMMIT esplicito (il commit dipende dalla gestione del DataLayer); 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, → DAL SaveResponses :3009QCK_SAVERESPONSES :3036), quindi imposta ExecutionDate/ExecutionUser/Igc e chiama qcheckCtrl.UpdateCheck(CurrentCheck, False) (:1211, → DAL UpdateCheck :1536QCK_UPDATECHECK :1600). Stessa semantica di QCK_DOCHECK ma su due stored procedure distinte, con l'IGC calcolato lato UI.
  • Annullamento/reset controllo (web): btnReset_Click (:1015) → CancelSurvey (:1255) → SaveResponses + UpdateCheck con CancelDate valorizzata.
  • Errori WCF: sessione non valida → setAsAccessDenied (:278); check sospeso/chiuso/annullato → setAsERROR/setAsNoDataFound (:261-265); nrow = 0 (nessuna risposta aggiornata) → setAsERROR generico (: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_ClickExecutedSurveySaveUserResponses 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_DOCHECKQCK_SAVERESPONSES → tabelle QCHECK_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 ramo SCHEDULE/ENTITYTABLE del trigger, verificato sul corpo del trigger ma non eseguito).

Open questions

  • Transazionalità di QCK_DOCHECK: la versione INFOCAD_TEST38 non contiene COMMIT esplicito (altre copie in schemi diversi sì); da chiarire se il commit è demandato al DataLayer/connessione.
  • Calcolo dell'IGC: nel path web l'IGC è calcolato lato UI (txtIgc) e salvato via UpdateCheck; nel path QCK_DOCHECK l'IGC non viene ricalcolato (a differenza di QCK_UPDATELQRMOBILE presente 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 a ValidateLoginKey.