Files
MBS/Dashboards MARMOTECH/Documentacion_MarmotechBI.md
T

329 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Documentación de la base de datos **MarmotechBI**
### Guía para el desarrollo de dashboards en Power BI
| | |
|---|---|
| **Servidor** | `192.168.40.8` (SQL Server 2016) |
| **Base de datos** | `MarmotechBI` |
| **Origen de los datos** | Se actualiza en vivo desde los sistemas operativos de la empresa |
| **Naturaleza** | Capa semántica de **vistas** (54 vistas + 2 tablas). No almacena datos propios salvo 2 tablas de carga manual |
| **Propósito** | Esquema estrella para que usuarios de negocio armen sus propios dashboards con nombres de negocio |
| **Fecha de este documento** | 2026-08-25 |
> **Idea clave:** casi todo en `MarmotechBI` es una **vista** que presenta la información con nombres de negocio (`vwFactVentas`, `vwDimProducto`, etc.). Como son vistas, **no existen llaves foráneas físicas**: las relaciones son *lógicas* y hay que **crearlas manualmente en Power BI** (ver la sección [Relaciones para Power BI](#relaciones-recomendadas-en-power-bi)).
---
## 1. Cómo conectarse desde Power BI
1. **Obtener datos → SQL Server**.
2. Servidor: `192.168.40.8`  ·  Base de datos: `MarmotechBI`.
3. Modo: **Import** (recomendado para tableros publicados) o **DirectQuery** si se necesita tiempo real.
4. Seleccionar las vistas del área que se va a analizar (ej. `vwFactVentas` + sus dimensiones `vwDim*`).
5. En la vista **Modelo**, crear las relaciones según la sección 6.
> **Permisos:** el acceso es por login de Windows con rol de lectura (`db_datareader`) sobre `MarmotechBI`. Solicitarlo a Tecnología con el usuario de dominio.
---
## 2. Convenciones de nombres
| Prefijo | Significado | Rol en el modelo |
|---|---|---|
| `vwDim…` | **Dimensión** — describe (quién, qué, dónde, cuándo) | Tabla de "look up" |
| `vwFact…` / `VWFACT…` | **Hecho** — mide (cuánto, cuántos) | Tabla central de valores |
| `vwBridge…` | **Puente** — resuelve relaciones muchos-a-muchos | Entre dimensiones |
| `VW_DIM_…` / `VW_HECHOS_…` | Esquema del **Balanced Scorecard / Indicadores** (área independiente) | Dim / Hecho de gestión |
| Sin prefijo (`ventas_facturas`, `estadoResultado`, `item_conteo_ciclico`…) | **Vistas planas de reporte** — ya vienen denormalizadas | Se usan solas, no requieren relaciones |
| `…_usuario` (`_cdelacruz`, `_jisa`, `_mpuig`…) | **Copias personales** filtradas por vendedor/supervisor | Uso individual, no para el modelo general |
**Claves compuestas** — se repiten en casi todo el modelo:
- **Producto** = `cod_n` + `cod_grupo` + `cod_tipo` + `cod_sec` (4 columnas). En `vwDimProducto` existe también `producto_id` que las concatena como texto (`cod_n-cod_grupo-cod_tipo-cod_sec`).
- **Cliente** = `tipo_cliente` + `sec_cliente` (2 columnas).
---
## 3. Áreas temáticas (subject areas)
| # | Área | Hecho(s) principal(es) | Dimensiones que usa |
|---|---|---|---|
| A | **Comercial / Ventas** | `vwFactVentas`, `VWFACTCOTIZACIONES`, `vwfactPipeline`, `vwFactPresupuesto` | Fecha, Cliente, Vendedor, EquipoVentas, Producto, Categoría, Provincia, Zona, TipoVenta |
| B | **Cuentas por Cobrar** | `vwFactCxC_Base`, `vwFactCxC_Real` | Cliente, Vendedor, TipoVenta |
| C | **Despacho / Pendientes** | `vwOrdenesPendientesDespacho`, `vwReqCotizaciones`, `vwProductoDisponible` | Cliente, Vendedor, Producto |
| D | **Producción** | `vwProduccion_pub` | DepartamentoProducción, Producto |
| E | **Contabilidad / Finanzas** | `vwFactContabilidad`, `estadoResultado` | (Departamento, Cuenta — internas) |
| F | **Inventario** | `vwRotacionInventario_pub`, `vwRotacionInventarioPorBodega_pub`, `item_conteo_ciclico` | (planas, autocontenidas) |
| G | **Indicadores / Balanced Scorecard** | `VW_HECHOS_INDICADORES`, `VW_HECHOS_DOWNTIME`, `VW_HECHOS_TICKETS` | Calendario, Departamentos, Indicadores, Perspectivas, Procesos |
| H | **Datos externos** (tabla física) | `FactMercadoEdificaciones` | (independiente) |
---
## 4. Diccionario de dimensiones (área comercial)
### `vwDimFecha` — Calendario (grano mensual)
Grano = mes.
| Columna | Tipo | Descripción |
|---|---|---|
| `ano` | smallint | Año |
| `numeroMes` | smallint | Número de mes (1-12) — **llave para ordenar** |
| `mes` | char(10) | Nombre del mes |
| `AnoMes` | varchar(7) | `AAAA-MM` |
### `vwDimCliente` — Clientes  · PK = `tipo_cliente` + `sec_cliente`
| Columna | Tipo | Descripción |
|---|---|---|
| `tipo_cliente` | smallint | Tipo/segmento de cliente (parte 1 de la llave) |
| `sec_cliente` | int | Secuencia del cliente (parte 2 de la llave) |
| `nombre` | char(100) | Razón social |
| `num_rnc` | char(25) | RNC/Cédula |
| `direccion` | varchar(173) | Dirección |
### `vwDimVendedor` — Vendedores  · PK = `vendedor_id`
| Columna | Tipo | Descripción |
|---|---|---|
| `vendedor_id` | smallint | Código de vendedor (corresponde al nº de empleado) |
| `vendedor` | varchar(31) | Nombre y apellido |
| `equipo_id` | smallint | **FK → `vwDimEquipoVentas.equipo_id`** |
### `vwDimEquipoVentas` — Equipos de venta  · PK = `equipo_id`
| Columna | Tipo | Descripción |
|---|---|---|
| `equipo_id` | smallint | Código del equipo/departamento comercial |
| `equipoVentas` | nchar(200) | Nombre del equipo |
### `vwDimProducto` — Productos  · PK = `cod_n`+`cod_grupo`+`cod_tipo`+`cod_sec`
**Es la dimensión central de producto de todo el modelo.**
| Columna | Tipo | Descripción |
|---|---|---|
| `cod_n`, `cod_grupo`, `cod_tipo`, `cod_sec` | int | Llave compuesta del producto |
| `producto_id` | varchar(43) | Llave concatenada (`cod_n-cod_grupo-cod_tipo-cod_sec`) — **usar esta para relacionar en Power BI** |
| `descripcion_producto` | varchar(180) | Nombre del producto |
| `unidad_med` | char(4) | Unidad de medida |
| `clase` / `grupo` / `tipo` | char/nvarchar | Jerarquía de clasificación |
| `origen` | char(20) | Origen (nacional/importado/producción) |
| `categoria_titulo` | varchar(100) | Categoría comercial |
| `GerenteMarcas` | varchar(31) | Gerente de marca responsable |
### `vwDimCategoria` — Categorías comerciales  · PK = `cod_categoria`
| Columna | Tipo | Descripción |
|---|---|---|
| `cod_categoria` | smallint | Código de categoría |
| `categoria` | varchar(100) | Nombre de la categoría |
### `vwBridgeProductoCategoria` — Puente Producto ↔ Categoría
Resuelve que un producto (por `cod_n`+`cod_grupo`+`cod_tipo`) pertenece a una categoría.
| Columna | Tipo | Descripción |
|---|---|---|
| `cod_n`, `cod_grupo`, `cod_tipo` | smallint | Parte de la llave del producto |
| `cod_categoria` | smallint | **FK → `vwDimCategoria.cod_categoria`** |
### `vwDimProvincia` — Provincias  · PK = `cod_provincia`
| Columna | Tipo | Descripción |
|---|---|---|
| `cod_provincia` | smallint | Código de provincia |
| `nombre_provincia` | char(30) | Nombre |
| `pais` | nchar(20) | País |
| `idZona` | smallint | **FK → `vwDimZona.cod_zona`** |
### `vwDimZona` — Zonas geográficas  · PK = `cod_zona`
| Columna | Tipo | Descripción |
|---|---|---|
| `cod_zona` | smallint | Código de zona |
| `zonaGeografica` | char(30) | Nombre de la zona |
### `vwDimTipoVenta` — Tipo de venta / Moneda  · PK = `ventas`
Contiene la **tasa de cambio** usada para convertir a RD$.
| Columna | Tipo | Descripción |
|---|---|---|
| `ventas` | smallint | Código de tipo de venta |
| `descripcion` | nvarchar(80) | Descripción |
| `simbolo` | nvarchar(40) | Símbolo de moneda |
| `descripcion_moneda` | nchar(40) | Moneda |
| `tasa` | decimal | Tasa de cambio a RD$ |
| `tipo_operacion` | varchar(11) | `LOCAL_RD` / `LOCAL_USD` / `EXPORTACION` / `EURO` / `OTRO` |
### `vwDimDepartamentoProduccion` — Departamentos de producción  · PK = `codigodepto`
| Columna | Tipo | Descripción |
|---|---|---|
| `codigodepto` | smallint | Código de departamento |
| `nombre_depto` | char(30) | Nombre |
| `tipo_departamento` | nchar(40) | Tipo |
| `proceso_agrupado` | varchar(13) | Agrupación de proceso |
---
## 5. Diccionario de hechos (measures)
### `vwFactVentas` — Ventas facturadas  · grano: **línea de factura**
Una fila por cada línea de factura. Solo incluye documentos activos (no anulados).
| Columna | Tipo | Rol | Descripción |
|---|---|---|---|
| `factura`, `sucid` | int | Grano | Nº de factura + sucursal |
| `fecha`, `ano`, `mes` | date/int | → Fecha | Fecha de factura |
| `tipo_cliente`, `sec_cliente` | — | → Cliente | Llave del cliente |
| `vendedor` | smallint | → Vendedor | `sec_vend` (código del vendedor) |
| `ventas` | — | → TipoVenta | Código de moneda/tipo venta |
| `tipoVenta`, `simbolo`, `tasa` | — | Atributo | Descripción de moneda y tasa |
| `cod_provincia` | — | → Provincia | Provincia del cliente |
| `cotizacion_no` | int | → Cotización | Cotización que originó la venta |
| `cod_n`,`cod_grupo`,`cod_tipo`,`cod_sec` | — | → Producto | Llave del producto |
| `cantidad` | numeric | Medida | Cantidad vendida |
| `precio` | numeric | Medida | Precio unitario |
| `porc_desc` | numeric | Medida | % de descuento |
| `valor_bruto` | numeric | Medida | cantidad × precio |
| `valor_descuento` | numeric | Medida | Monto del descuento |
| `neto` | numeric | Medida | Neto en moneda original |
| **`neto_rd`** | numeric | Medida | **Neto convertido a RD$ (neto × tasa)** — usar para totales |
### `VWFACTCOTIZACIONES` — Cotizaciones  · grano: línea de cotización
Llaves: `cotizacion_no`, `tipo_cliente`+`sec_cliente`, `vendedor_id`, `cod_zona`, `cod_provincia`, `cod_n…cod_sec`.
Medidas: `cantidad`, `precio`, `porc_desc`, `neto_rd`, `monto_bruto`, `monto_descuento`, `estado`.
### `vwfactPipeline` — Embudo comercial (cotizado → vendido → despachado) · grano: cotización
Medidas: `cotizado_rd`, `vendido_rd`, `pendiente_venta_rd`, `conversion_pct`, `despachado_rd`, `pendiente_despacho_rd`.
Llaves: `cotizacion_no`, `tipo_cliente`+`sec_cliente`, `vendedor`, `cod_zona`, `cod_provincia`, `ventas`.
### `vwFactPresupuesto` — Presupuesto/meta de ventas
Llaves: `ano`,`mes`, `vendedor`, `ventas`, `cod_n…cod_sec`, `cod_categoria`.
Medidas: `cantidad`, `valor`, `valor_rd`.
### `vwFactCxC_Base` — Movimientos de Cuentas por Cobrar
Llaves: `tipo_cliente`+`sec_cliente`, `vendedor`, `num_doc`, `tipo_doc`, `ventas`.
Medidas: `monto`, `monto_rd`, `monto_signado`, `monto_signado_rd`, `dias_vencimiento`, `tipo_movimiento`.
### `vwFactCxC_Real` — Balance vigente de CxC por factura
Llaves: `tipo_cliente`+`sec_cliente`, `vendedor`, `factura`, `ventas`.
Medidas: `balance_rd`, `dias_vencimiento`.
### `vwProductoDisponible` — Disponibilidad de inventario (snapshot)
Disponibilidad calculada con la misma lógica del sistema operativo de inventario. Llave: `producto_id` / `cod_n…cod_sec`.
Medidas: `existencia`, `ordenes_abiertas`, `despachado`, `reservado`, `transito`, **`disponible`** (= existencia (ordenes_abiertas despachado) reservado).
### `vwOrdenesPendientesDespacho` — Órdenes pendientes de despacho
Llaves: `cotizacion_no`, `tipo_cliente`+`sec_cliente`, `vendedor_id`, `cod_n…cod_sec`.
Medidas: `cantidadCotizada`, `cantidadDespachada`, `cantidadPendiente`, `valorCotizadoLinea`.
### `vwReqCotizaciones` — Requisiciones vs. cotizaciones
Medidas: `cantidadCotizada`, `cantidadDespachada`, `cantidadPendiente`, `valorRequisicion`, `valorPendienteDespachar`.
### `vwProduccion_pub` — Producción diaria  · grano: producto/día
Llaves: `codigodepto` → DepartamentoProducción, `cod_n…cod_sec` → Producto.
Medidas: `unidades`, `cantidad`, `existencia`, `cantidadVendida`.
### `vwFactContabilidad` — Movimientos contables
Llaves: `cuenta`, `codigodepartamento`, `ano`, `mes`, `tipo`, `banco`.
Medidas: `debito`, `credito`, `balance`, `presupuesto`. Incluye auditoría (`usuariocreador`, `fechacreacion`…).
---
## 6. Relaciones recomendadas en Power BI
> Como son vistas, **Power BI no detecta relaciones automáticamente**. Créalas a mano en la vista *Modelo*, con cardinalidad **Dimensión (1) → Hecho (\*)** y filtro en **dirección única**.
### 6.1 Área comercial (estrella)
| Dimensión (lado 1) | Columna | Hecho (lado \*) | Columna |
|---|---|---|---|
| `vwDimFecha` | `AnoMes` | `vwFactVentas` / cotizaciones / pipeline | `AnoMes` derivado de `ano`+`mes` |
| `vwDimCliente` | *clave compuesta* | `vwFactVentas`, `VWFACTCOTIZACIONES`, CxC | `tipo_cliente` + `sec_cliente` |
| `vwDimVendedor` | `vendedor_id` | `vwFactVentas` (`vendedor`), cotizaciones (`vendedor_id`) | vendedor |
| `vwDimEquipoVentas` | `equipo_id` | `vwDimVendedor` | `equipo_id` |
| `vwDimProducto` | `producto_id` | hechos con `cod_n…cod_sec` | *clave compuesta* |
| `vwDimCategoria` | `cod_categoria` | `vwBridgeProductoCategoria` | `cod_categoria` |
| `vwBridgeProductoCategoria` | `cod_n`+`cod_grupo`+`cod_tipo` | `vwDimProducto` | mismas columnas |
| `vwDimProvincia` | `cod_provincia` | `vwFactVentas`, cotizaciones, pipeline | `cod_provincia` |
| `vwDimZona` | `cod_zona` | `vwDimProvincia` | `idZona` |
| `vwDimTipoVenta` | `ventas` | hechos con `ventas` | `ventas` |
### 6.2 Claves compuestas — cómo resolverlas
Power BI **solo permite relaciones por UNA columna**. Para `Cliente` y `Producto` (llaves de 2 y 4 columnas) crea una **columna llave concatenada** con la misma fórmula en la dimensión y en el hecho:
```
// Cliente — en vwDimCliente y en cada hecho:
ClienteKey = FORMAT([tipo_cliente],"00") & "-" & FORMAT([sec_cliente],"0000000")
// Producto — usar el producto_id que ya trae vwDimProducto; en los hechos:
ProductoKey = FORMAT([cod_n],"0") & "-" & FORMAT([cod_grupo],"0") & "-" & FORMAT([cod_tipo],"0") & "-" & FORMAT([cod_sec],"0")
```
Luego relaciona por `ClienteKey` / `ProductoKey`.
### 6.3 Fechas
Los hechos traen `ano` + `mes`/`numeroMes` (grano mensual). Recomendado:
- Crear una **tabla de calendario** en Power BI (`CALENDAR`/`CALENDARAUTO`) y una columna `AnoMes` en cada hecho para relacionar; **o**
- Reutilizar `VW_DIM_CALENDARIO` (grano diario) como calendario compartido cuando se cruce con Indicadores.
### 6.4 Moneda
Los valores `*_rd` **ya vienen convertidos a RD$** usando la `tasa` de `vwDimTipoVenta`. Para totales monetarios usar siempre las columnas `neto_rd`, `monto_rd`, `valor_rd`, `balance_rd`.
---
## 7. Área de Indicadores / Balanced Scorecard (esquema `VW_*`)
Modelo estrella independiente para el tablero de gestión (indicadores, tiempos de caída, tickets de soporte).
**Dimensiones**
| Vista | PK | Descripción |
|---|---|---|
| `VW_DIM_CALENDARIO` | `Fecha` | Calendario diario (Año, Mes, Trimestre, Semana, EsFinDeSemana) |
| `VW_DIM_DEPARTAMENTOS` | `IdDepartamento` | Departamentos (Nombre, Tipo, Responsable, Activo) |
| `VW_DIM_INDICADORES` | `IdIndicador` | Indicadores (Meta, Peso, Frecuencia, UnidadMedida; FK `IdDepartamento`) |
| `VW_DIM_PERSPECTIVAS` | `IdPerspectiva` | Perspectivas del BSC (Financiera, Cliente, Procesos, Aprendizaje) |
| `VW_DIM_PROCESOS` | `IdProceso` | Procesos (Área, Criticidad, Tipo; FK `IdDepartamento`) |
**Hechos**
| Vista | Llaves | Medidas |
|---|---|---|
| `VW_HECHOS_INDICADORES` | `IdIndicador`, `Fecha`, `IdPerspectiva` | `ValorReal`, `ValorMeta`, `Cumplimiento`, `Score` |
| `VW_HECHOS_DOWNTIME` | `Fecha`, `IdDepartamento`, `IdProceso` | `HorasCaidas`, `ImpactoEstimado` |
| `VW_HECHOS_TICKETS` | `Fecha`, `IdProceso`, `IdDepartamento` | `HorasResolucion`, conteos por `status`/`priority`/`category` |
| `VW_SCORE_DEPARTAMENTO` | (derivada) | `ScorePromedio` por Departamento/Año/Mes |
**Relaciones**
- `VW_DIM_INDICADORES[IdIndicador]``VW_HECHOS_INDICADORES[IdIndicador]`
- `VW_DIM_PERSPECTIVAS[IdPerspectiva]``VW_HECHOS_INDICADORES[IdPerspectiva]`
- `VW_DIM_CALENDARIO[Fecha]``VW_HECHOS_INDICADORES / DOWNTIME / TICKETS[Fecha]`
- `VW_DIM_DEPARTAMENTOS[IdDepartamento]``VW_DIM_INDICADORES / VW_DIM_PROCESOS / hechos[IdDepartamento]`
- `VW_DIM_PROCESOS[IdProceso]``VW_HECHOS_DOWNTIME / VW_HECHOS_TICKETS[IdProceso]`
---
## 8. Tablas físicas (carga manual)
| Tabla | Contenido | Notas |
|---|---|---|
| `FactMercadoEdificaciones` | Datos de mercado de la construcción (municipio, barrio, tipo de destino, m² construidos, unidades, precio/m², situación del mercado, fuente) | Se carga con datos externos (ej. estadísticas de edificaciones) |
---
## 9. Vistas planas y personales (uso directo, fuera del modelo estrella)
Estas vistas **ya vienen denormalizadas** (traen las descripciones incorporadas): se conectan solas, sin relaciones.
| Vista | Uso |
|---|---|
| `ventas_facturas` | Vista completa de ventas con cliente, vendedor, producto, zona, moneda ya resueltos — ideal para una tabla dinámica rápida |
| `vwRotacionInventario_pub` / `vwRotacionInventarioPorBodega_pub` | Rotación de inventario (global / por bodega): cantidad vendida, valor ventas, `rotacion` |
| `item_conteo_ciclico` | Programación de conteo cíclico por clase ABC |
| `estadoResultado` | Estado de resultados por mes (`aplica_a`, `Balance`) |
| `vwProduccion_pub` | Producción diaria en formato plano |
| `analisisCotizaciones`, `analisisRequisiciones` | Análisis de cotizaciones y requisiciones (unidades/valores cotizados vs. despachados) |
**Copias personales (filtradas por vendedor/supervisor)***no usar para el modelo corporativo*:
`analisisCotizaciones_cdelacruz`, `_jefrancisco`, `_jisa`, `_mhurtado`, `_mpuig`, `_mvargas`;
`analisisRequisiciones_cdelacruz`, `_jefrancisco`, `_JISA`, `_mhurtado`, `_mpuig`;
`vwreportesfactura_cdelacruz`, `_jisa`, `_mpuig`;
`vwDimProductoMariaAna` (copia de `vwDimProducto`).
---
## 10. Buenas prácticas para el equipo de dashboards
1. **Un modelo por área** — no mezclar el esquema comercial con el de Indicadores en un mismo reporte salvo que se comparta el calendario.
2. **Usar siempre las columnas `*_rd`** para importes; la conversión de moneda ya está hecha.
3. **Dimensión en el lado 1, hecho en el lado \*** y filtro cruzado **unidireccional** (evita ambigüedad).
4. **Crear medidas DAX** (SUM, DISTINCTCOUNT…) en lugar de arrastrar columnas numéricas directamente.
5. **No apuntar a las vistas `_usuario`** para tableros compartidos; usar la vista base y filtrar con seguridad a nivel de fila (RLS) si se requiere segmentar por vendedor.
6. Ante dudas sobre el significado de una columna, consultar a Tecnología.