App terminal em Node.js para escolher um tipo de entidade e um campo via metadata do Adaptive Work, e atualizar esse campo em massa nos objetos do tipo selecionado (com filtros opcionais).
## Pré-requisitos
- Node.js 18+
- API key do Adaptive Work (`CLARIZEN_API_KEY`)
- Biblioteca `@arco/clarizen-lib` compilada no diretório irmão (`../clarizen-lib`)
## Instalação
```bash
cd ../clarizen-lib && npm install && npm run build
cd ../update_field_API
cp .env.example .env
# Edite .env com CLARIZEN_BASE_URL e CLARIZEN_API_KEY
npm install
```
## Uso
```bash
npm start
```
Fluxo interativo:
1. Autenticação com API key
2. Escolha do tipo de entidade (nível) — lista completa ou filtro por texto
3.**Filtro de objetos** — todos, por State (se o tipo tiver lifecycle), ou cláusula WHERE em CZQL
4. Escolha do campo — cada opção mostra **label**, **nome** e **tipo**
5. Exibição de exemplo de preenchimento conforme o tipo
6. Informe o novo valor (ou limpe o campo, se nullable)
7. Busca dos objetos conforme o filtro
8. Confirmação com resumo (tipo, filtro, campo, valor, quantidade)
9. Atualização em massa com barra de progresso, porcentagem e ETA
## Filtros de objetos
Após escolher o tipo de entidade, você pode limitar quais registros serão atualizados:
| Opção | Descrição |
|-------|-----------|
| Todos os objetos | Sem filtro (comportamento original) |
| Filtrar por State | Disponível quando a metadata expõe `validStates` (ex.: Active, Completed) |
| CZQL WHERE | Informe só a cláusula `WHERE`; o app valida contra a API antes de continuar |
### Exemplos de cláusula WHERE (CZQL)
```
State = 'Active'
Name LIKE 'Projeto%'
State = 'Active' AND Name LIKE 'Test%'
```
A cláusula é aplicada via `entityQuery` com filtro CZQL. Comandos de modificação (`DELETE`, `UPDATE`, etc.) são rejeitados.
## Exemplos de valor por tipo de campo
| Tipo | Como preencher no terminal |
|------|---------------------------|
| Boolean | `true`, `false`, `sim`, `não` |
| String | texto livre, ex: `Meu valor` |
| Integer / Long | `42` |
| Double | `3.14` |
| DateTime | `2026-06-09` ou `2026-06-09T14:30:00Z` |
| Date | `2026-06-09` |
| Entity | `/User/abc-123` ou `{"id":"/User/abc-123"}` |
| Duration | `{"value":5,"unit":"Days"}` |
| Money | `{"value":100,"currency":"BRL"}` |
Campos **nullable** permitem limpar o valor escolhendo "Limpar campo (null)" ou digitando `null`.
Campos com `presentationType: PickList` (listas de opções customizadas ou do sistema) exibem uma **lista carregada da API** com nomes legíveis (ex: `Conteúdo`). O app envia o ID como **string** (`"/C_GenericTaskSetor/Edição"`), não como objeto `{"id":"..."}` — formato exigido pela API do Adaptive Work para PickList.
Campos de **referência** (`ReferenceToObject`, ex: User, Project) continuam exigindo objeto `{"id":"/Tipo/guid"}` ou `/Tipo/guid` convertido para `{ id }`.
Objetos que falharem na atualização também aparecem no `run-log-*.json`. Além disso, um arquivo `errors-<timestamp>.json` é gerado quando há falhas, contendo só os erros para reprocessamento.