BR-BIM — Regole di business del dominio BIM (BIM Center)
Regole di business estratte dal flusso pilota FLOW-BIM-001 (creazione/aggiornamento di un progetto BIM) e dai sorgenti correlati. Il dominio BIM Center gestisce i progetti BIM (
BIM_PROJECTS) e i relativi file/versioni figli (BIM_PROJECTDATA), agganciati a uno spazio patrimoniale (entità + id, es. edificio/comprensorio). Il salvataggio (create-or-update) del progetto passa dalla procedura standalone OracleBIM_UPDATEPROJECT(upsert pilotato daPIDPROJECT), sia dal path interattivo (schedaBIMProjectDetails.ascx) sia dal path programmatico IFC/plugin (IFCController→IFC_DAL).Sistema: Infocad (Descor) — backend Oracle
INFOCAD_TEST38, ASP.NET Web Forms (C#, moduloBIMCenterWeb) + controller serverDescor.BIM.BIMControllersrisolti via .NET Remoting (Service_BIM,MarshalByRefObject); nessun ORM (stored procedure via DALExecute*StoredProcedure).Le regole sono classificate per tipo, enforcement point (UI / BL / DB / mixed) e confidence (VERIFIED / SUPPORTED / INFERRED). Gli identificatori tecnici NON sono tradotti.
Note di metodo e provenienza dell'evidenza
- Evidenza di codice: percorsi relativi alla radice del repository
Documentation/(es.InfocadServer/BIMDAL/OracleODP/BIM_DAL.cs:191). - Evidenza DB: letta in sola lettura (
USER_SOURCE,USER_TRIGGERS,USER_CONSTRAINTS,USER_IND_COLUMNS,USER_INDEXES,USER_TAB_COLUMNS,USER_OBJECTS,USER_SEQUENCES) suINFOCAD_TEST38, limitatamente aBIM_UPDATEPROJECT, alla tabellaBIM_PROJECTS, al suo trigger e alla sequenzaSEQ_BIM_PROJECTS. Nessuna lettura di dati applicativi, nessuna DML/DDL. Le righe della procedura sono indicate comeBIM_UPDATEPROJECT:NNN(numerazioneUSER_SOURCE). - La verifica DB live conferma le regole del flusso e ne emerge due correzioni rispetto alla
documentazione di flusso (vedi BR-BIM-003 — unique per spazio realmente presente; BR-BIM-011 — il
trigger fira SOLO su INSERT, quindi l'immutabilità di
IDPROJECTsu UPDATE è dead code).
Registro delle regole (register)
| id | regola | tipo | enforcement | conf |
|---|---|---|---|---|
| BR-BIM-001 | Create-vs-update pilotato da PIDPROJECT: NULL/<=0 ⇒ INSERT, >0 ⇒ UPDATE |
state-transition | mixed | VERIFIED |
| BR-BIM-002 | IDPROJECT è assegnato dalla sequenza SEQ_BIM_PROJECTS se NULL (trigger BEFORE INSERT) |
calculation | DB | VERIFIED |
| BR-BIM-003 | Un solo progetto attivo per spazio: unique UK_BIM_PROJECT_SPACE (ENTITY, ENTITYID, CANCELLED); violazione ⇒ POUT=-100 |
validation | DB | VERIFIED |
| BR-BIM-004 | Gestione errori nella procedura: DUP_VAL_ON_INDEX⇒POUT=-100, WHEN OTHERS⇒POUT=-1 (nessuna eccezione risollevata) |
state-transition | DB | VERIFIED |
| BR-BIM-005 | Interpretazione ritorno lato UI: returnID>0 ⇒ successo; <=0 ⇒ "Progetto non individuato" e false |
state-transition | BL | VERIFIED |
| BR-BIM-006 | Settings di progetto sono serializzate in JSON nel CLOB PSETTINGS/SETTINGS |
calculation | BL | VERIFIED |
| BR-BIM-007 | Stamping MODIFIED=DateTime.Now, MODIFIEDBY=UserName; su create l'utente è forzato ToUpper() |
validation | BL | VERIFIED |
| BR-BIM-008 | Validazione UI pre-salvataggio: nome, path, location (ID_Parent>0) e per ogni file nome/path/location/disciplina |
validation | UI | VERIFIED |
| BR-BIM-009 | Il DB non presidia i campi di business: unico vincolo è la PK IDPROJECT (tutte le altre colonne nullable) |
validation | DB | VERIFIED |
| BR-BIM-010 | Sul path interattivo di create ProjectType resta UNDEFINED (default DB 'REVIT' non applicato) |
config-flag | mixed | SUPPORTED |
| BR-BIM-011 | Immutabilità IDPROJECT: intento nel trigger (ORA-20000) ma il trigger fira SOLO su INSERT ⇒ ramo UPDATE dead code |
validation | DB | VERIFIED |
| BR-BIM-012 | Lock ottimistico applicativo su edit/delete via ManageEditing(..., BIMProjectsEntity, ...) |
state-transition | BL | SUPPORTED |
| BR-BIM-013 | Visibilità pulsanti toolbar pilotata dall'ACL di progetto (CanDelete/CanUpdate); ACL default = full |
permission | UI | VERIFIED |
| BR-BIM-014 | Guardia cancellazione file figlio: negata se cancellato, no CanDelete, IsLocked, IsUsed o IsRegistered |
permission | BL | VERIFIED |
| BR-BIM-015 | Default Schema="RVT" sul file figlio (UpdateProjectData) se assente |
config-flag | BL | VERIFIED |
| BR-BIM-016 | Post-save (returnID>0): upsert dei file figli e cancellazione fisica dei file flaggati |
state-transition | BL | VERIFIED |
| BR-BIM-017 | Path IFC/plugin: stessa BIM_UPDATEPROJECT con interpretazione ritorno propria e SENZA validazioni UI |
state-transition | BL | VERIFIED |
Dettaglio delle regole
BR-BIM-001 — Create vs Update pilotato da PIDPROJECT
- Regola: la procedura esegue una INSERT (nuovo progetto) se
PIDPROJECT IS NULL OR PIDPROJECT <= 0; altrimenti una UPDATEWHERE IDPROJECT = PIDPROJECT. - Tipo: state-transition · Enforcement: mixed (BL propaga l'id, DB decide) · Confidence: VERIFIED
- Evidenza (BL): ramo create quando
CurrentProject == null || CurrentProject.IdProject < 0conbimProjectNew.IdProject = 0—InfocadWeb/WebMachine/CASSANDRA/BIMCenterWeb/UserControls/BIMProjectDetails.ascx.cs:835,838,847; ramo updateBIMCtrl.UpdateProject(this.CurrentProject)—:850-857. - Evidenza (DB):
IF (PIDPROJECT IS NULL OR PIDPROJECT <= 0) THEN INSERT ... ELSE UPDATE ... WHERE IDPROJECT = PIDPROJECT—BIM_UPDATEPROJECT:16-35.
BR-BIM-002 — Identity IDPROJECT da SEQ_BIM_PROJECTS (trigger)
- Regola: alla INSERT, se
IDPROJECTè NULL, il trigger BEFORE INSERTBIM_PROJECTSlo valorizza daSEQ_BIM_PROJECTS.NEXTVAL. L'id prodotto è restituito dallaINSERT ... RETURNING IDPROJECT INTO POUT. - Tipo: calculation · Enforcement: DB (trigger BEFORE ROW) · Confidence: VERIFIED
- Evidenza (DB):
IF INSERTING THEN IF (:new.IDPROJECT IS NULL) THEN SELECT SEQ_BIM_PROJECTS.NEXTVAL INTO :new.IDPROJECT FROM DUAL; END IF; END IF;— triggerBIM_PROJECTS(USER_TRIGGERS,BEFORE EACH ROW, eventoINSERT);RETURNING IDPROJECT INTO POUT—BIM_UPDATEPROJECT:19; sequenzaSEQ_BIM_PROJECTSpresente inUSER_SEQUENCES. - Flag: regola enforced solo in SQL (identity via sequenza + trigger, non colonna IDENTITY).
BR-BIM-003 — Un solo progetto attivo per spazio (unique ENTITY, ENTITYID, CANCELLED)
- Regola: esiste un indice UNIQUE
UK_BIM_PROJECT_SPACEsu(ENTITY, ENTITYID, CANCELLED). Poiché la INSERT impostaCANCELLED = NULL, ne consegue che non possono esistere due progetti attivi (non cancellati) sullo stesso spazio (ENTITY+ENTITYID). Il tentativo sollevaDUP_VAL_ON_INDEX, catturata dalla procedura conPOUT = -100. - Tipo: validation · Enforcement: DB · Confidence: VERIFIED
- Evidenza (DB):
USER_INDEXES/USER_IND_COLUMNSsuBIM_PROJECTS:UK_BIM_PROJECT_SPACEUNIQUE → colonneENTITY,ENTITYID,CANCELLED; INSERT conCANCELLED = NULL—BIM_UPDATEPROJECT:18-19; handlerWHEN DUP_VAL_ON_INDEX THEN POUT := -100—BIM_UPDATEPROJECT:42. - Evidenza (BL): sul create la coppia spazio è valorizzata da
EntityID = this.ID_Parent,Entity = this.ParentEntityType—BIMProjectDetails.ascx.cs:843-844. - Flag: regola enforced solo in SQL, non ripetuta lato applicativo → l'errore risale come
-100generico (poi "Progetto non individuato" per l'utente, vedi BR-BIM-005). È il caso reale che rende raggiungibile il ramo-100. Questa regola non era documentata nel flusso pilota (che citava soloBIM_PROJECTScome target senza il vincolo di spazio).
BR-BIM-004 — Gestione errori DB nella procedura (POUT negativo, WHEN OTHERS silente)
- Regola: la procedura non solleva eccezioni verso il chiamante:
DUP_VAL_ON_INDEX⇒POUT = -100, qualsiasi altra eccezione (WHEN OTHERS) ⇒POUT = -1. Su UPDATE riuscitaPOUT := SQL % ROWCOUNT(tipicamente1). - Tipo: state-transition (esito) · Enforcement: DB · Confidence: VERIFIED
- Evidenza (DB):
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN POUT := -100; WHEN OTHERS THEN POUT := -1;—BIM_UPDATEPROJECT:41-43;POUT := SQL % ROWCOUNT—:37. - Flag:
WHEN OTHERS THENmaschera l'errore (nessunRAISE): la causa reale (es. violazione di un altro indice, errore di conversione) è persa e appiattita su-1; il DAL riceve un valore, non un'eccezione. Magic number hard-coded-1/-100.
BR-BIM-005 — Interpretazione del valore di ritorno lato UI
- Regola: il
returnIDdiUpdateProjectè interpretato dal code-behind così:> 0⇒ successo (id nuovo su create; su update è ilROWCOUNT, tipicamente1);<= 0⇒ salvataggio fallito con messaggio "Progetto non individuato" ereturn false. - Tipo: state-transition · Enforcement: BL · Confidence: VERIFIED
- Evidenza (BL):
if (returnID > 0) { ... } else { this.NotifyMessage(... " Progetto non individuato."); return false; }—BIMProjectDetails.ascx.cs:860,895-898; nel ramo createthis.CurrentProject.IdProject = returnID;—:849. - Flag: su UPDATE che non colpisce righe (
ROWCOUNT = 0, es.IDPROJECTinesistente)returnID = 0è trattato come fallimento generico, indistinguibile dagli errori-1/-100.
BR-BIM-006 — Serializzazione Settings in JSON (CLOB)
- Regola: le impostazioni di progetto (
BimProject.Settings) sono serializzate in stringa JSON e passate nel parametro CLOBPSETTINGS, memorizzato inBIM_PROJECTS.SETTINGS. - Tipo: calculation (serializzazione) · Enforcement: BL · Confidence: VERIFIED
- Evidenza (BL):
settingsparam.Value = Descor.Common.Serialization.JSon.SerializeToString(bp.Settings);—InfocadServer/BIMDAL/OracleODP/BIM_DAL.cs:170(identico su path IFCIFC_DAL.cs:136); colonnaSETTINGS CLOB—USER_TAB_COLUMNS(BIM_PROJECTS). - Flag: contenuto del CLOB schema-libero (JSON variabile per tipo progetto/tenant); non validato dal DB.
BR-BIM-007 — Stamping MODIFIED / MODIFIEDBY
- Regola: ad ogni salvataggio il code-behind valorizza
Modified = DateTime.NoweModifiedBy = UserName. Sul ramo create l'utente è forzato in maiuscolo (UserName.ToUpper()); sul ramo update è lasciato tal quale. - Tipo: validation (audit) · Enforcement: BL · Confidence: VERIFIED
- Evidenza (BL): create
bimProjectNew.ModifiedBy = this.UserName.ToUpper(); bimProjectNew.Modified = DateTime.Now;—BIMProjectDetails.ascx.cs:845-846; updatethis.CurrentProject.ModifiedBy = this.UserName; this.CurrentProject.Modified = DateTime.Now;—:855-856. - Flag: incoerenza tra i due rami (
ToUpper()solo su create) → il valore diMODIFIEDBYnon è normalizzato in modo uniforme. La colonnaMODIFIEDha default DBSYSDATEma è sempre sovrascritta dall'app.
BR-BIM-008 — Validazione UI pre-salvataggio (CheckInsertDataValue)
- Regola: prima del salvataggio la scheda valida: nome progetto non vuoto, path progetto non vuoto, location valida (
ID_Parent > 0); e per ogni file figlio: nome non vuoto,Path+FilePathnon vuoti,Entity+EntityIDvalorizzati,Discipline != Undefined. In caso di errore il salvataggio è bloccato con alert "Dati non completi". - Tipo: validation · Enforcement: UI · Confidence: VERIFIED
- Evidenza (UI):
CheckInsertDataValue()—BIMProjectDetails.ascx.cs:932-982(nome:935, path:939, locationID_Parent<=0:943, file name:952, file path:959, file location:966, disciplinax.Discipline == BimDiscipline.Undefined:973); invocata inSave—:773-775. - Flag: controllo UI-only. Nessuna di queste colonne ha vincolo DB corrispondente (vedi BR-BIM-009) → validazioni bypassabili dai path che non passano dalla scheda (IFC/plugin, BR-BIM-017).
BR-BIM-009 — Il DB non presidia i campi di business (solo PK)
- Regola: l'unico vincolo dichiarativo su
BIM_PROJECTSè la primary keyPK_BIM_PROJECTS_IDPROJECTsuIDPROJECT(più l'indice unique di spazio BR-BIM-003 e il LOB index di sistema). Tutte le colonne di business (NAME,ROOTPATH,ENTITY,ENTITYID,PROJECTTYPE,SOURCETYPE, …) sono nullable e senza CHECK. - Tipo: validation (assenza di presidio) · Enforcement: DB · Confidence: VERIFIED
- Evidenza (DB):
USER_CONSTRAINTS(BIM_PROJECTS)→ soloPK_BIM_PROJECTS_IDPROJECT(P);USER_TAB_COLUMNS: soloIDPROJECTèNOT NULL, tutte le altreY(nullable). - Flag: l'integrità dei campi obbligatori dipende interamente dalla UI (BR-BIM-008); un INSERT via
BIM_UPDATEPROJECTconNAME/ROOTPATH/ENTITYNULL sarebbe accettato dal DB.
BR-BIM-010 — ProjectType non impostato sul create interattivo
- Regola: sul ramo create del path interattivo
BimProject.ProjectTypenon viene mai impostato, quindi resta il default dell'enumBimProjectType.UNDEFINEDe viene inviato come stringa"UNDEFINED". Il default di colonna DBPROJECTTYPE = 'REVIT'non si applica, perché la INSERT passa esplicitamente il valore. - Tipo: config-flag · Enforcement: mixed · Confidence: SUPPORTED
- Evidenza (BL): ramo create (
:838-847) valorizzaName,Path,SourceType,FederationType,EntityID,Entity,ModifiedBy,Modifiedma nonProjectType; default enumUNDEFINED = 0—InfocadServer/BIMSharedObjects/BimProjectType.cs:13; inviobp.ProjectType.ToString()—BIM_DAL.cs:159. - Evidenza (DB):
USER_TAB_COLUMNS(BIM_PROJECTS):PROJECTTYPEdefault'REVIT'(ignorato per INSERT con valore esplicito). - Flag: discrepanza default tra applicazione (
UNDEFINED) e DB (REVIT); il tipo progetto sul path interattivo non riflette il default atteso.FederationTypeha invece default esplicitoNonenel DTO (BimProject.cs:46).
BR-BIM-011 — Immutabilità IDPROJECT: intento non enforced su UPDATE (dead code)
- Regola: il trigger
BIM_PROJECTScontiene un ramoIF UPDATING THEN IF NOT(:new.IDPROJECT = :old.IDPROJECT) THEN RAISE ... RAISE_APPLICATION_ERROR(-20000, 'Non posso cambiare il contatore per la tabella BIM_PROJECTS'). Tuttavia il trigger fira SOLO su INSERT (TRIGGERING_EVENT = 'INSERT'): il ramoIF UPDATINGè dead code e non viene mai eseguito. - Tipo: validation · Enforcement: DB · Confidence: VERIFIED
- Evidenza (DB):
USER_TRIGGERS(BIM_PROJECTS):TRIGGERING_EVENT = 'INSERT',TRIGGER_TYPE = 'BEFORE EACH ROW'; corpo con blocchiIF INSERTINGeIF UPDATING(quest'ultimo irraggiungibile). - Flag: corregge la documentazione di flusso (FLOW-BIM-001 indicava il trigger
BEFORE INSERT/UPDATEe l'ORA-20000come guardia attiva su UPDATE). In praticaIDPROJECTnon è comunque modificabile viaBIM_UPDATEPROJECTperché l'UPDATE usaWHERE IDPROJECT = PIDPROJECTe non tocca la colonna; la protezione trigger è però inattiva rispetto a UPDATE diretti fuori procedura. Codice morto + magic number-20000.
BR-BIM-012 — Lock ottimistico applicativo
- Regola: i comandi di editing (Modifica/Elimina/gestione file) passano da
ManageEditing(comando, BIMProjectsEntity, id, ...)della baseEntityBase/EntityBaseEx, che applica il lock ottimistico applicativo sull'entitàBIMProjects(stesso meccanismo del dominio Property, BR-PROP-015). - Tipo: state-transition · Enforcement: BL · Confidence: SUPPORTED (chiamata verificata; interni della base non ispezionati in questo task)
- Evidenza (BL):
ManageEditing(e.Item.Value, SystemFields.BIMProjectsEntity, this.ID_Entity.ToString(), ref RadWindowManager1);inRadToolBar1_ButtonClick—BIMProjectDetails.ascx.cs:170,176; baseEntityBaseEx.vb:8-9(Inherits CommonWeb.EntityBase). Esiste inoltre un lock DB dedicatoBIM_SETPROJECTLOCKED(BIM_DAL.SetProjectLocked,:573). - Flag: enforced solo in BL per il lock applicativo → non protegge i path che non passano dalla scheda (IFC/plugin).
BR-BIM-013 — Visibilità toolbar pilotata dall'ACL di progetto (UI)
- Regola: la visibilità dei pulsanti dipende dall'ACL del progetto: Elimina visibile solo se
ACL.CanDelete; Modifica solo secanEdit(=ACL.CanUpdatee progetto non cancellato); i campi (nome, path, dropdown) sono editabili solo seIsEdit && canEdit. In assenza di permessi specifici l'ACL è full (tutto consentito). - Tipo: permission · Enforcement: UI · Confidence: VERIFIED
- Evidenza (UI):
canEdit = falseseCurrentProject.Cancelled < DateTime.Now || !CurrentProject.ACL.CanUpdate—BIMProjectDetails.ascx.cs:505-507;Controls[0].Visible = !IsEdit && ACL.CanDelete(Elimina):512,Controls[2].Visible = !IsEdit && canEdit(Modifica):514; abilitazione campi:524-529. ACL di default full quando nessun permesso specifico —BimProject.cs:97(new BimACL(true,true,true,true)). - Flag: controllo UI-only (nasconde/disabilita pulsanti) — non è la barriera effettiva di scrittura; ACL default aperto (fail-open) se il progetto non ha permessi configurati.
BR-BIM-014 — Guardia cancellazione file figlio
- Regola: un file di progetto può essere cancellato dalla scheda solo se: non già cancellato (
Cancelled >= Now), l'utente haACL.CanDelete, e il file non èIsLocked, non èIsUsed, non èIsRegistered. Altrimenti alert "Impossibile eliminare il file selezionato…". - Tipo: permission/validation · Enforcement: BL (code-behind) · Confidence: VERIFIED
- Evidenza (BL):
if (itm.Cancelled < DateTime.Now || !(itm.ACL.CanDelete) || itm.IsLocked || itm.IsUsed || itm.IsRegistered) candelete = false;—BIMProjectDetails.ascx.cs:227; guardia analoga per cancellazione progetto (solo seItems.Count == 0e nessun file usato/registrato/locked):359-362. - Flag: file
IsRegisterednon viene rimosso ma solo (commentato) marcato cancellato — la cancellazione fisica riguarda solo i file non registrati (:236-241).
BR-BIM-015 — Default Schema "RVT" sul file figlio
- Regola: in
UpdateProjectData, sebpd.Schemaè vuoto/whitespace, viene forzato a"RVT"prima della chiamata aBIM_UPDATEPROJECTDATA. - Tipo: config-flag (default) · Enforcement: BL · Confidence: VERIFIED
- Evidenza (BL):
if (string.IsNullOrWhiteSpace(bpd.Schema)) bpd.Schema = "RVT";—InfocadServer/BIMDAL/OracleODP/BIM_DAL.cs:433-434. - Flag: valore hard-coded
"RVT"(schema Revit assunto come default per i file di progetto).
BR-BIM-016 — Side effect post-save: upsert file figli e cancellazione fisica
- Regola: solo se
returnID > 0, il code-behind iteraCurrentProject.ItemschiamandoUpdateProjectData(i nuovi item conIdData <= 0sono normalizzati anullper farli generare) e cancella fisicamente (DeleteMode.Phisical) i file elencati inListIdFileToDelete. Al termineReload()mantiene solo gli item conIdData > 0e riporta la scheda in sola lettura. - Tipo: state-transition (side effect) · Enforcement: BL · Confidence: VERIFIED
- Evidenza (BL):
if (itm.IdData <= 0) itm.IdData = null; ... UpdateProjectData(itm)—BIMProjectDetails.ascx.cs:867-871;if (id > 0) BIMCtrl.DeleteProjectData(UserName, id, DeleteMode.Phisical);—:882;Reload()filtraItems.Where(x => x.IdData > 0)—:921. - Flag: cancellazione fisica (non logica) dei file figli flaggati; gli errori sui singoli item sono catturati e notificati ma non interrompono il ciclo (
:873-876,884-887).
BR-BIM-017 — Path IFC/plugin: stessa procedura, ritorno diverso, nessuna validazione UI
- Regola: l'ingestion programmatica (Revit/IFC) usa
IFCController.UpdateProject→IFC_DAL.UpdateProject→ stessaBIM_UPDATEPROJECT, ma con interpretazione del ritorno propria: su update (IdProject > 0) mantiene l'id originale sePOUT > 0, altrimenti assumePOUT(0/-1/-100); su create ritorna il nuovo id. Questo path non esegue le validazioni UI di BR-BIM-008 né il lock/ACL della scheda. - Tipo: state-transition · Enforcement: BL · Confidence: VERIFIED · Customer-specific: sì (variante integrazione plugin)
- Evidenza (BL):
p.IdProject = p.IdProject > 0 ? ((outval > 0) ? p.IdProject : outval) : outval;—InfocadServer/BIMDAL/OracleODP/IFC_DAL.cs:159-163; controllerIFCController.UpdateProject—InfocadServer/BIMControllers/Controllers/IFCController.cs:33-36; call-siteBIM_UPDATEPROJECTunica per questo path —IFC_DAL.cs:157. - Flag: canale che bypassa le validazioni UI (BR-BIM-008) e i controlli di lock/permesso (BR-BIM-012/013), presidiato solo dai vincoli DB (di fatto solo BR-BIM-002/003, dato BR-BIM-009). Interpretazione ritorno divergente da BIM_DAL (BR-BIM-005), che ritorna sempre
POUTgrezzo.
Sintesi dei rischi e flag
Regole enforced SOLO nell'UI (rischio: bypassabili da altri path)
- BR-BIM-008 (validazione campi progetto/file) e BR-BIM-013 (visibilità toolbar per ACL): cosmetiche/lato scheda; il path IFC/plugin (BR-BIM-017) le salta completamente e il DB non le ricopre (BR-BIM-009).
Regole enforced SOLO in SQL (invisibili al codice applicativo)
- BR-BIM-002 (sequenza id), BR-BIM-003 (unique per spazio,
POUT=-100), BR-BIM-004 (esiti-1/-100conWHEN OTHERSsilente), BR-BIM-011 (trigger, con ramo UPDATE dead code).
Regole enforced SOLO in BL (non presidiate dal DB)
- BR-BIM-012 (lock ottimistico) e BR-BIM-014 (guardia cancellazione file): nessuna contropartita DB → non proteggono i path che non passano dalla scheda.
Magic number / valori e id hard-coded
POUT = -1/-100(BR-BIM-004);ORA-20000nel trigger (BR-BIM-011);Schema = "RVT"(BR-BIM-015); default DBPROJECTTYPE='REVIT'vs enumUNDEFINED(BR-BIM-010);SOURCETYPEdefault DB1.
Flag / default nascosti e discrepanze
- BR-BIM-010 —
ProjectTypenon impostato su create ⇒"UNDEFINED"memorizzato al posto del default'REVIT'. - BR-BIM-007 —
MODIFIEDBYin maiuscolo solo su create. - BR-BIM-011 — trigger con evento solo INSERT: la protezione su UPDATE è codice morto (correzione al FLOW-BIM-001).
- BR-BIM-004 —
WHEN OTHERS THENmaschera la causa reale dell'errore.
Varianti cliente/integrazione-specifiche
- BR-BIM-017 (path IFC/plugin): flusso di ingestion Revit/IFC con logica di ritorno propria e senza validazioni UI; il contenuto del CLOB
SETTINGS(BR-BIM-006) varia per tipo progetto/tenant.
Open questions
- Semantica esatta dell'indice unique
UK_BIM_PROJECT_SPACEincludendoCANCELLED: conferma che l'intento sia "un solo progetto attivo per spazio" e comportamento su più progetti cancellati con stessa data (BR-BIM-003). - Motivo del ramo
IF UPDATINGnel triggerBIM_PROJECTSse l'evento è solo INSERT: residuo storico o refuso? (BR-BIM-011). - Se il
ProjectType"UNDEFINED"memorizzato sul create interattivo sia intenzionale o un difetto (impatto su filtri/lettura per tipo) (BR-BIM-010). - Comportamento desiderato quando l'UPDATE non colpisce righe (
ROWCOUNT=0⇒returnID=0⇒ "Progetto non individuato"): distinzione da errore reale (BR-BIM-005). - Internals di
ManageEditing/lock perBIMProjectse presidio dei path programmatici (BR-BIM-012). - Sorgente di
BIM_UPDATEPROJECTDATA/BIM_DELETEPROJECT(file/versioni figli) non ispezionato in questo task. - Comportamento in configurazioni PROD (osservato solo su ambiente TEST38).