# Models

In this section, we will create a more complex model for `Tasks` that demonstrates the use of various decorators to define the table structure and field characteristics.

**Model Description**

The `Tasks` model includes the following fields:

* **task\_id**: A unique identifier for the task.
* **title**: The title of the task.
* **description**: A description of the task.
* **is\_completed**: The completion status of the task.
* **due\_date**: The due date of the task.
* **status**: A computed field for displaying the status of the task.
* **created\_at**: The date and time when the task was created.
* **updated\_at**: The date and time of the last update to the task.
* **price**: The price of the task.

**Code Example**

```typescript
import {
    Boolean,
    Column,
    ComputedColumn,
    Numeric,
    PrimaryGeneratedColumn,
    String,
    Table
} from "@myroslavshymon/orm";

@Table({ name: 'tasks' })
export class Tasks {
    @PrimaryGeneratedColumn({ type: 'BIGINT' })
    task_id: number;

    @String({ type: "VARCHAR", length: 255 })
    @Column({ options: { nullable: false } })
    title: string;

    @String({ type: "TEXT" })
    @Column({ options: { nullable: true } })
    description: string;

    @Boolean()
    @Column({ options: { nullable: false, defaultValue: false } })
    is_completed: boolean;

    @Column({ options: { dataType: 'DATE', nullable: true } })
    due_date: Date;

    @ComputedColumn({ dataType: 'VARCHAR', calculate: "title || ' - ' || CASE WHEN is_completed THEN 'Completed' ELSE 'Pending' END" })
    status: string;

    @Column({ options: { dataType: 'TIMESTAMP', defaultValue: 'CURRENT_TIMESTAMP' } })
    created_at: Date;

    @Column({ options: { dataType: 'TIMESTAMP', defaultValue: 'CURRENT_TIMESTAMP' } })
    updated_at: Date;

    @Numeric({ type: 'NUMERIC', precision: 10, scale: 2 })
    @Column({ options: { check: 'price >= 0', nameOfCheckConstraint: 'check_price' } })
    price: number;
}
```

**Decorator Explanations**

* **@PrimaryGeneratedColumn**: Used to define the primary key of the table. It specifies the data type as BIGINT for `task_id`.
* **@String**: A decorator for text fields. It specifies the data type as VARCHAR for `title` and TEXT for `description`.
* **@Boolean**: A decorator for boolean fields. Used for `is_completed`, with a default value of `false`.
* **@Column**: A general decorator for columns. For `due_date`, the data type used is DATE. For `created_at` and `updated_at`, the data type is TIMESTAMP with a default value of 'CURRENT\_TIMESTAMP'.
* **@ComputedColumn**: Creates a computed field. For `status`, it uses an expression that combines the title and the status of the task.
* **@Numeric**: Used for numeric fields with floating-point precision. For `price`, it sets the precision to 10 digits with 2 decimal places, and includes a constraint that the value must be greater than or equal to 0.

This approach allows for the creation of a table with various data types and parameters using all available decorators for PostgreSQL, making the model flexible and comprehensive.
