• Biblioteca EQUILIBRIUM equilibrium-system.com

CRISTAL DE LA CONSTRUCCIÓN

CRISTAL DE LA CONSTRUCCIÓN

A continuación se examinan las obras de construcción como los sistemas Uslov, Robert y Crystal. Es un modelo cómodo si queremos transformar la industria no sólo en un conjunto de procesos, sino en una arquitectura de sentido, digital e institucional gestionada.

La lógica básica del modelo

Los puntos de concentración de las funciones, los recursos, las decisiones, los datos y las responsabilidades son los puntos de concentración de las funciones, los recursos y las decisiones.

Las costillas son conexiones entre los nudos: corrientes de materiales, dinero, documentos, equipos, tecnología, personas y control.

El cristal JIU es una estructura holística en la que todos los nudos y costillas no se reúnen caóticamente, sino según las leyes de la simetría, la jerarquía, la transparencia y el desarrollo.

En otras palabras:

La construcción como grafo

El sector de la construcción no es una sola cadena, sino un grafo de múltiples capas.

Tiene:

Y las costillas entre ellas son:

Esquemas de construcción

Escondites de diseño. Es el comienzo de cualquier objeto.

Nodos clave:

Su función es:

Responder a la pregunta: qué construir, por qué construir, para quién construir, con qué medios y en qué lógica del territorio.

Esqueletos de regulación. Sin ellos, el sistema no es legítimo.

Esto incluye:

Su función es:

Garantizar la admisibilidad, la seguridad, la conformidad y el marco jurídico.

Esquemas de diseño

Son los nudos del nacimiento del uniforme.

Esto incluye:

Su función es:

Convertir el diseño en un sistema exacto de decisiones, planos, parámetros, tamaños y limitaciones.

Recursos y suministros

Sin ellos, el objeto no se materializará.

Esto incluye:

Su función es:

Construir todo lo necesario en cuanto a tamaño, duración, calidad y precio.

Unidades de trabajo

Es el centro de la creación física.

Esto incluye

Su función es reunir un objeto en la realidad.

Servicios financieros

La construcción sin un marco financiero se está convirtiendo rápidamente en un caos.

Espejos:

Su función es:

Garantizar la sostenibilidad de las corrientes monetarias y la previsibilidad de la ejecución.

Unidades de explotación

En realidad, el objeto no se construye para construir, sino para vivir después de construir.

Espejos:

Su función es:

Convertirla en un entorno operativo.

Espejos digitales. Este es el núcleo de la futura industria.

Espejos:

Su función es hacer que el sistema sea transparente, manejable y prejuiciado.

Ruedas de construcción

Ahora lo importante es que los nodos sin costillas son solo puntos muertos.

Cosas inteligentes.

Conectan:

Esto responde a la pregunta de por qué esta construcción tiene derecho a serlo.

Rhodes legales

Conectan:

Son las costillas de la legitimidad.

Rhodes de información

Conectan:

Son costillas de datos.

Costuras financieras

Conectan:

Son costillas de valor y confianza.

Rótulas materiales

Conectan:

Son las costillas de la creación física.

Ruedas de gestión

Conectan:

Son costillas de coordinación.

Las costillas de calidad. Conectan:

Son costillas de seguridad.

Retroalimentación

Conectan:

Son costillas de la evolución.

Cristal de construcción

Ahora, ¿qué es el cristal?

El cristal no es solo una red. Se trata de un sistema armónico de múltiples capas, en el que cada uno de los nodos tiene lugar, función, grado de comunicación y responsabilidad.

En la construcción de un cristal es:

Un modelo único de la industria espacial y digital en que:

Geometría del cristal de la construcción

Distribuir el cristal por lo menos en 7.

La Granja 1. Significado

Lo que se construye y por qué.

La Granja 2. Espacio

¿Dónde, en qué territorio, en qué contexto?

La Granja 3. Derecho

Sobre qué base y con qué reglas.

La Granja 4. Recursos

De qué, quién y en qué se construyen.

La Granja 5. Producción

¿Cómo exactamente el objeto se reúne por etapas?

La Granja 6. Finanzas. Con qué dinero y con qué estabilidad.

La Granja 7. Ciclo de vida

Como el objeto vive después de la entrada. Añadiendo un núcleo digital, el cristal del nivel 8, donde el entorno digital conecta todas las demás líneas.

El núcleo del cristal

Cualquier sistema cristalino debe tener un núcleo.

Para la construcción, el núcleo debe ser:

Operador digital único de servicios de construcción

No sustituye a todos los participantes, sino que se convierte en:

Es el que convierte la industria de la selección de participantes en un único cristal de construcción.

Fórmula del cristal de construcción

Cristal de construcción = nudos de Rheebr

Donde:

Estructura práctica de los nodos

Contorno A. Estado

Espejos:

Contorno B. Desarrollo y órdenes de compra

Espejos:

Contorno C. Diseño

Espejos:

Contorno D. Producción

Espejos:

Contorno E. Explotación

Espejos:

Contorno F. Plataforma digital

Espejos:

¿Cuáles son las costillas más críticas?

En términos duros, la mayoría de las veces la industria no se derrumba por falta de nudos, sino por las malas costillas.

Las costillas más problemáticas suelen ser:

Así que el objetivo principal de la reforma no es simplemente crear nuevos nudos, sino reconstruir las costillas.

Cristal del ciclo de vida del objeto

Puedes imaginar un objeto como un pequeño cristal:

Iniciación. Una idea, una necesidad, un terreno, un modelo.

Diseño conceptual, cálculos, BIM, estimaciones.

Armonía. Pruebas, permisos, conexiones.

Construcción. Entrega, trabajo, control, actos.

Entrar. Comprobaciones, documentación, lanzamiento.

Vigilancia, mantenimiento, retroalimentación.

Transformación

Reconstrucción, modernización, reutilización de datos. Ese es el cristal del ciclo de vida.

En el lenguaje metaarquitectónico

Entonces puedes decir:

Los nudos son órganos del organismo de construcción. Las costillas son sus vasos, nervios y canales. El cristal JIU es su esqueleto, su forma, su genoma y la ley de la armonía interna. Sin nudos no hay función. Sin costillas no hay coordinación. Sin el cristal, no hay integridad.

Conclusión de la gestión

Para el concepto de un único operador digital de servicios de construcción, esto significa que el operador no debe construirse como un sitio web, no como un conjunto de servicios y no como un mercado en sentido estricto, sino como:

Plataforma cristalina de la industria, en la que:

Así que el portal debe ser capaz de mostrar:

Textos listos para su inclusión en el concepto

Puede insertar así:

La industria de la construcción se considera un sistema de red cristalina consistente en nudos, costillas y un núcleo digital integrado. Los núcleos representan a los participantes, los recursos, las funciones y la etapa del ciclo de vida del objeto. Las costillas reflejan los vínculos materiales, financieros, de información, jurídicos y de gestión que existen entre ellas. El cristal de la industria se forma como una arquitectura holística en la que todos los elementos están interrelacionados, estandarizados, transparentes y manejados en tiempo real. Sobre esta base, se crea el Operador Digital Unificado de Servicios de Construcción como integrador de sistemas para la coordinación, la rastreabilidad y el desarrollo evolutivo del complejo de construcción.

La versión más fuerte de este modelo

Si terminamos la idea, podemos hacer 3:

Esto ya no es sólo una descripción, sino una base para:



Cuadro: Espejos de Röbra ○ Funciones Servicios digitales

1. Contorno: Diseño y iniciación

Local

Ruebra (comunicaciones)

Función

Servicios digitales

Empleador

Inversionista, diseñador

Creación de la misión

LC del cliente, diseñador de TZ

Inversionista

Banque, pour la développement

Financiación

Finmodel, ROI Calculadora

Tierras

- Inventario, Grad Plan

Base espacial

Geoanalista, GIS

Concepto

○ Diseño

La idea del objeto

Diseño de conceptos, análisis de la demanda de AI

Estado

Estrategia, región

Prioridades de desarrollo

Registro de programas, proyectos nacionales

2. Contorno: Reglamentación

Local

Ruebra

Función

Servicios digitales

Marco normativo

○ Proyecto

Reglas

Base de normas (SIG), control automático

Expert

- Diseñador

Verificación

Evaluación digital

Autorizaciones

○ Objeto

Legalización

ERS (sistema único de autorización)

Órganos de supervisión

○ Construcción

Supervisión

Control en línea, hojas de datos

Catástrofe

○ terreno

Contabilidad

Integración con Rosrestra

3. Contorno: Diseño

Local

Ruebra

Función

Servicios digitales

Arquitecto

- Empleador

Imágenes

BIM/TIM

Proyección de genes

- Contratista

Coordinación

CDE (medio de datos único)

Ingeniería

○ Red

Decisiones técnicas

Módulos de cálculo

Estimaciones

• Finanzas

Valor

Automóviles

BIM modelo

○ Construcción

Doble digital

Almacén BIM

4. Contorno: Recursos y suministros

Local

Ruebra

Función

Servicios digitales

Proveedores

○ Construcción

Materiales

Marketplace

Productores

○ Logística

Producción

Catálogo de productos

Almacenes

- La plataforma

Almacenamiento

WMS

Logistica

○ Objeto

Entrega

Tracking

Tecnología

- Contratista

Mecanización

Contabilidad de la tecnología

5. Contorno: Construcción

Local

Ruebra

Función

Servicios digitales

Contratista

- Empleador

Gobernanza

ERP Construcción

Subcontratistas

:: Contratación pública

Trabajos

Lista de contratistas

Superficie

- Recursos

Ejecución

Controlador de construcción

Supervisión

- Calidad

Verificación

Técnico móvil

Plan gráfico

- El hecho

Calendario

Plan de análisis

6. Contorno: Finanzas

Local

Ruebra

Función

Servicios digitales

Banco

○ Proyecto

Financiación

Financiación de proyectos

Tesorería

- Continuidad

Pagos

Módulo de tesorería

Escrou

○ Objeto

Seguridad

La cuenta escrota

Contratos

○ Participantes

Obligaciones

Contratos inteligentes

Seguros

○ Riesgos

Protección

Risk management

7. Contorno: Operaciones

Local

Ruebra

Función

Servicios digitales

CP

○ Objeto

Gobernanza

Sistema de funcionamiento

Usuario

○ CP

Remisión

Aplicación móvil

Suministro de recursos

○ Objeto

Agua, etc.

IoT Contabilidad

Vigilancia

- sistema

Supervisión

Detectores, IoT

Reparación

○ Conversión

Apoyo

Plan de reparaciones

8. Contorno: núcleo digital (Chrystal)

Local

Ruebra

Función

Servicios digitales

Plataforma única

○ Todos los nodos

Integración

Portal

Registro de objetos

- ciclo de vida

Contabilidad

ID del objeto

Lista de participantes

Mercado

Transparencia

Calificación

Pasaporte digital

○ Objeto

Datos

Pasaporte del objeto

Analista AI

- Datos

Proyección

Analista de prevención

Marketplace

- Recursos

Transacciones

Plataforma comercial

Cómo se convierte en un CRISTAL

Ahora lo más importante no es una simple tabla, sino una lógica:

Cada uno de los nudos digitalizados es un perfil, datos, historia.

Cada costilla es transparente:

  • ¿Quién está conectado con quién?
  • en qué condiciones
  • con qué resultado

Todo el sistema se observa en tiempo real

Es un sistema operativo de construcción.

Conclusión clave de la gestión

En la actualidad, la industria:

  • Los nudos son:
  • Las costillas son caóticas.
  • Crystal no disponible

Nuestro modelo hace:

  • Nodos estructurados
  • las costillas de control
  • Cristal controlado

○ ¿Qué da eso en la práctica?

La caja negra se ha ido. Puedes ver dónde está el dinero, dónde está el material, dónde está el retraso

La corrupción está cayendo porque las costillas son transparentes.

Acelerando la construcción de ° No hay brechas entre los nudos

Aparece la predicción de un sistema de vídeo de los problemas antes de que ocurran.

Siguiente paso (recomendado)

Esquema (cristo visual) - ¿Cómo se ve el sistema?

Arquitectura de la plataforma - Módulos, API, funciones

MVP Portal al menos:

  • Lista de participantes
  • Marketplace
  • Pasaporte digital del objeto

○ CRIESTAL DE CONSTRUCCIÓN

(metaarquitectura industrial)

La esencia del cristal. El cristal no es un patrón. Es un sistema vivo y autoconcordado en el que:

  • Cada elemento tiene lugar,
  • Cada conexión tiene sentido.
  • Cada operación deja una huella digital,
  • Todo el sistema se desarrolla mediante la retroalimentación.

En la construcción, esto significa que la industria se está convirtiendo en un solo organismo y no en un mercado fragmentado.

Geometría del cristal

Imagina el cristal como un multidimensional con un núcleo y capas.

JADRO. Un solo operador digital de construcción. Funciones:

  • la integración de todos los nodos,
  • Almacenamiento de datos;
  • la coordinación de los procesos
  • Analista y Pronóstico
  • - el control de la transparencia.

ESLOVA DE INTERNA (7). Estos son los campos estructurales del cristal:

Significado

  • ¿Por qué construir?
  • ¿A quién le importa?

Espacio

  • donde estamos construyendo
  • contexto territorial

Derecho

  • Normas y reglas

Recursos

  • materiales, tecnología, personas

Producción

  • procesos de construcción

Finanzas

  • Efectivo y pagos

Ciclo de vida

  • explotación y desarrollo

EL MIÉRCOLES EXTERNO

  • Estado
  • Mercado
  • la sociedad
  • Medio ambiente
  • Tecnología

Es con lo que el cristal interactúa constantemente.

Rejilla de cristal (iniciativa clave)

El cristal no es un nudo, sino una red de conexiones.

Principales tipos de costillas:

  • ○ Información
  • ○ Finanzas
  • ○ material
  • ○ Legal
  • - Gestión
  • ○ retroinformación

○ Si al menos un tipo de conexión es débil, el cristal empieza a descomponerse.

Avispón de cristal (gestión)

El cristal tiene 3 ejes principales:

EL EJERCICIO

La idea de un proyecto de construcción de un proyecto de explotación de un proyecto de transformación

Eje de datos

Cada acción se registra y está disponible

Eje de responsabilidad

Cada decisión tiene un autor.

Estructura fractal

El más fuerte es el cristal más pequeño.

Y está repitiendo la estructura de toda la industria. Es decir:

  • Casa = cristal
  • Área = cristal
  • Ciudad = cristal
  • País = cristal

Eso da escalabilidad sin pérdida de control.

El doble digital del cristal. En la plataforma parece que cada objeto tiene:

  • ID
  • Pasaporte digital
  • BIM modelo
  • Historia de las decisiones
  • La huella financiera
  • Situación en tiempo real

- Convierte la construcción de un proceso en un sistema observado.

El comportamiento del cristal. El cristal debe ser capaz de:

1. Autodiagnóstico

  • donde los retrasos
  • donde los riesgos
  • donde las fracturas

2. Samoa

  • Reasignación de recursos
  • cambios en los gráficos

3. Autoaprendizaje

  • Análisis de proyectos anteriores
  • en el futuro

Principales defectos de la industria actual

# No hay cristal # # es un caos #

  • No están conectados
  • Datos desmembrados
  • Las soluciones no son transparentes
  • La responsabilidad es borrosa
  • El dinero se pierde.
  • Fechas de vencimiento

No es un problema humano. Es un problema de estructura.

Lo que hace el cristal

○ Conecta todo al sistema

  • Proyecto de construcción
  • El dinero del trabajo
  • - los hechos
  • Operaciones de diseño

○ Hace que el sector sea manejable

¿Ves?

  • donde hay un problema
  • ¿Quién responde?
  • ¿Qué hacer?

○ Proyección. El sistema empieza a decir: "Este objeto se derrite en 3 meses"

Arquitectura de la plataforma (escala de cristal)

Módulo 1. Lista

  • objetos
  • Participantes
  • Recursos

Módulo 2. Marketplace

  • materiales
  • Contratistas
  • Tecnología

Módulo 3. Gestión del proyecto

  • Plazos
  • tareas
  • Supervisión

Módulo 4. Finanzas

  • Pagos
  • Estimaciones
  • Supervisión

Módulo 5. BIM*Doble digital*

  • Modelo de objeto

Módulo 6. Análisis y AI

  • Proyección
  • Riesgos
  • Optimización

Fórmula de cristal

Se puede registrar como principio básico: Cristal de construcción (escala de Ryubra) + Datos + Tiempo + Responsabilidad

Lo más importante (sin ilusiones)

Si realmente quieres cambiar la industria, tienes que hacerlo.

No hacer otro portal

○ No hacer simplemente comercialización

- Hacer un sistema operativo de construcción. Esta es la formulación del nivel de la estrategia:

El cristal de la construcción es una arquitectura digital e institucional integrada de la industria basada en la estructuración de los nodos, la normalización de los vínculos y la creación de un núcleo digital único. Este modelo garantiza la transparencia, la gestión y el desarrollo evolutivo del complejo de construcción en todas las etapas del ciclo de vida de las instalaciones.



:: Plano Visual

CRISTAL DE LA CONSTRUCCIÓN

Estructura central (nutri)

En el centro del cristal:

UN OPERATORES FIDUCIARIOS

No es un miembro del mercado, es un entorno de coordinación. Dentro del núcleo:

  • Registro de objetos
  • Lista de participantes
  • Pasaporte digital
  • BIM/doble
  • Analista AI

- Es el cerebro del sistema.

Primera vuelta del cristal de 7

Alrededor del núcleo de los módulos clave 7 (como pétalos/grandes):

1. TIEMPO

  • Necesidades
  • Estrategia
  • situaciones hipotéticas de desarrollo

2. DISTRIBUCIÓN

  • Tierras
  • Geoanalista
  • Plan maestro

3. Derecho

  • normas
  • permisos
  • Análisis pericial

4. RECURSOS

  • materiales
  • Tecnología
  • Personal

5. PRODUCCIÓN

  • Construcción
  • Contratistas
  • Procesos

6. Finanzas

  • Inversiones
  • Pagos
  • Supervisión

7. CICL DE VIDA

  • Explotación
  • Servicios de apoyo
  • Retroinformación

Segunda vuelta de nudos

Cada línea se divide en nudos: Ejemplo:

Granja de producción

  • Contratista general
  • subcontratistas
  • plataforma
  • Supervisión
  • gráfico

Granja de las finanzas

  • Banco
  • Tesorería
  • Contratos
  • Seguros

👉 Visualmente, es un clúster dentro de cada cara

Ruebra (más importante)

Ahora la parte clave del esquema es:

* Todas las instalaciones se han unido entre las dos partes.

Tipos de líneas (puede distinguirse visualmente):

  • - Corrientes materiales.
  • deslizador de datos
  • Finanzas dobles
  • Riesgos rojos
  • Retroalimentación verde

- Convierte el patrón en una red en vivo, no en una jerarquía.

Avispón de cristal 

A través del centro pasan 3 ejes:

El eje del tiempo es la idea de un proyecto de construcción.

Un eje de datos. Todos los nudos están conectados al núcleo digital.

El eje de responsabilidad cada nudo tiene un dueño.

Cubierta externa

Afuera del cristal el contexto:

  • Estado
  • Mercado
  • la sociedad
  • Medio ambiente
  • Tecnología

○ Se puede visualizar como una esfera alrededor del cristal

¿Cómo luce eso ideal?

Imagínate:

  • En el centro, el núcleo brillante
  • en torno a los segmentos simétricos
  • dentro de segmentos de nodos
  • * Red densa de conexiones entre ellos
  • Todo esto hace que los datos se acaben.

Este no es el patrón de la industria.

Esquema simplificado (para el documento)

Puede insertar así:

                [Expulsión]

                      ▲

                      |

[RESERVAS] [JADRO/OPERATORES FINANCIEROS] [FINANAS]

      ▲                ▲                 ▲

      |                |                 |

[LIFERACIÓN] [FRANCES/AI] [PRODUCCIÓN]

      ▲                                  ▲

      |                                  |

      * El presente documento se publica sin revisión editorial.


Cómo usar este esquema

Modelo de gestión del sector para el Estado

En el caso de los inversores, la transparencia del sistema

Estructura de la plataforma para la tecnología de la información

Para las presentaciones, una imagen visual fuerte

CARTA INTERACTIVA DE CRISTAL

(Interfaz de la plataforma)

La pantalla principal (Core View). No es una lista ni una tabla. Es un mapa vivo del cristal.

En pantalla:

  • Centro de base (operador)
  • en torno a 7
  • dentro de los nodos
  • entre costillas (relaciones)

El usuario ve todo el sistema a la vez

Modos de visualización (ficha clave)

El mismo cristal cambia:

 Modo 1

Muestra:

  • Un proyecto de construcción
  • Todas las conexiones alrededor de él.

Régimen 2 ○ Territorio

  • Ciudad/región
  • todas las construcciones

Modo 3

  • Todo el sistema del país

Interacción (UX)

Click en el nodo:

  • ¿Quién es ese?
  • Calificación
  • proyectos
  • Comunicaciones

Click en la costilla:

  • Contrato
  • Monto
  • Plazos
  • condición jurídica

Click en el objeto:

  • BIM
  • Finanzas
  • gráfico
  • Riesgos

Lógica de color

Para que la interfaz diga:

  • Norma
  • ○ Riesgo
  • - El problema
  • - Datos
  • • Finanzas

Barra a la derecha (control Panel)

  • filtros (región, tipo de objeto)
  • cambiar los regímenes
  • Analista
  • de prevención

Barra de abajo (Timeline)

Tiempo desconectado: ○ puedes dar vueltas a la construcción

  • Como era.
  • Lo que sea.
  • Proyección

Valor principal de la interfaz

No es UI.

Es un mapa operativo de la industria en tiempo real.

ARQUITECTURA TÉCNICA (ТЗ)

Estructura general

Tipo: Microservices + Data Platform + Digital Twin

Módulos básicos

Core Platform

  • Autorización
  • función
  • API esclusa

Registros

Registro de objetos

  • ID
  • condición jurídica
  • Geología
  • Fase

Lista de participantes

  • empresa
  • Calificaciones
  • Historia

 Digital Twin (BIM)

  • Almacenar modelos
  • versiones
  • Adherir a las etapas

Graph Engine

Es el corazón del sistema. Guarda:

  • nodos
  • costillas
  • Comunicaciones

○ Tecnología:

  • Neo4j / TigerGraph

Project Management

  • tareas
  • Plazos
  • dependencia

Módulo financiero

  • Contratos
  • Pagos
  • Supervisión

Marketplace

  • materiales
  • Contratistas
  • Tecnología

AI / Análisis

  • Calendario previsto
  • Identificación de riesgos
  • Optimización

Monitoring (IoT)

  • Sensores
  • Construcción
  • Explotación

Tipos de datos

Espejos:

  • objeto
  • Participante
  • Recursos
  • documento

Ruebra:

  • Contrato
  • entrega
  • tarea
  • pago

API (ejemplo)

Obtener el grafo del objeto

GET /api/object/{id}/graph

Recibir comunicaciones del participante: GET /api/company/{id}/relations

Obtener riesgos: GET /api/object/{id}/risks

Funciones de los usuarios

  • Estado
  • Inversionista
  • Empleador
  • Contratista
  • Supervisión
  • Ciudadano

Corrientes de datos

1. BIM → Graph

2. Finanzas - Graph

3. IoT → Monitoring

4. El usuario de UI es Graph Engine.

- 2.7. Sin lo cual el sistema no funcionaría.

*Si no hay Graph Engine * no hay cristal

Si no hay ID de objetos, caos.

- A menos que exista un pasaporte digital no hay transparencia.


IDEA BASADA 

No estamos construyendo:

  • sitio web
  • Marketplace
  • CRM

- Tú estás construyendo:

Graph-based Operating System for Construction


MVP CRISTALLA DE CONSTRUCCIÓN

(primera versión operacional del sistema)

Objetivo MVP. No intentes construir el cristal de inmediato. Objetivo MVP: Demostrar que el sistema verá la construcción como una sección. Así que MVP debe saber:

  • crear un objeto
  • vincular a los participantes
  • mostrar vínculos
  • mostrar estado
  • identificar el problema

Si esto no es lo mismo, todo lo demás no tiene sentido.

Lo cual es MVP (mínimo)

Registro de objetos

  • ID del objeto
  • Dirección/ geo
  • fase (proyecto/construcción/explotación)
  • parámetros básicos

Lista de participantes

  • empresa
  • (contratante, contratista, etc.)
  • Calificación (por el momento simple)

Graph Engine (núcleo) Guarda:

  • ¿Quién está conectado con quién?
  • ¿Qué contratos?
  • ¿Cuáles son los papeles

Mapa visual (UI)

  • Nodos = círculos
  • Enlaces = líneas
  • klick_información

Situación del objeto

  • - Está bien.
  • ○ Riesgo
  • - El problema


Analista de referencia

  • Demora
  • sobrecarga del contratista
  • Falta de comunicación

Arquitectura MVP

Simplificado:

[Frontend]

     ↓

[API Gateway]

     ↓

-------------------------

|   Core Backend        |

|-----------------------|

| Objects Service       |

| Companies Service     |

| Graph Service         |

| Auth Service          |

-------------------------

     ↓

[Databases]

- PostgreSQL

- Graph DB (Neo4j)

Telecomunicaciones (mejores)

Backend 👉 Node.js (NestJS) o 👉 Python (FastAPI). Motivos:

  • rápido
  • Flexibilidad
  • Simple escalar

Frontend 👉 React + Next.js. Además:

  • Desarrollo rápido
  • SSR
  • UI cómoda

Visualización de la columna (CLUCH)

- Cytoscape.js o D3.js. Si quieres empezar con más facilidad: React Flow

Graph Database 👉 Neo4j (obligatorio). Es el corazón del cristal.

Base de datos principal 👉 PostgreSQL

API

  • REST (para MVP basta)
  • Más tarde, GraphQL

Hosting ○ Empezando rápido:

  • Vercel (frontend)
  • Railway / Render (backend)
  • Neo4j Aura (graph)

Autorización de Auth0 / Firebase Auth o simple JWT en inicio

Modelo de datos (simplificado)

Espejos:

Object

  • id
  • name
  • status
  • location

Company

  • id
  • name
  • role

Röbra: RELATION

  • type (contract / supplier / control)
  • start_date
  • status

Ejemplo de lógica de Graph

[Objeto]

   |

   [Contratador]

   |

   [Banco]

   |

   [Vigilancia]

- Este es el cristal mínimo.

MVP Interfaz (que debería ser)

Pantalla principal:

  • Grado (centro)
  • panel de derecha:
    • lista de nodos
    • filtro

En el clic:

Objeto:

  • condición jurídica
  • Participantes
  • Riesgos

Compañía:

  • proyectos
  • Comunicaciones

Plan de desarrollo (real)

Semana 1–2

  • Arquitectura
  • Bases
  • API

Semana 3–4

  • Graph Engine
  • Comunicaciones

Semana 5–6

  • UI + visualización

Semana 7–8

  • prueba
  • lanzamiento

En 2, ya tienes un sistema.

Orden mínima

  • 1 backend
  • 1 frontend
  • 1 fullstack (o CTO)
  • 1 diseñador (desechable)

Donde normalmente se rompen.

Error 1

crean un CRM en lugar de un grafo

Error 2

No existe un modelo de datos normal

Error 3

sobrecargado MVP

Error 4

Lo intentamos de inmediato.

La clave del éxito 👉 Primero el grafo, después todo lo demás. Si tienes:

  • Hay nudos.
  • Hay conexiones.
  • Hay un visor.

- Ya tienes un cristal.

¿Qué obtienes en la salida MVP?

  • Mapa vivo de la construcción
  • vínculos transparentes
  • primer nivel de control
  • demostración para inversores/Estados

Después de MVP, añádase: Finanzas, BIM, Mercado

Si vamos a lanzar MVP en 6–8 semanas, vamos a superar a todos los que escriben estrategias.

Estructura de la base de datos

La lógica es simple: PostgreSQL almacena directorios, tarjetas de objetos, usuarios, documentos, eventos. Neo4j guarda la misma línea de conexión: quién está conectado con quién, en qué tipo de conexión, en qué condición.

PostgreSQL: cuadros básicos

Cuadro users. Usuarios del sistema.

Campo

Tipo

Finalidad

id

UUID PK

Identificación

email

varchar unique

Login

password_hash

varchar

Contraseña Hash

full_name

varchar

FIO

phone

varchar

Teléfono

status

varchar

active / blocked / invited

created_at

timestamp

Fecha de creación

updated_at

timestamp

Fecha de actualización

Cuadro de funcionesYu. Roles de acceso.

Campo

Tipo

id

UUID PK

code

varchar unique

name

varchar

Ejemplos:

Cuadro user_roles. Conexión de usuarios y funciones.

Campo

Tipo

id

UUID PK

user_id

UUID FK -> users.id

role_id

UUID FK -> roles.id

created_at

timestamp

Cuadro de empresas. Los participantes en el mercado.

Campo

Tipo

Finalidad

id

UUID PK

ID de la empresa

name

varchar

Nombre

short_name

varchar

Nombre corto

inn

varchar

INN

ogrn

varchar

OGRN

company_type

varchar

customer / contractor / supplier / bank / regulator

rating

numeric(3,2)

Calificación

status

varchar

active / inactive

website

varchar

Sitio web

created_at

timestamp

Fecha de creación

updated_at

timestamp

Fecha de actualización

Cuadro de company_users Conectar al usuario a la empresa.

Campo

Tipo

id

UUID PK

company_id

UUID FK -> companies.id

user_id

UUID FK -> users.id

position

varchar

is_primary

boolean

created_at

timestamp

Cuadro de regiones. Guía de regiones.

Campo

Tipo

id

UUID PK

code

varchar unique

name

varchar

Cuadro locations. Dirección y coordenadas.

Campo

Tipo

id

UUID PK

region_id

UUID FK -> regions.id

address

text

lat

numeric(10,7)

lon

numeric(10,7)

cadastral_number

varchar

created_at

timestamp

Cuadro de proyectos. Tarjeta de obra.

Campo

Tipo

Finalidad

id

UUID PK

ID del objeto

code

varchar unique

Número interno

name

varchar

Título

description

text

Descripción

project_type

varchar

residential / industrial / infrastructure

lifecycle_stage

varchar

concept / design / construction / operation

status

varchar

normal / risk / problem / archived

location_id

UUID FK -> locations.id

Locaciones

customer_company_id

UUID FK -> companies.id

Empleador

start_date

date

Comienzo de planificación

end_date

date

Finalización prevista

planned_budget

numeric(18,2)

Presupuesto del plan

actual_budget

numeric(18,2)

El hecho

created_at

timestamp

Fecha de creación

updated_at

timestamp

Fecha de actualización

Cuadro de proyectos_stages. Etapas del proyecto.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id

stage_code

varchar

stage_name

varchar

planned_start

date

planned_end

date

actual_start

date

actual_end

date

status

varchar

created_at

timestamp

Cuadro de contratos. Contratos dentro del sistema.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id

contract_number

varchar

contract_type

varchar

customer_company_id

UUID FK -> companies.id

contractor_company_id

UUID FK -> companies.id

amount

numeric(18,2)

currency

varchar

date_start

date

date_end

date

status

varchar

created_at

timestamp

updated_at

timestamp

Cuadro de documentos. Documentos del proyecto.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id

company_id

UUID FK -> companies.id null

contract_id

UUID FK -> contracts.id null

doc_type

varchar

title

varchar

file_url

text

version

integer

issued_at

date

status

varchar

created_by

UUID FK -> users.id

created_at

timestamp

La tabla de riesgo del objeto.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id

related_company_id

UUID FK -> companies.id null

related_stage_id

UUID FK -> project_stages.id null

risk_type

varchar

severity

varchar

probability

varchar

description

text

status

varchar

detected_at

timestamp

resolved_at

timestamp null

Cuadro events. La lista de eventos.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id null

company_id

UUID FK -> companies.id null

user_id

UUID FK -> users.id null

event_type

varchar

event_payload

jsonb

created_at

timestamp

Cuadro del proyecto_metrics. Metrics del proyecto.

Campo

Tipo

id

UUID PK

project_id

UUID FK -> projects.id

metric_date

date

progress_percent

numeric(5,2)

cost_variance

numeric(18,2)

schedule_variance_days

integer

open_risks_count

integer

created_at

timestamp

Índices PostgreSQL

Es lo mínimo necesario:

Neo4j: modelo del grafo

En la columna, guardamos la esencia como nudos y relaciones como costillas.

Los nudos. Lápices principales:

Propiedades obligatorias de un nodo. Para uniformidad:

Las costillas de Neo4j. Relaciones básicas

Propiedades de las costillas

Por ejemplo PARTICIPATES_IN:

HAS_CONTRACT:

HAS_RISK:

Ejemplo de grafo

(Company: Customer) -[:PARTICIPATES_IN {role:"customer"}]-> (Project)

(Company: GeneralContractor) -[:PARTICIPATES_IN {role:"general_contractor"}]-> (Project)

(Project) -[:HAS_CONTRACT]-> (Contract)

(Company: Customer) -[:CUSTOMER_IN]-> (Contract)

(Company: GeneralContractor) -[:CONTRACTOR_IN]-> (Contract)

(Project) -[:HAS_STAGE]-> (Stage: Construction)

(Project) -[:HAS_RISK {severity:"high"}]-> (Risk)

(Project) -[:LOCATED_AT]-> (Location)


Arquitectura API

Para MVP, será suficiente con REST API v1. Más adelante, podrá agregar GraphQL para pantallas complejas de la barra.

Regla general API

Prefijo básico

/api/v1

Formato

{

  "data": {},

  "meta": {},

  "error": null

}

Error

{

  "data": null,

  "meta": {},

  "error": {

    "code": "PROJECT_NOT_FOUND",

    "message": "Project not found"

  }


Authorization: Bearer <token>


Auth API. POST /auth/login. Entra.

Request

{

  "email": "user@example.com",

  "password": "secret"

}

Response

{

  "data": {

    "accessToken": "jwt",

    "refreshToken": "jwt",

    "user": {

      "id": "uuid",

      "fullName": "Ivan Petrov,"

      "email": "user@example.com",

      "roles": ["customer"]

    }

  },

  "meta": {},

  "error": null

}

POST /auth/refresh. Una actualización de la token.

GET /auth/me. Perfil del usuario actual.

API

GET /companies. Lista de empresas. Parámetros:

POST /companies. Crear una empresa.

Request

{

  "Name": "OOO Stroy Grad,"

  "shortName": "Strey Grad,"

  "inn": "1234567890",

  "ogrn": "1234567890123",

  "companyType": "contractor",

  "website": "https://example.com"

}

GET /companies/{id}. Tarjeta de la compañía.

PATCH /companies/{id}. Reiniciar la compañía.


GET /companies/{id}/projects. Proyectos de la empresa.

GET /companies/{id}/relations. Los contactos de la compañía están en la línea.

Response

{

  "data": {

    "nodes": [

      { "id": "c1," "type": "company," "name": "OSG Stroy Grad"},

      { "id": "p1," "type": "project," "name": "HC North" }

    ],

    "edges": [

      {

        "from": "c1",

        "to": "p1",

        "type": "PARTICIPATES_IN",

        "role": "contractor",

        "status": "active"

      }

    ]

  },

  "meta": {},

  "error": null

}

API proyectos

GET /projects. Lista de proyectos. Filtradores:

POST /projects. Crear un proyecto.

Request

{

  "Name": "HK Norte,"

  "description": "Un complejo de viviendas multifuncionales"

  "projectType": "residential",

  "lifecycleStage": "design",

  "status": "normal",

  "location": {

    "regionId": "uuid",

    "address": "San Petersburgo,"

    "lat": 59.93,

    "lon": 30.31,

    "cadastralNumber": "78:00:0000000:1234"

  },

  "customerCompanyId": "uuid",

  "startDate": "2026-04-01",

  "endDate": "2028-10-31",

  "plannedBudget": 2500000000

}

GET /projects/{id} Mapa del proyecto.

PATCH /projects/{id}. Renovar el proyecto.

GET /projects/{id}/graph. Endpoint principal MVP. Devuelve los nudos y las costillas del objeto.

Response

{

  "data": {

    "project": {

      "id": "uuid",

      "Name": "HK Norte,"

      "status": "risk",

      "lifecycleStage": "construction"

    },

    "nodes": [

      { "id": "p1," "type": "project," "name": "CG North," "status": "risk"},

      { "id": "c1," "type": "company," "name": "El Empleador del Desarrollo," "estatus": "active"},

      { "id": "c2," "type": "company," "name": "Gensord 1," "status": "active"},

      { "id": "r1," "type": "risk," "name": "salto de tiempo," "status": "open" }

    ],

    "edges": [

      { "from": "c1", "to": "p1", "type": "PARTICIPATES_IN", "role": "customer", "status": "active" },

      { "from": "c2", "to": "p1", "type": "PARTICIPATES_IN", "role": "general_contractor", "status": "active" },

      { "from": "p1", "to": "r1", "type": "HAS_RISK", "severity": "high" }

    ]

  },

  "meta": {},

  "error": null

}

GET /projects/{id}/timeline. La lista de cambios y acontecimientos.

GET /projects/{id}/metrics. Metrics del proyecto.

GET /projects/{id}/risks. Lista de riesgos.

POST /projects/{id}/risks. Crear riesgos.

GET /projects/{id}/documents. Documentos del proyecto.

POST /projects/{id}/documents. Carga el documento.

GET /projects/{id}/companies. Los participantes en el proyecto.

POST /projects/{id}/companies. Añadir un participante al proyecto.

Request

{

  "companyId": "uuid",

  "role": "supplier",

  "startDate": "2026-05-01",

  "status": "active"

}

API etapas del proyecto

GET /projects/{id}/stages. Lista de pasos.

POST /projects/{id}/stages. Crear fase.

PATCH /projects/{id}/stages/{stageId}. Actualiza la fase.

API contratos

GET /contracts. Lista de contratos. Filtradores:

POST /contracts. Crear un contrato.

Request

{

  "projectId": "uuid",

  "contractNumber": "C-2026-001",

  "contractType": "general_contract",

  "customerCompanyId": "uuid",

  "contractorCompanyId": "uuid",

  "amount": 1500000000,

  "currency": "RUB",

  "dateStart": "2026-04-10",

  "dateEnd": "2027-12-20",

  "status": "active"

}

GET /contracts/{id}. Tarjeta de contrato.

PATCH /contracts/{id}. Renovar el contrato.

API riesgos

GET / risks. Lista común de riesgos. Filtradores:

POST / risks. Crear riesgos.

PATCH /risks/{id}. Cambiar el riesgo.

POST / risks/{id}/rolve. Cierra el riesgo.

API

GET /documents/{id}. Metadatos del documento.

GET /documents/{id}/download descargar archivo.

API del grafo. Es un servicio independiente porque constituye el corazón del sistema.

GET /graph/projects/{id}

Grafo del proyecto.

GET /graph/companies/{id}

Grafo de la empresa.

POST /graph/query

Solicitud de búsqueda o análisis de la columna. Para MVP, es mejor limitar las consultas a las solicitudes de plantilla en lugar de dar un Cypher arbitrario.

Request

{

  "queryType": "project_neighbors",

  "entityId": "uuid",

  "depth": 2

}

GET /graph/search. Encontrar elementos esenciales en la columna:

API analistas

GET /analytics/dashboard

Resumen:

GET /analytics/projects/status-summary

Resumen de la situación de los proyectos.

GET /analytics/companies/top-contractors

Un montón de contratistas por número de proyectos.

GET /analytics/risks/hotspots

Donde hay más riesgos.

API

GET /events

El registro de eventos. Filtradores:

Dividir en servicios. Para MVP es suficiente con 5 servicios.

auth-service

directory-service

project-service

graph-service

analytics-service

Sincronización PostgreSQL y Neo4j

Este es un momento importante, la fuente de la verdad para las tarjetas de Comment PostgreSQL, la fuente de la verdad para las conexiones y los pases de Neo4j.

Enfoque. Después de crear/actualizar la esencia en PostgreSQL:

Ejemplos de acontecimientos:

Mínima DTO

CreateProjectDto

{

  "name": "string",

  "description": "string",

  "projectType": "residential",

  "lifecycleStage": "design",

  "status": "normal",

  "customerCompanyId": "uuid",

  "startDate": "2026-04-01",

  "endDate": "2027-12-31",

  "plannedBudget": 1000000

}

AddCompanyToProjectDto

{

  "companyId": "uuid",

  "role": "contractor",

  "startDate": "2026-04-01",

  "endDate": null,

  "status": "active"

}

CreateRiskDto

{

  "projectId": "uuid",

  "relatedCompanyId": "uuid",

  "riskType": "deadline_delay",

  "severity": "high",

  "probability": "medium",

  "description": 21 días retrasados"

}

¿Qué hay que hacer en la primera versión?

Sin eso, MVP estará vacío:

Lo haré.

Se puede posponer.

Aparato de vidrio directo recomendado bajo este esquema

Backend

Frontend

Infra


Estructura del emplazamiento

/crystal-construction

  /apps

    /api-gateway

    /auth-service

    /directory-service

    /project-service

    /graph-service

    /analytics-service

    /web-client

  /packages

    /shared-types

    /shared-utils

    /ui

  /infra

    /docker

    /nginx

    /db

  /docs

    openapi.yaml

    database-schema.md

    graph-model.md

El procedimiento de montaje más apropiado

MVP debe responder a 4:

Si API y el BD lo dan, ya tienes el núcleo de trabajo de Crystal de la Construcción.





1. OpenAPI-Terminal

Por debajo del marco de especificaciones de OpenAPI 3.1 para MVP.

openapi: 3.1.0

info:

  title: Crystal Construction API

  version: 1.0.0

  description: API MVP


servers:

  - url: https://api.crystal-construction.local/api/v1


tags:

  - name: Auth

  - name: Companies

  - name: Projects

  - name: Contracts

  - name: Risks

  - name: Graph

  - name: Analytics


paths:

  /auth/login:

    post:

      tags: [Auth]

      summary: Entrada del usuario

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/LoginRequest'

      responses:

        '200':

          description: Entrar con éxito

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/AuthResponse'


  /auth/me:

    get:

      tags: [Auth]

      summary: Perfil del usuario actual

      security:

        - bearerAuth: []

      responses:

        '200':

          description: Perfil de usuario

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/UserProfileResponse'


  /companies:

    get:

      tags: [Companies]

      Resumen: Lista de empresas

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: search

          schema: { type: string }

        - in: query

          name: companyType

          schema: { type: string }

        - in: query

          name: status

          schema: { type: string }

        - in: query

          name: page

          schema: { type: integer, minimum: 1, default: 1 }

        - in: query

          name: limit

          schema: { type: integer, minimum: 1, maximum: 100, default: 20 }

      responses:

        '200':

          description: Lista de empresas

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyListResponse'


    post:

      tags: [Companies]

      summary: Crear una empresa

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateCompanyRequest'

      responses:

        '201':

          description: Compañía creada

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


  /companies/{id}:

    get:

      tags: [Companies]

      Resumen: Tarjeta de la empresa

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          description: Datos de la empresa

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


    patch:

      tags: [Companies]

      Summary: Actualizar la empresa

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/UpdateCompanyRequest'

      responses:

        '200':

          description: La empresa está actualizada

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/CompanyResponse'


  /companies/{id}/relations:

    get:

      tags: [Graph]

      summary: Grafo de conexiones de la empresa

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

        - in: query

          name: depth

          schema: { type: integer, minimum: 1, maximum: 3, default: 1 }

      responses:

        '200':

          description: Grafo de la empresa

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/GraphResponse'


  /projects:

    get:

      tags: [Projects]

      summary: List of projects

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: status

          schema: { type: string }

        - in: query

          name: lifecycleStage

          schema: { type: string }

        - in: query

          name: regionId

          schema: { type: string, format: uuid }

        - in: query

          name: customerCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: search

          schema: { type: string }

        - in: query

          name: page

          schema: { type: integer, default: 1 }

        - in: query

          name: limit

          schema: { type: integer, default: 20 }

      responses:

        '200':

          description: Lista de proyectos

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectListResponse'


    post:

      tags: [Projects]

      summary: Crear proyecto

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateProjectRequest'

      responses:

        '201':

          description: Proyecto creado

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


  /projects/{id}:

    get:

      tags: [Projects]

      Resumen: Mapa del proyecto

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          description: Datos del proyecto

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


    patch:

      tags: [Projects]

      summary: Actualizar el proyecto

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/UpdateProjectRequest'

      responses:

        '200':

          description: Proyecto actualizado

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectResponse'


  /projects/{id}/graph:

    get:

      tags: [Graph]

      summary: Grafo del proyecto

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

        - in: query

          name: depth

          schema: { type: integer, minimum: 1, maximum: 3, default: 2 }

      responses:

        '200':

          description: Contador del proyecto

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ProjectGraphResponse'


  /projects/{id}/companies:

    post:

      tags: [Projects]

      summary: Añadir un participante al proyecto

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/AddCompanyToProjectRequest'

      responses:

        '201':

          description: Participante añadido

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/OperationResponse'


  /contracts:

    get:

      tags: [Contracts]

      summary: Lista de contratos

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: projectId

          schema: { type: string, format: uuid }

        - in: query

          name: customerCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: contractorCompanyId

          schema: { type: string, format: uuid }

        - in: query

          name: status

          schema: { type: string }

      responses:

        '200':

          description: Lista de contratos

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ContractListResponse'


    post:

      tags: [Contracts]

      summary: Crear un contrato

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateContractRequest'

      responses:

        '201':

          description: Contrato creado

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/ContractResponse'


  /risks:

    get:

      tags: [Risks]

      summary: List of risks

      security:

        - bearerAuth: []

      parameters:

        - in: query

          name: projectId

          schema: { type: string, format: uuid }

        - in: query

          name: severity

          schema: { type: string }

        - in: query

          name: status

          schema: { type: string }

      responses:

        '200':

          description: Lista de riesgos

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskListResponse'


    post:

      tags: [Risks]

      summary: Crear riesgo

      security:

        - bearerAuth: []

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: '#/components/schemas/CreateRiskRequest'

      responses:

        '201':

          description: Riesgo creado

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskResponse'


  /risks/{id}/resolve:

    post:

      tags: [Risks]

      summary: Cerrar el riesgo

      security:

        - bearerAuth: []

      parameters:

        - $ref: '#/components/parameters/IdPath'

      responses:

        '200':

          description: Riesgo cerrado

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/RiskResponse'


  /analytics/dashboard:

    get:

      tags: [Analytics]

      summary: Dashbord MVP

      security:

        - bearerAuth: []

      responses:

        '200':

          description: Analista integrador

          content:

            application/json:

              schema:

                $ref: '#/components/schemas/DashboardResponse'


components:

  securitySchemes:

    bearerAuth:

      type: http

      scheme: bearer

      bearerFormat: JWT


  parameters:

    IdPath:

      in: path

      name: id

      required: true

      schema:

        type: string

        format: uuid


  schemas:

    ApiError:

      type: object

      properties:

        code: { type: string }

        message: { type: string }

      required: [code, message]


    LoginRequest:

      type: object

      properties:

        email: { type: string, format: email }

        password: { type: string }

      required: [email, password]


    AuthUser:

      type: object

      properties:

        id: { type: string, format: uuid }

        fullName: { type: string }

        email: { type: string, format: email }

        roles:

          type: array

          items: { type: string }

      required: [id, fullName, email, roles]


    AuthResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            accessToken: { type: string }

            refreshToken: { type: string }

            user:

              $ref: '#/components/schemas/AuthUser'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    UserProfileResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/AuthUser'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    Company:

      type: object

      properties:

        id: { type: string, format: uuid }

        name: { type: string }

        shortName: { type: string }

        inn: { type: string }

        ogrn: { type: string }

        companyType: { type: string }

        rating: { type: number }

        status: { type: string }

        website: { type: string, nullable: true }

      required: [id, name, companyType, status]


    CreateCompanyRequest:

      type: object

      properties:

        name: { type: string }

        shortName: { type: string }

        inn: { type: string }

        ogrn: { type: string }

        companyType: { type: string }

        website: { type: string }

      required: [name, inn, ogrn, companyType]


    UpdateCompanyRequest:

      type: object

      properties:

        name: { type: string }

        shortName: { type: string }

        companyType: { type: string }

        rating: { type: number }

        status: { type: string }

        website: { type: string }


    CompanyResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Company'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CompanyListResponse:

      type: object

      properties:

        data:

          type: array

          items:

            $ref: '#/components/schemas/Company'

        meta:

          type: object

          properties:

            page: { type: integer }

            limit: { type: integer }

            total: { type: integer }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    LocationInput:

      type: object

      properties:

        regionId: { type: string, format: uuid }

        address: { type: string }

        lat: { type: number }

        lon: { type: number }

        cadastralNumber: { type: string }

      required: [regionId, address]


    Project:

      type: object

      properties:

        id: { type: string, format: uuid }

        code: { type: string }

        name: { type: string }

        description: { type: string, nullable: true }

        projectType: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        customerCompanyId: { type: string, format: uuid }

        startDate: { type: string, format: date, nullable: true }

        endDate: { type: string, format: date, nullable: true }

        plannedBudget: { type: number, nullable: true }

        actualBudget: { type: number, nullable: true }

      required: [id, name, projectType, lifecycleStage, status]


    CreateProjectRequest:

      type: object

      properties:

        name: { type: string }

        description: { type: string }

        projectType: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        location:

          $ref: '#/components/schemas/LocationInput'

        customerCompanyId: { type: string, format: uuid }

        startDate: { type: string, format: date }

        endDate: { type: string, format: date }

        plannedBudget: { type: number }

      required:

        - name

        - projectType

        - lifecycleStage

        - status

        - location

        - customerCompanyId


    UpdateProjectRequest:

      type: object

      properties:

        name: { type: string }

        description: { type: string }

        lifecycleStage: { type: string }

        status: { type: string }

        actualBudget: { type: number }

        endDate: { type: string, format: date }


    ProjectResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Project'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ProjectListResponse:

      type: object

      properties:

        data:

          type: array

          items:

            $ref: '#/components/schemas/Project'

        meta:

          type: object

          properties:

            page: { type: integer }

            limit: { type: integer }

            total: { type: integer }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    GraphNode:

      type: object

      properties:

        id: { type: string }

        type: { type: string }

        name: { type: string }

        status: { type: string, nullable: true }

        metadata:

          type: object

          additionalProperties: true

      required: [id, type, name]


    GraphEdge:

      type: object

      properties:

        from: { type: string }

        to: { type: string }

        type: { type: string }

        role: { type: string, nullable: true }

        status: { type: string, nullable: true }

        metadata:

          type: object

          additionalProperties: true

      required: [from, to, type]


    GraphResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            nodes:

              type: array

              items: { $ref: '#/components/schemas/GraphNode' }

            edges:

              type: array

              items: { $ref: '#/components/schemas/GraphEdge' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ProjectGraphResponse:

      type: object

      properties:

        data:

          type: object

          properties:

            project:

              $ref: '#/components/schemas/Project'

            nodes:

              type: array

              items: { $ref: '#/components/schemas/GraphNode' }

            edges:

              type: array

              items: { $ref: '#/components/schemas/GraphEdge' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CreateContractRequest:

      type: object

      properties:

        projectId: { type: string, format: uuid }

        contractNumber: { type: string }

        contractType: { type: string }

        customerCompanyId: { type: string, format: uuid }

        contractorCompanyId: { type: string, format: uuid }

        amount: { type: number }

        currency: { type: string }

        dateStart: { type: string, format: date }

        dateEnd: { type: string, format: date }

        status: { type: string }

      required:

        - projectId

        - contractNumber

        - contractType

        - customerCompanyId

        - contractorCompanyId

        - amount

        - currency

        - status


    Contract:

      type: object

      properties:

        id: { type: string, format: uuid }

        projectId: { type: string, format: uuid }

        contractNumber: { type: string }

        contractType: { type: string }

        customerCompanyId: { type: string, format: uuid }

        contractorCompanyId: { type: string, format: uuid }

        amount: { type: number }

        currency: { type: string }

        status: { type: string }

      required: [id, projectId, contractNumber, contractType, amount, currency, status]


    ContractResponse:

      type: object

      properties:

        data:

          $ref: '#/components/schemas/Contract'

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    ContractListResponse:

      type: object

      properties:

        data:

          type: array

          items: { $ref: '#/components/schemas/Contract' }

        meta: { type: object }

        error:

          oneOf:

            - $ref: '#/components/schemas/ApiError'

            - { type: 'null' }


    CreateRiskRequest:

      type: object

      properties:

        projectId: { type: string, format: uuid }

        relatedCompanyId: { type: string, format: uuid, nullable: true }

        riskType: { type: string }

        severity: { type: string }

        probability: { type: string }

        description: { type: string }

      required: [projectId, riskType, severity, probability, description]


    Risk:

      type: object

      properties:

        id: { type: string, format: uuid }

        projectId: { type: string, format: uuid }

        relatedCompanyId: { type: string, format