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

# Scripts de ejemplo de ensamblaje

> Scripts de ejemplo de ensamblaje para conjuntos de documentos de ABBYY FlexiCapture: uno añade los documentos obligatorios según el importe del préstamo y otro comprueba si faltan documentos.

Estos scripts de ejemplo ensamblan documentos en conjuntos de documentos definidos por una definición del conjunto de documentos y notifican los problemas de ensamblaje mediante el objeto `AssemblingErrors`. El primer script requiere distintos documentos en función del importe del préstamo. El segundo comprueba que un conjunto contenga los documentos de identificación esperados.

<div id="require-documents-based-on-the-loan-sum">
  ## Requerir documentos en función del importe del préstamo
</div>

Este script agrupa documentos en conjuntos de documentos definidos por una definición del conjunto de documentos. La definición del conjunto de documentos contiene una sección llamada **Formulario del prestatario** y referencias a las siguientes Definiciones de Document:

* Pasaporte
* Documentos del garante
* Documentos del co-prestatario
* Referencia del empleador

La sección **Formulario del prestatario** incluye los siguientes campos:

* Nombre del co-prestatario
* Importe del préstamo

Los documentos que debe contener el conjunto de documentos dependen del valor del campo **Importe del préstamo**. El script usa dos valores umbral para determinar qué documentos son obligatorios:

| Importe del préstamo                                      | Documentos obligatorios                                                |
| --------------------------------------------------------- | ---------------------------------------------------------------------- |
| Inferior al primer valor umbral                           | Pasaporte                                                              |
| Superior al primer valor umbral, pero inferior al segundo | Pasaporte y una referencia del empleador                               |
| Superior al segundo valor umbral                          | Pasaporte, una referencia del empleador y los documentos de un garante |

Si el campo **Nombre del co-prestatario** contiene un valor, el conjunto de documentos también debe incluir los documentos del co-prestatario.

El siguiente script usa esta lógica para agrupar conjuntos de documentos:

```csharp theme={null}
using System.Collections.Generic;
int creditSum = 0;
bool creditSumFound = false;
string cocreditor = "";
int formCount = 0;
string formName = "Borrower's form";
// Definiciones de Document utilizadas en el conjunto de documentos
int referenceFromWorkCount = 0;
string referenceFromWorkName = "Employer reference";
int guaranteeDocsCount = 0;
string guaranteeDocsName = "Guarantor's documents";
int cocreditorDocsCount = 0;
string cocreditorDocsName = "Co-borrower's documents";
int passportCount = 0;
string passportName = "Passport";
foreach( IBatchItem item in BatchItems ) {
    // Buscar el formulario y determinar el importe del préstamo
    if (item.Type == TBatchItemType.BIT_Page)
    {
        if (item.AsPage.SectionName != formName)
            AssemblingErrors.AddCustomError("Cannot contain the following sections: " + item.AsPage.SectionName, 1);
        else
        {
            cocreditor = item.AsPage.Document.IndexedItemValue("Borrower's name").ToString();
            string creditSumText = item.AsPage.Document.IndexedItemValue("Loan sum").ToString();
            if (!int.TryParse(creditSumText, out creditSum))
                AssemblingErrors.AddCustomError("Loan sum was not recognized: " + creditSumText, 1);
            else
                creditSumFound = true;
            formCount++;
        }
    }
    // Contar los documentos del conjunto
    else if (item.Type == TBatchItemType.BIT_Document) {
        if (item.AsDocument.TemplateName == referenceFromWorkName)
            referenceFromWorkCount++;
        else if (item.AsDocument.TemplateName == guaranteeDocsName)
            guaranteeDocsCount++;
        else if (item.AsDocument.TemplateName == passportName)
            passportCount++;
        else if (item.AsDocument.TemplateName == cocreditorDocsName)
            cocreditorDocsCount++;
        else
            AssemblingErrors.AddCustomError("The document set cannot contain the document " + item.AsDocument.TemplateName, 1);
    }
}
// Verificar el número de secciones y documentos del conjunto
if (formCount > 1)
    AssemblingErrors.AddCustomError("There are too many documents of the type: " + formName, formCount);
else if (formCount < 1)
    AssemblingErrors.AddCustomError("Missing the following documents: " + formName, 1);
if (passportCount > 1)
    AssemblingErrors.AddCustomError("There are too many documents of the type: " + passportName, passportCount);
else if (passportCount < 1)
    AssemblingErrors.AddCustomError("Missing the following documents: " + passportName, 1);
// Verificar que el conjunto de documentos contiene un co-prestatario si el nombre del co-prestatario está presente en el formulario
if (cocreditor != "" && cocreditorDocsCount < 1)
    AssemblingErrors.AddCustomError("Missing the following documents: " + cocreditorDocsName, 1);
else if (cocreditor != "" && cocreditorDocsCount > 1)
    AssemblingErrors.AddCustomError("There are too many documents of the type: " + cocreditorDocsName, cocreditorDocsCount);
else if (cocreditor == "" && cocreditorDocsCount > 0)
    AssemblingErrors.AddCustomError("There are too many documents of the type: " + cocreditorDocsName, cocreditorDocsCount);
// Verificar que el conjunto de documentos contiene todos los documentos requeridos porque el importe del préstamo supera uno de los umbrales
if (creditSumFound)
{
    if (creditSum > 50000) // requiere una referencia del empleador
    {
        if (referenceFromWorkCount > 1)
            AssemblingErrors.AddCustomError("There are too many documents of the type: " + referenceFromWorkName, referenceFromWorkCount);
        else if (referenceFromWorkCount < 1)
            AssemblingErrors.AddCustomError("Missing the following documents: " + referenceFromWorkName, 1);
    }
    if (creditSum > 500000) // requiere los documentos del garante
    {
        if (guaranteeDocsCount > 1)
            AssemblingErrors.AddCustomError("There are too many documents of the type: " + guaranteeDocsName, guaranteeDocsCount);
        else if (guaranteeDocsCount < 1)
            AssemblingErrors.AddCustomError("Missing the following documents: " + guaranteeDocsName, 1);
    }
}
```

<div id="check-for-missing-or-duplicate-documents">
  ## Comprobar si faltan documentos o si hay documentos duplicados
</div>

Este script funciona con la **definición del conjunto de documentos** **Identification Documents**, que hace referencia a las siguientes Definiciones de Document:

* Passport
* Driver's license

Un conjunto de documentos puede contener como máximo un documento de cada tipo y debe contener al menos uno de estos documentos.

El siguiente script usa esta lógica para ensamblar conjuntos de documentos:

```csharp theme={null}
using System.Collections.Generic;
using System;
string docSetName = "Identification Documents";
int pagesCnt = 0;
// Lista de los tipos de documentos que pueden incluirse en el conjunto
List<string> allowed = new List<string> {"Passport", "Driver's license"};
// Límite en el número de documentos de cada tipo en el conjunto
List<int> allowedCount = new List<int>{1,1};
// El número de documentos detectados en el conjunto
List<int> foundCount = new List<int>{0,0};
// Contar el número de documentos y páginas en el conjunto
foreach (IBatchItem item in BatchItems) {
    if (item.Type == TBatchItemType.BIT_Document) {
        if (item.AsDocument.TemplateName == docSetName)
            AssemblingErrors.AddCustomError("Cannot contain a nested set", 1);
        else if (allowed.Contains(item.AsDocument.TemplateName)) {
            int i = allowed.IndexOf(item.AsDocument.TemplateName);
            foundCount[i]++;
        }
    }
    else if (item.Type == TBatchItemType.BIT_Page) pagesCnt++;
}
// Verificar el número de documentos y páginas
if (foundCount[0] + foundCount[1] == 0)
    AssemblingErrors.AddCustomError("At least one identification document is required", 1);
for (int i = 0; i < allowed.Count; i++) {
    if (foundCount[i] > allowedCount[i])
        AssemblingErrors.AddCustomError("Maximum number of documents: " + allowed[i] + ": " + allowedCount[i]);
}
if (pagesCnt > 0) AssemblingErrors.AddCustomError("The document set cannot contain pages that do not belong to a document", pagesCnt);
```
