FLOW-DOC-001 — Creazione di un documento (core documentale) — DocCenter
Flusso end-to-end di creazione di un documento nell'entità core del documentale (Document / DocCenter). Path pilota: wizard interattivo
DocumentCreateControl.ascx(operatore che crea un nuovo documento con allegato principale, tag e attributi custom). Backend OracleINFOCAD_TEST38, accesso via stored procedure ODP.NET (nessun ORM). L'entità è persistita nella tabellaDOCS_DOCUMENT.Distinto da FLOW-ECM-001: qui si documenta la scrittura sull'entità documento core (tabelle
DOCS_*dell'hubINFOCAD_TEST38), NON il salvataggio su repository ECM esterno (Alfresco/OpenText/Docs), che è un percorso separato (Customizations/ExternalDocSave.*).
- Flow ID: FLOW-DOC-001
- Repository: InfocadWeb (ASP.NET Web Forms, VB.NET,
DocCenterWeb) + InfocadServer (DocumentControllers→DocumentBL→DocumentDAL, VB.NET) - has_standalone_write:
true— esiste un path di scrittura autonomo e pulito sull'entità core (DOCS_DOCUMENT), tramiteDocumentController.Insert→DOC_CREATEDOCUMENT. - Confidence complessiva: VERIFIED (catena UI → code-behind → controller → BL → DAL → stored procedure, confermata su codice E su sorgente DB
user_source) · SUPPORTED (wiring controller→BL via .NET RemotingDAOFactory).
Obiettivo di business
Consentire a un operatore del DocCenter di creare un nuovo documento (anagrafica + allegato
principale + tag di classificazione + attributi custom) all'interno dell'archivio documentale. Al
termine il documento esiste nella tabella DOCS_DOCUMENT con: id generato, protocollo di sistema
assegnato, eventuale allegato binario su DOCS_ATTACHMENT, associazioni tag su DOCS_TAG_DOCUMENT
e attributi custom su DOCS_DOCUMENT_ATTRIBUTE.
Attori
- Operatore DocCenter (utente autenticato) — path interattivo wizard
DocumentCreateControl.ascx(bottoni Salva / Salva e pubblica). - Sistemi esterni / processi massivi — controlli custom di upload
(
UploadProcessControl.ascx,DocumentInsertControl.ascx) che chiamano lo stessoDocumentController.Insert. - Oracle
INFOCAD_TEST38(hub documentale; stored procedureDOC_CREATEDOCUMENTe sotto-procedure).
Trigger
Click sul pulsante Salva (btnSalva) del wizard di creazione documento: evento
btnSalva_Click in DocumentCreateControl.ascx.vb:1243, che dopo Me.Validate invoca
CreateDocument() (:1246). Variante Salva e pubblica: btnSalvaPubblica_Click (:1257) →
CreateDocument(True) (:1259, con auto-pubblicazione workflow).
Frontend entry point
- Control wizard:
DocCenterWeb/UserControls/Custom/DocumentCreateControl.ascx(istanzadocCtrl As New DocumentController,:13). - Control di dettaglio (raccolta campi):
DocManagementControl.DocumentDetail(area/rack/shelf/folder, descrizione, note, sito, categoria, tag, allegato, date validità). - Gate di accesso: validazione lato UI (
Me.Validate) prima di procedere; autenticazione di sessione (WS.SessionContact,WS.CurrentTenant).
Sequenza principale (main sequence)
- Operatore compila il wizard (dettaglio, ubicazione, allegato, tag, attributi) e preme Salva.
DocumentCreateControl.ascx.vb→btnSalva_Click(:1243) →CreateDocument()(:1002) →InsertDocument(autoPublish, 0, IDDocSaved)(:1005).InsertDocument(:174) costruisce il DTOObjects.Document: anagrafica (Description,Notes), ubicazione (Area/Rack/Shelf/Folder), sito (DocumentSite.ID_DTO), categoria (IdCategory+Category), allegato (Attachment), validità (IsValid/ValidFrom/ValidTo/DocumentDate), tag selezionati (GetSelectedTagsID()), attributi custom generici/specifici (CustomGenericAttributes/CustomSpecificAttributes, popolati leggendodocCtrl.GetAllAttributes()/GetAttributesByCategory(...)),CreatedBy = WS.SessionContact.ID_DTO.- Controllo anti-duplicato:
checkNoExistDocument(doc)(:323, def:417) confronta descrizione + nome file + categoria + scadenze con i documenti esistenti viadocCtrl.SelectByDescription(...). SenoExistDocument = Truesi procede. Dim newDocID As Integer = docCtrl.Insert(doc)(:327) →DocumentController.Insert(DocumentController.vb:16) →DirectCast(Me.DAO, IDocument_BL).Insert(dto)(:17).Me.DAOè risolto daDAOFactory.CreateDAO(enControllers.Ctrl_Document)via .NET Remoting (Activator.GetObject(GetType(IDocument_BL), ...),DAOFactory.vb:14-15) → implementazioneDocument_BL.Document_BL.Insert(Document_BL.vb:24): estrae la lista id-tag dal DTO (:29) e invoca il DALDocumentDAL.DocumentDALFactory.GetDocumentDAL.Insert(...)con ~23 argomenti (:33-55), ottenendoidDoc. Poi, in unTryseparato, per ogni attributo custom generico/specifico chiamaGetDocumentDAL.AddDocAttribute(idDoc, IdAttribute, Name, Value)(:61,:70). RitornaidDoc.Document_DAL.Insert(Document_DAL.vb:328):- Protocollo: prepara 4 parametri OUT e chiama
DOC_GETNEWDOCPROTOCOL(:359); componeProtocolapplicando regex/suffisso (:361-364), poidl.ClearParameter(). - Prepara i parametri IN del documento (descrizione, note, blob allegato
PDOCUMENTFILE, sito, contatto, ubicazione, validità,PIDTAGLISTcomePLSQLAssociativeArray, categoria,PSYSPROTOCOL, ecc.) +PNEWINDEXOUT (:370-453). - Invoca
DOC_CREATEDOCUMENT(:456) e ritornaPNEWINDEXcome nuovo id (:458).
- Protocollo: prepara 4 parametri OUT e chiama
- Oracle
DOC_CREATEDOCUMENT(INFOCAD_TEST38):- se
PDOCUMENTFILEnon nullo, chiamaDOC_CREATEATTACHMENT(...)→ INSERTDOCS_ATTACHMENTRETURNING ID_ATTACHMENT(src); - INSERT
DOCS_DOCUMENT(colonne anagrafiche +ID_ATTACHMENT+START_DATE = SYSDATE,SYS_PROTOCOL,USER_PROTOCOL,USER_VERSION)RETURNING ID_DOCUMENT INTO PNEWINDEX; - chiama
DOC_ADDTAGSTODOCUMENT(PIDTAGLIST, PNEWINDEX)→ INSERTDOCS_TAG_DOCUMENT(una riga per tag).
- se
- Per ogni attributo custom,
Document_DAL.AddDocAttribute(:2421) invocaDOC_ADDDOCATTRIBUTE(:2436) → INSERTDOCS_DOCUMENT_ATTRIBUTERETURNING ID_DOCATTRIBUTE. - Post-salvataggio (in
InsertDocument/CreateDocument): recupero protocollo (GetProtocolByDocumentID,:329), salvataggio allegati secondari (AddAttachmentDoc,:336), assegnazione tenancy (SetDocumentTenancies("DOCUMENT", newDocID, ...),:351), salvataggio scadenze (DeadlineControl.SaveItemListIntoDB,:353), ingresso in workflow (CreateWorkFlowEntryPoint,:358), eventuale auto-pubblicazione, refresh cache (DocCenterHelper.EmptyFromCache/...).
API / service
- Path interattivo: postback ASP.NET Web Forms diretto sul wizard (nessun SOAP/REST).
- Comunicazione controller→BL: .NET Remoting —
DocumentController(client) chiamaIDocument_BLrisolto daDAOFactoryconActivator.GetObject(...)sul canaleSettingsManager.CHANNEL://SERVERADDRESS/Service_Document(DAOFactory.vb:15). In esecuzione in-process/remoto secondo configurazione.
Backend
- UI/Code-behind:
DocumentCreateControl.ascx.vb(wizard creazione). - Controller server:
Descor.Documents.DocumentControllers.DocumentController(InfocadServer/DocumentControllers/DocumentController.vb), ereditaCtrl_EntityBase. - Factory DAO:
DocumentControllers/serv/DAOFactory.vb(Ctrl_Document → IDocument_BL). - Business Layer:
Descor.Documents.DocumentBL.Document_BL(InfocadServer/DocumentBL/Document_BL.vb). - DAL:
DocumentDAL.OracleODP.Document_DAL(InfocadServer/DocumentDAL/OracleODP/Document_DAL.vb), ottenuto viaDocumentDALFactory.GetDocumentDAL. - Pattern DAL:
Using dl As DataLayer = New DataLayer(My.Settings.ConnectionName)→dl.Parameters.Add(OracleParameter...)→dl.ExecuteNonQueryStoredProcedure("DOC_CREATEDOCUMENT"); id di ritorno via parametro OUTPNEWINDEX.
Query / stored procedure
| Passo | Stored procedure (Oracle INFOCAD_TEST38) |
Chiamata da (DAL) |
|---|---|---|
| Generazione protocollo di sistema | DOC_GETNEWDOCPROTOCOL (4 OUT) |
Document_DAL.vb:359 |
Creazione documento (INSERT DOCS_DOCUMENT) |
DOC_CREATEDOCUMENT (OUT PNEWINDEX) |
Document_DAL.vb:456 |
INSERT allegato principale (DOCS_ATTACHMENT) |
DOC_CREATEATTACHMENT (interna a DOC_CREATEDOCUMENT) |
DOC_CREATEDOCUMENT src |
INSERT associazioni tag (DOCS_TAG_DOCUMENT) |
DOC_ADDTAGSTODOCUMENT (interna a DOC_CREATEDOCUMENT) |
DOC_CREATEDOCUMENT src |
INSERT attributi custom (DOCS_DOCUMENT_ATTRIBUTE) |
DOC_ADDDOCATTRIBUTE (OUT PNEWINDEX) |
Document_DAL.vb:2436 |
Tabelle lette (read)
INFOCAD_TEST38:DOCS_PROTOCOLFORMAT(formula/regex/suffisso protocollo, letta daDOC_GETNEWDOCPROTOCOL).- Letture di supporto UI (categoria/attributi/anti-duplicato) via
DOC_GET*(es.DOC_GETDOCUMENTBYDESCRIPTIONpercheckNoExistDocument) — non parte della transazione di scrittura.
Tabelle modificate (write)
INFOCAD_TEST38:DOCS_DOCUMENT(RW — entità-radice del documento: INSERT conRETURNING ID_DOCUMENT; VERIFIED su sorgenteDOC_CREATEDOCUMENT).DOCS_ATTACHMENT(RW — INSERT allegato principale con blob, solo sePDOCUMENTFILEnon nullo;RETURNING ID_ATTACHMENT; viaDOC_CREATEATTACHMENT).DOCS_TAG_DOCUMENT(RW — INSERT n righe di associazione tag↔documento; viaDOC_ADDTAGSTODOCUMENT).DOCS_DOCUMENT_ATTRIBUTE(RW — INSERT attributi custom generici/specifici; viaDOC_ADDDOCATTRIBUTE).
Validazione
- Lato UI:
Me.Validateprima diCreateDocument(:1245,:1258); controllo anti-duplicatocheckNoExistDocument(descrizione + file + categoria + scadenze,:417); se il documento esiste già l'INSERT non viene eseguito. - Lato BL: la creazione degli attributi custom è in un
Tryisolato (Document_BL.vb:57-79): un errore sugli attributi viene loggato ma NON annulla il documento già inserito. - Lato DB:
DOC_CREATEDOCUMENTesegue l'attachment solo se il blob non è nullo (IF NOT PDOCUMENTFILE IS NULL); nessun controllo di esistenza tabella (SQL statico).
Side effects
- Assegnazione protocollo di sistema (
DOC_GETNEWDOCPROTOCOL+DOCS_PROTOCOLFORMAT) iniettato inSYS_PROTOCOL. - Stamping
CREATEDBY = WS.SessionContact.ID_DTO,START_DATE = SYSDATE. - Assegnazione tenancy documento (
SetDocumentTenancies,:351). - Salvataggio scadenze (
DeadlineControl.SaveItemListIntoDB,:353). - Ingresso in workflow (
CreateWorkFlowEntryPoint,:358) ed eventuale auto-pubblicazione (RunWorkFlow,:372) sul path Salva e pubblica. - Salvataggio allegati secondari (
AddAttachmentDoc,:336). - Refresh cache DocCenter (
DocCenterHelper.EmptyFromCache/UpdateCache). - Sistema di alert/mailing (
ProcessAlertSystem,:1248) se configurato.
Percorsi alternativi / di errore
- Upload massivo / processi:
UploadProcessControl.ascx.vb:193→InsertDocument(doc)→docCtrl.Insert(doc)(:690circa) — stessaDOC_CREATEDOCUMENT. - Wizard alternativi (Temp):
DocumentInsertControl.ascx/DocumentInsertControlNew.ascx→InsertDocument(...)→docCtrl.Insert. - Contatto mancante: se
CreateWorkFlowEntryPointnon trova il contatto, il documento appena creato viene cancellato fisicamente (docCtrl.FinalDelete(newDocID)+ eliminazione scadenze,:382-383). - Inserimento da cancellato (RequestCenter/custom): se
InsertCancelled, subito dopo l'insert si eseguedocCtrl.LogicalDelete(newDocID)(:365). - Errore generico: eccezione catturata e loggata via
InfocadTraceWrapper.CreateError(:1253); il DAL logga conExceptionLogger.LogExceptione rilancia (Document_DAL.vb:462-463). - Aggiornamento (controprova non distruttiva):
Document_DAL.Update→DOC_UPDATEDOCUMENT(Document_DAL.vb:1500); rinnovo/revisione:DOC_RENEWDOCUMENT(:1771) /DOC_REVIEWDOCUMENT(:1902).
Diagramma di sequenza
sequenceDiagram
actor Op as Operatore DocCenter
participant UI as DocumentCreateControl.ascx
participant CB as InsertDocument (code-behind)
participant DC as DocumentController.Insert
participant BL as Document_BL.Insert
participant DAL as Document_DAL.Insert
participant DB as Oracle INFOCAD_TEST38
Op->>UI: compila wizard + click Salva
UI->>CB: btnSalva_Click -> CreateDocument -> InsertDocument
CB->>CB: costruisce DTO Document (+ tag, attributi)
CB->>CB: checkNoExistDocument (anti-duplicato)
CB->>DC: docCtrl.Insert(doc)
DC->>BL: IDocument_BL.Insert(dto) [.NET Remoting / DAOFactory]
BL->>DAL: GetDocumentDAL.Insert(...23 args...)
DAL->>DB: DOC_GETNEWDOCPROTOCOL (OUT protocollo)
DB->>DB: read DOCS_PROTOCOLFORMAT
DAL->>DB: DOC_CREATEDOCUMENT (OUT PNEWINDEX)
alt PDOCUMENTFILE non nullo
DB->>DB: DOC_CREATEATTACHMENT -> INSERT DOCS_ATTACHMENT
end
DB->>DB: INSERT DOCS_DOCUMENT RETURNING ID_DOCUMENT
DB->>DB: DOC_ADDTAGSTODOCUMENT -> INSERT DOCS_TAG_DOCUMENT
DAL-->>BL: idDoc (PNEWINDEX)
loop per attributo custom
BL->>DAL: AddDocAttribute(idDoc, ...)
DAL->>DB: DOC_ADDDOCATTRIBUTE -> INSERT DOCS_DOCUMENT_ATTRIBUTE
end
BL-->>DC: idDoc
DC-->>CB: newDocID
CB->>CB: protocollo, tenancy, scadenze, workflow, cache
Matrice di tracciabilità (file:riga)
| Livello | Elemento | File:riga |
|---|---|---|
| UI trigger | btnSalva_Click → CreateDocument() |
InfocadWeb/.../DocCenterWeb/UserControls/Custom/DocumentCreateControl.ascx.vb:1243,1246 |
| UI trigger (pubblica) | btnSalvaPubblica_Click → CreateDocument(True) |
DocumentCreateControl.ascx.vb:1257,1259 |
| Code-behind | CreateDocument → InsertDocument |
DocumentCreateControl.ascx.vb:1002,1005 |
| Code-behind | InsertDocument (build DTO) |
DocumentCreateControl.ascx.vb:174 |
| Validazione | checkNoExistDocument |
DocumentCreateControl.ascx.vb:323,417 |
| Chiamata controller | docCtrl.Insert(doc) |
DocumentCreateControl.ascx.vb:327 |
| Controller | DocumentController.Insert → Me.DAO |
InfocadServer/DocumentControllers/DocumentController.vb:16-17 |
| Wiring controller→BL | DAOFactory Ctrl_Document → IDocument_BL |
InfocadServer/DocumentControllers/serv/DAOFactory.vb:14-15 |
| BL | Document_BL.Insert → GetDocumentDAL.Insert |
InfocadServer/DocumentBL/Document_BL.vb:24,33 |
| BL | loop attributi → AddDocAttribute |
Document_BL.vb:61,70 |
| DAL | Document_DAL.Insert (protocollo) |
InfocadServer/DocumentDAL/OracleODP/Document_DAL.vb:328,359 |
| DAL | ExecuteNonQueryStoredProcedure("DOC_CREATEDOCUMENT") |
Document_DAL.vb:456 |
| DAL | ritorno PNEWINDEX |
Document_DAL.vb:458 |
| DAL | AddDocAttribute → DOC_ADDDOCATTRIBUTE |
Document_DAL.vb:2421,2436 |
| SP | DOC_CREATEDOCUMENT INSERT DOCS_DOCUMENT |
Oracle user_source (INFOCAD_TEST38) |
| SP | DOC_CREATEATTACHMENT INSERT DOCS_ATTACHMENT |
Oracle user_source |
| SP | DOC_ADDTAGSTODOCUMENT INSERT DOCS_TAG_DOCUMENT |
Oracle user_source |
| SP | DOC_ADDDOCATTRIBUTE INSERT DOCS_DOCUMENT_ATTRIBUTE |
Oracle user_source |
| SP | DOC_GETNEWDOCPROTOCOL read DOCS_PROTOCOLFORMAT |
Oracle user_source |
Evidenza (INLINE)
Vedi sezione seguente (corpo evidenza restituito anche come evidence_markdown).
Confidence
- VERIFIED sul cuore del flusso: UI
DocumentCreateControl→DocumentController.Insert→Document_BL.Insert→Document_DAL.Insert→DOC_CREATEDOCUMENT, con INSERT suDOCS_DOCUMENT(+DOCS_ATTACHMENT,DOCS_TAG_DOCUMENT) confermato sul sorgente della stored procedure (user_source, INFOCAD_TEST38). Almeno 2 tipi di evidenza: (1) codice VB.NET UI/BL/DAL, (2) sorgente Oracle PL/SQL delle SP, (3) catalogo DB (database-catalog.json). - SUPPORTED sul wiring controller→BL via .NET Remoting (
DAOFactory,Activator.GetObject): confermato inDAOFactory.vbma l'implementazione concretaDocument_BLè risolta a runtime. - Forward/Reverse concordi: la risalita da
DOCS_DOCUMENT←DOC_CREATEDOCUMENT←Document_DAL.Insert←Document_BL.Insert←DocumentController.Insert←DocumentCreateControlcombacia con la discesa.
Open questions
- La generazione/incremento del contatore di protocollo:
DOC_GETNEWDOCPROTOCOLleggeDOCS_PROTOCOLFORMATma la sequenzaSEQ_DOCS_PROTOCOLrisulta commentata nel sorgente; da verificare come viene effettivamente incrementato il progressivo di protocollo. DOC_ADDTAGSTODOCUMENTcontiene chiamate commentate aDOC_REFRESHTAGWEIGHT: il "peso" dei tag non viene aggiornato in fase di creazione (comportamento voluto?).- Attributi custom (
DOCS_DOCUMENT_ATTRIBUTE) inseriti fuori transazione atomica rispetto aDOCS_DOCUMENT: un fallimento parziale lascerebbe il documento senza attributi (log-only).