Table of Contents

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 Oracle BIM_UPDATEPROJECT (upsert pilotato da PIDPROJECT), sia dal path interattivo (scheda BIMProjectDetails.ascx) sia dal path programmatico IFC/plugin (IFCControllerIFC_DAL).

Sistema: Infocad (Descor) — backend Oracle INFOCAD_TEST38, ASP.NET Web Forms (C#, modulo BIMCenterWeb) + controller server Descor.BIM.BIMControllers risolti via .NET Remoting (Service_BIM, MarshalByRefObject); nessun ORM (stored procedure via DAL Execute*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) su INFOCAD_TEST38, limitatamente a BIM_UPDATEPROJECT, alla tabella BIM_PROJECTS, al suo trigger e alla sequenza SEQ_BIM_PROJECTS. Nessuna lettura di dati applicativi, nessuna DML/DDL. Le righe della procedura sono indicate come BIM_UPDATEPROJECT:NNN (numerazione USER_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 IDPROJECT su 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_INDEXPOUT=-100, WHEN OTHERSPOUT=-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 UPDATE WHERE IDPROJECT = PIDPROJECT.
  • Tipo: state-transition · Enforcement: mixed (BL propaga l'id, DB decide) · Confidence: VERIFIED
  • Evidenza (BL): ramo create quando CurrentProject == null || CurrentProject.IdProject < 0 con bimProjectNew.IdProject = 0InfocadWeb/WebMachine/CASSANDRA/BIMCenterWeb/UserControls/BIMProjectDetails.ascx.cs:835,838,847; ramo update BIMCtrl.UpdateProject(this.CurrentProject):850-857.
  • Evidenza (DB): IF (PIDPROJECT IS NULL OR PIDPROJECT <= 0) THEN INSERT ... ELSE UPDATE ... WHERE IDPROJECT = PIDPROJECTBIM_UPDATEPROJECT:16-35.

BR-BIM-002 — Identity IDPROJECT da SEQ_BIM_PROJECTS (trigger)

  • Regola: alla INSERT, se IDPROJECT è NULL, il trigger BEFORE INSERT BIM_PROJECTS lo valorizza da SEQ_BIM_PROJECTS.NEXTVAL. L'id prodotto è restituito dalla INSERT ... 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; — trigger BIM_PROJECTS (USER_TRIGGERS, BEFORE EACH ROW, evento INSERT); RETURNING IDPROJECT INTO POUTBIM_UPDATEPROJECT:19; sequenza SEQ_BIM_PROJECTS presente in USER_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_SPACE su (ENTITY, ENTITYID, CANCELLED). Poiché la INSERT imposta CANCELLED = NULL, ne consegue che non possono esistere due progetti attivi (non cancellati) sullo stesso spazio (ENTITY+ENTITYID). Il tentativo solleva DUP_VAL_ON_INDEX, catturata dalla procedura con POUT = -100.
  • Tipo: validation · Enforcement: DB · Confidence: VERIFIED
  • Evidenza (DB): USER_INDEXES/USER_IND_COLUMNS su BIM_PROJECTS: UK_BIM_PROJECT_SPACE UNIQUE → colonne ENTITY, ENTITYID, CANCELLED; INSERT con CANCELLED = NULLBIM_UPDATEPROJECT:18-19; handler WHEN DUP_VAL_ON_INDEX THEN POUT := -100BIM_UPDATEPROJECT:42.
  • Evidenza (BL): sul create la coppia spazio è valorizzata da EntityID = this.ID_Parent, Entity = this.ParentEntityTypeBIMProjectDetails.ascx.cs:843-844.
  • Flag: regola enforced solo in SQL, non ripetuta lato applicativo → l'errore risale come -100 generico (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 solo BIM_PROJECTS come 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_INDEXPOUT = -100, qualsiasi altra eccezione (WHEN OTHERS) ⇒ POUT = -1. Su UPDATE riuscita POUT := SQL % ROWCOUNT (tipicamente 1).
  • 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 THEN maschera l'errore (nessun RAISE): 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 returnID di UpdateProject è interpretato dal code-behind così: > 0 ⇒ successo (id nuovo su create; su update è il ROWCOUNT, tipicamente 1); <= 0 ⇒ salvataggio fallito con messaggio "Progetto non individuato" e return 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 create this.CurrentProject.IdProject = returnID;:849.
  • Flag: su UPDATE che non colpisce righe (ROWCOUNT = 0, es. IDPROJECT inesistente) 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 CLOB PSETTINGS, memorizzato in BIM_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 IFC IFC_DAL.cs:136); colonna SETTINGS CLOBUSER_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.Now e ModifiedBy = 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; update this.CurrentProject.ModifiedBy = this.UserName; this.CurrentProject.Modified = DateTime.Now;:855-856.
  • Flag: incoerenza tra i due rami (ToUpper() solo su create) → il valore di MODIFIEDBY non è normalizzato in modo uniforme. La colonna MODIFIED ha default DB SYSDATE ma è 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+FilePath non vuoti, Entity+EntityID valorizzati, 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, location ID_Parent<=0 :943, file name :952, file path :959, file location :966, disciplina x.Discipline == BimDiscipline.Undefined :973); invocata in Save: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 key PK_BIM_PROJECTS_IDPROJECT su IDPROJECT (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) → solo PK_BIM_PROJECTS_IDPROJECT (P); USER_TAB_COLUMNS: solo IDPROJECT è NOT NULL, tutte le altre Y (nullable).
  • Flag: l'integrità dei campi obbligatori dipende interamente dalla UI (BR-BIM-008); un INSERT via BIM_UPDATEPROJECT con NAME/ROOTPATH/ENTITY NULL sarebbe accettato dal DB.

BR-BIM-010 — ProjectType non impostato sul create interattivo

  • Regola: sul ramo create del path interattivo BimProject.ProjectType non viene mai impostato, quindi resta il default dell'enum BimProjectType.UNDEFINED e viene inviato come stringa "UNDEFINED". Il default di colonna DB PROJECTTYPE = 'REVIT' non si applica, perché la INSERT passa esplicitamente il valore.
  • Tipo: config-flag · Enforcement: mixed · Confidence: SUPPORTED
  • Evidenza (BL): ramo create (:838-847) valorizza Name, Path, SourceType, FederationType, EntityID, Entity, ModifiedBy, Modified ma non ProjectType; default enum UNDEFINED = 0InfocadServer/BIMSharedObjects/BimProjectType.cs:13; invio bp.ProjectType.ToString()BIM_DAL.cs:159.
  • Evidenza (DB): USER_TAB_COLUMNS(BIM_PROJECTS): PROJECTTYPE default '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. FederationType ha invece default esplicito None nel DTO (BimProject.cs:46).

BR-BIM-011 — Immutabilità IDPROJECT: intento non enforced su UPDATE (dead code)

  • Regola: il trigger BIM_PROJECTS contiene un ramo IF 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 ramo IF 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 blocchi IF INSERTING e IF UPDATING (quest'ultimo irraggiungibile).
  • Flag: corregge la documentazione di flusso (FLOW-BIM-001 indicava il trigger BEFORE INSERT/UPDATE e l'ORA-20000 come guardia attiva su UPDATE). In pratica IDPROJECT non è comunque modificabile via BIM_UPDATEPROJECT perché l'UPDATE usa WHERE IDPROJECT = PIDPROJECT e 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 base EntityBase/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); in RadToolBar1_ButtonClickBIMProjectDetails.ascx.cs:170,176; base EntityBaseEx.vb:8-9 (Inherits CommonWeb.EntityBase). Esiste inoltre un lock DB dedicato BIM_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 se canEdit (= ACL.CanUpdate e progetto non cancellato); i campi (nome, path, dropdown) sono editabili solo se IsEdit && canEdit. In assenza di permessi specifici l'ACL è full (tutto consentito).
  • Tipo: permission · Enforcement: UI · Confidence: VERIFIED
  • Evidenza (UI): canEdit = false se CurrentProject.Cancelled < DateTime.Now || !CurrentProject.ACL.CanUpdateBIMProjectDetails.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 ha ACL.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 se Items.Count == 0 e nessun file usato/registrato/locked) :359-362.
  • Flag: file IsRegistered non 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, se bpd.Schema è vuoto/whitespace, viene forzato a "RVT" prima della chiamata a BIM_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 itera CurrentProject.Items chiamando UpdateProjectData (i nuovi item con IdData <= 0 sono normalizzati a null per farli generare) e cancella fisicamente (DeleteMode.Phisical) i file elencati in ListIdFileToDelete. Al termine Reload() mantiene solo gli item con IdData > 0 e 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() filtra Items.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.UpdateProjectIFC_DAL.UpdateProjectstessa BIM_UPDATEPROJECT, ma con interpretazione del ritorno propria: su update (IdProject > 0) mantiene l'id originale se POUT > 0, altrimenti assume POUT (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; controller IFCController.UpdateProjectInfocadServer/BIMControllers/Controllers/IFCController.cs:33-36; call-site BIM_UPDATEPROJECT unica 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 POUT grezzo.

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/-100 con WHEN OTHERS silente), 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-20000 nel trigger (BR-BIM-011); Schema = "RVT" (BR-BIM-015); default DB PROJECTTYPE='REVIT' vs enum UNDEFINED (BR-BIM-010); SOURCETYPE default DB 1.

Flag / default nascosti e discrepanze

  • BR-BIM-010ProjectType non impostato su create ⇒ "UNDEFINED" memorizzato al posto del default 'REVIT'.
  • BR-BIM-007MODIFIEDBY in 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-004WHEN OTHERS THEN maschera 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_SPACE includendo CANCELLED: 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 UPDATING nel trigger BIM_PROJECTS se 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=0returnID=0 ⇒ "Progetto non individuato"): distinzione da errore reale (BR-BIM-005).
  • Internals di ManageEditing/lock per BIMProjects e 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).