Evidenza FLOW-QC-001 (estratti file:riga)

1. Service entry WCF — QualityCheckReaderWCF.svc.vb:254-282

Public Function DoCheck(ByVal loginkey As String, ByVal idCheck As Integer, ByVal idsDetail As List(Of Integer), ByVal responses As List(Of String)) As MobileResult(Of Integer) Implements IQualityCheckReaderWCF.DoCheck
    Dim result As New MobileResult(Of Integer)
    If ValidateLoginKey(loginkey) Then
        Dim qcheck As QualityCheckCheck = ctrl.GetCheckByID(idCheck)          '259
        If qcheck.Suspenddate.HasValue Then                                   '260  controllo sospeso
            result.setAsERROR(... "SuspendCheckLbl" ...)
        ElseIf qcheck.ExecutionDate.HasValue Then                             '262  gia chiuso
            result.setAsERROR(... "CheckStringStatusClosed" ...)
        ElseIf qcheck.CancelDate.HasValue Then                               '264  annullato
            result.setAsNoDataFound()
        Else
            Dim nrow As Integer = ctrl.DoCheck(_validCSession.SessionLogin.UserName, idCheck, idsDetail, responses)  '267
            If nrow <> 0 Then
                result.Data = nrow : result.setAsOK()                         '269-270
            Else
                result.setAsERROR(... "ErrorString" ...)                      '272
            End If
        End If
    Else
        result.setAsAccessDenied()                                           '278
    End If
    Return result
End Function

Campo controller: Private ReadOnly ctrl As New QualityCheckController (svc.vb:18). Contratto: IQualityCheckReaderWCF.vb:26 Function DoCheck(...) As MobileResult(Of Integer).

2. Controller — QualityCheckController.cs:264-267

public int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues)
{
    return ((IQualityCheck)this.DAO).DoCheck(username, idCheck, idDetails, resValues);
}

Interfaccia server: IQualityCheck.cs:105 int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues);

3. DAL — QualityCheck_DAL.cs:1397-1445

public int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues)
{
    DataLayer dl = new DataLayer(ConnectionName);
    try {
        OracleParameter pUsername = new OracleParameter("PUSERNAME", OracleDbType.Varchar2, username, ...);   //1407
        OracleParameter pIdCheck  = new OracleParameter("PIDCHECK",  OracleDbType.Int32, idCheck, ...);        //1408
        OracleParameter idsParam  = new OracleParameter("PIDDETAILS", OracleDbType.Int32, ...);               //1410
        idsParam.Value = DataLayer.GetIntegerArray(idDetails);
        idsParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;                                  //1412
        OracleParameter resValuesParam = new OracleParameter("PRESPONSEVALUES", OracleDbType.Varchar2, ...);  //1414
        resValuesParam.Value = DataLayer.GetStringArray(resValues, false);
        resValuesParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;                            //1416
        OracleParameter precords = new OracleParameter("POUT", OracleDbType.Int32, ParameterDirection.Output);//1418
        dl.Parameters.Add(pUsername); ... dl.Parameters.Add(precords);                                         //1421-1425
        dl.ExecuteNonQueryStoredProcedure("QCK_DOCHECK");                                                      //1428
        return ((OracleDecimal)precords.Value).ToInt32();                                                     //1430
    }
    catch (Exception ex) { Descor.Infrastructure.LogManager.ExceptionLogger.LogException(ex); throw; }         //1434-1438
    finally { dl.Kill(); }
}

4. Oracle — QCK_DOCHECK (user_source, owner INFOCAD_TEST38)

PROCEDURE QCK_DOCHECK(PUSERNAME IN VARCHAR, PIDCHECK IN NUMBER,
                      PIDDETAILS IN HELPERS.numberlist,
                      PRESPONSEVALUES IN HELPERS.stringlist4000, POUT OUT NUMBER)
AS
BEGIN
    QCK_SAVERESPONSES(PIDDETAILS, PRESPONSEVALUES, PIDCHECK, POUT);      -- line 12
    UPDATE QCHECK_CHECK
      SET EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME             -- line 15
      WHERE IDCHECK = PIDCHECK;                                          -- line 16
END;

(Nessun COMMIT nella versione INFOCAD_TEST38 — vedi Open questions.)

5. Oracle — QCK_SAVERESPONSES (user_source, owner INFOCAD_TEST38)

PROCEDURE "QCK_SAVERESPONSES"(PIDDETAILS IN HELPERS.numberlist,
                              PRESPONSEVALUES IN HELPERS.stringlist4000,
                              PIDCHECK IN NUMBER, POUT OUT NUMBER)
AS tmpRowsAffected NUMBER := 0;
BEGIN
    FOR I IN PIDDETAILS.FIRST .. PIDDETAILS.LAST LOOP
      UPDATE QCHECK_CHECK_DETAILS
        SET RESPONSEVALUE = PRESPONSEVALUES(I)                           -- line 17
        WHERE IDDETAILS = PIDDETAILS(I) AND CHECKID = PIDCHECK;          -- line 18-19
      tmpRowsAffected := tmpRowsAffected + SQL % ROWCOUNT;               -- line 21
    END LOOP;
    POUT := tmpRowsAffected;                                            -- line 25
END QCK_SAVERESPONSES;

6. Oracle — user_dependencies (VERIFIED write targets)

QCK_DOCHECK        -> INFOCAD_TEST38.QCHECK_CHECK (TABLE), QCK_SAVERESPONSES (PROCEDURE), HELPERS (PACKAGE)
QCK_SAVERESPONSES  -> INFOCAD_TEST38.QCHECK_CHECK_DETAILS (TABLE), HELPERS (PACKAGE)

7. Oracle — user_tab_columns (colonne bersaglio confermate)

QCHECK_CHECK:          IDCHECK(NN), ..., EXECUTIONDATE(DATE), EXECUTIONUSER(VARCHAR2),
                       SUSPENDDATE(DATE), CANCELDATE(DATE), IGC(NUMBER), SURVEYID, ENTITYTABLE, ENTITYID
QCHECK_CHECK_DETAILS:  IDDETAILS(NN), CHECKID, QUESTIONID, RESPONSEVALUE(VARCHAR2), RESPONSEWEIGHT

8. Oracle — trigger side effect (user_triggers: QCHECK_CHECK_SCHEDULE, INSERT OR UPDATE su QCHECK_CHECK)

-- se il check e legato a ENTITYTABLE='SCHEDULE' e ENTITYID>0:
ELSIF UPDATING THEN
  IF oldExecDate IS NULL AND newExecDate IS NOT NULL THEN
    UPDATE MAINT_ODL SET COUNT_QCHECKS = COUNT_QCHECKS - 1 WHERE ID_ODL = newEntityId;
  ...

=> l'UPDATE di chiusura del check decrementa il contatore controlli aperti dell'ODL.

9. Path web alternativo — CheckSurveyControl.ascx.vb

Protected Sub btnExecuted_Click(...)            '999
    If CheckAllWithAnswer() Then ExecutedSurvey()

Private Sub ExecutedSurvey()                     '1201
    Dim insOK As Int32 = SaveUserResponses()     '1203
    CurrentCheck.Igc = CDbl(txtIgc.Value)        '1206  (IGC calcolato lato UI)
    CurrentCheck.ExecutionDate = DateTime.Now    '1207
    CurrentCheck.ExecutionUser = WS.SessionLogin.UserName  '1208
    insOK = qcheckCtrl.UpdateCheck(CurrentCheck, False)    '1211 -> QCK_UPDATECHECK (DAL:1600)

Private Function SaveUserResponses() As Integer  '1283
    ...
    insOK = qcheckCtrl.SaveResponses(iddetailslist, respvaluelist, CInt(CurrentCheck.IdCheck))  '1291
    -> DAL SaveResponses (:3009) -> ExecuteNonQueryStoredProcedure("QCK_SAVERESPONSES") (:3036)

Gate grant UI: btnSaveTelerik.Visible = (HasUserGrant("22540") Or WS.SessionProfile.SuperAdmin) And IsCompile (:244,279).

Tipi di evidenza indipendenti usati

  1. Codice applicativo VB.NET (WCF svc + code-behind web) e C# (controller, DAL, interfaccia).
  2. Sorgente stored procedure Oracle (user_source: QCK_DOCHECK, QCK_SAVERESPONSES) + corpo trigger (user_triggers).
  3. Catalogo Oracle statico (user_dependencies, user_tab_columns) a conferma di tabelle e colonne scritte.