# Validazione dei dati

La piattaforma permette funzioni di validazione dei dati

## Obbligatorietà dei contenuti

Per rendere la compilazione di un campo obbligatoria, attiva la funzione "required" nella sezione "Validation"

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FFC6vfZ5Nahnfzw4cKvMJ%2Fimage.png?alt=media&#x26;token=1d205cbb-e50e-4942-af6d-15d0b619f419" alt=""><figcaption></figcaption></figure>

## Dato presente una sola volta nel modulo

Per far sì che un dato possa essere inserito solo una volta durante la compilazione, nella sezione "Validation" del componente attiva la funzione "unique"

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FG1iZb9VpQtkXoRuUR4Zf%2Fimage.png?alt=media&#x26;token=21533822-004b-4da7-92a9-f87a0483594d" alt=""><figcaption></figcaption></figure>

## Lunghezza minima e massima (datagrid)

Per i componenti [Datagrid](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/il-datagrid) puoi configurare la lunghezza minima e massima del testo inserito nel campo.

Nella sezione "Validation" del componente, compila le voci *Maximum length* e *Minimum length* con valori numerici.

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FXAX9bLpL7tuh8yD867Wn%2Fimage.png?alt=media&#x26;token=4faee283-9723-424a-9f5b-b966cd96997c" alt=""><figcaption></figcaption></figure>

Ricordati di inserire il messaggio di errore che compare all'utente alla voce "Custom error message".

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FkFvCFRC4jupqvKB1i5mE%2Fimage.png?alt=media&#x26;token=512d7df4-178b-4c9f-a6f1-f1721f4feb58" alt=""><figcaption></figcaption></figure>

## Verificare le date inserite

Una volta inserita la data, puoi [configurare il formato e verificare che il cittadino non possa inserire date nel passato](https://app.gitbook.com/o/-MRQtav6dxPB0RkAwAX7/s/rdV0mwA7iy2c3I7wu5BX/~/changes/67/creare-un-servizio/i-componenti/le-date#configurare-le-date).

<div data-full-width="true"><figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FpVawhlvXYhTBBhkckwhD%2Fimage.png?alt=media&#x26;token=1164629a-e87a-4e39-a736-d350cec2563d" alt=""><figcaption></figcaption></figure> <figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FJwSrHHNCVhTwYVVLuKni%2FScreenshot-4--05-21-2025_04_37_PM.png?alt=media&#x26;token=8fc5607e-8512-43cb-855b-632b0b198be1" alt=""><figcaption></figcaption></figure></div>

## Verificare l'età di una persona&#x20;

Durante la configurazione di una [data](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/le-date), nel caso in cui il servizio preveda l'inserimento di una data di nascita, puoi controllare che questa venga inserita correttamente.

Nella sezione "Validation" del componente, compila la voce "Custom validation" con il codice JavaScript di verifica, ad esempio prevedendo che venga inserita la data di nascita di un minorenne

```javascript
date = moment(input, 'DD/MM/YYYY')
if (date.isAfter(moment())) {
  valid = "La data non può essere nel futuro"
} else {
  if (moment().diff(date, 'years') > 18) {
    valid = "L'età inserità non è quella di un minorenne"
  }
}
```

## *Regular expression pattern*

Il *pattern* è una stringa che rappresenta una espressione regolare usata per verificare se il valore inserito in un campo rispetta certe regole di formato. È un modo per assicurarsi che, ad esempio, un campo email, telefono o codice postale abbia la struttura corretta.

Nella sezione "Validation" del componente (normalmente un [*Text field*](https://app.gitbook.com/o/-MRQtav6dxPB0RkAwAX7/s/rdV0mwA7iy2c3I7wu5BX/~/changes/67/creare-un-servizio/i-componenti/il-textfield)), compila la voce "Regular expression pattern" con la struttura prevista dal dato inserito

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2Fn9diKz5ezmEOCkU7gK24%2Fimage.png?alt=media&#x26;token=44d776cb-91d1-4a1d-9ba2-1d415ec16945" alt=""><figcaption></figcaption></figure>

Ricordati di inserire il messaggio di errore che compare all'utente alla voce "Custom error message".

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FCVOZ50GAVM26dlrqoRVh%2Fimage.png?alt=media&#x26;token=178a3630-8bff-4531-b74b-f9a77b9afb39" alt=""><figcaption></figcaption></figure>

## Lunghezza minima e massima del dato

Durante la configurazione di un componente [*Text field*](https://app.gitbook.com/o/-MRQtav6dxPB0RkAwAX7/s/rdV0mwA7iy2c3I7wu5BX/~/changes/67/creare-un-servizio/i-componenti/il-textfield), puoi configurare:

* la lunghezza del testo (1)
* il numero di parole (2).

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FSHbAA7b5WELmDut29U9D%2Fimage.png?alt=media&#x26;token=78069bbf-11ac-4b4d-bc3c-55275a209472" alt=""><figcaption></figcaption></figure>

Ricordati di inserire il messaggio di errore che compare all'utente alla voce "Custom error message".

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FpOCtFEobZepTICl1mkyV%2Fimage.png?alt=media&#x26;token=6fa5f2d3-352c-455e-bf5d-25f5adf67068" alt=""><figcaption></figcaption></figure>

## Verificare la residenza del beneficiario

{% hint style="info" %}
**Attenzione!**

Questa funzione richiede che nel servizio sia stato inserito il nested form "OC - Beneficiario"
{% endhint %}

Per verificare che la residenza del beneficiario del servizio sia situata in un determinato Comune e impedire al cittadino di proseguire qualora indichi un Comune diverso, è possibile configurare un’apposita funzione seguendo questi passaggi:

{% stepper %}
{% step %}

#### Inserisci un nuovo campo Hidden

{% endstep %}

{% step %}

#### Configuralo inserendo `residence_tenant` come label e come property name (sezione "API")

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FiSNg7PaFbBt2npuYhK5b%2Fimage.png?alt=media&#x26;token=9b6ab456-da16-4492-a19a-607a86759e85" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Inserisci in "Data", nella sezione "Calculated value", il seguente codice, poi salva

```javascript
if (!value) { 
  window.FormioHelper.getTenantInfo().then((info) => {
    instance.setValue(info.name.toLowerCase());
  });
}
```

{% endstep %}

{% step %}

#### Inserisci un nuovo campo a tua scelta (per esempio, un Text Field) e salva senza inserire informazioni

{% endstep %}

{% step %}

#### Copia il codice qui sotto e incollalo nella sezione "Edit JSon" del componente appena creato

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2Fm9Ap91ATIygn8CFqdIIa%2Fimage.png?alt=media&#x26;token=31ef01d1-e352-49d3-95e7-ef2856cfebcf" alt=""><figcaption></figcaption></figure>

```json
{
  "label": "Columns",
  "columns": [
    {
      "width": 12,
      "offset": 0,
      "push": 0,
      "pull": 0,
      "size": "md",
      "currentWidth": 12,
      "components": [
        {
          "label": "HTML",
          "tag": "div",
          "className": "alert alert-danger",
          "attrs": [
            {
              "attr": "",
              "value": ""
            }
          ],
          "content": "<h5>Attenzione!</h5>\nNon puoi inviare questa pratica. La residenza del beneficiario non si trova nel Comune",
          "refreshOnChange": false,
          "key": "html17",
          "type": "htmlelement",
          "input": false,
          "tableView": false
        }
      ]
    },
    {
      "width": 12,
      "offset": 0,
      "push": 0,
      "pull": 0,
      "size": "md",
      "currentWidth": 12,
      "components": [
        {
          "label": "fail_applicant",
          "key": "fail_applicant",
          "type": "checkbox",
          "customClass": "d-none",
          "disabled": true,
          "input": true,
          "tableView": false,
          "defaultValue": false,
          "validate": {
            "required": true
          }
        }
      ]
    }
  ],
  "key": "columns9",
  "customConditional": "const residenceFields = [ \"beneficiary.data.address.data.address_locality\" ]\nshow = window.FormioHelper.checkResidences(data, residenceFields);",
  "type": "columns",
  "input": false,
  "tableView": false
}
```

{% hint style="info" %}
Questa operazione consente di riutilizzare parti di modulo già predisposte, evitando di doverle ricreare da zero.\
In questo caso, il componente appena aggiunto viene sostituito con un componente columns che include un messaggio HTML di errore, visualizzato in caso di residenza non valida, e una checkbox configurata per impedire all’utente di proseguire.
{% endhint %}

Il cittadino che avrà inserito una residenza errata visualizzerà questo messaggio d'errore e non potrà proseguire la compilazione:

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2F4epvT9u4m7pp4Sock6BX%2Fimage.png?alt=media&#x26;token=d5f6bf74-982c-4575-bf29-0192a2d52395" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

## Verificare la provincia del richiedente

Per verificare l'indirizzo inserito da un utente in fase di richiesta, inserisci nel modulo un [nested form OC-Residenza](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/i-nested-form).

Successivamente, inserisci un campo Columns in cui inserire un [campo HTML ](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/lhtml)e un checkbox [obbligatorio](#obbligatorieta-dei-contenuti) e disabilitato.

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2Fvgvbfc9pREluBWRXnCYB%2FScreen%20recording%202025-05-22%2016.52.20.gif?alt=media&#x26;token=4a027703-30ad-4868-9904-3a03555587ab" alt=""><figcaption></figcaption></figure>

Nella sezione "Contional" del campo Columns compila la voce "Advanced conditions" con il codice di controllo:

<div><figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2Fxw1rZBEKN7N561vX1tpj%2Fimage.png?alt=media&#x26;token=1f31b590-e392-4457-b05c-6a02ce1a50df" alt=""><figcaption></figcaption></figure> <figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2F2GsRCNCqUOHtC6TBPAWl%2FScreenshot%20(16).png?alt=media&#x26;token=b9845435-ccac-4e3b-8d90-80e57b913feb" alt=""><figcaption></figcaption></figure></div>

Qui trovi un codice di esempio per cui il richiedente viene bloccato quando la provincia inserita non è quella di Trento:&#x20;

```
show = 
  data.sport_organization_address?.data.county?.length > 0 &&
  data.sport_organization_address.data.county !== "TN"
```

## Verificare l'ISEE del richiedente

Per verificare il valore ISEE inserito da un utente in fase di richiesta, inserisci nel modulo [un nested form OC-ISEE](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/i-nested-form).

Successivamente, inserisci un campo Columns in cui inserire un [campo HTML](https://docs.opencityitalia.it/guida-alla-creazione-dei-servizi-digitali/creare-un-servizio/i-componenti/lhtml) e un checkbox [obbligatorio](#obbligatorieta-dei-contenuti) e disabilitato.

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FrEbsQFwHglY7XUyUd5Ee%2FScreen%20recording%202025-05-22%2017.08.08.gif?alt=media&#x26;token=792e7cc8-610a-4ef9-a1dc-27cea673f1ac" alt=""><figcaption></figcaption></figure>

Una volta fatto, configura il codice json del componente Columns con il codice di controllo.

<figure><img src="https://4252442743-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrdV0mwA7iy2c3I7wu5BX%2Fuploads%2FWiDtZhx7kqTr6wP21TbG%2Fimage.png?alt=media&#x26;token=240382d0-c935-46dc-b03b-7f8c70ed3e6f" alt=""><figcaption></figcaption></figure>

Qui trovi un codice di esempio per cui il richiedente viene bloccato quando l'importo ISEE inserito supera i 17.747,58

```
{
  "label": "Columns",
  "columns": [
    {
      "components": [
        {
          "label": "HTML",
          "tag": "div",
          "className": "alert alert-danger",
          "attrs": [
            {
              "attr": "",
              "value": ""
            }
          ],
          "content": "<h5>Attenzione!</h5>\nL'ISEE riportato è troppo alto. Non è possibile continuare la compilazione",
          "refreshOnChange": false,
          "key": "html9",
          "type": "htmlelement",
          "input": false,
          "tableView": false
        }
      ],
      "width": 12,
      "offset": 0,
      "push": 0,
      "pull": 0,
      "size": "md",
      "currentWidth": 12
    },
    {
      "components": [
        {
          "label": "admitted",
          "customClass": "d-none",
          "tableView": false,
          "clearOnHide": false,
          "validate": {
            "required": true
          },
          "key": "admitted",
          "type": "checkbox",
          "input": true,
          "defaultValue": false
        }
      ],
      "size": "md",
      "width": 12,
      "offset": 0,
      "push": 0,
      "pull": 0,
      "currentWidth": 12
    }
  ],
  "key": "columns2",
  "customConditional": "importo = parseFloat(data.economic_situation_indicator.data.value.replace(\",\",\".\"))\nshow = (importo && importo > 17747.58) ? true : false ",
  "type": "columns",
  "input": false,
  "tableView": false
}
```
