> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Referencia del mapeo regulatorio

> Las claves, los valores y los rechazos del mapeo que envías a Reporter para un documento regulatorio.

El mapeo es un documento YAML. Dice de dónde viene cada valor de un documento regulatorio en tus datos. Para enviarlo, [reemplaza el mapeo](https://docs.lerian.studio/es/reference/products/reporter/replace-subscription-mapping.md) de una suscripción. Reporter lee el documento, lo revisa contra el contrato de la versión fijada y lo almacena.

El contrato de un documento y su plantilla pertenecen a Lerian. El contrato nombra los conjuntos y los campos del documento. La plantilla coloca cada valor en el archivo. Esta página describe el mapeo.

Un mapeo que Reporter no puede leer se rechaza con HTTP `400` y `RPT-0143`. El detalle nombra el punto que debes corregir, por ejemplo `query 'saldos_cosif'`. Consulta la [lista de errores](https://docs.lerian.studio/es/reference/products/reporter/reporter-error-list.md).

## Ejemplo

***

Este mapeo llena dos conjuntos de CADOC 4010. La consulta `saldos_cosif` suma los asientos aprobados de cada `route_code` creados antes del fin del período del parámetro `dataBase`. Un crédito suma su `amount`. Un débito lo resta. El mapeo de referencia publicado para este documento también filtra por el activo BRL, por los asientos que movieron un saldo y por las filas que no están borradas. También corta el fin del período con el calendario de días hábiles.

```yaml theme={null}
kind: DocumentBinding
contract: br.bcb.cadoc-4010
contractVersion: 1.0.0

queries:
  - name: declarante
    dataSource: midaz_onboarding
    table: organization
    filters:
      - field: deleted_at
        operator: isNull

  - name: saldos_cosif
    dataSource: midaz_transaction
    table: operation
    filters:
      - field: status
        operator: eq
        values: ["APPROVED"]
      - field: created_at
        operator: lt
        values: [{parameter: dataBase, at: end}]
    compute:
      - as: valor_no_razao
        case:
          column: direction
          when:
            credit: {column: amount}
            debit: {negate: amount}
          otherwise: refuse
    aggregate:
      groupBy: [route_code]
      measures:
        - as: saldo
          fn: sum
          of: valor_no_razao

datasets:
  institution:
    from:
      query: declarante
    fields:
      cnpj:
        from: query
        column: legal_document

  cosif_balances:
    from:
      query: saldos_cosif
    fields:
      cosifCode:
        from: query
        column: route_code
      saldo:
        from: query
        column: saldo
```

## Cómo lee Reporter el documento

***

* El documento debe ser YAML. Un documento vacío se rechaza. El nivel superior debe ser un objeto de claves y valores.
* Cada bloque acepta las claves de su tabla en esta página. Un bloque con cualquier otra clave se rechaza. El rechazo enumera las claves que el bloque acepta.
* Una clave conocida sin valor cuenta como no escrita.
* Un texto obligatorio no puede estar vacío.
* Reporter lee un valor como el texto que escribes. `7` y `"7"` son el mismo valor.
* Reporter acepta anclas y alias de YAML. Rechaza la clave de combinación `<<`.
* Dos consultas no pueden tener el mismo nombre. Dos conjuntos no pueden tener el mismo nombre. Dos campos de un conjunto no pueden tener el mismo nombre.
* Estos nombres deben coincidir con una consulta del mapeo: el `from` de una consulta, la `query` del `from` de un conjunto, la `query` de un join y la `query` de un campo de un conjunto. Una consulta puede declararse después del conjunto o de la consulta que se refiere a ella.

## Claves de nivel superior

***

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `apiVersion` | texto | No | Marcador de formato. |
| `kind` | texto | No | Marcador de formato. Cuando lo escribes, el valor debe ser `DocumentBinding`. |
| `contract` | texto | Sí | ID del documento que el mapeo llena, por ejemplo `br.bcb.cadoc-4010`. |
| `contractVersion` | texto | No | Versión del contrato con la que escribiste el mapeo. |
| `queries` | lista de consultas | No | Las lecturas de tus datos. |
| `datasets` | objeto de conjuntos | Sí | Cómo se llena cada conjunto del documento. `datasets: {}` se acepta y no mapea nada. Un documento sin la clave `datasets` se rechaza. |
| `manualOverrides` | lista de sobrescrituras | No | Valores que Reporter valida al guardar y almacena con el mapeo. Para cambiar un valor en una presentación, [corrige el borrador](https://docs.lerian.studio/es/reference/products/reporter/correct-regulatory-report.md). |
| `generatable` | `true` o `false` | No | Tu declaración de si el documento se puede generar o no. |
| `incompleteReason` | texto | No | Por qué el documento no se puede generar. |
| `incompleteFields` | lista de textos | No | Campos sin origen, cada uno escrito como `set.field`. |

## Consultas

***

Una consulta lee filas de tus datos. Los conjuntos y otras consultas se refieren a una consulta por su nombre.

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `name` | texto | Sí | Da nombre a la consulta. |
| `description` | texto | No | Una descripción de la consulta. |
| `dataSource` | texto | Con `table` | El `configName` de la fuente de datos que la consulta lee. |
| `table` | texto | Con `dataSource` | Clave de la tabla en esa fuente de datos. |
| `from` | texto | En lugar de `dataSource` y `table` | Otra consulta para leer. Consulta las construcciones que una generación rechaza. |
| `expand` | texto | No | Lista dentro de cada documento cuyos elementos se vuelven filas. |
| `filters` | lista de condiciones | No | Conserva las filas que pasan, antes de agrupar. |
| `having` | lista de condiciones | No | Consulta las construcciones que una generación rechaza. |
| `join` | lista de joins | No | Trae una segunda tabla o consulta junto a las filas. |
| `derive` | lista de columnas derivadas | No | Consulta las construcciones que una generación rechaza. |
| `compute` | lista de columnas calculadas | No | Agrega una columna que un caso calcula en cada fila. |
| `aggregate` | objeto | No | Agrupa las filas y calcula medidas. |
| `select` | lista de textos | No | Nombra las columnas que la consulta devuelve. |

Una consulta se rechaza cuando:

* no tiene `dataSource` ni `from`;
* tiene `from` y también `dataSource` o `table`;
* tiene `dataSource` y no tiene `table`;
* su `from` nombra la propia consulta, nombra una consulta que el mapeo no declara o cierra un anillo con otras consultas.

### Filtros

Una fila permanece cuando pasa cada condición de `filters`. Las condiciones sobre la misma columna se aplican todas.

Una condición es una prueba o una combinación:

| Clave | Tipo | Qué hace |
| - | - | - |
| `field` | texto | La columna que se prueba. |
| `operator` | texto | Cómo comparar. |
| `values` | lista | Con qué comparar. |
| `anyOf` | lista de condiciones | Una combinación. Consulta las construcciones que una generación rechaza. |
| `allOf` | lista de condiciones | Una combinación. Consulta las construcciones que una generación rechaza. |

Una condición necesita `field` y `operator`, o `anyOf` o `allOf`. Se aceptan estos operadores:

| Operador | Valores |
| - | - |
| `eq`, `in`, `nin` | Uno o más valores, o un parámetro. |
| `gt`, `gte`, `lt`, `lte` | Un valor, o un parámetro. |
| `startsWith`, `notStartsWith` | Uno o más valores, o un parámetro. Cada valor es un prefijo. |
| `between` | Exactamente dos valores: los límites. No se acepta un parámetro. |
| `isNull`, `notNull` | Ningún valor y ningún parámetro. |

Para excluir filas por prefijo, usa `notStartsWith`. Este filtro descarta las filas cuyo `route_code` empieza con `7` o `8`:

```yaml theme={null}
filters:
  - field: route_code
    operator: notStartsWith
    values: ["7", "8"]
```

Una condición se rechaza cuando:

* tiene una clave distinta de `field`, `operator`, `values`, `anyOf` y `allOf`;
* tiene `field` y también `anyOf` o `allOf`;
* no tiene `field` ni `anyOf` ni `allOf`;
* tiene `field` y no tiene `operator`;
* su `operator` no está en la tabla. El rechazo enumera los operadores aceptados;
* tiene `isNull` o `notNull` con valores o con un parámetro;
* tiene `between` con un parámetro, o con una cantidad de valores distinta de dos;
* tiene cualquier otro operador sin valor y sin parámetro.

Dos condiciones de `filters` sobre una columna se rechazan cuando usan el mismo operador. También se rechazan cuando una de ellas es `isNull` o `notNull`. Dos operadores distintos sobre una columna se combinan, y así escribes un período: `gte` para su inicio y `lt` para su fin. Una generación rechaza `between` junto a `gte` o `lte`.

#### Valores leídos de un parámetro

Un parámetro es un valor que envías en la solicitud de generación. Un elemento de `values` que es un objeto lee un parámetro:

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `parameter` | texto | Sí | Nombre del parámetro. |
| `at` | `start` o `end` | No | El borde del período que el parámetro nombra. |
| `of` | `day`, `month` o `year` | No | El período al que pertenece el borde. Necesita `at`. |
| `calendar` | `business` | No | Corta el período por los días hábiles del contrato. |

Sin `at`, la condición compara con el valor del parámetro como lo trae la solicitud. Con `at`, el parámetro nombra un período: `AAAA-MM` para un mes, `AAAA-MM-DD` para un día. Los bordes siguen la zona horaria del informe. `start` es el primer instante dentro del período. `end` es el primer instante después de él. Compara `start` con `gte` y `end` con `lt`. Así, ningún instante cae en dos períodos ni en ninguno.

Con `calendar: business`, un período termina justo después de su último día hábil. Empieza justo después del último día hábil del período anterior.

Esta consulta lee el mes del parámetro, hasta el fin de su período:

```yaml theme={null}
filters:
  - field: created_at
    operator: gte
    values: [{parameter: dataBase, at: start, of: month}]
  - field: created_at
    operator: lt
    values: [{parameter: dataBase, at: end}]
```

Un valor de parámetro se rechaza cuando:

* `values` enumera dos parámetros, o enumera un texto junto a un parámetro;
* el objeto del parámetro tiene una clave distinta de `parameter`, `at`, `of` y `calendar`, o no tiene `parameter`;
* `at` no es `start` ni `end`;
* `of` no es `day`, `month` ni `year`;
* `calendar` no es `business`;
* tiene `of` o `calendar` y no tiene `at`;
* tiene `at: start` con un operador distinto de `gte`, o `at: end` con un operador distinto de `lt`.

Una generación rechaza un `of` más corto que el período del parámetro, por ejemplo `of: day` en un mes.

### Joins

Un join trae una tabla junto a las filas de la consulta. Cada elemento de `join` tiene estas claves:

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `table` | texto | Una entre `table` y `query` | La tabla que se trae. |
| `query` | texto | Una entre `table` y `query` | La consulta que se trae. Consulta las construcciones que una generación rechaza. |
| `match` | objeto | Sí | Empareja una columna de esta consulta (clave) con una columna de la tabla o de la consulta del join (valor). |
| `columns` | objeto | Con `table` | Las columnas que el join trae. Cada clave es el nombre que esta consulta usa. Cada valor es la columna de la tabla del join. Las otras columnas quedan fuera. |
| `type` | texto | No | `left` o `inner`. El valor predeterminado es `left`. |

Con `left`, cada fila de la consulta permanece, y las columnas traídas quedan vacías donde ninguna fila empareja. Con `inner`, las filas sin par salen. Una fila con varios pares se vuelve varias filas.

Un join se rechaza cuando:

* no nombra `table` ni `query`, o nombra las dos;
* no tiene `match`, o `match` no tiene ningún par;
* escribe `on` en lugar de `match`. Escribe `match`;
* tiene una clave distinta de `table`, `query`, `match`, `columns` y `type`;
* trae una tabla y no tiene `columns`, o `columns` no tiene ningún par;
* trae una consulta y tiene `columns`;
* dos joins de la consulta traen el mismo nombre, o un join trae un nombre que también empareja en `match`;
* `type` no es `left` ni `inner`.

### Columnas calculadas

`compute` agrega una columna a cada fila. Los pasos siguientes la leen como una columna de la tabla: filtros, agrupación y sumas.

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `as` | texto | Sí | Nombre de la nueva columna. |
| `case` | objeto | Sí | Elige el valor de la columna. |

Un `case` tiene estas claves:

| Clave | Obligatoria | Qué hace |
| - | - | - |
| `column` | Sí | La columna cuyo valor elige la respuesta. |
| `when` | Sí | Un objeto. Cada clave es un valor de `column`. Cada valor es una respuesta. |
| `otherwise` | Sí | La respuesta para un valor que `when` no enumera. Es `refuse` o una respuesta. |

Una respuesta es un objeto con exactamente una clave:

| Clave | El valor de la nueva columna |
| - | - |
| `column` | El valor de esa columna. |
| `negate` | El valor de esa columna con el signo cambiado. |
| `constant` | El texto que escribes. |

Con `otherwise: refuse`, una fila cuyo valor `when` no enumera hace que la generación se rechace.

Una columna calculada se rechaza cuando:

* `compute` tiene dos elementos con el mismo `as`;
* un elemento tiene una clave distinta de `as` y `case`, o no tiene `as` o `case`;
* el `case` tiene una clave distinta de `column`, `when` y `otherwise`;
* `column` u `otherwise` faltan, o `when` falta o está vacío;
* `otherwise` es un texto distinto de `refuse`;
* `as` es también un nombre que un join trae o que un derive nombra, o el `case` lee otra columna calculada;
* una respuesta no tiene exactamente una entre `column`, `negate` y `constant`, o su valor está vacío.

### Agrupación y medidas

`aggregate` reduce las filas a una fila por cada grupo.

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `groupBy` | lista de textos | No | Columnas que definen un grupo. Sin ella, todas las filas se vuelven una sola. |
| `measures` | lista de medidas | Sí | Valores que Reporter calcula para cada grupo. |

Una medida tiene estas claves. Las tres son obligatorias:

| Clave | Qué hace |
| - | - |
| `as` | Nombre del resultado. Un campo lee el resultado con este nombre. |
| `fn` | La función. Escribe `sum`. Reporter rechaza otra función cuando genera una presentación. |
| `of` | La columna que se suma. Puede ser una columna de la tabla, una columna de join o una columna calculada. |

Una consulta que agrupa devuelve las columnas de `groupBy` y una columna por cada medida. Un campo que lee otra columna se rechaza cuando guardas. Una generación se rechaza cuando una fila no tiene valor en una columna de `groupBy`.

`aggregate` se rechaza cuando tiene una clave distinta de `groupBy` y `measures`, o cuando `measures` falta o está vacío. Una medida se rechaza cuando tiene una clave distinta de `as`, `fn` y `of`, o cuando le falta una de ellas. Una generación rechaza dos medidas con el mismo `as`.

### Columnas que una consulta devuelve

`select` nombra las columnas que una consulta devuelve. Sin él, la consulta devuelve cada columna y los campos eligen. Con él, un campo que lee otra columna se rechaza cuando guardas.

`select` se rechaza cuando la consulta también tiene `aggregate`, cuando está vacío, o cuando nombra una columna dos veces o nombra una columna vacía.

### Listas dentro de documentos

`expand` nombra una lista dentro de cada documento, como una ruta con puntos de los campos de la tabla. Cada elemento de la lista se vuelve una fila. La consulta lee los campos del elemento bajo la ruta de la lista.

En una fuente de datos PostgreSQL, la respuesta del guardado enumera `expand` en `unexecuted`, y una generación se rechaza.

`expand` se rechaza cuando la ruta está vacía, empieza o termina con punto, tiene dos puntos seguidos, o tiene un espacio o un `$`. También se rechaza en una consulta que tiene `from`.

### Construcciones que una generación rechaza

Reporter lee y almacena estas construcciones. La respuesta del guardado las enumera en `unsupported`. Una generación de un mapeo que contiene una de ellas se rechaza.

| Construcción | Cómo la escribes |
| - | - |
| Una consulta que lee otra consulta | `from` en una consulta |
| Filtro después de agrupar | `having` |
| Una columna derivada | `derive`, con `as`, `from` y `apply`, todas obligatorias |
| Un join de una consulta | `query` en un join |
| Condiciones combinadas | `anyOf` o `allOf` en `filters` |

## Conjuntos

***

Cada clave de `datasets` es el nombre de un conjunto que el contrato declara. Su valor tiene estas claves:

| Clave | Tipo | Obligatoria | Qué hace |
| - | - | - | - |
| `from` | objeto | No | Tiene una clave, `query`. Nombra la consulta cuyas filas se vuelven las filas del conjunto. |
| `rowKey` | objeto | No | Para un conjunto cuyas filas publica el catálogo. Empareja el campo que identifica una fila publicada (clave) con la columna de la consulta que identifica la misma fila (valor). |
| `parentMatch` | objeto | No | Para un conjunto que el contrato declara como hijo de otro conjunto. Empareja un campo del conjunto padre (clave) con la columna de la consulta que lo trae (valor). |
| `fields` | objeto de campos | Sí | De dónde toma el valor cada campo del conjunto. No puede estar vacío. |
| `also` | lista de orígenes | No | Otros orígenes del mismo conjunto. Consulta Consolidación. |

Un conjunto abierto tiene una fila por cada fila de su consulta. Reporter ordena las filas por los campos clave del conjunto, como texto en orden de bytes. Sin `from`, el conjunto no tiene filas de consulta. Si el contrato declara el conjunto como una fila, sus constantes y parámetros llenan esa fila. Cuando el contrato declara una jerarquía para el código del conjunto, Reporter también agrega una fila por cada código ancestro, con la suma de las filas que están debajo. Devuelve el valor registrado en cada código. No devuelvas un valor de padre que ya incluye a sus hijos, porque Reporter suma los hijos a él.

Las filas de un conjunto que el catálogo publica son las filas publicadas, una por cada una. El mapeo da sus valores:

* Las consultas del conjunto leen solo las filas cuya columna de `rowKey` contiene un código publicado. Cuando el contrato declara una jerarquía para el código, leen las filas cuyo código está bajo un código publicado. Reporter deja fuera una fila con otro código y no la rechaza. En un elemento de `also`, Reporter no deja fuera una fila con otro código: rechaza la generación.
* Una fila de resultado llena la fila publicada de su código. Cuando el contrato declara una jerarquía, también llena cada fila publicada por encima de ese código. Esa fila publicada lee la suma de las medidas de las filas de resultado de su código y de los códigos debajo de él.
* Con una jerarquía, devuelve el valor registrado en cada código. No devuelvas un valor de padre que ya incluye a sus hijos, porque Reporter suma los hijos a él.
* Una fila publicada sin fila de resultado lee `0` en una medida que una consulta llena. Sus otras columnas de consulta quedan sin valor. Un campo obligatorio que lee una de ellas hace que la generación se rechace.
* Dos filas de resultado con el mismo código hacen que la generación se rechace.
* Una generación en la que ninguna fila de resultado coincide con una fila publicada se rechaza.

Un conjunto se rechaza cuando:

* su `from` no es un objeto con la clave `query`;
* tiene una clave distinta de `from`, `rowKey`, `parentMatch`, `fields` y `also`;
* `rowKey` o `parentMatch` no tiene ningún par;
* no tiene `fields`, o `fields` está vacío;
* su `from` nombra una consulta que el mapeo no declara.

### Campos

Un campo dice de dónde viene su valor. Escribe un origen, o escribe `byRowClass`.

| Clave | Tipo | Qué hace |
| - | - | - |
| `from` | texto | El origen del valor: `query`, `constant`, `parameter`, `manual` o `rowSet`. |
| `column` | texto | La columna que Reporter lee. |
| `query` | texto | La consulta que Reporter lee, cuando no es la consulta del conjunto. |
| `value` | texto | El valor fijo. |
| `parameter` | texto | El nombre del parámetro. |
| `pendingReason` | texto | Por qué un campo manual no tiene valor. |
| `byRowClass` | lista de casos | Elige el origen según la fila. |

Cada origen necesita una cosa:

| `from` | Necesita | El valor del campo |
| - | - | - |
| `query` | `column` | La `column` de la fila de la consulta. En un conjunto cuyas filas publica el catálogo, `query` nombra la consulta que se lee en lugar de la consulta del conjunto. Escribe la clave `query` del propio campo solo en ese tipo de conjunto. Una generación se rechaza cuando la consulta no devuelve esa columna. |
| `constant` | `value` | El `value`. |
| `parameter` | `parameter` | El valor de ese parámetro en la solicitud de generación. Cuando la solicitud no lo trae, Reporter usa el valor predeterminado del contrato. Sin valor predeterminado, un parámetro que el contrato exige hace que se rechace la solicitud. Nombra un parámetro que el contrato declara. |
| `manual` | `value` o `pendingReason` | El `value`, cuando lo escribes. Sin valor, el campo queda en blanco para que una persona lo llene en el borrador. El `pendingReason` le dice a esa persona el motivo. |
| `rowSet` | `column` | La `column` de la fila publicada. |

Un campo del contrato que el mapeo no nombra queda en blanco, y la respuesta lo enumera como una brecha. Reporter rechaza aprobar un borrador mientras un campo obligatorio esté en blanco.

Un origen de campo se rechaza cuando:

* `from` falta, o no es uno de los cinco orígenes;
* nombra una `query` y su origen no es `query`;
* el origen es `query` o `rowSet` y no hay `column`;
* el origen es `constant` y no hay `value`;
* el origen es `parameter` y no hay `parameter`;
* el origen es `manual` y no hay `value` ni `pendingReason`;
* el campo tiene una clave distinta de las claves de la tabla anterior;
* la `query` que nombra no está declarada por el mapeo.

#### Orígenes que dependen de la fila

`byRowClass` sirve para un conjunto cuyas filas publica el catálogo. Cada caso tiene `when` y las claves de un origen. El primer caso cuyo `when` coincide con la fila publicada da el valor. Una fila que ningún caso atiende no recibe valor de este campo. La generación se rechaza cuando el contrato exige el campo.

`when` tiene dos claves obligatorias: `rowSet`, la columna de la fila publicada, y `equals`, el valor que debe tener.

Este campo lee un saldo para una clase de fila y un total mensual para la otra. Cada clase lee su propia consulta:

```yaml theme={null}
saldoDia:
  byRowClass:
    - when: { rowSet: measure, equals: stock }
      from: query
      column: saldoDia
    - when: { rowSet: measure, equals: flow }
      from: query
      query: volumes_fluxo
      column: volumeMes
```

Un `byRowClass` se rechaza cuando el campo también tiene un `from` propio. Un caso se rechaza cuando no tiene `when`, cuando `when` tiene una clave distinta de `rowSet` y `equals`, cuando `rowSet` o `equals` falta, o cuando tiene una clave distinta de `when` y de las claves de un origen.

### Consolidación

`also` agrega orígenes a un conjunto. Cada elemento mapea el mismo conjunto sobre otra consulta, por ejemplo otra base de datos de la institución de la presentación. Reporter no limita la consulta de un elemento a la institución de la presentación. Los filtros de esa consulta deben elegir las filas de la institución de la presentación. El contrato del documento dice cómo Reporter une las filas de los orígenes, y cuáles conjuntos aceptan `also`.

Un elemento tiene las claves `from`, `rowKey` y `fields`. No tiene `parentMatch` ni `also`. Su `from` es obligatorio. Su `fields` usa las claves de los campos de un conjunto. Un elemento sin `fields`, o con `fields` vacío, no mapea nada, y cada campo que no mapea es una brecha.

Reporter rechaza un elemento cuyo `from` también es el `from` del conjunto o de otro elemento. Rechaza un elemento que lee una consulta que el mapeo de cualquier conjunto lee. También rechaza un elemento que mapea un campo que el mapeo propio del conjunto no mapea. Da a cada elemento sus propias consultas.

## Sobrescrituras manuales y declaraciones

***

Reporter revisa estas claves cuando guardas el mapeo, y las almacena con él.

Cada elemento de `manualOverrides` tiene estas claves:

| Clave | Tipo | Obligatoria | Significado |
| - | - | - | - |
| `field` | texto | Sí | El campo, escrito como `set.field`. |
| `value` | texto | Sí | El valor. |
| `reason` | texto | No | Por qué lo escribiste. |

Un elemento se rechaza cuando tiene una clave distinta de estas tres, o cuando `field` o `value` está vacío.

`generatable`, `incompleteReason` y `incompleteFields` guardan tu declaración sobre el documento:

* `generatable` debe ser `true` o `false`.
* `generatable: false` se rechaza cuando `incompleteReason` falta.
* `incompleteFields` se rechaza cuando enumera un campo y `generatable` no es `false`.

## Revisiones contra el contrato

***

Después de leer el documento, Reporter lo compara con el contrato de la versión fijada. El guardado se rechaza cuando:

| El mapeo | Qué cambias |
| - | - |
| Nombra un `contract` distinto del documento de la suscripción. | Escribe el ID del documento. |
| Llena un conjunto o un campo que el contrato no declara, o mapea un campo que el contrato deriva de otro campo. | Usa los conjuntos y los campos del contrato. Mapea el campo del que viene el campo derivado. |
| Compara una columna con un parámetro que el contrato no declara, usa `at` en un parámetro que no es un mes ni una fecha, o usa `calendar: business` cuando el contrato no tiene calendario. | Usa un parámetro del contrato. |
| Lee una columna de una consulta que agrupa, en un campo, en `rowKey` o en `parentMatch`, y la consulta no la devuelve. | Nombra una columna de `groupBy` o el `as` de una medida. |
| Llena con una consulta un conjunto cuyas filas publica el catálogo y no tiene `rowKey`, o empareja un campo distinto del que identifica las filas. | Empareja el campo que identifica las filas publicadas. |
| Usa `rowKey` o `from: rowSet` en un conjunto sin filas publicadas. | Quita `rowKey` y lee cada valor de otro origen. |
| Llena un conjunto hijo con una consulta y no empareja cada clave del padre en `parentMatch`, o usa `parentMatch` en un conjunto que no es hijo. | Empareja cada clave del padre. |
| Usa `also` en un conjunto que el contrato no declara para consolidación. | Quita `also`. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.