# Camada de dados brutos

A camada de dados brutos contém 3 esquemas de dados distintos, cada um atendendo a diferentes aspectos da plataforma de telemática e business intelligence:

* [`raw_business_data`](#raw_business_data-structure) - contendo tabelas, atributos e valores relacionados às informações de negócios, como veículos, funcionários, cercas geográficas adicionadas pelos usuários etc.
* [`raw_telematics_data`](#raw_telematics_data-structure) - contendo tabelas, atributos e valores relacionados aos dados de telemática transmitidos por dispositivos sob monitoramento, como localizações, entradas, saídas e eventos.
* [`repo`](#repo-data-structure) - contendo tabelas para gerenciamento de ativos e inventário, incluindo tipos de ativos configuráveis, campos personalizados, relações entre ativos e dados geoespaciais para rastreamento de recursos organizacionais.

Cada esquema é otimizado para seu domínio de dados e padrões de acesso específicos, oferecendo cobertura abrangente das necessidades operacionais, telemáticas e de gerenciamento de ativos.

## `raw_business_data` estrutura

Este esquema contém mais de 40 tabelas cuidadosamente selecionadas para abranger vários aspectos de negócios e casos de uso. Essas tabelas representam suas entidades principais de negócios, estrutura organizacional e dados operacionais.

<figure><img src="/files/debf93b1f3620705a07f72258c84ec2a97bf392c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
O diagrama interativo do esquema raw\_business\_data está disponível em **dbdiagram.io**: <https://dbdiagram.io/d/V3-bronze-layer-68ecfd1c2e68d21b4131089a>
{% endhint %}

Encontre os detalhes do esquema raw business data abaixo.

{% code title="esquema raw\_business\_data" expandable="true" %}

```sql
Table "vehicle_service_tasks" {
  "record_added_at" timestamp [not null]
  "start_mileage" numeric
  "comment" "character varying(255)"
  "status" "character varying(10)" [not null]
  "completion_date" timestamp
  "start_engine_hours" numeric
  "service_task_id" integer [not null]
  "is_notification_push_enabled" boolean [not null]
  "date_notification_interval" interval
  "predicted_datetime" timestamp
  "cost" numeric [not null]
  "mileage_limit" numeric
  "notification_emails" text
  "is_unplanned" boolean [not null]
  "is_repeat" boolean [not null]
  "completion_engine_hours" integer
  "engine_hours_limit" numeric
  "mileage_repeat_interval" integer
  "vehicle_id" integer [not null]
  "engine_hours_notification_interval" integer
  "start_date" timestamp
  "mileage_notification_interval" integer
  "date_repeat_interval" interval
  "description" "character varying(255)"
  "notification_sms_phone_numbers" text
  "end_date" timestamp
  "engine_hours_repeat_interval" integer
  "completion_mileage" integer
}

Table "garages" {
  "record_added_at" timestamp [not null]
  "garage_id" integer [not null]
  "longitude" numeric
  "mechanic_name" "character varying(255)"
  "radius" integer [not null]
  "latitude" numeric
  "organization_label" "character varying(255)"
  "user_id" integer [not null]
  "dispatcher_name" "character varying(255)"
  "address" "character varying(255)"
}

Table "driver_history" {
  "server_datetime" timestamp [not null]
  "address" "character varying(255)"
  "updated_by" integer [not null]
  "object_id" integer
  "longitude" numeric
  "latitude" numeric
  "driver_history_id" integer [not null]
  "hardware_key" "character varying(64)"
  "new_employee_id" integer
  "changed_datetime" timestamp
  "record_added_at" timestamp [not null]
  "old_employee_id" integer
}

Table "departments" {
  "record_added_at" timestamp [not null]
  "department_label" "character varying(255)" [not null]
  "latitude" numeric
  "department_id" integer [not null]
  "address" "character varying(255)"
  "radius" integer [not null]
  "longitude" numeric
  "user_id" integer [not null]
}

Table "checkins" {
  "radius" integer [not null]
  "latitude" numeric [not null]
  "employee_id" integer [not null]
  "longitude" numeric [not null]
  "record_added_at" timestamp [not null]
  "actual_datetime" timestamp [not null]
  "user_id" integer [not null]
  "form_id" integer [not null]
  "address" "character varying(255)"
  "planned_datetime" timestamp [not null]
  "object_id" integer [not null]
  "checkin_id" integer [not null]
  "comment" text
}

Table "statuses" {
  "order_sort" integer [not null]
  "listing_id" integer [not null]
  "color" "character varying(6)" [not null]
  "status_id" integer [not null]
  "status_label" "character varying(200)" [not null]
  "record_added_at" timestamp [not null]
  "is_deleted" boolean [not null]
}

Table "places_linked_entity_fields" {
  "value" bigint [not null]
  "record_added_at" timestamp [not null]
  "place_id" integer [not null]
  "field_id" integer [not null]
}

Table "places_text_fields" {
  "place_id" integer [not null]
  "record_added_at" timestamp [not null]
  "value" text [not null]
  "field_id" integer [not null]
}

Table "users2zones" {
  "zone_id" integer [not null]
  "record_added_at" timestamp [not null]
  "user_id" integer [not null]
}

Table "objects" {
  "record_added_at" timestamp [not null]
  "create_datetime" timestamp [not null]
  "client_id" integer [not null]
  "group_id" integer
  "object_label" "character varying(100)"
  "model" "character varying(64)"
  "is_clone" boolean [not null]
  "is_deleted" boolean [not null]
  "device_id" integer [not null]
  "object_id" integer [not null]
}

Table "device_output_name" {
  "device_id" integer [not null]
  "record_added_at" timestamp [not null]
  "label" "character varying(100)" [not null]
  "number" integer [not null]
}

Table "geofence_points" {
  "longitude" numeric [not null]
  "number" integer [not null]
  "zone_id" integer [not null]
  "record_added_at" timestamp [not null]
  "latitude" numeric [not null]
}

Table "custom_fields" {
  "record_added_at" timestamp [not null]
  "entity_id" integer [not null]
  "is_required" boolean [not null]
  "custom_field_label" text [not null]
  "parameters" jsonb
  "custom_field_type" integer [not null]
  "description" text
  "custom_field_id" integer [not null]
}

Table "places_decimal_fields" {
  "field_id" integer [not null]
  "record_added_at" timestamp [not null]
  "place_id" integer [not null]
  "value" numeric [not null]
}

Table "task_history" {
  "task_id" integer [not null]
  "activity" integer [not null]
  "task_history_id" integer [not null]
  "record_added_at" timestamp [not null]
  "user_id" integer [not null]
  "event_datetime" timestamp [not null]
  "payload" text
}

Table "tags" {
  "tag_label" "character varying(64)" [not null]
  "color" "character varying(6)"
  "user_id" integer [not null]
  "record_added_at" timestamp [not null]
  "tag_id" integer [not null]
}

Table "places" {
  "description" text
  "custom_fields" jsonb
  "place_id" integer [not null]
  "external_id" "character varying(32)"
  "record_added_at" timestamp [not null]
  "user_id" integer
  "latitude" numeric
  "radius" integer
  "place_label" "character varying(256)"
  "assigned_datetime" timestamp
  "address" "character varying(256)"
  "longitude" numeric
}

Table "status_listings" {
  "user_id" integer [not null]
  "is_supervisor_controlled" boolean [not null]
  "is_deleted" boolean [not null]
  "status_listing_id" integer [not null]
  "is_employee_controlled" boolean [not null]
  "record_added_at" timestamp [not null]
  "status_listing_label" "character varying(200)" [not null]
}

Table "models" {
  "record_added_at" timestamp [not null]
  "model_id" integer [not null]
  "has_battery_level" boolean [not null]
  "alternative_label" "character varying(50)" [not null]
  "vendor" "character varying(30)" [not null]
  "is_clone" boolean
  "has_altitude" boolean [not null]
  "has_phone" boolean [not null]
  "type_output_control" "character varying(30)" [not null]
  "has_gsm_roaming" boolean [not null]
  "has_gsm_level" boolean [not null]
  "model" "character varying(255)" [not null]
  "type_special_control" "character varying(255)" [not null]
  "digital_amount" integer [not null]
  "has_detach_button" boolean [not null]
  "has_gsm_name" boolean [not null]
  "analog_amount" integer [not null]
  "outputs_amount" integer [not null]
}

Table "vehicle_trackers_history" {
  "vehicle_id" integer [not null]
  "record_added_at" timestamp [not null]
  "object_id" integer [not null]
  "changed_datetime" timestamp [not null]
  "vehicle_tracker_history_id" integer [not null]
}

Table "groups" {
  "group_id" integer [not null]
  "group_color" "character varying(6)" [not null]
  "group_label" "character varying(255)" [not null]
  "client_id" integer [not null]
  "record_added_at" timestamp [not null]
}

Table "sensor_description" {
  "record_added_at" timestamp [not null]
  "parameters" jsonb
  "input_id" integer [not null]
  "accuracy" numeric [not null]
  "sensor_units" "character varying(10)"
  "multiplier" doubleprecision [not null]
  "input_label" "character varying(64)"
  "sensor_label" "character varying(100)"
  "units_type" integer [not null]
  "divider" doubleprecision [not null]
  "group_id" integer [not null]
  "sensor_id" integer [not null]
  "device_id" integer [not null]
  "sensor_type" "character varying(45)" [not null]
  "group_type" integer [not null]
  "calibration_data" jsonb
}

Table "entities" {
  "entity_label" jsonb
  "record_added_at" timestamp [not null]
  "entity_id" integer [not null]
  "builtin_type" integer [not null]
  "user_id" integer [not null]
}

Table "zones" {
  "address" "character varying(255)"
  "radius" integer [not null]
  "zone_id" integer [not null]
  "circle_center_latitude" numeric [not null]
  "client_id" integer [not null]
  "zone_label" "character varying(100)"
  "color" "character varying(6)" [not null]
  "zone_type" "character varying(20)" [not null]
  "circle_center_longitude" numeric [not null]
  "latitude" numeric [not null]
  "record_added_at" timestamp [not null]
  "longitude" numeric [not null]
}

Table "vehicles" {
  "vehicle_id" integer [not null]
  "payload_length" numeric
  "vin" "character varying(20)"
  "free_insurance_policy_number" "character varying(50)"
  "vehicle_label" "character varying(100)"
  "payload_width" numeric
  "color" "character varying(6)"
  "trailer" "character varying(255)"
  "object_id" integer
  "vehicle_status_id" integer
  "liability_insurance_valid_till" timestamp
  "manufacture_year" integer
  "fuel_grade" "character varying(16)"
  "fuel_cost" numeric
  "fuel_tank_volume" numeric
  "model" "character varying(100)"
  "garage_id" integer
  "payload_height" numeric
  "max_speed" numeric
  "registration_number" "character varying(32)"
  "tyre_size" "character varying(50)"
  "passenger_capacity" integer
  "record_added_at" timestamp [not null]
  "trailer_reg_number" "character varying(32)"
  "free_insurance_valid_till_date" timestamp
  "gross_weight" numeric
  "standard_fuel_consumption" numeric
  "fuel_type" integer
  "payload_weight" numeric
  "additional_info" text
  "vehicle_subtype" "character varying(32)"
  "liability_insurance_policy_number" "character varying(50)"
  "frame_number" "character varying(32)"
  "user_id" integer [not null]
  "vehicle_type" integer [not null]
  "chassis_number" "character varying(32)"
  "tyres_number" integer
  "wheel_arrangement" "character varying(16)"
}

Table "tag_links" {
  "entity_id" integer [not null]
  "record_added_at" timestamp [not null]
  "entity_type" integer [not null]
  "ordinal" integer [not null]
  "tag_id" integer [not null]
}

Table "rules" {
  "rule_id" integer [not null]
  "object_id" integer [not null]
  "parameters" jsonb
  "alert_phone" "character varying(210)" [not null]
  "event_type" "character varying(100)" [not null]
  "client_id" integer [not null]
  "is_push_enabled" boolean [not null]
  "event_comment1" "character varying(255)" [not null]
  "event_label" "character varying(255)" [not null]
  "description" "character varying(255)" [not null]
  "record_added_at" timestamp [not null]
  "alert_sms" text [not null]
  "event_group" integer [not null]
  "created_at" timestamp [not null]
  "maximum" integer [not null]
  "is_deleted" boolean [not null]
  "alert_email" text [not null]
  "event_comment2" "character varying(255)" [not null]
}

Table "status_history" {
  "longitude" numeric
  "new_status_id" integer
  "status_history_id" integer [not null]
  "device_id" integer [not null]
  "updated_by" integer [not null]
  "address" "character varying(255)"
  "latitude" numeric
  "record_added_at" timestamp [not null]
  "server_datetime" timestamp [not null]
  "changed_datetime" timestamp
  "old_status_id" integer
}

Table "rules2zones" {
  "zone_id" integer [not null]
  "record_added_at" timestamp [not null]
  "rule_id" integer [not null]
}

Table "forms" {
  "object_id" integer [not null]
  "description" text
  "form_label" "character varying(255)" [not null]
  "fields" text
  "created_at" timestamp [not null]
  "submission_address" "character varying(255)"
  "submission_latitude" numeric
  "form_id" integer [not null]
  "submission_longitude" numeric
  "is_submission_in_zone" boolean [not null]
  "values" text
  "record_added_at" timestamp [not null]
  "task_id" integer
  "submitted_at" timestamp
}


Table "rules2objects" {
  "object_params" jsonb
  "param_group_number" integer [not null]
  "object_id" integer [not null]
  "record_added_at" timestamp [not null]
  "rule_id" integer [not null]
}

Table "tasks" {
  "time_from" timestamp
  "stay_duration_minutes" interval
  "external_id" "character varying(100)"
  "object_id" integer
  "task_type" integer
  "arrival_duration_minutes" interval
  "status" integer
  "arrival_datetime" timestamp
  "record_added_at" timestamp [not null]
  "task_id" integer [not null]
  "user_id" integer
  "status_change_datetime" timestamp
  "order_sort" integer
  "time_to" timestamp
  "max_delay_minuts" integer
  "is_stay_control_enabled" boolean
  "address" "character varying(255)"
  "task_label" "character varying(200)" [not null]
  "longitude" numeric
  "created_by" integer
  "description" text [not null]
  "radius" integer
  "latitude" numeric
  "stay_duration" integer
  "created_at" timestamp [not null]
  "custom_fields" jsonb
  "parent_task_id" integer
}

Table "places_bigint_fields" {
  "field_id" integer [not null]
  "value" bigint [not null]
  "place_id" integer [not null]
  "record_added_at" timestamp [not null]
}

Table "devices" {
  "is_sim_blocked" boolean [not null]
  "device_id" integer [not null]
  "device_imei" "character varying(64)" [not null]
  "network_label" "character varying(50)" [not null]
  "status_listing_id" integer [not null]
  "signal_level" numeric [not null]
  "phone" "character varying(32)" [not null]
  "has_roaming" boolean [not null]
  "created_at" timestamp [not null]
  "owner_id" integer [not null]
  "record_added_at" timestamp [not null]
}

Table "description_parameters" {
  "description" "character varying(150)"
  "record_added_at" timestamp [not null]
  "type" "character varying(100)" [not null]
  "key" integer [not null]
}

Table "users" {
  "company_label" "character varying(255)" [not null]
  "registration_datetime" timestamp
  "first_name" "character varying(100)" [not null]
  "master_id" integer
  "last_name" "character varying(100)" [not null]
  "birth_date" timestamp
  "timezone_label" "character varying(30)"
  "middle_name" "character varying(100)" [not null]
  "user_id" integer [not null]
  "locale" "character varying(10)" [not null]
  "record_added_at" timestamp [not null]
}

Table "counters" {
  "sensor_id" integer
  "multiplier" numeric [not null]
  "counter_id" integer [not null]
  "device_id" integer [not null]
  "counter_type" integer [not null]
  "record_added_at" timestamp [not null]
}

Table "employees" {
  "driver_license_valid_till" timestamp
  "record_added_at" timestamp [not null]
  "last_name" "character varying(100)"
  "department_id" integer
  "citizen_id_number" "character varying(32)"
  "first_name" "character varying(100)"
  "driver_license_categories" "character varying(32)"
  "user_id" integer [not null]
  "phone_number" "character varying(32)"
  "object_id" integer
  "is_deleted" boolean [not null]
  "driver_license_issue_date" boolean
  "hardware_key" "character varying(64)"
  "middle_name" "character varying(100)"
  "address" "character varying(255)"
  "latitude" numeric
  "employee_id" integer [not null]
  "personnel_number" "character varying(15)"
  "fuel_cost" doubleprecision
  "driver_license_number" "character varying(32)"
  "email" "character varying(100)"
  "fuel_consumption" doubleprecision
  "radius" integer [not null]
  "longitude" numeric
}

Table "places_longtext_fields" {
  "field_id" integer [not null]
  "value" text [not null]
  "record_added_at" timestamp [not null]
  "place_id" integer [not null]
}

Table "groups_objects" {
  "groups_client_id" integer
  "objects_client_id" integer

  Indexes {
    (groups_client_id, objects_client_id) [pk]
  }
}

Table "device_settings" {
  "device_id" integer [not null]
  "key" "character varying" [not null]
  "value" text

  Indexes {
    (device_id, key) [pk]
  }
}

Table "event_description" {
  "event_id" integer [not null, pk]
  "description" text
}

Ref:"employees"."employee_id" < "checkins"."employee_id"

Ref:"objects"."object_id" < "checkins"."object_id"

Ref:"forms"."form_id" < "checkins"."form_id"

Ref:"sensor_description"."sensor_id" < "counters"."sensor_id"

Ref:"devices"."device_id" < "counters"."device_id"

Ref:"entities"."entity_id" < "custom_fields"."entity_id"

Ref:"departments"."department_id" < "employees"."department_id"

Ref:"users"."user_id" < "departments"."user_id"

Ref:"description_parameters"."key" < "counters"."counter_type"

Ref:"description_parameters"."key" < "custom_fields"."custom_field_type"

Ref:"description_parameters"."key" < "driver_history"."updated_by"

Ref:"description_parameters"."key" < "entities"."builtin_type"

Ref:"description_parameters"."key" < "sensor_description"."units_type"

Ref:"description_parameters"."key" < "status_history"."updated_by"

Ref:"description_parameters"."key" < "tasks"."status"

Ref:"description_parameters"."key" < "tasks"."created_at"

Ref:"description_parameters"."key" < "tasks"."task_type"

Ref:"description_parameters"."key" < "vehicles"."fuel_type"

Ref:"description_parameters"."key" < "task_history"."activity"

Ref:"description_parameters"."key" < "sensor_description"."group_type"

Ref:"devices"."device_id" < "device_output_name"."device_id"

Ref:"status_listings"."status_listing_id" < "devices"."status_listing_id"

Ref:"employees"."employee_id" < "driver_history"."new_employee_id"

Ref:"employees"."employee_id" < "driver_history"."old_employee_id"

Ref:"objects"."object_id" < "driver_history"."object_id"

Ref:"objects"."object_id" < "employees"."object_id"

Ref:"users"."user_id" < "employees"."user_id"

Ref:"users"."user_id" < "entities"."user_id"

Ref:"tasks"."task_id" < "forms"."task_id"

Ref:"objects"."object_id" < "forms"."object_id"

Ref:"objects"."object_id" < "tasks"."object_id"

Ref:"users"."user_id" < "garages"."user_id"

Ref:"groups"."client_id" < "groups_objects"."groups_client_id"

Ref:"objects"."client_id" < "groups_objects"."objects_client_id"

Ref:"models"."model" < "objects"."model"

Ref:"devices"."device_id" < "objects"."device_id"

Ref:"users"."user_id" < "places"."user_id"

Ref:"custom_fields"."custom_field_id" < "places_bigint_fields"."field_id"

Ref:"places"."place_id" < "places_bigint_fields"."place_id"

Ref:"custom_fields"."custom_field_id" < "places_decimal_fields"."field_id"

Ref:"places"."place_id" < "places_decimal_fields"."place_id"

Ref:"custom_fields"."custom_field_id" < "places_linked_entity_fields"."field_id"

Ref:"places"."place_id" < "places_linked_entity_fields"."place_id"

Ref:"custom_fields"."custom_field_id" < "places_longtext_fields"."field_id"

Ref:"places"."place_id" < "places_longtext_fields"."place_id"

Ref:"custom_fields"."custom_field_id" < "places_text_fields"."field_id"

Ref:"places"."place_id" < "places_text_fields"."place_id"

Ref:"rules"."rule_id" < "rules2zones"."rule_id"

Ref:"objects"."object_id" < "rules2objects"."object_id"

Ref:"rules"."rule_id" < "rules2objects"."object_id"

Ref:"zones"."zone_id" < "rules2zones"."zone_id"

Ref:"devices"."device_id" < "sensor_description"."device_id"

Ref:"statuses"."status_id" < "status_history"."new_status_id"

Ref:"statuses"."status_id" < "status_history"."old_status_id"

Ref:"devices"."device_id" < "status_history"."device_id"

Ref:"users"."user_id" < "status_listings"."user_id"

Ref:"status_listings"."status_listing_id" < "statuses"."listing_id"

Ref:"tags"."tag_id" < "tag_links"."tag_id"

Ref:"users"."user_id" < "tags"."user_id"

Ref:"tasks"."task_id" < "task_history"."task_id"

Ref:"users"."user_id" < "task_history"."user_id"

Ref:"tasks"."parent_task_id" < "tasks"."task_id"

Ref:"users"."user_id" < "tasks"."user_id"

Ref:"users"."master_id" < "users"."user_id"

Ref:"users"."user_id" < "users2zones"."user_id"

Ref:"zones"."zone_id" < "users2zones"."zone_id"

Ref:"vehicles"."vehicle_id" < "vehicle_service_tasks"."vehicle_id"

Ref:"objects"."object_id" < "vehicle_trackers_history"."object_id"

Ref:"vehicles"."vehicle_id" < "vehicle_trackers_history"."vehicle_id"

Ref:"garages"."garage_id" < "vehicles"."garage_id"

Ref:"objects"."object_id" < "vehicles"."object_id"

Ref:"users"."user_id" < "vehicles"."user_id"

Ref:"zones"."zone_id" < "geofence_points"."zone_id"

Ref:"users"."user_id" < "devices"."owner_id"

Ref:"users"."user_id" < "objects"."client_id"

```

{% endcode %}

### Frequência de atualização

Os dados neste esquema são sincronizados com o banco de dados principal. As atualizações ocorrem de forma incremental à medida que as alterações acontecem no banco de dados MySQL de origem, normalmente em menos de 5 minutos após a alteração na origem.

### `description_parameters`

O sistema inclui dados de referência para padronizar valores em todo o banco de dados:

<table><thead><tr><th width="167.1817626953125">Tipo de referência</th><th width="173.9090576171875">Descrição</th><th>Valores de exemplo</th></tr></thead><tbody><tr><td>Definições de tipos</td><td>Tipos de entidades padrão</td><td><code>vehicle_type: car, truck, bus</code></td></tr><tr><td>Códigos de status</td><td>Valores de status de tarefas e do sistema</td><td><code>tasks_status: unassigned, assigned, done</code></td></tr><tr><td>Definições de unidades</td><td>Unidades de medida para sensores</td><td><code>units_type: liter, gallon, celsius</code></td></tr><tr><td>Classificações de entidades</td><td>Categorias de entidades de negócio</td><td><code>entities_type: place, task, customer</code></td></tr></tbody></table>

### Tabelas principais por categoria

As tabelas no **`raw_business_data`** schema são organizadas em categorias funcionais para facilitar a navegação. A tabela abaixo resume as principais tabelas por sua finalidade de negócio:

Entidades principais do negócio

<details>

<summary><strong><code>users</code></strong></summary>

**Descrição**: Contas de usuários contendo informações de perfil, vinculação à empresa, configurações de localização (fuso horário, localidade) e relacionamentos hierárquicos via master\_id para estruturas de conta em vários níveis

<table><thead><tr><th width="145">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>user_id</code> - Identificador exclusivo do usuário<br>- <code>company_label</code> - Nome da empresa associada ao usuário<br>- <code>first_name</code> - Nome de usuário<br>- <code>last_name</code> - Sobrenome do usuário<br>- <code>middle_name</code> - Nome do meio do usuário<br>- <code>locale</code> - Configurações de idioma do usuário<br>- <code>timezone_label</code> - Fuso horário no formato IANA<br>- <code>master_id</code> - ID do usuário principal (se o atual for subordinado)<br>- <code>registration_datetime</code> - Data de registro no sistema<br>- <code>birth_date</code> - Data de nascimento do usuário</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Usuário pai via <code>master_id</code>, vinculado a <code>employees</code>, <code>departments</code>, <code>places</code>, <code>tasks</code> por meio de <code>user_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Entidade central que conecta dados organizacionais; <code>master_id</code> permite hierarquias de usuários para estruturas de conta em vários níveis</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>employees</code></strong></summary>

**Descrição**: Registros de funcionários e motoristas usados para representar pessoas que trabalham para a organização, incluindo informações pessoais, detalhes de habilitação, atribuições de departamento, chaves de hardware para identificação por iButton/RFID e dados de localização com suporte a geofencing

<table><thead><tr><th width="143">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>employee_id</code> - Identificador da entidade do funcionário<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>department_id</code> - ID do departamento ao qual o funcionário está atribuído<br>- <code>first_name</code> - O atributo first_name da tabela employees<br>- <code>last_name</code> - O atributo last_name da tabela employees<br>- <code>middle_name</code> - O atributo middle_name da tabela employees<br>- <code>driver_license_number</code> - Número da carteira de motorista<br>- <code>driver_license_categories</code> - Categorias da carteira de motorista<br>- <code>driver_license_issue_date</code> - Data de emissão da carteira de motorista<br>- <code>driver_license_valid_till</code> - Data até a qual a carteira de motorista é válida<br>- <code>hardware_key</code> - Uma chave de hardware<br>- <code>email</code> - E-mail do funcionário<br>- <code>phone_number</code> - Telefone do funcionário sem o sinal "+"<br>- <code>address</code> - Endereço da localização<br>- <code>personnel_number</code> - Número funcional do funcionário/motorista<br>- <code>citizen_id_number</code> - Número do CPF<br>- <code>latitude</code> - Localização associada a este funcionário<br>- <code>longitude</code> - Localização associada a este funcionário<br>- <code>radius</code> - Localização associada a este funcionário em metros<br>- <code>fuel_consumption</code> - O atributo fuel_consumption da tabela employees<br>- <code>fuel_cost</code> - O atributo fuel_cost da tabela employees<br>- <code>is_deleted</code> - O atributo is_deleted da tabela employees</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula-se a <code>users</code>, <code>departments</code>, <code>objects</code> (rastreador atribuído), rastreado em <code>driver_history</code> e <code>checkins</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>A chave de hardware permite a identificação do motorista via iButton ou RFID; oferece suporte a geofencing com <code>latitude</code>, <code>longitude</code>, <code>radius</code> campos</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>departments</code></strong></summary>

**Descrição**: Unidades organizacionais com dados de localização geográfica (latitude, longitude, raio), permitindo análises baseadas em geofence para relatórios em nível de departamento e associação de localização do funcionário

<table><thead><tr><th width="156">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>department_id</code> - Identificador da entidade departamento<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>department_label</code> - O atributo department_label da tabela departments<br>- <code>latitude</code> - Localização associada a este departamento<br>- <code>longitude</code> - Localização associada a este departamento<br>- <code>radius</code> - Tamanho da geolocalização em metros<br>- <code>address</code> - O atributo address da tabela departments</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula funcionários à estrutura organizacional por meio de <code>department_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Os campos de localização suportam análises baseadas em geofence para relatórios em nível de departamento</td></tr></tbody></table>

</details>

Rastreamento e monitoramento

<details>

<summary><strong><code>devices</code></strong></summary>

**Descrição**: Registro de dispositivos físicos de rastreamento com identificadores de hardware (IMEI), informações do cartão SIM, status de conectividade de rede (intensidade de sinal, roaming, operadora) e atribuições de lista de status para gerenciamento do ciclo de vida do dispositivo

<table><thead><tr><th width="138">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>device_id</code> - ID do dispositivo<br>- <code>owner_id</code> - ID do proprietário do dispositivo na conta do qual o beacon foi adicionado<br>- <code>device_imei</code> - IMEI do dispositivo<br>- <code>phone</code> - Número do cartão SIM do dispositivo<br>- <code>status_listing_id</code> - ID de status do dispositivo<br>- <code>network_label</code> - Nome da rede à qual o cartão SIM está conectado<br>- <code>signal_level</code> - Intensidade de sinal do dispositivo<br>- <code>has_roaming</code> - Indicador de disponibilidade de roaming<br>- <code>is_sim_blocked</code> - Indicador de bloqueio do cartão SIM<br>- <code>created_at</code> - Data e hora em que o registro foi criado</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Entidade principal que faz a ligação com <code>objects</code>, <code>models</code>, <code>sensor_description</code>, <code>counters</code>; <code>owner_id</code> references <code>users.user_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Todos os dados telemáticos em <code>raw_telematics_data</code> schema referenciam esta tabela por meio de <code>device_id</code></td></tr></tbody></table>

</details>

<details>

<summary><strong><code>objects</code></strong></summary>

**Descrição**: Registro central de entidades monitoradas (veículos, ativos, pessoal) que vincula dispositivos físicos à estrutura organizacional por meio de client\_id e group\_id, representando a "unidade rastreável" com um objeto ativo por dispositivo

<table><thead><tr><th width="148">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>client_id</code> - Identificador da entidade cliente<br>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>object_label</code> - Nome do objeto<br>- <code>model</code> - Modelo do dispositivo<br>- <code>group_id</code> - Grupo de ID da entidade<br>- <code>create_datetime</code> - Data e hora de criação de uma nova linha no servidor<br>- <code>is_deleted</code> - O atributo is_deleted da tabela objects<br>- <code>is_clone</code> - Sinal de clonagem</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Hub central que conecta dispositivos a usuários (<code>client_id</code>), detalhes do veículo, histórico de rastreamento, tarefas e regras</td></tr><tr><td><strong>Observações especiais</strong></td><td>Representa a "unidade rastreável" no sistema; um objeto por dispositivo em uso ativo</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>models</code></strong></summary>

**Descrição**: Registro central de entidades monitoradas (veículos, ativos, pessoal) que vincula dispositivos físicos à estrutura organizacional por meio de client\_id e group\_id, representando a "unidade rastreável" com um objeto ativo por dispositivo

<table><thead><tr><th width="135">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>model_id</code> - Identificador do modelo da entidade<br>- <code>model</code> - O atributo model da tabela models<br>- <code>vendor</code> - Nome da empresa que lançou o rastreador<br>- <code>alternative_label</code> - O atributo alternative_label da tabela models<br>- <code>analog_amount</code> - Número de entradas analógicas do rastreador<br>- <code>digital_amount</code> - Número de entradas discretas do rastreador<br>- <code>outputs_amount</code> - Número de saídas discretas do rastreador<br>- <code>has_battery_level</code> - Determina se o rastreador transmite leituras de carga da bateria<br>- <code>has_altitude</code> - Determina se o rastreador transmite altitude<br>- <code>has_phone</code> - Há um cartão SIM?<br>- <code>has_gsm_level</code> - Um rastreador pode transmitir a intensidade do sinal GSM?<br>- <code>has_gsm_name</code> - O rastreador pode transmitir o nome da rede GSM ou o código da operadora (MCC + MNC)?<br>- <code>has_gsm_roaming</code> - O rastreador pode transmitir o status de roaming?<br>- <code>has_detach_button</code> - O rastreador possui um sensor de desconexão?<br>- <code>type_output_control</code> - Perfil de controle de saída do rastreador<br>- <code>type_special_control</code> - Contém configurações especializadas e módulos funcionais para modelos individuais de dispositivos, como o modo de condução perigosa (hbm_telfm) para equipamentos Teltonika<br>- <code>is_clone</code> - O modelo é um clone de outro modelo?</td></tr><tr><td><strong>Conteúdo</strong></td><td>As sinalizações booleanas de capacidade indicam quais campos de dados estão disponíveis para este tipo de dispositivo</td></tr><tr><td><strong>Observações especiais</strong></td><td>Use as sinalizações de capacidade para determinar sensores e entradas válidos ao consultar dados telemáticos</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>sensor_description</code></strong></summary>

**Descrição**: Configuração abrangente de sensores vinculando entradas do dispositivo à lógica de negócio, incluindo mapeamentos de entradas, unidades de medida, fatores de conversão (multiplicador/divisor), tabelas de calibração para sensores de combustível, limites de precisão e lógica de agrupamento para leituras agregadas de sensores

<table><thead><tr><th width="142">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>sensor_id</code> - Identificador da entidade sensor<br>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>sensor_label</code> - Nome do sensor para a interface<br>- <code>input_label</code> - Nome do campo da mensagem (atributo) do qual os dados do sensor são obtidos. Se for igual a "input_status", trata-se de um sensor discreto<br>- <code>sensor_type</code> - Tipo de sensor<br>- <code>units_type</code> - Unidade de medida<br>- <code>multiplier</code> - Multiplicador - o número pelo qual multiplicar o valor do campo. Somente para sensores de medição<br>- <code>divider</code> - Divisor - o número pelo qual dividir o valor do campo. Somente para sensores de medição<br>- <code>accuracy</code> - Uma porcentagem especificada para calcular o erro absoluto do volume do tanque. Esse erro é usado para determinar quando reabastecimentos ou drenagens estão ocorrendo. Isso é usado apenas para sensores de combustível<br>- <code>calibration_data</code> - O atributo calibration_data da tabela sensor_description<br>- <code>input_id</code> - Número da entrada para sensor discreto<br>- <code>group_id</code> - Sensores do mesmo tipo com o mesmo group_id e source_id são considerados pertencentes ao mesmo grupo. Seus dados são somados ou calculados pela média, dependendo do valor de group_type. Isso é necessário para sensores agregados. É usado em sensores de medição<br>- <code>group_type</code> - 0 - soma os valores dos sensores dentro de um grupo, 1 - média<br>- <code>sensor_units</code> - Nome da unidade informado pelo usuário se units_type=0 (personalizado)<br>- <code>parameters</code> - Objeto opcional com parâmetros adicionais parent_ids - array opcional de parent_ids para sensor composto. volume - double. Volume opcional para sensor composto. parent_ids - opcional. array de int. Array de parent_ids para sensor composto. volume - opcional. Double. Volume para sensor composto. min - opcional. Double. Valor bruto mínimo aceitável para um sensor. max - opcional. Double. Valor bruto máximo aceitável para um sensor. max_lowering_by_time - opcional. Double. Redução máxima legal de valor por hora. max_lowering_by_mileage - opcional. Double. Redução máxima legal de valor por 100 km. ignore_drains_in_move - opcional. Boolean. O padrão é false. Se true, as drenagens de combustível não serão detectadas durante o movimento. ignore_refuels_in_move - opcional. Boolean. O padrão é false. Se true, os reabastecimentos não serão detectados durante o movimento. refuel_gap_minutes - opcional. Integer. O padrão é 5. O tempo em minutos após o início do movimento em que os reabastecimentos serão detectados durante o movimento. custom_field_name - opcional. Boolean. O padrão é false. O parâmetro determina se o campo input_name é um valor personalizado inserido pelo usuário. Isso faz sentido apenas se o modelo do rastreador tiver o recurso has_custom_fields</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula entradas do dispositivo (de <code>raw_telematics_data.inputs</code>) à lógica de negócio por meio de <code>device_id</code> e <code>input_label</code> correspondência</td></tr><tr><td><strong>Observações especiais</strong></td><td><code>calibration_data</code> (JSONB) armazena tabelas de calibração específicas de sensores para sensores de nível de combustível; <code>multiplier</code> e <code>divider</code> converte valores brutos em unidades</td></tr></tbody></table>

</details>

Gestão de ativos

<details>

<summary><strong><code>vehicles</code></strong></summary>

**Descrição**: Registro abrangente de veículos contendo especificações (dimensões, peso, capacidade), documentação (VIN, registro, seguro), parâmetros operacionais (consumo de combustível, volume do tanque) e atribuição atual de rastreador via object\_id para gestão de frota e controle de conformidade

<table><thead><tr><th width="144">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>vehicle_id</code> - Identificador da entidade veículo<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>garage_id</code> - Identificador da entidade garagem<br>- <code>vehicle_label</code> - O atributo vehicle_label da tabela vehicles<br>- <code>registration_number</code> - Número de registro/placa de um veículo<br>- <code>vin</code> - O atributo vin da tabela vehicles<br>- <code>manufacture_year</code> - O atributo manufacture_year da tabela vehicles<br>- <code>fuel_type</code> - O atributo fuel_type da tabela vehicles<br>- <code>fuel_cost</code> - O atributo fuel_cost da tabela vehicles<br>- <code>fuel_tank_volume</code> - O atributo fuel_tank_volume da tabela vehicles<br>- <code>max_speed</code> - O atributo max_speed da tabela vehicles<br>- <code>model</code> - O atributo model da tabela vehicles<br>- <code>color</code> - O atributo color da tabela vehicles<br>- <code>trailer</code> - O atributo trailer da tabela vehicles<br>- <code>additional_info</code> - O atributo additional_info da tabela vehicles<br>- <code>vehicle_type</code> - O atributo vehicle_type da tabela vehicles<br>- <code>vehicle_subtype</code> - O atributo vehicle_subtype da tabela vehicles<br>- <code>vehicle_status_id</code> - Identificador da entidade status do veículo<br>- <code>chassis_number</code> - O atributo chassis_number da tabela vehicles<br>- <code>frame_number</code> - O atributo frame_number da tabela vehicles<br>- <code>trailer_reg_number</code> - O atributo trailer_reg_number da tabela vehicles<br>- <code>payload_weight</code> - O atributo payload_weight da tabela vehicles<br>- <code>payload_height</code> - O atributo payload_height da tabela vehicles<br>- <code>payload_length</code> - O atributo payload_length da tabela vehicles<br>- <code>payload_width</code> - O atributo payload_width da tabela vehicles<br>- <code>passenger_capacity</code> - Número máximo de passageiros<br>- <code>gross_weight</code> - O atributo gross_weight da tabela vehicles<br>- <code>standard_fuel_consumption</code> - Consumo médio normal de combustível em litros por 100 km<br>- <code>fuel_grade</code> - O atributo fuel_grade da tabela vehicles<br>- <code>wheel_arrangement</code> - O atributo wheel_arrangement da tabela vehicles<br>- <code>tyre_size</code> - Tamanho do veículo: dimensões e tamanho das rodas<br>- <code>tyres_number</code> - Número de rodas<br>- <code>liability_insurance_policy_number</code> - O atributo liability_insurance_policy_number da tabela vehicles<br>- <code>liability_insurance_valid_till</code> - Data até a qual o seguro de responsabilidade civil é válido<br>- <code>free_insurance_policy_number</code> - O atributo free_insurance_policy_number da tabela vehicles<br>- <code>free_insurance_valid_till_date</code> - Data até a qual o seguro gratuito é válido</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula-se a <code>objects</code> (rastreador atual), <code>garages</code> (local de serviço), <code>vehicle_service_tasks</code>; rastreado em <code>vehicle_trackers_history</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Campos de dimensão física (<code>payload_length</code>, <code>payload_width</code>, <code>payload_height</code>, <code>gross_weight</code>) oferecem suporte a análises de planejamento de carga; datas de seguro permitem rastreamento de conformidade</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>garages</code></strong></summary>

**Descrição**: Locais de oficinas e manutenção com coordenadas geográficas (latitude, longitude, raio), informações de contato para mecânicos e despachantes, permitindo detecção de visitas de serviço com base em geofence e análise de proximidade

<table><thead><tr><th width="135">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>garage_id</code> - Identificador da entidade garagem<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>latitude</code> - Objeto de localização<br>- <code>longitude</code> - Objeto de localização<br>- <code>radius</code> - Tamanho da geolocalização em metros<br>- <code>address</code> - Objeto de localização<br>- <code>organization_label</code> - ID do depósito<br>- <code>mechanic_name</code> - Nome do mecânico<br>- <code>dispatcher_name</code> - Nome do despachante</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por <code>vehicles.garage_id</code> para atribuição do local de serviço</td></tr><tr><td><strong>Observações especiais</strong></td><td>Os campos de localização permitem detecção de visitas de serviço com base em geofence e análise de proximidade</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>vehicle_service_tasks</code></strong></summary>

**Descrição**: Acompanhamento do cronograma de manutenção e do histórico de serviços com vários tipos de gatilho (baseado em data, baseado em quilometragem, baseado em horas de motor), intervalos de tarefas recorrentes, notificações multicanal (e-mail, SMS, push) e distinção entre eventos de manutenção planejados (is\_repeat) e não planejados

<table><thead><tr><th width="132">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>service_task_id</code> - Identificador da entidade da tarefa de serviço<br>- <code>vehicle_id</code> - Identificador da entidade veículo<br>- <code>description</code> - O atributo description da tabela vehicle_service_tasks<br>- <code>status</code> - O valor de status do atributo status<br>- <code>cost</code> - O atributo cost da tabela vehicle_service_tasks<br>- <code>start_date</code> - A data e a hora associadas ao atributo start_date<br>- <code>end_date</code> - A data e a hora associadas ao atributo end_date<br>- <code>completion_date</code> - A data e a hora associadas ao atributo completion_date<br>- <code>predicted_datetime</code> - A data e a hora associadas ao atributo predicted_datetime<br>- <code>mileage_limit</code> - O atributo mileage_limit da tabela vehicle_service_tasks<br>- <code>engine_hours_limit</code> - O atributo engine_hours_limit da tabela vehicle_service_tasks<br>- <code>start_mileage</code> - O atributo start_mileage da tabela vehicle_service_tasks<br>- <code>start_engine_hours</code> - O atributo start_engine_hours da tabela vehicle_service_tasks<br>- <code>mileage_notification_interval</code> - O atributo mileage_notification_interval da tabela vehicle_service_tasks<br>- <code>engine_hours_notification_interval</code> - O atributo engine_hours_notification_interval da tabela vehicle_service_tasks<br>- <code>date_notification_interval</code> - Conversão de um inteiro N para N dias<br>- <code>mileage_repeat_interval</code> - O atributo mileage_repeat_interval da tabela vehicle_service_tasks<br>- <code>engine_hours_repeat_interval</code> - O atributo engine_hours_repeat_interval da tabela vehicle_service_tasks<br>- <code>date_repeat_interval</code> - Conversão de um inteiro N para N dias<br>- <code>notification_emails</code> - O atributo notification_emails da tabela vehicle_service_tasks<br>- <code>notification_sms_phone_numbers</code> - O atributo notification_sms_phone_numbers da tabela vehicle_service_tasks<br>- <code>is_notification_push_enabled</code> - O atributo is_notification_push_enabled da tabela vehicle_service_tasks<br>- <code>completion_mileage</code> - O atributo completion_mileage da tabela vehicle_service_tasks<br>- <code>completion_engine_hours</code> - O atributo completion_engine_hours da tabela vehicle_service_tasks<br>- <code>is_repeat</code> - O atributo is_repeat da tabela vehicle_service_tasks<br>- <code>is_unplanned</code> - O atributo is_unplanned da tabela vehicle_service_tasks<br>- <code>comment</code> - O atributo comment da tabela vehicle_service_tasks</td></tr><tr><td><strong>Conteúdo</strong></td><td>Suporta três tipos de gatilho: baseado em data, baseado em quilometragem, baseado em horas de motor; configurações de notificação para e-mail, SMS e push</td></tr><tr><td><strong>Observações especiais</strong></td><td><code>is_repeat</code> e campos de intervalo permitem cronogramas recorrentes de manutenção; <code>is_unplanned</code> distingue manutenção programada de manutenção reativa</td></tr></tbody></table>

</details>

Localização e roteamento

<details>

<summary><strong><code>zones</code></strong></summary>

**Descrição**: Áreas com geofence que definem perímetros virtuais usando círculos ou polígonos para monitorar eventos de entrada e saída de veículos/ativos, oferecendo suporte à automação baseada em regras e à análise de localização com codificação por cores para diferenciação visual

<table><thead><tr><th width="150">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>zone_id</code> - Identificador da entidade zona<br>- <code>client_id</code> - Identificador da entidade cliente<br>- <code>zone_label</code> - O atributo zone_label da tabela zones<br>- <code>zone_type</code> - O atributo zone_type da tabela zones<br>- <code>latitude</code> - Objeto opcional, a caixa delimitadora que pode conter totalmente o resultado retornado<br>- <code>longitude</code> - Objeto opcional, a caixa delimitadora que pode conter totalmente o resultado retornado<br>- <code>circle_center_latitude</code> - O atributo circle_center_latitude da tabela zones<br>- <code>circle_center_longitude</code> - O atributo circle_center_longitude da tabela zones<br>- <code>radius</code> - Tamanho da geolocalização em metros<br>- <code>address</code> - O atributo address da tabela zones<br>- <code>color</code> - O atributo color da tabela zones</td></tr><tr><td><strong>Conteúdo</strong></td><td>Os tipos de zona incluem circle, polygon (definido por meio de <code>geofence_points</code>), e classificações especiais de área</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por <code>rules2zones</code>, <code>users2zones</code>; vértices do polígono armazenados em <code>geofence_points</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Funções do PostGIS podem ser usadas para verificar point-in-polygon em análises complexas de geofence</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>places</code></strong></summary>

**Descrição**: Pontos de interesse com coordenadas geográficas, definições de raio e suporte extensível a campos personalizados para armazenar informações de contato do cliente e dados específicos do negócio, permitindo integração com CRM/ERP via external\_id e relatórios baseados em localização

<table><thead><tr><th width="129">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>place_id</code> - Identificador da entidade local<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>place_label</code> - O atributo place_label da tabela places<br>- <code>latitude</code> - Objeto de localização<br>- <code>longitude</code> - Objeto de localização<br>- <code>radius</code> - Tamanho da geolocalização em metros<br>- <code>address</code> - O atributo address da tabela places<br>- <code>description</code> - O atributo description da tabela places<br>- <code>external_id</code> - ID para integração com sistemas externos (CRM)<br>- <code>custom_fields</code> - Campos adicionais<br>- <code>assigned_datetime</code> - Data e hora da atribuição do ponto de interesse ao usuário</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Estendido com valores de campos personalizados por meio de <code>places_text_fields</code>, <code>places_decimal_fields</code>, <code>places_bigint_fields</code>, <code>places_longtext_fields</code>, <code>places_linked_entity_fields</code></td></tr><tr><td><strong>Observações especiais</strong></td><td><code>custom_fields</code> JSONB fornece acesso rápido; tabelas relacionadas permitem filtragem e ordenação por atributos personalizados</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>geofence_points</code></strong></summary>

**Descrição**: Coordenadas dos vértices ordenadas (o campo numérico determina a sequência) que definem os limites do polígono para formas complexas de geocerca, permitindo perímetros geográficos precisos além de zonas circulares simples, usado com PostGIS ST\_MakePolygon para operações geométricas

<table><thead><tr><th width="133">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>zone_id</code> - Um ID da zona à qual este formulário está vinculado<br>- <code>number</code> - Número de série<br>- <code>latitude</code> - Localização<br>- <code>longitude</code> - Localização</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vários registros por <code>zone_id</code> definem os limites do polígono; <code>number</code> o campo determina a ordem dos vértices</td></tr><tr><td><strong>Observações especiais</strong></td><td>Consultar com <code>ORDER BY number</code> para reconstruir o caminho do polígono; use com PostGIS ST_MakePolygon para operações geométricas</td></tr></tbody></table>

</details>

Gerenciamento de tarefas e fluxo de trabalho

<details>

<summary><strong><code>tasks</code></strong></summary>

**Descrição**: Atribuições de ordens de serviço com validação de localização (latitude, longitude, raio), janelas de tempo (time\_from, time\_to), requisitos de duração da visita (stay\_duration\_minutes, arrival\_duration\_minutes), estrutura hierárquica via parent\_task\_id e rastreamento de status para gerenciamento de serviços de campo e operações de entrega

<table><thead><tr><th width="130">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>task_id</code> - Identificador da entidade tarefa<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>parent_task_id</code> - Identificador da entidade tarefa pai<br>- <code>task_label</code> - O atributo task_label da tabela tasks<br>- <code>status</code> - O valor de status do atributo status<br>- <code>task_type</code> - Tipo de tarefa, task, route ou checkpoint<br>- <code>latitude</code> - O atributo latitude da tabela tasks<br>- <code>longitude</code> - O atributo longitude da tabela tasks<br>- <code>radius</code> - Tamanho da geolocalização em metros<br>- <code>arrival_datetime</code> - Quando o rastreador chega na área da tarefa. IGNORADO ao criar/atualizar<br>- <code>created_at</code> - O atributo created_at da tabela tasks<br>- <code>status_change_datetime</code> - Data e hora da atualização da tarefa<br>- <code>time_from</code> - A data e hora associadas ao atributo time_from<br>- <code>time_to</code> - A data e hora associadas ao atributo time_to<br>- <code>stay_duration</code> - O atributo stay_duration da tabela tasks<br>- <code>stay_duration_minutes</code> - Duração da visita. O tempo que um trabalhador móvel deve permanecer no local da atribuição para concluir a tarefa com êxito. Várias visitas são cumulativas<br>- <code>arrival_duration_minutes</code> - Ignore visitas aleatórias mais curtas do que a duração especificada. Ao calcular a duração mínima, visitas mais curtas do que a duração especificada serão ignoradas<br>- <code>max_delay_minuts</code> - Atraso aceitável. A quantidade máxima de tempo que um funcionário pode se atrasar. Qualquer tarefa concluída durante esse período será marcada como "atrasada"<br>- <code>is_stay_control_enabled</code> - O atributo is_stay_control_enabled da tabela tasks<br>- <code>address</code> - O atributo address da tabela tasks<br>- <code>description</code> - O atributo description da tabela tasks<br>- <code>custom_fields</code> - O atributo custom_fields da tabela tasks<br>- <code>external_id</code> - Identificador da entidade externa<br>- <code>order_sort</code> - O atributo order_sort da tabela tasks<br>- <code>created_by</code> - Origem da tarefa criada</td></tr><tr><td><strong>Conteúdo</strong></td><td>Suporta tarefas hierárquicas por meio de <code>parent_task_id</code>; janelas de tempo definidas por <code>time_from</code>/<code>time_to</code>; validação de geocerca com localização e raio</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula-se a <code>formulários</code> (coleta de dados), <code>task_history</code> (alterações de status), <code>objects</code> (rastreador atribuído)</td></tr><tr><td><strong>Observações especiais</strong></td><td><code>stay_duration</code> e <code>arrival_duration_minutes</code> habilitar monitoramento de conformidade para tarefas de entrega e serviço</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>formulários</code></strong></summary>

**Descrição**: Formulários de coleta de dados configuráveis para capturar informações estruturadas durante a conclusão de tarefas ou check-ins no aplicativo móvel, com campos e valores armazenados como JSON, validação opcional de localização (is\_submission\_in\_zone) e requisitos obrigatórios de envio quando anexados às tarefas

<table><thead><tr><th width="141">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>form_id</code> - Identificador da entidade formulário<br>- <code>task_id</code> - Um ID da tarefa à qual este formulário está vinculado<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>form_label</code> - Rótulo do formulário definido pelo usuário<br>- <code>campos</code> - Se verdadeiro, o formulário pode ser enviado somente na zona da tarefa<br>- <code>values</code> - Um mapa com IDs de campos como chaves e objetos field_value como valores. Chave usada para vincular o campo e seu valor correspondente<br>- <code>submitted_at</code> - Data em que os valores do formulário foram enviados pela última vez<br>- <code>submission_latitude</code> - Localização em que os valores do formulário foram enviados pela última vez<br>- <code>submission_longitude</code> - Localização em que os valores do formulário foram enviados pela última vez<br>- <code>submission_address</code> - Localização em que os valores do formulário foram enviados pela última vez<br>- <code>is_submission_in_zone</code> - Se verdadeiro, o formulário pode ser enviado somente na zona da tarefa<br>- <code>description</code> - Data em que este formulário foi criado (ou vinculado à tarefa)<br>- <code>created_at</code> - Data em que este formulário foi criado (ou vinculado à tarefa)</td></tr><tr><td><strong>Conteúdo</strong></td><td><code>campos</code> define a estrutura do formulário (JSON); <code>values</code> contém dados enviados (JSON)</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula-se a <code>tasks</code> (ordem de serviço associada), <code>objects</code> (remetente), referenciado em <code>checkins</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Flag de validação de localização <code>is_submission_in_zone</code> permite regras de envio de formulário baseadas em geocerca</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>checkins</code></strong></summary>

**Descrição**: Registros de presença e atividade baseados em localização, enviados por meio de aplicativo móvel, rastreando horários planejados versus horários reais de chegada (planned\_datetime vs actual\_datetime) com coordenadas geográficas e medições de precisão de localização (radius) para relatórios de pontualidade

<table><thead><tr><th width="129">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>checkin_id</code> - Identificador da entidade check-in<br>- <code>employee_id</code> - O identificador da entidade funcionário também é o identificador dos motoristas<br>- <code>object_id</code> - Dispositivo do funcionário<br>- <code>form_id</code> - Identificador da entidade formulário<br>- <code>user_id</code> - Usuário funcionário<br>- <code>planned_datetime</code> - Hora do dispositivo quando o check-in foi realizado<br>- <code>actual_datetime</code> - Hora do servidor quando a solicitação/mensagem foi processada<br>- <code>latitude</code> - Localização em que os check-ins foram enviados<br>- <code>longitude</code> - Localização em que os check-ins foram enviados<br>- <code>radius</code> - Erro de posicionamento em um ponto em metros<br>- <code>address</code> - Endereço do check-in<br>- <code>comment</code> - O atributo comment da tabela checkins</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Conecta funcionários a formulários e locais; rastreia o desvio em relação ao cronograma planejado</td></tr><tr><td><strong>Observações especiais</strong></td><td>Variação de tempo entre <code>planned_datetime</code> e <code>actual_datetime</code> permite relatórios de pontualidade; o raio define a tolerância aceitável de localização</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>task_history</code></strong></summary>

**Descrição**: Trilho de auditoria completo dos eventos do ciclo de vida da tarefa, capturando todas as alterações de status, atribuições, atualizações e modificações de campo com carimbos de data/hora (event\_datetime), atribuição ao usuário e tipos de atividade (create, update, assign, status\_change) armazenados no campo payload para conformidade e análise do fluxo de trabalho

<table><thead><tr><th width="137">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>task_history_id</code> - Identificador da entidade histórico da tarefa<br>- <code>task_id</code> - Identificador da entidade tarefa<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>activity</code> - Operação que ocorreu. Pode ser "create", "update", "assign" ou "status_change"<br>- <code>event_datetime</code> - Data e hora do evento<br>- <code>payload</code> - Depende da operação. Normalmente, contém os campos que foram alterados durante a operação</td></tr><tr><td><strong>Conteúdo</strong></td><td>Tipos de atividade definidos em <code>description_parameters</code>; <code>payload</code> armazena detalhes específicos do evento (texto)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Essencial para análise de conclusão de tarefas, relatórios de transição de status e rastreamento da atividade do usuário</td></tr></tbody></table>

</details>

Regras e automação

<details>

<summary><strong><code>rules</code></strong></summary>

**Descrição**: Regras de detecção de eventos com condições de disparo configuráveis (excesso de velocidade, violações de geocerca, limites de sensores, tempo ocioso) armazenadas em parâmetros (JSONB), e configurações de notificação multicanal (alert\_email, alert\_sms, alert\_phone, is\_push\_enabled) para monitoramento e alertas automatizados com base em dados do dispositivo e do servidor

<table><thead><tr><th width="131">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>rule_id</code> - Identificador da entidade regra<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>client_id</code> - Identificador da entidade cliente<br>- <code>event_type</code> - O atributo event_type da tabela rules<br>- <code>event_label</code> - O atributo event_label da tabela rules<br>- <code>event_group</code> - O atributo event_group da tabela rules<br>- <code>description</code> - Atributo de descrição da tabela rules<br>- <code>parameters</code> - Parâmetros do evento. Para mais detalhes sobre os parâmetros disponíveis, consulte <a href="https://www.navixy.com/docs/navixy-api/user-api/backend-api/resources/tracking/tracker/rules/rule_types/">Navixy API docs</a>.<br>- <code>alert_email</code> - E-mail para notificações<br>- <code>alert_sms</code> - Números de telefone para notificações por SMS<br>- <code>alert_phone</code> - Telefones para chamadas de voz<br>- <code>is_push_enabled</code> - Se verdadeiro, as notificações push estão disponíveis<br>- <code>created_at</code> - O atributo created_at da tabela rules<br>- <code>is_deleted</code> - O atributo is_deleted da tabela rules<br>- <code>maximum</code> - Limites aplicados a várias regras. Por exemplo, para a regra de tempo ocioso com o motor ligado, em minutos<br>- <code>event_comment1</code> - O atributo event_comment1 da tabela rules<br>- <code>event_comment2</code> - O atributo event_comment2 da tabela rules</td></tr><tr><td><strong>Conteúdo</strong></td><td>Os parâmetros da regra (JSONB) definem as condições de disparo; suportam notificações por e-mail, SMS, telefone e push</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula a objetos por meio de <code>rules2objects</code>, zonas por meio de <code>rules2zones</code></td></tr><tr><td><strong>Observações especiais</strong></td><td><code>event_type</code> define um cenário específico de monitoramento (excesso de velocidade, violação de geocerca, limite de sensor); <code>maximum</code> o campo permite a agregação de eventos para alertas baseados em limiar</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>rules2objects</code></strong></summary>

**Descrição**: Relação muitos-para-muitos que vincula regras a objetos monitorados com personalização de parâmetros por objeto via object\_params (JSONB), permitindo valores de limiar diferentes (por exemplo, limites de velocidade) para cada veículo ou ativo dentro da mesma regra

<table><thead><tr><th width="140">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>rule_id</code> - Identificador da entidade regra<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>param_group_number</code> - O atributo param_group_number da tabela rules2objects<br>- <code>object_params</code> - O atributo object_params da tabela rules2objects</td></tr><tr><td><strong>Conteúdo</strong></td><td><code>object_params</code> (JSONB) permite personalização de regras por objeto (por exemplo, limites de velocidade diferentes por veículo)</td></tr><tr><td><strong>Observações especiais</strong></td><td>A relação muitos-para-muitos permite que uma regra monitore vários objetos com parâmetros diferentes</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>rules2zones</code></strong></summary>

**Descrição**: Relação muitos-para-muitos que associa regras a zonas cercadas por geocerca, permitindo que uma única regra monitore eventos de entrada/saída em várias áreas geográficas para cenários complexos de monitoramento espacial

<table><thead><tr><th width="144">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>rule_id</code> - Identificador da entidade regra<br>- <code>zone_id</code> - Identificador da entidade zona</td></tr><tr><td><strong>Observações especiais</strong></td><td>A relação muitos-para-muitos permite monitoramento de várias zonas para uma única regra (por exemplo, alertar ao entrar em qualquer uma de várias áreas restritas)</td></tr></tbody></table>

</details>

Status e categorização

<details>

<summary><strong><code>statuses</code></strong></summary>

**Descrição**: Definições de status personalizadas dentro das listas de status, incluindo propriedades de exibição (color para exibição no website, order\_sort para posicionamento) usadas para representar estados de trabalho de dispositivos ou funcionários, com suporte à exclusão lógica por meio da flag is\_deleted

<table><thead><tr><th width="128">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>status_id</code> - Identificador da entidade status<br>- <code>listing_id</code> - Identificador da entidade de lista<br>- <code>status_label</code> - Valor de status do atributo status_label<br>- <code>color</code> - Cor usada para exibição no site<br>- <code>order_sort</code> - Posição de ordenação dentro do status da lista<br>- <code>is_deleted</code> - O atributo is_deleted da tabela statuses</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Grupos de status organizados por <code>listing_id</code> (referências <code>status_listings</code>); usado em <code>status_history</code></td></tr><tr><td><strong>Observações especiais</strong></td><td><code>order_sort</code> define a sequência de exibição; a cor permite diferenciação visual nos relatórios</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>status_listings</code></strong></summary>

**Descrição**: Definições de conjuntos de status que controlam quais valores de status estão disponíveis para dispositivos ou funcionários, com flags de permissão (is\_supervisor\_controlled, is\_employee\_controlled) determinando se supervisores, funcionários ou ambos podem alterar os valores de status

<table><thead><tr><th width="144">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>status_listing_id</code> - Identificador da entidade de lista de status<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>status_listing_label</code> - Valor de status do atributo status_listing_label<br>- <code>is_supervisor_controlled</code> - Se verdadeiro, os supervisores podem alterar o status de trabalho, por exemplo, usando o aplicativo móvel de monitoramento<br>- <code>is_employee_controlled</code> - Se verdadeiro, os funcionários podem alterar seu próprio status de trabalho, por exemplo, usando o aplicativo móvel de rastreamento<br>- <code>is_deleted</code> - O atributo is_deleted da tabela status_listings</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por <code>devices.status_listing_id</code> e <code>statuses.listing_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Os flags de controle determinam quem pode alterar os status: somente supervisor, autoatendimento do funcionário ou ambos</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>status_history</code></strong></summary>

**Descrição**: Trilho de auditoria de todas as transições de status do dispositivo com carimbos de data/hora (changed\_datetime no dispositivo, server\_datetime no servidor), atribuição ao usuário (updated\_by) e captura de localização (latitude, longitude, address), permitindo análise geográfica das alterações de status e relatórios de local de início/fim do dia de trabalho

<table><thead><tr><th width="143">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>status_history_id</code> - Identificador da entidade histórico de status<br>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>old_status_id</code> - Identificador da entidade status antigo<br>- <code>new_status_id</code> - Identificador da entidade novo status<br>- <code>updated_by</code> - A data e hora associadas ao atributo updated_by<br>- <code>changed_datetime</code> - Data e hora da atribuição de um novo status no dispositivo<br>- <code>server_datetime</code> - Data e hora da atribuição do novo status no servidor<br>- <code>latitude</code> - Localização dos dispositivos durante as alterações de status<br>- <code>longitude</code> - Localização dos dispositivos durante as alterações de status<br>- <code>address</code> - Localização dos dispositivos durante as alterações de status</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula-se a <code>devices</code>, <code>statuses</code> (antigo e novo), <code>description_parameters</code> (para <code>updated_by</code> função)</td></tr><tr><td><strong>Observações especiais</strong></td><td>A captura de localização permite análise geográfica das transições de status; útil para relatórios de local de início/fim do dia de trabalho</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>tags</code></strong></summary>

**Descrição**: Rótulos de categorização definidos pelo usuário com codificação por cor que permitem filtragem e pesquisa rápidas em vários tipos de entidades (locais, geocercas, funcionários, tarefas, rastreadores, veículos) para organização flexível

<table><thead><tr><th width="149">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>tag_id</code> - ID da entidade tag<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>tag_label</code> - O atributo tag_label da tabela tags<br>- <code>color</code> - O atributo color da tabela tags</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Aplicadas a entidades por meio de <code>tag_links</code>; escopo definido pelo usuário</td></tr><tr><td><strong>Observações especiais</strong></td><td>Sistema flexível de categorização que oferece suporte a várias tags por entidade</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>tag_links</code></strong></summary>

**Descrição**: Tabela de relação polimórfica que associa tags a qualquer tipo de entidade por meio de entity\_type e entity\_id, com campo ordinal para gerenciamento da ordem de exibição, permitindo marcação flexível de várias entidades

<table><thead><tr><th width="127">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>tag_id</code> - ID da entidade tag<br>- <code>entity_type</code> - O atributo entity_type da tabela tag_links<br>- <code>entity_id</code> - Identificador da entidade<br>- <code>ordinal</code> - O atributo ordinal da tabela tag_links</td></tr><tr><td><strong>Conteúdo</strong></td><td><code>entity_type</code> identifica a tabela (veículo, funcionário, tarefa, etc.); <code>ordinal</code> define a ordem de exibição</td></tr><tr><td><strong>Observações especiais</strong></td><td>A relação polimórfica permite marcação em diferentes tipos de entidade</td></tr></tbody></table>

</details>

Grupos e hierarquia

<details>

<summary><strong><code>groups</code></strong></summary>

**Descrição**: Estrutura de agrupamento organizacional para rastreadores, permitindo organização visual na interface do usuário com cores personalizáveis (group\_color) e gerenciamento hierárquico em estilo de pastas, atualmente servindo a uma função puramente visual

<table><thead><tr><th width="148">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>group_id</code> - Grupo de rastreadores (vinculado por objects.group_id). A divisão em grupos pode ser vista na lista de beacons, por exemplo<br>- <code>client_id</code> - Identificador da entidade cliente<br>- <code>group_label</code> - Título do grupo definido pelo usuário, de 1 a 60 caracteres imprimíveis, por exemplo "Funcionários"<br>- <code>group_color</code> - Cor do grupo no formato web (sem #), por exemplo "FF6DDC". Determina a cor dos marcadores dos rastreadores no mapa</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por <code>objects.group_id</code>; propriedade do cliente por meio de <code>client_id</code> (referências <code>users</code>)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Permite organização em estilo de pastas de entidades de monitoramento para relatórios e permissões</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>groups_objects</code></strong></summary>

**Descrição**: Relação muitos-para-muitos entre grupos e objetos usando chave primária composta (groups\_client\_id, objects\_client\_id), permitindo que objetos pertençam a vários grupos simultaneamente para estruturas organizacionais flexíveis

<table><thead><tr><th width="135">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>groups_client_id</code> - Identificador da entidade cliente para grupos<br>- <code>objects_client_id</code> - Identificador da entidade cliente para objetos</td></tr><tr><td><strong>Observações especiais</strong></td><td>Permite que objetos pertençam a vários grupos simultaneamente; consulte com ambos <code>client_id</code> valores para associação ao grupo</td></tr></tbody></table>

</details>

Campos personalizados e entidades

<details>

<summary><strong><code>entities</code></strong></summary>

**Descrição**: Registro de tipos de entidade que define quais entidades de negócios oferecem suporte a campos personalizados e sua estrutura de layout de campos (sections, field\_order) armazenada em entity\_label (JSONB), permitindo extensão dinâmica do esquema em locais, tarefas e outras entidades sem alterações no banco de dados

<table><thead><tr><th width="141">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>entity_id</code> - Identificador da entidade<br>- <code>user_id</code> - Identificador da entidade do usuário<br>- <code>entity_label</code> - id - int. Identificador da entidade. type - enum. Atualmente, apenas "place" é suportado. layout - object descreve o layout dos campos da entidade. sections - array de objects. Cada seção pode conter um ou mais campos. Pelo menos uma seção deve existir em um layout. label - string. Nome da seção. field_order - array de strings. Campos integrados e IDs de campos personalizados (como strings)<br>- <code>builtin_type</code> - O atributo builtin_type da tabela entities</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por <code>custom_fields</code> para definir quais campos personalizados se aplicam a quais tipos de entidade</td></tr><tr><td><strong>Observações especiais</strong></td><td><code>builtin_type</code> vincula a <code>description_parameters</code> para classificações de entidade definidas pelo sistema</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>custom_fields</code></strong></summary>

**Descrição**: Definições de campos personalizados que permitem extensão dinâmica do esquema para tipos de entidade, com tipos de campo configuráveis (custom\_field\_type), regras de validação e opções em parameters (JSONB) e flags de obrigatoriedade (is\_required) para captura flexível de dados em locais, tarefas e outras entidades

<table><thead><tr><th width="146">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>custom_field_id</code> - Identificador da entidade campo personalizado<br>- <code>entity_id</code> - Identificador da entidade<br>- <code>custom_field_label</code> - Nome do campo<br>- <code>custom_field_type</code> - Tipo de dado no campo<br>- <code>description</code> - Descrição do campo<br>- <code>is_required</code> - É obrigatório ou não?<br>- <code>parameters</code> - Parâmetros do campo</td></tr><tr><td><strong>Conteúdo</strong></td><td><code>parameters</code> (JSONB) armazena a configuração específica do tipo de campo (regras de validação, opções de lista suspensa etc.)</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Define os atributos personalizados disponíveis para entidades; o tipo de campo vincula-se a <code>description_parameters</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Permite extensão dinâmica do esquema sem alterações no banco de dados; usado extensivamente em <code>places</code> e <code>tasks</code></td></tr></tbody></table>

</details>

Rastreamento histórico

<details>

<summary><strong><code>driver_history</code></strong></summary>

**Descrição**: Trilho de auditoria completo das atribuições de funcionário para veículo ao longo do tempo, acompanhando transições de old\_employee\_id para new\_employee\_id com carimbos de data/hora (changed\_datetime, server\_datetime), dados de localização (latitude, longitude, address), informações da chave de hardware e atribuição ao usuário (updated\_by), permitindo análises específicas de motorista quando os motoristas trocam de veículo

<table><thead><tr><th width="146">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>driver_history_id</code> - Identificador da entidade histórico do motorista<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>old_employee_id</code> - Identificador da entidade funcionário antigo<br>- <code>new_employee_id</code> - Identificador da entidade novo funcionário<br>- <code>hardware_key</code> - O atributo hardware_key da tabela driver_history<br>- <code>changed_datetime</code> - Data e hora em que as alterações foram feitas no dispositivo<br>- <code>server_datetime</code> - Data e hora das alterações feitas no servidor<br>- <code>updated_by</code> - A data e hora associadas ao atributo updated_by<br>- <code>latitude</code> - O atributo latitude da tabela driver_history<br>- <code>longitude</code> - O atributo longitude da tabela driver_history<br>- <code>address</code> - O atributo address da tabela driver_history</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Rastreia as atribuições de motoristas aos veículos ao longo do tempo; vincula a <code>employees</code> e <code>objects</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Essencial para relatórios específicos de motoristas quando os motoristas trocam de veículo; a captura de localização permite análise da localização da mudança de atribuição</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>vehicle_trackers_history</code></strong></summary>

**Descrição**: Trilho de auditoria que rastreia quais dispositivos GPS (object\_id) foram instalados em quais veículos (vehicle\_id) ao longo do tempo, com carimbos de data/hora de alteração (changed\_datetime), permitindo atribuição histórica precisa dos dados e cálculo de quilometragem quando os rastreadores são movidos entre veículos

<table><thead><tr><th width="144">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>vehicle_tracker_history_id</code> - Identificador da entidade histórico do rastreador do veículo<br>- <code>vehicle_id</code> - Identificador da entidade veículo<br>- <code>object_id</code> - Objeto identificador da entidade<br>- <code>changed_datetime</code> - A data e hora associadas ao atributo changed_datetime</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Rastreia qual dispositivo GPS foi instalado em qual veículo ao longo do tempo</td></tr><tr><td><strong>Observações especiais</strong></td><td>Crítico para análise histórica de dados quando os rastreadores são movidos entre veículos; permite atribuição precisa de quilometragem e uso</td></tr></tbody></table>

</details>

Dados de referência e consulta

<details>

<summary><strong><code>description_parameters</code></strong></summary>

**Descrição**: Dados de referência em todo o sistema que fornecem rótulos legíveis por humanos (description) para valores inteiros enumerados (key) usados em todo o banco de dados, organizados por campo type (por exemplo, task\_status, fuel\_type, counter\_type, entity\_classification) para tradução consistente de valores em relatórios e exibição na interface

<table><thead><tr><th width="146">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>key</code> - Valor possível no atributo<br>- <code>type</code> - Atributo composto que consiste no nome da tabela seguido de um sublinhado e do nome de um atributo na tabela<br>- <code>description</code> - Valor implícito de um atributo</td></tr><tr><td><strong>Conteúdo</strong></td><td>Fornece rótulos legíveis por humanos para valores codificados em todo o banco de dados (status de tarefa, tipos de combustível, tipos de contador etc.)</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Referenciado por chaves estrangeiras de várias tabelas para categorização padronizada</td></tr><tr><td><strong>Observações especiais</strong></td><td>Essencial para traduzir códigos inteiros em valores legíveis em relatórios; <code>type</code> grupos de campos e enumerações relacionadas</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>counters</code></strong></summary>

**Descrição**: Configurações de odômetro e contador de horas do motor que vinculam leituras de sensores do dispositivo (sensor\_id) a medições de distância ou tempo com coeficientes multiplicadores para conversão de unidades (km, milhas, horas) e counter\_type de description\_parameters definindo o tipo de medição

<table><thead><tr><th width="140">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>counter_id</code> - ID interno<br>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>counter_type</code> - Tipo de contador<br>- <code>sensor_id</code> - Identificador da entidade sensor<br>- <code>multiplier</code> - Coeficiente para converter valores em uma das métricas (km, l, etc.)</td></tr><tr><td><strong>Relacionamentos</strong></td><td>Vincula dispositivos a leituras de sensores que representam contadores de distância ou tempo</td></tr><tr><td><strong>Observações especiais</strong></td><td><code>multiplier</code> converte pulsos do sensor em unidades reais (km, milhas, horas); <code>counter_type</code> de <code>description_parameters</code> define o tipo de medição</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>device_output_name</code></strong></summary>

**Descrição**: Rótulos personalizados para canais de saída do dispositivo, mapeando identificadores numéricos de saída (number) para nomes definidos pelo usuário (label), como "Door Lock" ou "Engine Block", para relatórios e análises legíveis de comandos e estados de saída do dispositivo

<table><thead><tr><th width="140">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>number</code> - O atributo number da tabela device_output_name<br>- <code>label</code> - O atributo label da tabela device_output_name</td></tr><tr><td><strong>Conteúdo</strong></td><td>Mapeia números de canais de saída para nomes definidos pelo usuário (por exemplo, "Door Lock", "Engine Block")</td></tr><tr><td><strong>Observações especiais</strong></td><td>Permite relatórios legíveis ao analisar comandos e estados de saída do dispositivo</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>device_settings</code></strong></summary>

**Descrição**: Pares chave-valor de configuração do dispositivo sincronizados da plataforma de origem. Cada linha armazena uma configuração para um dispositivo específico.

<table><thead><tr><th width="140">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>device_id</code> - Identificador da entidade do dispositivo<br>- <code>key</code> - Nome da configuração<br>- <code>value</code> - Valor da configuração</td></tr><tr><td><strong>Chave primária</strong></td><td>Composto: <code>(device_id, key)</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Preenchida durante a sincronização completa do cliente. Use esta tabela para ler valores de configuração no nível do dispositivo juntamente com dados telemáticos ou de negócios.</td></tr></tbody></table>

</details>

<details>

<summary><strong><code>event_description</code></strong></summary>

**Descrição**: Tabela de referência de códigos de eventos do rastreador com descrições legíveis por humanos. Contém 134 entradas cobrindo eventos comuns do rastreador, como SOS, modo de suspensão, ignição e alterações de entradas/saídas digitais.

<table><thead><tr><th width="140">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td>- <code>event_id</code> - Código do evento (chave primária)<br>- <code>description</code> - Nome do evento legível por humanos</td></tr><tr><td><strong>Observações especiais</strong></td><td>Associe a <code>raw_telematics_data.tracking_data_core</code> em <code>event_id</code> para exibir nomes de eventos em relatórios e painéis em vez de códigos numéricos.</td></tr></tbody></table>

</details>

## `raw_telematics_data` estrutura

A **`raw_telematics_data`** o esquema contém três tipos principais de tabelas que trabalham em conjunto para fornecer dados abrangentes do dispositivo.

<figure><img src="/files/e8a792532865c1ad018a0724be1032b261e30f6b" alt="Bronze layer raw telematics data ERD"><figcaption><p>DER da camada Bronze de dados telemáticos brutos</p></figcaption></figure>

{% hint style="info" %}
O diagrama interativo do esquema raw\_telematics\_data está disponível em **dbdiagram.io**: <https://dbdiagram.io/d/v1-schema-telematics-bd-67a0acef263d6cf9a0d8e750>
{% endhint %}

Encontre abaixo os detalhes do esquema de dados telemáticos brutos.

{% code title="esquema raw\_telematics\_data" expandable="true" %}

```sql
Tabela tracking_data_core {

  device_id integer [primary key]

  device_time timestampz [primary key]

  platform_time timestampz

  record_added_at timestampz [default: `now()`]

  latitude integer

  longitude integer

  speed integer

  altitude integer

  satellites integer

  event_id integer

  gps_fix_type integer

  hdop integer

  

  indexes {(device_id, device_time)}

}

  

Tabela inputs {

  event_id integer [primary key]

  device_id integer [primary key]

  record_added_at timestampz [default: `now()`]

  device_time timestampz [primary key]

  sensor_name text [primary key]

  value text

  indexes {(device_id, device_time)}

}

  

Tabela states {

  event_id integer [primary key]

  device_id serial [primary key]

  record_added_at timestampz [default: `now()`]

  device_time timestampz [primary key]

  state_name text [primary key]

  value text

  indexes {(device_id, device_time)}

}

  

Ref: inputs.(device_id, device_time) > tracking_data_core.(device_id, device_time)

Ref: states.(device_id, device_time) > tracking_data_core.(device_id, device_time)
```

{% endcode %}

### Tabelas principais por categoria

Cada tabela atende a um propósito específico na captura de diferentes aspectos das informações do dispositivo:

<details>

<summary><code>tracking_data_core</code></summary>

**Finalidade**: Dados principais de localização e movimento

<table><thead><tr><th width="181.20001220703125">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>device_id</code>, <code>device_time</code>, <code>platform_time</code>, <code>latitude</code>, <code>longitude</code>, <code>speed</code>, <code>altitude</code>, <code>satellites</code>, <code>hdop</code>, <code>event_id</code></td></tr><tr><td><strong>Indexação</strong></td><td>Otimizado com índice em (<code>device_id</code>, <code>device_time</code>)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Os dados de localização (latitude e longitude) usam formato inteiro com precisão de 10⁷ para desempenho ideal no TimescaleDB<br><br>A velocidade também é armazenada em inteiro, portanto você precisa dividi-la por 100</td></tr></tbody></table>

</details>

<details>

<summary><code>inputs</code></summary>

**Finalidade**: Leituras de sensores dos dispositivos

<table><thead><tr><th width="182">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>input_id</code>, <code>device_id</code>, <code>device_time</code>, <code>sensor_name</code>, <code>value</code></td></tr><tr><td><strong>Conteúdo</strong></td><td>Leituras analógicas (nível de combustível, temperatura, tensão), valores calculados (RPM do motor)</td></tr><tr><td><strong>Relacionamentos</strong></td><td><pre data-overflow="wrap"><code>FROM raw_telematics_data.inputs AS i
JOIN raw_business_data.sensor_description AS sd
    ON i.device_id = sd.device_id AND i.sensor_name = sd.input_label
JOIN raw_telematics_data.tacking_data_core AS tdc
    ON i.device_id = tdc.device_id AND i.device_time = tdc.device_time
</code></pre></td></tr></tbody></table>

</details>

<details>

<summary><code>states</code></summary>

**Finalidade**: Indicadores de status e modos operacionais do dispositivo

<table><thead><tr><th width="174.800048828125">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos-chave</strong></td><td><code>state_id</code>, <code>device_id</code>, <code>device_time</code>, <code>state_name</code>, <code>value</code></td></tr><tr><td><strong>Conteúdo</strong></td><td>Indicadores de modo de operação (em funcionamento, ocioso, desligado), status de componentes (ignição, portas)</td></tr><tr><td><strong>Formato do valor</strong></td><td>Valores booleanos (1/0) ou códigos de status específicos</td></tr></tbody></table>

</details>

Os dados neste esquema são ingeridos diretamente dos dispositivos, com latência mínima (normalmente de segundos). O esquema é otimizado para dados de séries temporais, usando o TimescaleDB para armazenamento e recuperação eficientes.

## Informações adicionais

### Validação de dados

O banco de dados impõe a integridade dos dados por meio de vários mecanismos:

* **Restrições CHECK** validam que os valores estejam dentro de faixas aceitáveis
* **Chaves estrangeiras** garantem que os relacionamentos entre tabelas permaneçam consistentes
* **Restrições NOT NULL** garantem que os campos obrigatórios sempre tenham valores
* **Valores DEFAULT** fornecem um valor de fallback quando os dados não são fornecidos explicitamente

### Otimização de consultas

As tabelas são organizadas com estratégias específicas de indexação:

* Todas as tabelas incluem **índices baseados em tempo** em `record_added_at`
* As colunas de chave estrangeira têm índices dedicados para desempenho de junções
* Combinações de colunas frequentemente usadas têm **índices compostos**
* O TimescaleDB fornece índices especializados para consultas de séries temporais

## `repo` estrutura de dados

{% hint style="warning" %}
**Este esquema está atualmente em desenvolvimento.** Se você estiver interessado em acesso antecipado ou tiver dúvidas sobre esta funcionalidade, entre em contato com <iotquery@navixy.com>.
{% endhint %}

A `repo` O esquema fornece uma estrutura abrangente para gerenciar estruturas organizacionais, ativos, dispositivos e seus relacionamentos em ambientes multitenant. Construído sobre PostgreSQL 14+ com a extensão ltree, o esquema suporta organizações hierárquicas, definições de campos personalizados para qualquer tipo de entidade, controle de acesso baseado em função com restrições no nível do objeto e trilhas de auditoria completas com rastreamento de alterações no nível do campo. Todas as entidades podem ser estendidas sem modificações no esquema, localizadas para implantações internacionais e vinculadas por meio de relacionamentos polimórficos flexíveis.

O esquema aborda cenários complexos de gerenciamento de dados, incluindo hierarquias de ativos da frota em níveis organizacionais, plataformas SaaS multitenant que exigem isolamento de dados, operações orientadas por conformidade com requisitos detalhados de auditoria e sistemas que precisam de modelos de dados dinâmicos adaptáveis por meio de campos personalizados em vez de migrações de banco de dados.

<figure><img src="/files/85f9536c590180289377d142dd95463b747691b1" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
O diagrama interativo do`repo` esquema de dados está disponível em **dbdiagram.io**: <https://dbdiagram.io/d/Navixy-Repo-data-schema-68ad788c1e7a611967a0930e>
{% endhint %}

Encontre os `repo` detalhes do esquema abaixo.

{% code title="esquema de dados do repositório" expandable="true" %}

```sql
// ============================================
// Novo esquema do DataHub - Jornada do Cliente
// PostgreSQL 14+ com extensão ltree
// Versão: 2.0 (Conceito)
// ============================================

// ============================================
// TABELAS DE REFERÊNCIA BÁSICA (hierarquia ci_base)
// ============================================

Table ci_base {
  id uuid [chave primária]
  code text [not null]
  title_en text [not null]
  order int
  is_system boolean [not null, default: false]
  discriminator text [not null]
  catalog_id uuid
  organization_id uuid
  parent_id uuid
  path ltree
  is_hierarchical boolean [default: false]
  extra jsonb
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  
  indexes {
    (parent_id) [name: 'idx_ci_parent']
    (path) [type: gist, name: 'idx_ci_path_gist']
    (catalog_id) [name: 'idx_ci_catalog']
    (organization_id) [name: 'idx_ci_org']
    (discriminator) [name: 'idx_ci_discriminator']
    (code) [unique, name: 'uq_ci_code_per_type']
    (organization_id, code) [unique, name: 'uq_ci_org_code']
  }
}

Table ci_module {
  id uuid [chave primária]
}

Table ci_catalog_category {
  id uuid [chave primária]
}

Table ci_country {
  id uuid [chave primária]
}

Table ci_role {
  id uuid [chave primária]
}

Table ci_entity_type {
  id uuid [chave primária]
}

Table ci_device_status {
  id uuid [chave primária]
}

Table ci_permission_scope {
  id uuid [chave primária]
  module_id uuid
  entity_type_id uuid
  category text
}

Table ci_device_type {
  id uuid [chave primária]
}

Table ci_asset_type {
  id uuid [chave primária]
  category_id uuid
}

Table ci_asset_type_category {
  id uuid [chave primária]
}

Table ci_inventory_type {
  id uuid [chave primária]
}

Table ci_organization_type {
  id uuid [chave primária]
}

Table ci_user_type {
  id uuid [chave primária]
}

Table ci_asset_group_type {
  id uuid [chave primária]
  max_items int
  color text
  icon text
  allowed_asset_type_id uuid
}

Table ci_device_relation_type {
  id uuid [chave primária]
}

Table ci_tag {
  id uuid [chave primária]
  entity_type_id uuid
  color text
}

// ============================================
// ENTIDADE BÁSICA COM SUPORTE A CAMPOS PERSONALIZADOS
// ============================================

Table customizable_entity {
  id uuid [chave primária]
  entity_type_id uuid [not null]
  cf_data jsonb
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  
  indexes {
    (entity_type_id) [name: 'idx_customizable_entity_type']
  }
}

// ============================================
// ENTIDADES DE NEGÓCIO PRINCIPAIS
// ============================================

Table organization {
  id uuid [chave primária]
  parent_id uuid
  path ltree
  organization_type_id uuid [not null]
  title_en text [not null]
  is_active boolean [not null, default: true]
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (parent_id) [name: 'idx_org_parent']
    (path) [type: gist, name: 'idx_org_path_gist']
    (organization_type_id) [name: 'idx_org_type']
  }
}

Table catalog {
  id uuid [chave primária]
  organization_id uuid [not null]
  module_id uuid
  category_id uuid
  title_en text [not null]
  is_system boolean [not null, default: false]
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  
  indexes {
    (organization_id) [name: 'idx_catalog_org']
    (module_id) [name: 'idx_catalog_module']
  }
}

Table user {
  id uuid [chave primária]
  organization_id uuid [not null]
  user_type_id uuid [not null]
  identity_provider text [not null]
  identity_provider_id uuid [not null]
  full_name text [not null]
  is_active boolean [not null, default: true]
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (organization_id) [name: 'idx_user_org']
    (user_type_id) [name: 'idx_user_type']
    (organization_id, identity_provider, identity_provider_id) [unique, name: 'uq_user_org_idp']
  }
}

// ============================================
// CONTROLE DE ACESSO (ACL)
// ============================================

Table user_role {
  id uuid [chave primária]
  user_id uuid [not null]
  role_id uuid [not null]
  assigned_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  assigned_by uuid
  
  indexes {
    (user_id) [name: 'idx_user_role_user']
    (role_id) [name: 'idx_user_role_role']
    (user_id, role_id) [unique, name: 'uq_user_role']
  }
}

Table acl_role_permission {
  id uuid [chave primária]
  role_id uuid [not null]
  permission_scope_id uuid [not null]
  target_entity_id uuid
  actions int [not null]
  granted_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  granted_by uuid
  
  indexes {
    (role_id) [name: 'idx_acl_role_perm_role']
    (permission_scope_id) [name: 'idx_acl_role_perm_scope']
    (role_id, permission_scope_id, target_entity_id) [unique, name: 'uq_acl_role_permission']
  }
}

Table acl_user_scope {
  id uuid [chave primária]
  user_id uuid [not null]
  permission_scope_id uuid [not null]
  target_entity_id uuid [not null]
  actions int [not null]
  
  indexes {
    (user_id, permission_scope_id) [name: 'idx_acl_user_scope_user']
    (user_id, permission_scope_id, target_entity_id) [unique, name: 'uq_acl_user_scope']
  }
}

// ============================================
// ENTIDADES DE NEGÓCIO
// ============================================

Table asset {
  id uuid [chave primária]
  organization_id uuid [not null]
  asset_type_id uuid [not null]
  label text [not null]
  description text
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (organization_id) [name: 'idx_asset_org']
    (asset_type_id) [name: 'idx_asset_type']
  }
}

Table inventory {
  id uuid [chave primária]
  organization_id uuid [not null]
  inventory_type_id uuid [not null]
  code text [not null]
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (organization_id) [name: 'idx_inventory_org']
    (inventory_type_id) [name: 'idx_inventory_type']
    (organization_id, code) [unique, name: 'uq_inventory_org_code']
  }
}

Table device {
  id uuid [chave primária]
  organization_id uuid [not null]
  device_type_id uuid [not null]
  status_id uuid [not null]
  hw_id text
  label text [not null]
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (organization_id) [name: 'idx_device_org']
    (device_type_id) [name: 'idx_device_type']
    (status_id) [name: 'idx_device_status']
    (hw_id) [name: 'idx_device_hw_id']
  }
}

Table device_asset_link {
  id uuid [chave primária]
  device_id uuid [unique, not null]
  asset_id uuid [not null]
  linked_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  linked_by uuid
  
  indexes {
    (device_id) [unique, name: 'idx_device_asset_link_device']
    (asset_id) [name: 'idx_device_asset_link_asset']
  }
}

Table device_inventory_link {
  id uuid [chave primária]
  device_id uuid [unique, not null]
  inventory_id uuid [not null]
  linked_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  linked_by uuid
  
  indexes {
    (device_id) [unique, name: 'idx_device_inventory_link_device']
    (inventory_id) [name: 'idx_device_inventory_link_inventory']
  }
}

Table device_relation {
  id uuid [chave primária]
  master_id uuid [not null]
  slave_id uuid [not null]
  relation_type_id uuid [not null]
  
  indexes {
    (master_id) [name: 'idx_device_relation_master']
    (slave_id) [name: 'idx_device_relation_slave']
    (master_id, slave_id, relation_type_id) [unique, name: 'uq_device_relation']
  }
}

Table asset_group {
  id uuid [chave primária]
  organization_id uuid [not null]
  group_type_id uuid [not null]
  title_en text [not null]
  description text
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  deleted_at timestamptz
  deleted_by uuid
  
  indexes {
    (organization_id) [name: 'idx_asset_group_org']
    (group_type_id) [name: 'idx_asset_group_type']
  }
}

Table asset_group_item {
  id uuid [chave primária]
  group_id uuid [not null]
  asset_id uuid [not null]
  attached_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  detached_at timestamptz
  
  indexes {
    (group_id) [name: 'idx_asset_group_item_group']
    (asset_id) [name: 'idx_asset_group_item_asset']
    (group_id, asset_id, detached_at) [unique, name: 'uq_asset_group_item']
  }
}

Table entity_tag {
  id uuid [chave primária]
  tag_id uuid [not null]
  entity_id uuid [not null]
  tagged_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  
  indexes {
    (tag_id) [name: 'idx_entity_tag_tag']
    (entity_id) [name: 'idx_entity_tag_entity']
    (tag_id, entity_id) [unique, name: 'uq_entity_tag']
  }
}

// ============================================
// LOCALIZAÇÃO
// ============================================

Table i18n_text {
  entity_id uuid [pk]
  field_code text [pk]
  locale text [pk]
  text_value text [not null]
  
  indexes {
    (entity_id) [name: 'idx_i18n_entity']
    (locale) [name: 'idx_i18n_locale']
  }
}

// ============================================
// CAMPOS PERSONALIZADOS - DEFINIÇÕES
// ============================================

Table custom_field_def {
  id uuid [chave primária]
  organization_id uuid [not null]
  owner_entity_type_id uuid [not null]
  code text [not null]
  title_en text [not null]
  field_type text [not null]
  is_multi boolean [not null, default: false]
  is_required boolean [not null, default: false]
  order int
  ref_entity_type_id uuid
  ref_catalog_id uuid
  created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  
  indexes {
    (organization_id) [name: 'idx_cfd_org']
    (owner_entity_type_id) [name: 'idx_cfd_owner_type']
    (organization_id, owner_entity_type_id, code) [unique, name: 'uq_cfd_org_type_code']
  }
}

// ============================================
// CAMPOS PERSONALIZADOS - VALORES (por tipo)
// ============================================

Table custom_field_value_text {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  value text [not null]
  
  indexes {
    (field_def_id, value) [name: 'idx_cfv_text_value']
  }
}

Table custom_field_value_number {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  value numeric [not null]
  
  indexes {
    (field_def_id, value) [name: 'idx_cfv_number_value']
  }
}

Table custom_field_value_boolean {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  value boolean [not null]
  
  indexes {
    (field_def_id, value) [name: 'idx_cfv_boolean_value']
  }
}

Table custom_field_value_date {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  value date [not null]
  
  indexes {
    (field_def_id, value) [name: 'idx_cfv_date_value']
  }
}

Table custom_field_value_datetime {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  value timestamptz [not null]
  
  indexes {
    (field_def_id, value) [name: 'idx_cfv_datetime_value']
  }
}

Table custom_field_value_entity {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  ref_entity_id uuid [not null]
  
  indexes {
    (field_def_id, ref_entity_id) [name: 'idx_cfv_entity_value']
  }
}

Table custom_field_value_catalog {
  customizable_entity_id uuid [pk]
  field_def_id uuid [pk]
  value_index smallint [pk]
  ref_item_id uuid [not null]
  
  indexes {
    (field_def_id, ref_item_id) [name: 'idx_cfv_catalog_value']
  }
}

// ============================================
// AUDITORIA
// ============================================

Table audit_event {
  id uuid [chave primária]
  event_category text [not null]
  user_id uuid
  identity_provider_id uuid
  ip_address inet
  user_agent text
  aggregate_type text
  aggregate_id uuid
  event_type text [not null]
  event_data jsonb
  occurred_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
  
  indexes {
    (user_id, occurred_at) [name: 'idx_audit_event_user']
    (aggregate_type, aggregate_id, occurred_at) [name: 'idx_audit_event_aggregate']
    (event_category, occurred_at) [name: 'idx_audit_event_category']
    (event_type, occurred_at) [name: 'idx_audit_event_type']
  }
}

// ============================================
// RELACIONAMENTOS
// ============================================

Ref: ci_base.catalog_id > catalog.id
Ref: ci_base.organization_id > organization.id
Ref: ci_base.parent_id > ci_base.id

Ref: ci_module.id - ci_base.id
Ref: ci_catalog_category.id - ci_base.id
Ref: ci_country.id - ci_base.id
Ref: ci_role.id - ci_base.id
Ref: ci_entity_type.id - ci_base.id
Ref: ci_device_status.id - ci_base.id
Ref: ci_permission_scope.id - ci_base.id
Ref: ci_device_type.id - ci_entity_type.id
Ref: ci_asset_type.id - ci_entity_type.id
Ref: ci_asset_type_category.id - ci_base.id
Ref: ci_inventory_type.id - ci_entity_type.id
Ref: ci_organization_type.id - ci_entity_type.id
Ref: ci_user_type.id - ci_entity_type.id
Ref: ci_asset_group_type.id - ci_entity_type.id
Ref: ci_device_relation_type.id - ci_base.id
Ref: ci_tag.id - ci_base.id

Ref: ci_permission_scope.module_id > ci_module.id
Ref: ci_permission_scope.entity_type_id > ci_entity_type.id
Ref: ci_asset_type.category_id > ci_asset_type_category.id
Ref: ci_asset_group_type.allowed_asset_type_id > ci_asset_type.id
Ref: ci_tag.entity_type_id > ci_entity_type.id

Ref: customizable_entity.entity_type_id > ci_entity_type.id

Ref: organization.id - customizable_entity.id
Ref: organization.parent_id > organization.id
Ref: organization.organization_type_id > ci_organization_type.id
Ref: organization.deleted_by > user.id

Ref: catalog.organization_id > organization.id
Ref: catalog.module_id > ci_module.id
Ref: catalog.category_id > ci_catalog_category.id

Ref: user.id - customizable_entity.id
Ref: user.organization_id > organization.id
Ref: user.user_type_id > ci_user_type.id
Ref: user.deleted_by > user.id

Ref: user_role.user_id > user.id
Ref: user_role.role_id > ci_role.id
Ref: user_role.assigned_by > user.id

Ref: acl_role_permission.role_id > ci_role.id
Ref: acl_role_permission.permission_scope_id > ci_permission_scope.id
Ref: acl_role_permission.granted_by > user.id

Ref: acl_user_scope.user_id > user.id
Ref: acl_user_scope.permission_scope_id > ci_permission_scope.id

Ref: asset.id - customizable_entity.id
Ref: asset.organization_id > organization.id
Ref: asset.asset_type_id > ci_asset_type.id
Ref: asset.deleted_by > user.id

Ref: inventory.id - customizable_entity.id
Ref: inventory.organization_id > organization.id
Ref: inventory.inventory_type_id > ci_inventory_type.id
Ref: inventory.deleted_by > user.id

Ref: device.id - customizable_entity.id
Ref: device.organization_id > organization.id
Ref: device.device_type_id > ci_device_type.id
Ref: device.status_id > ci_device_status.id
Ref: device.deleted_by > user.id

Ref: device_asset_link.device_id - device.id
Ref: device_asset_link.asset_id > asset.id
Ref: device_asset_link.linked_by > user.id

Ref: device_inventory_link.device_id - device.id
Ref: device_inventory_link.inventory_id > inventory.id
Ref: device_inventory_link.linked_by > user.id

Ref: device_relation.master_id > device.id
Ref: device_relation.slave_id > device.id
Ref: device_relation.relation_type_id > ci_device_relation_type.id

Ref: asset_group.id - customizable_entity.id
Ref: asset_group.organization_id > organization.id
Ref: asset_group.group_type_id > ci_asset_group_type.id
Ref: asset_group.deleted_by > user.id

Ref: asset_group_item.group_id > asset_group.id
Ref: asset_group_item.asset_id > asset.id

Ref: entity_tag.tag_id > ci_tag.id

Ref: custom_field_def.organization_id > organization.id
Ref: custom_field_def.owner_entity_type_id > ci_entity_type.id
Ref: custom_field_def.ref_entity_type_id > ci_entity_type.id
Ref: custom_field_def.ref_catalog_id > catalog.id

Ref: custom_field_value_text.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_text.field_def_id > custom_field_def.id

Ref: custom_field_value_number.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_number.field_def_id > custom_field_def.id

Ref: custom_field_value_boolean.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_boolean.field_def_id > custom_field_def.id

Ref: custom_field_value_date.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_date.field_def_id > custom_field_def.id

Ref: custom_field_value_datetime.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_datetime.field_def_id > custom_field_def.id

Ref: custom_field_value_entity.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_entity.field_def_id > custom_field_def.id
Ref: custom_field_value_entity.ref_entity_id > customizable_entity.id

Ref: custom_field_value_catalog.customizable_entity_id > customizable_entity.id
Ref: custom_field_value_catalog.field_def_id > custom_field_def.id
Ref: custom_field_value_catalog.ref_item_id > ci_base.id

Ref: audit_event.user_id > user.id
```

{% endcode %}

### Frequência de atualização

Os dados no `repo` esquema são sincronizados em tempo real com os sistemas de origem. As atualizações ocorrem imediatamente à medida que as mudanças acontecem, com trilhas de auditoria capturando todas as modificações para conformidade e análise histórica.

### `ci_base`

A `repo` esquema usa o padrão Single Table Inheritance para todos os dados de referência por meio da `ci_base` tabela:

A `repo` esquema usa um **Single Table Inheritance** padrão para todos os dados de referência por meio da `ci_base` tabela. Este design consolida dicionários do sistema, classificações e itens de referência definidos pelo usuário em uma estrutura única unificada, proporcionando consistência e flexibilidade em todo o esquema.

**Arquitetura:**

A `ci_base` tabela serve como base para todos os dados de referência, usando um campo `discriminator` para identificar o tipo de referência específico. Cada tipo de referência tem uma tabela correspondente (como `ci_device_type`, `ci_asset_type`) que compartilha o mesmo `id` de `ci_base`, criando um relacionamento de herança com segurança de tipo.

**Como as entidades de negócio se conectam ao ci\_base:**

Todas as entidades de negócio no `repo` esquema referenciam `ci_base` subtipos para definir sua classificação e comportamento:

* `organization` → referencia `ci_organization_type` (que herda de `ci_entity_type` → `ci_base`)
* `user` → referencia `ci_user_type` (que herda de `ci_entity_type` → `ci_base`)
* `device` → referencia `ci_device_type` e `ci_device_status` (ambos herdam de `ci_base`)
* `asset` → referencia `ci_asset_type` (que herda de `ci_entity_type` → `ci_base`)
* `inventory` → referencia `ci_inventory_type` (que herda de `ci_entity_type` → `ci_base`)
* `asset_group` → referencia `ci_asset_group_type` (que herda de `ci_entity_type` → `ci_base`)

**Categorias de tipo de referência:**

| Categoria                          | Tabelas                                                                                                                                 | Finalidade                                                                                 |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| **Configuração do sistema**        | `ci_module`, `ci_country`, `ci_role`                                                                                                    | Definem módulos do sistema, referências geográficas e funções de usuário                   |
| **Definições de tipo de entidade** | `ci_entity_type`, `ci_device_type`, `ci_asset_type`, `ci_inventory_type`, `ci_organization_type`, `ci_user_type`, `ci_asset_group_type` | Classificam todas as entidades de negócio por tipo                                         |
| **Status e classificação**         | `ci_device_status`, `ci_asset_type_category`                                                                                            | Rastreiam estados de entidades e classificam tipos de grupos em categorias                 |
| **Controle de acesso**             | `ci_permission_scope`                                                                                                                   | Defina quais permissões podem ser concedidas (conectadas a `ci_module` e `ci_entity_type`) |
| **Relacionamentos**                | `ci_device_relation_type`                                                                                                               | Defina tipos de relacionamentos entre dispositivos (mestre-escravo, backup, etc.)          |
| **Categorização**                  | `ci_tag`, `ci_catalog_category`                                                                                                         | Permite marcação flexível e organização de catálogo                                        |

<details>

<summary><strong>Exemplos de padrões de consulta</strong></summary>

```sql
-- Obtenha todos os tipos de dispositivo para uma organização (sistema + personalizado)
SELECT cb.id, cb.code, cb.title_en, cb.is_system
FROM repo.ci_base cb
JOIN repo.ci_device_type dt ON dt.id = cb.id
WHERE cb.discriminator = 'device_type'
  AND (cb.is_system = true OR cb.organization_id = $org_id)
  AND cb.deleted_at IS NULL;

-- Obtenha o tipo de ativo com sua categoria
SELECT 
  cb.code as asset_type_code,
  cb.title_en as asset_type_name,
  cat_cb.title_en as category_name
FROM repo.ci_base cb
JOIN repo.ci_asset_type at ON at.id = cb.id
LEFT JOIN repo.ci_asset_type_category cat ON cat.id = at.category_id
LEFT JOIN repo.ci_base cat_cb ON cat_cb.id = cat.id
WHERE cb.discriminator = 'asset_type'
  AND cb.deleted_at IS NULL;

-- Obtenha a estrutura hierárquica de tags
SELECT cb.id, cb.code, cb.title_en, cb.path, cb.parent_id
FROM repo.ci_base cb
JOIN repo.ci_tag t ON t.id = cb.id
WHERE cb.discriminator = 'tag'
  AND cb.deleted_at IS NULL
ORDER BY cb.path;
```

</details>

### Tabelas principais por categoria

As tabelas no `repo` os schemas são organizados em categorias funcionais. As descrições abaixo resumem as tabelas mais importantes por seu propósito de negócio.

<details>

<summary><code>organization</code></summary>

**Propósito:** Gestão da organização hierárquica

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>parent_id</code>, <code>path</code>, <code>organization_type_id</code>, <code>title_en</code>, <code>is_active</code>, <code>deleted_at</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índice GiST em <code>path</code> para consultas hierárquicas, índices em <code>parent_id</code> e <code>organization_type_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Usa ltree para hierarquias multinível, herda de <code>customizable_entity</code> para suporte a campos personalizados</td></tr></tbody></table>

</details>

<details>

<summary><code>user</code></summary>

**Propósito:** Contas de usuário e autenticação

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>user_type_id</code>, <code>identity_provider</code>, <code>identity_provider_id</code>, <code>full_name</code>, <code>is_active</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índice exclusivo em (<code>organization_id</code>, <code>identity_provider</code>, <code>identity_provider_id</code>)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Integração com provedor de identidade externo (Keycloak, Auth0, Okta), herda de <code>customizable_entity</code></td></tr></tbody></table>

</details>

<details>

<summary><code>device</code></summary>

**Propósito:** Dispositivos físicos de rastreamento

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>device_type_id</code>, <code>status_id</code>, <code>hw_id</code>, <code>label</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índices em <code>organization_id</code>, <code>device_type_id</code>, <code>status_id</code>, <code>hw_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Identificador de hardware para rastreamento de dispositivos, herda de <code>customizable_entity</code> para campos personalizados</td></tr></tbody></table>

</details>

<details>

<summary><code>asset</code></summary>

**Propósito:** Ativos físicos ou virtuais

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>asset_type_id</code>, <code>label</code>, <code>description</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índices em <code>organization_id</code> e <code>asset_type_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Herdado de <code>customizable_entity</code>, vinculado a dispositivos via <code>device_asset_link</code></td></tr></tbody></table>

</details>

<details>

<summary><code>inventory</code></summary>

**Propósito:** Registros de inventário e almoxarifado

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>inventory_type_id</code>, <code>code</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índice exclusivo em (<code>organization_id</code>, <code>code</code>)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Códigos exclusivos dentro da organização, vinculados a dispositivos via <code>device_inventory_link</code></td></tr></tbody></table>

</details>

<details>

<summary><code>asset_group</code></summary>

**Propósito:** Agrupamento de ativos com rastreamento histórico

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>group_type_id</code>, <code>title_en</code>, <code>description</code></td></tr><tr><td><strong>Relacionamentos</strong></td><td><code>FROM repo.asset_group AS ag JOIN repo.asset_group_item AS agi ON agi.group_id = ag.id JOIN repo.asset AS a ON a.id = agi.asset_id WHERE agi.detached_at IS NULL</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Filiação baseada em tempo via <code>asset_group_item</code>, consulte os membros atuais com <code>WHERE detached_at IS NULL</code></td></tr></tbody></table>

</details>

<details>

<summary><code>custom_field_def</code></summary>

**Propósito:** Definições e metadados de campos personalizados

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>organization_id</code>, <code>owner_entity_type_id</code>, <code>code</code>, <code>field_type</code>, <code>is_multi</code>, <code>is_required</code></td></tr><tr><td><strong>Conteúdo</strong></td><td>Os tipos de campo incluem texto, número, booleano, data, data e hora, entity_ref, catalog_item_ref</td></tr><tr><td><strong>Observações especiais</strong></td><td>Permite campos personalizados flexíveis para qualquer tipo de entidade, valores armazenados em tabelas específicas por tipo <code>custom_field_value_*</code> tabelas</td></tr></tbody></table>

</details>

<details>

<summary><code>acl_role_permission</code></summary>

**Propósito:** Gerenciamento de permissões baseado em função

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>role_id</code>, <code>permission_scope_id</code>, <code>target_entity_id</code>, <code>actions</code></td></tr><tr><td><strong>Conteúdo</strong></td><td>Máscara de bits de ação (READ=1, UPDATE=2, DELETE=4, CREATE=8), permissões específicas por alvo ou abrangentes por tipo de entidade</td></tr><tr><td><strong>Relacionamentos</strong></td><td><code>FROM repo.user_role AS ur JOIN repo.acl_role_permission AS rp ON rp.role_id = ur.role_id WHERE ur.user_id = $user_id</code></td></tr><tr><td><strong>Observações especiais</strong></td><td>Funciona com <code>user_role</code> e <code>acl_user_scope</code> para determinar as permissões finais do usuário</td></tr></tbody></table>

</details>

<details>

<summary><code>audit_event</code></summary>

**Propósito:** Registro de auditoria unificado para todas as alterações do sistema

<table><thead><tr><th width="139">Atributo</th><th>Detalhes</th></tr></thead><tbody><tr><td><strong>Campos principais</strong></td><td><code>id</code>, <code>event_category</code>, <code>user_id</code>, <code>aggregate_type</code>, <code>aggregate_id</code>, <code>event_type</code>, <code>event_data</code>, <code>occurred_at</code></td></tr><tr><td><strong>Indexação</strong></td><td>Índices em (<code>user_id</code>, <code>occurred_at</code>), (<code>aggregate_type</code>, <code>aggregate_id</code>, <code>occurred_at</code>), (<code>event_category</code>, <code>occurred_at</code>)</td></tr><tr><td><strong>Observações especiais</strong></td><td>Particionado por <code>occurred_at</code> (mensalmente), duas categorias: <code>auth</code> (autenticação) e <code>domain</code> (eventos de negócio), armazena deltas de alteração em nível de campo em <code>event_data</code> JSONB</td></tr></tbody></table>

</details>

### Relações de dados

A `repo` o schema implementa padrões sofisticados de relacionamento para modelagem flexível de dados:

**Estruturas hierárquicas**

* As organizações usam paths ltree para consultas de árvore eficientes
* Itens de referência (`ci_base`) suportam hierarquias opcionais
* Manutenção automática do path por meio de triggers de banco de dados

**Padrões de herança**

* Herança de tabela: `customizable_entity` → entidades de negócio (`organization`, `user`, `device`, `asset`, `inventory`, `asset_group`)
* Herança de ID: `ci_base` → tabelas de tipos de referência
* Discriminação de tipo via `entity_type_id` e `discriminator` campos

**Relacionamentos polimórficos**

Certas tabelas usam referências polimórficas sem restrições de chave estrangeira para máxima flexibilidade:

* `acl_role_permission.target_entity_id` → qualquer `customizable_entity`
* `acl_user_scope.target_entity_id` → qualquer `customizable_entity`
* `entity_tag.entity_id` → qualquer `customizable_entity`

Esses relacionamentos são validados no nível da aplicação.

### Informações adicionais

#### Validação de dados

A `repo` o schema impõe a integridade dos dados por meio de vários mecanismos:

**Restrições de banco de dados**

* Restrições UNIQUE com suporte a exclusão lógica (índices parciais WHERE `deleted_at` IS NULL)
* Restrições CHECK (por exemplo, `device_relation` garante `master_id` ≠ `slave_id`)
* Restrições NOT NULL em campos obrigatórios
* Valores DEFAULT para timestamps e flags booleanas

**Validação no nível da aplicação**

* Validação do tipo de entidade para referências polimórficas
* Validação de catálogo para referências de campos personalizados
* Validação do tipo de campo personalizado
* Gerenciamento de arrays de campos com múltiplos valores

#### Otimização de consultas

As tabelas são organizadas com estratégias específicas de indexação:

**Índices padrão:**

* Todas as chaves estrangeiras possuem índices dedicados
* Índices baseados em tempo em `created_at`, `updated_at`, `deleted_at`
* Índices compostos para colunas frequentemente relacionadas em joins

**Índices especializados:**

* Índices GiST em paths ltree para consultas hierárquicas
* Índices exclusivos parciais com suporte a exclusão lógica
* Índices de valores de campos personalizados para filtragem e ordenação
* Índices de eventos de auditoria por tempo + entidade para buscas eficientes

**Considerações de desempenho:**

* Recomendado pooling de conexões (PgBouncer)
* Manutenção regular com VACUUM para tabelas grandes
* Possível particionamento futuro para `device` tabela por `organization_id`
* Visões materializadas para cálculos complexos de controle de acesso


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://navixy.com/docs/analytics/pt-br/iot-query/schema-overview/bronze-layer.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
