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

# 1. Model de date

> Modelul de documente și șabloane cu obiecte, câmpuri și o relație.

Aplicația noastră are nevoie de două obiecte personalizate: **șabloane de documente** (ce să scrie) și
**documente** (rezultatul generat). Să le definim.

Scaffold fiecare fișier de entitate cu CLI - generează un UUID valid și dosarul corect
pentru tine:

```bash filename="Terminal" theme={null}
yarn twenty dev:add object
```

Mai jos arătăm fișierele terminate.

<Note>
  Fiecare "\*\_UNIVERSAL\_IDENTIFIER" trăieşte în
  `src/constants/universal-identificfiers.ts` şi este importat unde este folosit. Fragmentele
  de mai jos omit acele importuri pentru încurcare - le păstrează-le în propriile fișiere.
</Note>

## Obiectul şablonului

Un şablon are un `name`, un `body` cu `{{placeholders}}`, şi un `target` care spune
dacă este scris pentru o Persoană sau o companie. `body` este un câmp
`RICH_TEXT`, deci douăzeci îi dă un editor complet bogat.

```ts filename="src/objects/document-template.object.ts" theme={null}
import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  universalIdentifier: DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  nameSingular: 'documentTemplate',
  namePlural: 'documentTemplates',
  labelSingular: 'Document template',
  labelPlural: 'Document templates',
  icon: 'IconFileText',
  labelIdentifierFieldMetadataUniversalIdentifier:
    TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
  fields: [
    { universalIdentifier: TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.TEXT, name: 'name', label: 'Name', icon: 'IconAbc' },
    { universalIdentifier: TEMPLATE_BODY_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.RICH_TEXT, name: 'body', label: 'Body', icon: 'IconFileText',
      description: 'Use {{placeholders}} like {{name.firstName}} or {{jobTitle}}.' },
    { universalIdentifier: TEMPLATE_TARGET_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.SELECT, name: 'target', label: 'Target', icon: 'IconTarget',
      defaultValue: `'PERSON'`,
      options: [
        { id: TEMPLATE_TARGET_OPTION_PERSON_UNIVERSAL_IDENTIFIER,
          value: 'PERSON', label: 'Person', color: 'blue', position: 0 },
        { id: TEMPLATE_TARGET_OPTION_COMPANY_UNIVERSAL_IDENTIFIER,
          value: 'COMPANY', label: 'Company', color: 'green', position: 1 },
      ] },
  ],
});
```

<Warning>
  Opţiunea `SELECT` **valori** trebuie să fie `UPPER_CASE` (`PERSON", nu `persoană`), şi
    `valoarea implicită`este împachetată în ghilimele suplimentare: `` 'PERSON''.`label\` este ceea ce văd utilizatorii
  .
</Warning>

## Obiectul documentului

Documentul generat stochează `conținutul` și `status`. Definiţi-l
în acelaşi mod, cu `status` selectează din `DRAFT` / `GENERATED`. Fişier complet:
[`document.object.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/examples/document-generator/src/objects/document.object.ts).

## Conectarea lor cu o relație

Fiecare document ar trebui să indice modelul de la care a venit. Relațiile sunt
**bidirecționale** — definiți ambele părți, fiecare în propriul fișier de câmp.

```ts filename="src/fields/document-template-relation.field.ts" theme={null}
import { defineField, FieldType, OnDeleteAction, RelationType } from 'twenty-sdk/define';

// The "many" side: each document belongs to one template.
export default defineField({
  universalIdentifier: DOCUMENT_TEMPLATE_FIELD_UNIVERSAL_IDENTIFIER,
  objectUniversalIdentifier: DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'template',
  label: 'Template',
  relationTargetObjectMetadataUniversalIdentifier:
    DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  relationTargetFieldMetadataUniversalIdentifier:
    TEMPLATE_DOCUMENTS_FIELD_UNIVERSAL_IDENTIFIER,
  universalSettings: {
    relationType: RelationType.MANY_TO_ONE,
    onDelete: OnDeleteAction.SET_NULL,
    joinColumnName: 'templateId',
  },
});
```

Cealaltă parte (`template-documents-relation.field.ts`) este un câmp
`RelationType.ONE_TO_MANY` numit `documents` care arată invers.
Vezi [Relations](/l/ro/developers/extend/apps/data/relations) pentru întregul model.

## Vezi în Douăzeci

Cu `yarn douăzeci de` rulează, deschide **Setări → Modelul de date**. Ambele obiecte
apar, etichetate cu aplicația ta.

<Frame caption="Ambele obiecte personalizate, deținute de aplicația Document Generator.">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/twenty/imagini/documente/dezvoltatori/extinderi/aplica%C8%9Bii/generator/01-data-model.png" alt="Setările modelului de date care afișează documente și șabloane de documente" />
</Frame>

Creați un șablon pentru a testa cu - denumiți *Propunere de vânzări*, setați **Ținta**
*Person*, și lipiți un corp cu câțiva substituenți:

```text theme={null}
Dear {{name.firstName}} {{name.lastName}},

As {{jobTitle}} at {{company.name}}, we think you'll love our product.

Best,
The Team
```

<Frame caption="O înregistrare șablon. Organismul îşi păstrează substituenţii până când se generează un document.">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/twenty/imagini/documente/dezvoltatori/extensii/aplica%C8%9Bii/generator%20document/03-template-record.png" alt="Un model de înregistrare a propunerii de vânzare cu organismul substituent" />
</Frame>

**După acest pas:** aveţi obiecte `documentTemplate` şi `document`, legate de
o relaţie, şi un şablon din care să se genereze. Apoi, logica care o umple.

<Card title="Următorul: generarea de documente →" icon="bolt" href="/dezvoltator/extindere/aplicații/tutoriale/generator documentare/generare-documente">
  Scrieți funcția logică care completează șablonul.
</Card>
