---
# System prepended metadata

title: Liberar Pontuação
tags: [eFinance]

---

# Liberar Pontuação

:::info Descrição
Permite ao usuário aprovar liberações de contratos que tiveram pontuação abaixo do mínimo durante simulação. O processo de liberação é iniciado no sistema web e finalizado via APP.
:::

## Fluxo no APP
1. O usuário acessa o menu `Liberar Pontuação`.
2. É exibida a lista de contratos pendentes de aprovação.
3. Ao selecionar um contrato, os dados são carregados para análise.
4. O usuário pode então aprovar a liberação clicando no botão `Liberar`.

## Como Simular/Testar no Sistema Web
1. Acesse: `http://modelo.efinance.com.br`
2. Login:
   - **Empresa:** 116
   - **Usuário:** Santarosa
3. Após login, entre com as credenciais da Persys.
4. Vá até: `Comercial > Clientes / Simulação e Contrato`
5. Selecione um cliente com 1+ projetos (coluna `Proj.`).
6. Clique em `Simulação e Contrato`.
7. Altere o campo `Pontuação` para 1.5 ou menos e clique em `Simulação`.
8. Quando alertado que a pontuação está abaixo do mínimo, clique em `Solicitar lib. Pontuação`.
9. Marque o usuário `Silvio Santarosa` e clique em `Enviar Solicitação`.

:::success Resultado
Após estes passos, a solicitação aparecerá no APP.
:::

## Endpoints Utilizados

### Listar Contratos Pendentes
**Método:** POST  
**URL:** `/api/Contrato/GetContrato`  
**Descrição:** Retorna os contratos pendentes de liberação.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário que vai aprovar

**Exemplo Request:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1
}
```

**Response (Sucesso):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "CLI_Codigo": 12345,
    "CLI_Loja": 2009,
    "Cliente": "Nome do Cliente",
    "Indicador": 1.5,
    "TipoVenda": "Tipo de Venda",
    "Financeira": "Nome da Financeira",
    "Fornecedor": 123,
    "Contrato": "200901234",
    "CondicaoPagamento": "Condição de Pagamento",
    "Pontuacao": 1.5,
    "JurosMedio": 2.5,
    "USU_Nome": "Nome do Usuário"
  }
]
```

**Response (Erro):**
```json
[
  {
    "ERR_Codigo": 1,
    "ERR_Mensagem": "Não há contratos para liberar",
    "CLI_Codigo": 0,
    "CLI_Loja": 0,
    "Cliente": null,
    "Indicador": 0,
    "TipoVenda": null,
    "Financeira": null,
    "Fornecedor": 0,
    "Contrato": null,
    "CondicaoPagamento": null,
    "Pontuacao": 0,
    "JurosMedio": 0,
    "USU_Nome": null
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `CLI_Codigo` <int> - Código do cliente
- `CLI_Loja` <int> - Código da loja do cliente
- `Cliente` <string> - Nome do cliente
- `Indicador` <decimal> - Valor do indicador de pontuação
- `TipoVenda` <string> - Tipo de venda (à vista, financiada, etc.)
- `Financeira` <string> - Nome da instituição financeira (se aplicável)
- `Fornecedor` <int> - Código do fornecedor
- `Contrato` <string> - Número do contrato
- `CondicaoPagamento` <string> - Condição de pagamento negociada
- `Pontuacao` <decimal> - Pontuação atual do contrato
- `JurosMedio` <decimal> - Taxa média de juros aplicada
- `USU_Nome` <string> - Nome do usuário responsável

### Detalhes do Contrato
**Método:** POST  
**URL:** `/api/Projeto`  
**Descrição:** Retorna os dados detalhados do contrato selecionado para análise.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário
- `Cliente` <int32> - Código do cliente
- `Contrato` <string> - Número do contrato

**Exemplo Request:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "Cliente": 12345,
  "Contrato": "200901234"
}
```

**Response:**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "PRO_Loja": 2009,
    "PRO_Cliente": 12345,
    "PRO_Opcao": "AA",
    "PRO_Ambiente": "SALA",
    "PRO_Fornecedor": "123",
    "PRO_Linha": "456",
    "Fornecedor": "Nome do Fornecedor",
    "Linha": "Nome da Linha",
    "PRO_TotalPrazo": 10000.00,
    "PontuacaoLiberada": 1.5,
    "PontuacaoStartSimulacao": 2.0,
    "PercentualDesconto": 25.0,
    "JurosMedio": 2.5
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "PRO_Loja": 2009,
    "PRO_Cliente": 12345,
    "PRO_Opcao": "AB",
    "PRO_Ambiente": "QUARTO",
    "PRO_Fornecedor": "123",
    "PRO_Linha": "456",
    "Fornecedor": "Nome do Fornecedor",
    "Linha": "Nome da Linha",
    "PRO_TotalPrazo": 5000.00,
    "PontuacaoLiberada": 1.5,
    "PontuacaoStartSimulacao": 2.0,
    "PercentualDesconto": 25.0,
    "JurosMedio": 2.5
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `PRO_Loja` <int> - Código da loja onde o projeto foi criado
- `PRO_Cliente` <int> - Código do cliente
- `PRO_Opcao` <string> - Código do ambiente/opção (AA, AB, etc.)
- `PRO_Ambiente` <string> - Descrição do ambiente (Sala, Quarto, etc.)
- `PRO_Fornecedor` <string> - Código do fornecedor
- `PRO_Linha` <string> - Código da linha de produtos
- `Fornecedor` <string> - Nome do fornecedor
- `Linha` <string> - Nome da linha de produtos
- `PRO_TotalPrazo` <decimal> - Valor total a prazo
- `PontuacaoLiberada` <decimal> - Pontuação que será liberada
- `PontuacaoStartSimulacao` <decimal> - Pontuação inicial da simulação
- `PercentualDesconto` <decimal> - Percentual de desconto aplicado
- `JurosMedio` <decimal> - Taxa média de juros aplicada

### Liberar Pontuação
**Método:** POST  
**URL:** `/api/Projeto/Liberar`  
**Descrição:** Realiza a liberação da pontuação do contrato selecionado.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja do usuário
- `Login` <string> - Login do usuário
- `Senha` <string> - Senha do usuário
- `CLI_Loja` <array[string]> - Código da loja do cliente
- `CLI_Codigo` <array[string]> - Código do cliente
- `Opcao` <array[string]> - Código do projeto
- `Linha` <array[string]> - Código da linha
- `Fornecedor` <array[string]> - Código do fornecedor
- `Pontuacao` <array[string]> - Pontuação do projeto

**Exemplo Request:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "Login": "usuario",
  "Senha": "senha123",
  "CLI_Loja": ["2009"],
  "CLI_Codigo": ["12345"],
  "Opcao": ["AA", "AB"],
  "Linha": ["115"],
  "Fornecedor": ["6"],
  "Pontuacao": ["1,2"]
}
```

**Response:**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (em caso de sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (em caso de erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Usuário sem permissão para liberar pontuações"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro)
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso

:::warning Observações
- O contrato só aparece no APP após o processo de solicitação de liberação ser feito no sistema web.
- O ambiente de testes é: `http://suporte.efinance.com.br/13647`.
- O usuário `Silvio Santarosa` (Usuário ID: 1) é utilizado nos testes.
- Todos os endpoints sempre retornam HTTP Status Code 200.
- Para verificar se houve erro na operação, verifique se `ERR_Codigo` é diferente de 0 e a mensagem em `ERR_Mensagem`.
:::

# Autorização Deb/Cred

:::info Descrição
Permite ao usuário autorizar, retornar, aprovar ou reprovar solicitações de débito ou crédito cadastradas previamente no sistema web. O APP apresenta os registros pendentes e possibilita o gerenciamento individual de cada solicitação.
:::

## Fluxo no APP
1. O usuário acessa o menu `Autorização Deb/Cred`.
2. A tela lista todas as solicitações pendentes.
3. Ao selecionar uma solicitação, o app exibe os detalhes da CI.
4. As ações disponíveis são:
   - Alterar grupo de contas e tipo de movimento
   - Retornar ao solicitante
   - Aprovar
   - Reprovar
   - Fechar sem ação (desbloqueia automaticamente)

## Como Simular/Testar no Sistema Web
1. Acesse: `http://modelo.efinance.com.br`
2. Login:
   - **Empresa:** 116
   - **Loja:** 2009
   - **Usuário:** dani
   - **Senha:** eFiPersys
3. Vá até: `Financeiro > Solicitação de Autorização (Deb/Cre)`
4. Clique em `Nova`
5. Selecione o destinatário `SILVIO SANTAROSA`
6. Preencha todos os campos da CI, incluindo parcelamento
7. Clique em `Enviar`

:::success Resultado
Após estes passos, a solicitação será exibida no APP.
:::

## Endpoints Utilizados

### Listar Autorizações Pendentes
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacao/GetSolicitacaoAutorizacao`  
**Descrição:** Retorna a lista de autorizações pendentes.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário

**Exemplo Request:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1
}
```

**Response:**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "CodCIA": 3497170,
    "Loja": 2009,
    "Data": "28/01/2025 10:51:26",
    "Vencimento": "28/01/2025",
    "Remetente": "Ana Lima",
    "Destinatario": "Silvio Santarosa ",
    "GrupoContas": "CREDITOS",
    "ContaMovto": "CRÉDITOS-DIVERSOS",
    "TotalCI": 2460,
    "Status": "<font color=green><b>Retornado</b></font>",
    "Tipo": "C"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "CodCIA": 3518832,
    "Loja": 2009,
    "Data": "27/02/2025 10:21:44",
    "Vencimento": "12/02/2025",
    "Remetente": "Silvio Santarosa ",
    "Destinatario": "Ana Lima",
    "GrupoContas": "OBRIGAÇÕES TRABALHISTAS",
    "ContaMovto": "INSS",
    "TotalCI": 500,
    "Status": "<font color=green><b>Aguarda</b></font>",
    "Tipo": "D"
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `CodCIA` <int> - Código único da CI (vem de `CIA_CodCIA`)
- `Loja` <int> - Código da loja da CI (vem de `CIA_Loja`)
- `Data` <string> - Data e hora de criação da solicitação (formato "dd/MM/yyyy HH:mm:ss", vem de `CIA_Data` e `CIA_Hora`)
- `Vencimento` <string> - Data do primeiro vencimento (formato "dd/MM/yyyy", vem de `Primeiro_Vecto`)
- `Remetente` <string> - Nome do usuário remetente (vem de `DeNome`)
- `Destinatario` <string> - Nome do usuário destinatário (vem de `ParaNome`)
- `GrupoContas` <string> - Descrição do grupo de contas (vem de `TMS_Descricao`)
- `ContaMovto` <string> - Descrição da conta de movimento/tipo de despesa (vem de `TMP_Descricao`)
- `TotalCI` <decimal> - Valor total da solicitação (vem de `TotalCIA`)
- `Status` <string> - Descrição do status da CI (pode conter HTML, vem de `NomeStatus`)
- `Tipo` <string> - Tipo da operação ("D" para Débito, "C" para Crédito, vem de `TMP_DebCre`)

### Detalhes da CI
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacaoItem`  
**Descrição:** Retorna os detalhes da CI selecionada.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CodCIA` <int32> - Código da CI
- `Usuario` <int32> - Código do usuário

**Exemplo Request:**
```json
{
  "Emp": 116,
  "CodCIA": 3475277,
  "Usuario": 1
}
```

**Response:**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "",
  "UserDe": "DANIELLE SILVA",
  "UserPara": "SILVIO SANTAROSA",
  "Loja": "Loja Exemplo",
  "TipoMovto": "<font color=red> Débito</font>",
  "Documento": "Nota Fiscal",
  "GrupoContas": "PGTO FORNECEDOR",
  "ContasMovto": "PAGAMENTO A FORNECEDORES",
  "Fornecedor": "FORNECEDOR XYZ LTDA",
  "Assunto": "PAGAMENTO FORNECEDOR",
  "Historico": "Pagamento referente à nota fiscal 9876, entrega realizada em 20/11/2024",
  "Observacao": "<br /><br /><div class=dvCIA>DANIELLE SILVA - 25/11/2024 14:35 hs </div>Favor verificar e aprovar com urgência",
  "CodCIA": 3475277,
  "CIA_Status": 0,
  "CIA_TipoMovimento": 5213,
  "CIA_Equipe": 0,
  "CIA_PeriodoMes": 11,
  "CIA_PeriodoAno": 2024,
  "CIA_Origem": 0,
  "CIA_Fornecedor": 3075,
  "TMP_DebCre": "D",
  "CIA_CodUserDe": 287,
  "CIA_CodUserPara": 1,
  "CIA_Loja": 2009,
  "CIA_Documento": 1234,
  "CIA_Data_Retornado": null,
  "Documentos": [
    { "NomCampo": "Número NF", "Conteudo": "9876" },
    { "NomCampo": "Data Emissão NF", "Conteudo": "20/11/2024" }
  ],
  "Parcelas": [
    { "Parcela": "1", "Vencto": "30/11/2024", "Valor": 2500.00 },
    { "Parcela": "2", "Vencto": "30/12/2024", "Valor": 2500.00 }
  ],
  "Bloqueado": "N"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `UserDe` <string> - Nome do usuário DE (remetente da CIA, da Model: `NomUserDE`)
- `UserPara` <string> - Nome do usuário PARA (destinatário da CIA, da Model: `NomUserPara`)
- `Loja` <string> - Nome da Loja (da Model: `NomLoja`)
- `TipoMovto` <string> - Tipo de movimento formatado (ex: D/C com HTML, da Model: `TMP_DebCre` formatado)
- `Documento` <string> - Nome do tipo de documento (da Model: `TDO_Nome`)
- `GrupoContas` <string> - Descrição do "Grupo de Contas" (mapeado de `TMP_Descricao` - Nome do Tipo de Movimento/Despesa)
- `ContasMovto` <string> - Descrição da "Conta de Movimento" (mapeado de `TMS_Descricao` - Nome do SubGrupo de Contas)
- `Fornecedor` <string> - Nome do Fornecedor (da Model: `NomFornecedor`)
- `Assunto` <string> - Assunto da CI (da Model: `CIA_Assunto`)
- `Historico` <string> - Histórico da CI (da Model: `CIA_Historico`)
- `Observacao` <string> - Observações do sistema/fluxo em uma string única (da Model: `CIA_Observacao`)
- `CodCIA` <int> - Código da CI
- `CIA_Status` <int> - Status numérico da CI (0=Pendente, 1=Aprovada, 2=Reprovada, 3=Retornada)
- `CIA_TipoMovimento` <int> - Código do Tipo de Movimento
- `CIA_Equipe` <int> - Código da Equipe (se houver)
- `CIA_PeriodoMes` <int> - Mês de referência do período (se houver)
- `CIA_PeriodoAno` <int> - Ano de referência do período (se houver)
- `CIA_Origem` <int> - Código da origem da CI (se houver)
- `CIA_Fornecedor` <int> - Código do fornecedor (se aplicável)
- `TMP_DebCre` <string> - Tipo da operação ("D" para Débito, "C" para Crédito)
- `CIA_CodUserDe` <int> - Código do usuário solicitante/DE
- `CIA_CodUserPara` <int> - Código do usuário destinatário/PARA
- `CIA_Loja` <int> - Código da loja da CI
- `CIA_Documento` <int> - Código do Tipo de Documento
- `CIA_Data_Retornado` <string> - Data em que a CI foi retornada (se aplicável, formato ISO ou dd/MM/yyyy)
- `Documentos` <array[object]> - Lista de documentos associados à CI
  - `NomCampo` <string> - Nome do campo do documento
  - `Conteudo` <string> - Conteúdo do campo do documento
- `Parcelas` <array[object]> - Lista de parcelas da CI
  - `Parcela` <string> - Identificador da parcela (ex: "1", "2")
  - `Vencto` <string> - Data de vencimento da parcela (formato dd/MM/yyyy)
  - `Valor` <decimal> - Valor da parcela
- `Bloqueado` <string> - Indica o status de bloqueio do registro (ex: "S" para Sim, "N" para Não, ou mensagem)

### Carregar Grupos de Contas
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacaoItem/GrupoConta`  
**Descrição:** Carrega as opções de grupo de contas.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `DebCre` <string> - Tipo do movimento ("D" para Débito ou "C" para Crédito)

**Exemplo Request:**
```json
{
  "Emp": 116,
  "DebCre": "D"
}
```

**Response:**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 52,
    "Descricao": "CONTAS A PAGAR",
    "SubGrupos": [
      {
        "Codigo": 5213,
        "Descricao": "PAGAMENTO A FORNECEDORES"
      },
      {
        "Codigo": 5214,
        "Descricao": "PAGAMENTO DE SERVIÇOS"
      },
      {
        "Codigo": 5215,
        "Descricao": "DESPESAS DIVERSAS"
      }
    ]
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 53,
    "Descricao": "DESPESAS ADMINISTRATIVAS",
    "SubGrupos": [
      {
        "Codigo": 5301,
        "Descricao": "MATERIAL DE ESCRITÓRIO"
      },
      {
        "Codigo": 5302,
        "Descricao": "DESPESAS COM PESSOAL"
      }
    ]
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `Codigo` <int> - Código do grupo de contas
- `Descricao` <string> - Nome do grupo de contas
- `SubGrupos` <array[object]> - Lista de subgrupos pertencentes ao grupo
  - `Codigo` <int> - Código do subgrupo
  - `Descricao` <string> - Nome do subgrupo

### Carregar Tipos de Movimento
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacaoItem/TipoMovimento`  
**Descrição:** Retorna os tipos de movimento conforme o subgrupo selecionado.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `SubGrupo` <int32> - Código do subgrupo de contas

**Exemplo Request:**
```json
{
  "Emp": 116,
  "SubGrupo": 5213
}
```

**Response:**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "TMO_Codigo": 52131,
    "TMO_Nome": "PGTO FORNECEDOR MATERIAL"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "TMO_Codigo": 52132,
    "TMO_Nome": "PGTO FORNECEDOR SERVIÇO"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "TMO_Codigo": 52133,
    "TMO_Nome": "PGTO FORNECEDOR FRETE"
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)
- `TMO_Codigo` <int> - Código do tipo de movimento
- `TMO_Nome` <string> - Nome do tipo de movimento

### Desbloquear CI
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacaoItem/Desbloqueia`  
**Descrição:** Desbloqueia a CI caso o usuário apenas feche a tela sem tomar ação.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CodCIA` <int32> - Código da CI
- `Usuario` <int32> - Código do usuário

**Exemplo Request:**
```json
{
  "Emp": 116,
  "CodCIA": 3497170,
  "Usuario": 1
}
```

**Response:**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso)
- `ERR_Mensagem` <string> - Mensagem de erro (vazio = sucesso)

### Retornar CI
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacao/Retornar`  
**Descrição:** Retorna a CI ao solicitante com observação obrigatória.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CodCIA` <int32> - Código da CI
- `Observacao` <string> - Motivo do retorno
- `Usuario` <int32> - Código do usuário
- `CIA_CodUserDe` <int32> - Código do usuário que está retornando
- `CIA_CodUserPara` <int32> - Código do usuário destinatário
- `CIA_Loja` <int32> - Código da loja
- `CIA_TipoMovimento` <int32> - Código do tipo de movimento
- `CIA_Documento` <int32> - Número do documento
- `CIA_Assunto` <string> - Assunto da CI
- `CIA_Historico` <string> - Histórico da CI
- `CIA_Fornecedor` <int32> - Código do fornecedor

**Exemplo Request:**
```json
{
  "Emp": 116,
  "CodCIA": 3475277,
  "Observacao": "Falta nota fiscal do fornecedor",
  "Usuario": 1,
  "CIA_CodUserDe": 1,
  "CIA_CodUserPara": 287,
  "CIA_Loja": 2009,
  "CIA_TipoMovimento": 5213,
  "CIA_Documento": 1,
  "CIA_Assunto": "PAGAMENTO FORNECEDOR",
  "CIA_Historico": "Pagamento referente à nota fiscal 9876",
  "CIA_Fornecedor": 3075
}
```

**Response:**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (em caso de erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "É necessário incluir uma observação para retornar a CI"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro)
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso

### Aprovar/Reprovar CI
**Método:** POST  
**URL:** `/api/SolicitacaoAutorizacao/Aprovar`  
**Descrição:** Usado tanto para aprovar quanto para reprovar a solicitação.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário
- `CodCIA` <int32> - Código da CI
- `Aprova` <int32> - 0 para Reprovar, 1 para Aprovar
- `CIA_CodUserDe` <int32> - Código do usuário que está aprovando
- `CIA_CodUserPara` <int32> - Código do usuário destinatário
- `CIA_Loja` <int32> - Código da loja
- `CIA_Status` <int32> - Status da CI
- `CIA_TipoMovimento` <int32> - Código do tipo de movimento
- `CIA_Documento` <int32> - Número do documento
- `CIA_Assunto` <string> - Assunto da CI
- `CIA_Equipe` <int32> - Código da equipe
- `CIA_PeriodoMes` <int32> - Mês do período
- `CIA_PeriodoAno` <int32> - Ano do período
- `CIA_Origem` <int32> - Código da origem
- `CIA_Historico` <string> - Histórico da CI
- `CIA_Fornecedor` <int32> - Código do fornecedor
- `TMP_DebCre` <string> - Tipo do movimento (D/C)
- `Observacao` <string> - Observação da aprovação/reprovação
- `Vencimentos` <string> - Datas de vencimento das parcelas
- `ValoresParcelas` <string> - Valores das parcelas

**Exemplo Request (Aprovação):**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "CodCIA": 3475277,
  "Aprova": 1,
  "CIA_CodUserDe": 1,
  "CIA_CodUserPara": 287,
  "CIA_Loja": 2009,
  "CIA_Status": 0,
  "CIA_TipoMovimento": 5213,
  "CIA_Documento": 1,
  "CIA_Assunto": "PAGAMENTO FORNECEDOR",
  "CIA_Equipe": 0,
  "CIA_PeriodoMes": 0,
  "CIA_PeriodoAno": 0,
  "CIA_Origem": 0,
  "CIA_Historico": "Pagamento referente à nota fiscal 9876",
  "CIA_Fornecedor": 3075,
  "TMP_DebCre": "D",
  "Observacao": "Aprovado - Pagamento autorizado",
  "Vencimentos": "18/12/2024",
  "ValoresParcelas": "5000.00"
}
```

**Exemplo Request (Reprovação):**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "CodCIA": 3475277,
  "Aprova": 0,
  "CIA_CodUserDe": 1,
  "CIA_CodUserPara": 287,
  "CIA_Loja": 2009,
  "CIA_Status": 0,
  "CIA_TipoMovimento": 5213,
  "CIA_Documento": 1,
  "CIA_Assunto": "PAGAMENTO FORNECEDOR",
  "CIA_Equipe": 0,
  "CIA_PeriodoMes": 0,
  "CIA_PeriodoAno": 0,
  "CIA_Origem": 0,
  "CIA_Historico": "Pagamento referente à nota fiscal 9876",
  "CIA_Fornecedor": 3075,
  "TMP_DebCre": "D",
  "Observacao": "Reprovado - Falta documentação completa",
  "Vencimentos": "18/12/2024",
  "ValoresParcelas": "5000.00"
}
```

**Response:**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (em caso de erro na reprovação):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "É necessário incluir uma observação para reprovar a CI"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro)
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso

:::warning Observações
- CI só pode ser reprovada se tiver uma observação.
- CI é desbloqueada automaticamente se o usuário fechar a tela sem ação.
- A mesma CI pode ser retornada para outro usuário, dependendo do fluxo interno.
- O sistema permite alterar o grupo de contas e tipo de movimento mesmo após o cadastro inicial.
- O sistema mantém um histórico completo de todas as observações e ações realizadas.
- Os valores das parcelas são exibidos com 2 casas decimais.
- Quando uma CI é retornada ou já foi processada, os botões de aprovar e reprovar são automaticamente desabilitados.
:::

# Gerenciamento de Montagem/AT

:::info Descrição
Sistema integrado para gerenciamento completo de serviços pós-venda, abrangendo três módulos principais que trabalham de forma integrada:

### 1. Gerenciamento de Montagem
- Acompanhamento de montagens por ambiente
- Registro de ocorrências durante a montagem
- Controle de prazos e responsáveis
- Geração de ficha de montagem

### 2. AT de Serviço
- Gestão de assistência técnica para serviços
- Registro de ocorrências de assistência
- Controle de tipos de serviço e valores
- Atribuição de responsáveis

### 3. AT de Produto
- Gestão de assistência técnica para produtos
- Integração com fornecedores
- Controle de custos e dimensões
- Geração automática de pedidos
:::

## Fluxo no APP
1. Acessar o menu `Gerenciamento de Montagem/AT`.

### Gerenciamento de Montagem (`TipoCliente = 0`)
1. Visualizar lista de clientes com montagem
2. Selecionar ambiente do cliente
3. Registrar ocorrências de montagem:
   - Visualizar ocorrências
   - Criar nova ocorrência (serviço ou produto)
   - Inserir observações
   - Finalizar ocorrência (com ou sem pendência)
   - Gerar ficha
   - Acessar arquivos do ambiente

### AT de Serviço
1. Alternar para modo AT (`TipoCliente = 1`)
2. Selecionar cliente/ambiente
3. Criar nova ocorrência tipo "Serviço":
   - Selecionar tipo de serviço
   - Registrar observações
4. Acompanhar e finalizar serviço

### AT de Produto
1. Alternar para modo AT (`TipoCliente = 1`)
2. Selecionar cliente/ambiente
3. Criar nova ocorrência tipo "Produto":
   - Escolher fornecedor e linha
   - Buscar produto
   - Informar quantidades
   - Selecionar tipo de AT:
     - AT sem Custo (código 4)
     - AT com Custo (código 5)
     - AT venda Cliente (código 15)
4. Definir responsável e observações

## Endpoints Utilizados

### Listar Clientes
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem`  
**Descrição:** Lista clientes, com ou sem montagem, para o gerenciamento do Pós-Venda.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `EmpPadrao` <int32> - Código da empresa padrão
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `MesMinimo` <int32> - Período em meses para retornar os dados
- `TipoStatus` <int32> - Tipo do status (-1=Todos, 0=Com montagem, 1=Sem montagem)
- `TipoCliente` <int32> - Tipo do cliente (-1=Todos, 0=Montagem, 1=AT)
- `Status` <int32> - Status (-1=Todos, 0=Em aberto, 1=Terminadas)
- `Campo` <string, ==opcional==> - Campo para busca
- `Busca` <string, ==opcional==> - Conteúdo da busca
- `VersaoMobile` <string> - Versão do aplicativo

**Exemplo:**
```json
{
  "Emp": 116,
  "EmpPadrao": 116,
  "Usuario": 1,
  "Loja": 2009,
  "MesMinimo": 3,
  "TipoStatus": -1,
  "TipoCliente": 0,
  "Status": 0,
  "Campo": "",
  "Busca": "",
  "VersaoMobile": "1.4.1"
}
```

**Response (Exemplo):**
```json
[
  {
    "TM1_Ambientes": "5",
    "TM1_AtrasoOcorrenciaPedido": "5",
    "TM1_BaixaMontagem": "08/12/2016 00:00",
    "TM1_CodCliente": "2101",
    "TM1_CodGrupo": "2",
    "TM1_Contrato": "200901996",
    "TM1_DataCadOcorrencia": "21/08/2017 13:25",
    "TM1_DiasAtrasos": "547",
    "TM1_Emp": "116",
    "TM1_Loja": "2009",
    "TM1_NomeCliente": "PAULO DA SILVA COSTA",
    "TM1_OcorrenciaStatus": "0",
    "TM1_QtdeDiasUltimoPedido": "291",
    "TM1_TipoIcone": "1",
    "TM1_TipoStatusCliente": null,
    "TM1_QtdeOcorrenciaAtrasadoPedido": "1",
    "TM1_ParametroDiasAtraso": "30",
    "TM1_HabilitaPesquisa": "S",
    "TM1_MAX_AtFinalizadaData": "15/08/2017 00:00",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `TM1_Ambientes` <string> - Número de ambientes.
- `TM1_AtrasoOcorrenciaPedido` <string> - Dias de atraso da ocorrência do pedido.
- `TM1_BaixaMontagem` <string> - Data da baixa da montagem (formato dd/MM/yyyy HH:mm).
- `TM1_CodCliente` <string> - Código do cliente.
- `TM1_CodGrupo` <string> - Código do grupo.
- `TM1_Contrato` <string> - Número do contrato.
- `TM1_DataCadOcorrencia` <string> - Data de cadastro da ocorrência (formato dd/MM/yyyy HH:mm).
- `TM1_DiasAtrasos` <string> - Total de dias em atraso.
- `TM1_Emp` <string> - Código da empresa.
- `TM1_Loja` <string> - Código da loja.
- `TM1_NomeCliente` <string> - Nome do cliente.
- `TM1_OcorrenciaStatus` <string> - Status da ocorrência.
- `TM1_QtdeDiasUltimoPedido` <string> - Quantidade de dias desde o último pedido.
- `TM1_TipoIcone` <string> - Tipo de ícone para exibição.
- `TM1_TipoStatusCliente` <object> - Tipo de status do cliente (o tipo exato pode variar, string ou numérico).
- `TM1_QtdeOcorrenciaAtrasadoPedido` <string> - Quantidade de ocorrências de pedido atrasado.
- `TM1_ParametroDiasAtraso` <string> - Parâmetro de dias para considerar atraso.
- `TM1_HabilitaPesquisa` <string> - Indica se a pesquisa está habilitada ("S" ou "N").
- `TM1_MAX_AtFinalizadaData` <string> - Data máxima de finalização de AT (formato dd/MM/yyyy HH:mm).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Ambientes
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemAmbiente`  
**Descrição:** Retorna os ambientes e ocorrências do cliente selecionado.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `Cliente` <int32> - Código do cliente
- `Contrato` <int32> - Número do contrato
- `Ambientes` <string> - Códigos dos ambientes

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009,
  "Cliente": 12345,
  "Contrato": 67890,
  "Ambientes": "AA,AB"
}
```

**Response (Exemplo de um item da lista):**
```json
[
  {
    "TM2_Ordem": "1",
    "TM2_Emp": "116",
    "TM2_Loja": "2009",
    "TM2_Cliente": "1977",
    "TM2_Contrato": "200901857",
    "TM2_OpcaoLetra": "AE",
    "TM2_Opcao": "AE - COZINHA",
    "TM2_DataFinalizado": "",
    "TM2_ValorAvista": "15000.00",
    "TM2_TipoMontagem": "1",
    "TM2_DataInicioMontagem": "12/04/2018 08:00",
    "TM2_DataTerminoMontagem": "12/04/2018 10:00",
    "TM2_DataPrevistaMontagem": "12/04/2018 10:00",
    "TM2_ID": "336765",
    "TM2_NumOcorrencia": "1",
    "TM2_UserCadastro": "1",
    "TM2_DataCadastro": "19/03/2018 12:16",
    "TM2_Servico": "-1",
    "TM2_Observacao": "Não houve observação.",
    "TM2_Status": "0",
    "TM2_TipoResponsavel": "1",
    "TM2_CodUserResponsavelAt": "10",
    "TM2_TipoCliente": "0",
    "TM2_NomeCliente": "RENATINHO",
    "TM2_CliEntFone1": "999732545",
    "TM2_CliEndereco": "RUA TITANIA",
    "TM2_DescricaoProduto": "Base superior de armário",
    "TM2_NomeCadastro": "Silvio Santarosa",
    "TM2_UserResponsavelAt": "VAPT E VUPT",
    "TM2_Fornecedor": "HERVAL COLCHÕES",
    "TM2_Linha": "CABEÇEIRA",
    "TM2_NumPedido": "0",
    "TM2_QtdeProduto": "1.00",
    "TM2_AmbienteReferencia": "AI",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `TM2_Ordem` <string> - Ordem de exibição.
- `TM2_Emp` <string> - Código da empresa.
- `TM2_Loja` <string> - Código da loja.
- `TM2_Cliente` <string> - Código do cliente.
- `TM2_Contrato` <string> - Número do contrato.
- `TM2_OpcaoLetra` <string> - Letra da opção/ambiente (ex: "AA").
- `TM2_Opcao` <string> - Código e descrição do ambiente (ex: "AA - SALA").
- `TM2_DataFinalizado` <string> - Data de finalização do ambiente/ocorrência.
- `TM2_ValorAvista` <string> - Valor à vista do projeto/ambiente.
- `TM2_DataTerminoEmpresa` <string> - Data de término pela empresa.
- `TM2_TipoAt` <string> - Tipo de AT.
- `TM2_FinalizadoPor` <string> - Código do usuário que finalizou.
- `TM2_UserTerminoEmpresa` <string> - Código do usuário que deu término pela empresa.
- `TM2_FinalizadoPorNome` <string> - Nome do usuário que finalizou.
- `TM2_UserTerminoEmpresaNome` <string> - Nome do usuário que deu término pela empresa.
- `TM2_TipoMontagem` <string> - Código do tipo de montagem.
- `TM2_DataInicioMontagem` <string> - Data de início da montagem.
- `TM2_DataTerminoMontagem` <string> - Data de término da montagem.
- `TM2_DataBaixaMontagem` <string> - Data da baixa da montagem.
- `TM2_DataPrevistaMontagem` <string> - Data prevista para montagem.
- `TM2_MontagemTSistema` <string> - Data de montagem (sistema).
- `TM2_ID` <string> - ID da ocorrência/ambiente.
- `TM2_NumOcorrencia` <string> - Número da ocorrência.
- `TM2_UserCadastro` <string> - Código do usuário que cadastrou.
- `TM2_DataCadastro` <string> - Data de cadastro.
- `TM2_Servico` <string> - Código do serviço.
- `TM2_ServicoValor` <string> - Valor do serviço.
- `TM2_Observacao` <string> - Observações gerais.
- `TM2_Status` <string> - Status da ocorrência/ambiente.
- `TM2_EnviaCI` <string> - Indica se envia CI.
- `TM2_ObservacaoHTML` <string> - Observações em HTML.
- `TM2_TipoResponsavel` <string> - Código do tipo de responsável.
- `TM2_CodUserResponsavelAt` <string> - Código do usuário responsável pela AT.
- `TM2_TipoCliente` <string> - Tipo de cliente (0=Montagem, 1=AT).
- `TM2_DesativadoData` <string> - Data de desativação.
- `TM2_DesativadoPor` <string> - Código do usuário que desativou.
- `TM2_DesativadoMotivo` <string> - Motivo da desativação.
- `TM2_TipoFinalizacao` <string> - Tipo de finalização.
- `TM2_NomeCliente` <string> - Nome do cliente.
- `TM2_CliCgcCpf` <string> - CPF/CNPJ do cliente.
- `TM2_CliInscRG` <string> - RG/IE do cliente.
- `TM2_CliEntFone1` <string> - Telefone 1 do cliente.
- `TM2_CliEntFone2` <string> - Telefone 2 do cliente.
- `TM2_CliEmail` <string> - Email do cliente.
- `TM2_CliEndereco` <string> - Endereço do cliente.
- `TM2_CliBairro` <string> - Bairro do cliente.
- `TM2_CliCidade` <string> - Cidade do cliente.
- `TM2_CliEstado` <string> - Estado do cliente.
- `TM2_CliCep` <string> - CEP do cliente.
- `TM2_CliDataCadastro` <string> - Data de cadastro do cliente.
- `TM2_ClienteAT` <string> - Indica se é cliente de AT.
- `TM2_DescricaoServico` <string> - Descrição do serviço.
- `TM2_DescricaoProduto` <string> - Descrição do produto.
- `TM2_NomeCadastro` <string> - Nome do usuário de cadastro.
- `TM2_DesativadoPorNome` <string> - Nome de quem desativou.
- `TM2_UserResponsavelAt` <string> - Nome do usuário responsável pela AT.
- `TM2_TooltipComissionados` <string> - Tooltip dos comissionados.
- `TM2_Fornecedor` <string> - Nome do fornecedor.
- `TM2_Linha` <string> - Nome da linha.
- `TM2_NumPedido` <string> - Número do pedido.
- `TM2_QtdeOcorrencia` <string> - Quantidade de ocorrências.
- `TM2_QtdeProduto` <string> - Quantidade de produto.
- `TM2_CodFornecedor` <string> - Código do fornecedor.
- `TM2_CodLinha` <string> - Código da linha.
- `TM2_QtdeOcorrenciaFinalizada` <string> - Quantidade de ocorrências finalizadas.
- `TM2_AmbienteReferencia` <string> - Código do ambiente de referência.
- `T_PTI_DataInicio` <string> - Data de início (programação técnica).
- `T_PMO_ProgramacaoAT` <string> - Código da programação de AT.
- `T_PTI_Tecnico` <string> - Código do técnico.
- `TM2_PRO_DataRomaneio` <string> - Data do romaneio.
- `TM2_AtrasoOcorrenciaPedido` <string> - Atraso da ocorrência do pedido.
- `TM2_CancelarAmbienteReferencia` <string> - Flag para cancelar ambiente de referência.
- `TM2_AmbienteReferenciaDescricao` <string> - Descrição do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_EnviadoFabrica` <string> - Data de envio à fábrica do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_DataStartLiberacao` <string> - Data de início da liberação do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_DataFimLiberacao` <string> - Data de fim da liberação do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_Pontuacao` <string> - Pontuação do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_T012_Tabela_Preco` <string> - Tabela de preço do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_DataFIN` <string> - Data FIN do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_Fornecedor` <string> - Código do fornecedor do ambiente de referência.
- `TM2_AmbienteReferencia_PRO_Linha` <string> - Código da linha do ambiente de referência.
- `TM2_Tabela_Preco` <string> - Tabela de preço.
- `TM2_FornecedorFabricante_eFinance` <string> - Indicador de fornecedor fabricante eFinance.
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Tipos de Serviço
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/TipoServico`  
**Descrição:** Lista os tipos de serviço disponíveis.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009
}
```

**Response (Exemplo):**
```json
[
  {
    "TPS_Codigo": "101",
    "TPS_Descricao": "AJUSTE DE PORTA",
    "TPS_ValorMinimo": "50.00",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "TPS_Codigo": "102",
    "TPS_Descricao": "TROCA DE PUXADOR",
    "TPS_ValorMinimo": "30.00",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `TPS_Codigo` <string> - Código do tipo de serviço.
- `TPS_Descricao` <string> - Descrição do tipo de serviço.
- `TPS_ValorMinimo` <string> - Valor mínimo associado ao serviço (pode ser string representando decimal).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Fornecedores
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/Fornecedor`  
**Descrição:** Lista fornecedores para AT.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `TipoAT` <int32> - Tipo de AT (4=Sem Custo, 5=Com Custo, 15=Venda Cliente)

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009,
  "TipoAT": 4
}
```

**Response (Exemplo):**
```json
[
  {
    "FOR_Codigo": "123",
    "FOR_Nome": "DELLAVITA COZINHAS E PLANEJADOS",
    "FOR_TMS_Codigo": null,
    "FOR_TMP_Codigo": null,
    "FOR_Fabricante": "1",
    "HabilitaCadastro": "1",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "FOR_Codigo": "456",
    "FOR_Nome": "ITALINEA MOVEIS",
    "FOR_TMS_Codigo": "10",
    "FOR_TMP_Codigo": "101",
    "FOR_Fabricante": "2",
    "HabilitaCadastro": "0",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `FOR_Codigo` <string> - Código do fornecedor.
- `FOR_Nome` <string> - Nome/razão social do fornecedor.
- `FOR_TMS_Codigo` <string> - Código do subgrupo de contas (pode ser nulo).
- `FOR_TMP_Codigo` <string> - Código do tipo de movimento/despesa (pode ser nulo).
- `FOR_Fabricante` <string> - Código do fabricante associado.
- `HabilitaCadastro` <string> - Indica se o cadastro de linhas para este fornecedor está habilitado/restrito ("1" para habilitado/sem restrição, "0" para restrito).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Linhas
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/Linha`  
**Descrição:** Lista linhas do fornecedor selecionado.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja
- `Fornecedor` <string> - Código do fornecedor
- `TipoAT` <string> - Tipo de AT

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "Fornecedor": "123",
  "TipoAT": "4"
}
```

**Response (Exemplo):**
```json
[
  {
    "Codigo": "4561",
    "Descricao": "LINHA PREMIUM COZINHAS",
    "LSI_Fornecedor": "123",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "Codigo": "4562",
    "Descricao": "LINHA STANDARD SALAS",
    "LSI_Fornecedor": "123",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `Codigo` <string> - Código da linha.
- `Descricao` <string> - Descrição da linha (pode incluir nome do fornecedor dependendo da lógica interna da API).
- `LSI_Fornecedor` <string> - Código do fornecedor ao qual a linha pertence.
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Buscar Produtos
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/Produto`  
**Descrição:** Busca produtos do fornecedor/linha selecionados.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja
- `Linha` <string> - Código da linha
- `Fornecedor` <string> - Código do fornecedor
- `Busca` <string, ==opcional==> - Termo para busca
- `TipoAT` <string> - Tipo de AT

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "Linha": "456",
  "Fornecedor": "123",
  "Busca": "mesa",
  "TipoAT": "4"
}
```

**Response (Exemplo):**
```json
[
  {
    "Codigo": "PROD001",
    "Descricao": "MESA DE JANTAR 4 LUGARES",
    "FOR_Nome": "DELLAVITA COZINHAS E PLANEJADOS",
    "LSI_Descricao": "LINHA PREMIUM COZINHAS",
    "PRC_Descricao": "MESA DE JANTAR 4 LUGARES",
    "PRC_Fornecedor": "123",
    "PRC_Linha": "4561",
    "PRC_CodComercial": "PROD001COM",
    "PRC_CodFabricante": "FAB001XYZ",
    "Unidade": "UN",
    "ValorUnitario": "799.90",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "Codigo": "PROD002",
    "Descricao": "CADEIRA ESTOFADA",
    "FOR_Nome": "DELLAVITA COZINHAS E PLANEJADOS",
    "LSI_Descricao": "LINHA PREMIUM COZINHAS",
    "PRC_Descricao": "CADEIRA ESTOFADA COM BRAÇO",
    "PRC_Fornecedor": "123",
    "PRC_Linha": "4561",
    "PRC_CodComercial": "PROD002COM",
    "PRC_CodFabricante": "FAB002ABC",
    "Unidade": "PC",
    "ValorUnitario": "250.00",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `Codigo` <string> - Código principal do produto/item.
- `Descricao` <string> - Descrição geral do produto/item.
- `FOR_Nome` <string> - Nome do fornecedor associado.
- `LSI_Descricao` <string> - Descrição da linha do produto.
- `PRC_Descricao` <string> - Descrição específica do produto (pode ser igual a `Descricao`).
- `PRC_Fornecedor` <string> - Código do fornecedor do produto.
- `PRC_Linha` <string> - Código da linha do produto.
- `PRC_CodComercial` <string> - Código comercial do produto.
- `PRC_CodFabricante` <string> - Código do produto no fabricante.
- `Unidade` <string> - Unidade de medida do produto (ex: "UN", "PC", "M2").
- `ValorUnitario` <string> - Valor unitário do produto (string representando decimal).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Tipos de AT
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/TipoAT`  
**Descrição:** Retorna tipos de AT disponíveis.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009"
}
```

**Response (Exemplo):**
```json
[
  {
    "Codigo": "4",
    "Descricao": "AT SEM CUSTO",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "Codigo": "5",
    "Descricao": "AT COM CUSTO",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "Codigo": "15",
    "Descricao": "AT VENDA CLIENTE",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `Codigo` <string> - Código do Tipo de AT.
- `Descricao` <string> - Descrição do Tipo de AT.
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Usuários Responsáveis
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/UsuarioResponsavel`  
**Descrição:** Lista responsáveis disponíveis.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja
- `TipoResponsavel` <string> - Tipo do responsável

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "TipoResponsavel": "1"
}
```

**Response (Exemplo):**
```json
[
  {
    "TM1_CodIdentity": "USER_1",
    "TM1_NomeCompleto": "Silvio Santarosa",
    "TM1_Codigo": "1",
    "TM1_Emp": "116",
    "TM1_Cargo": "10",
    "TM1_Equipe": "1",
    "TM1_Desativado": "0",
    "TM1_DescricaoCargo": "VENDEDOR",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "TM1_CodIdentity": "CARGO_5",
    "TM1_NomeCompleto": "MONTADOR",
    "TM1_Codigo": "5", 
    "TM1_Emp": "116",
    "TM1_Cargo": "5", 
    "TM1_Equipe": "0",
    "TM1_Desativado": "0",
    "TM1_DescricaoCargo": "MONTADOR",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "TM1_CodIdentity": "EQUIPE_3",
    "TM1_NomeCompleto": "EQUIPE AZUL",
    "TM1_Codigo": "3",
    "TM1_Emp": "116",
    "TM1_Cargo": "0", 
    "TM1_Equipe": "3",
    "TM1_Desativado": "0",
    "TM1_DescricaoCargo": "EQUIPE DE MONTAGEM",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `TM1_CodIdentity` <string> - Identificador único do responsável na lista (pode ser uma combinação de tipo e código).
- `TM1_NomeCompleto` <string> - Nome completo do usuário, cargo ou equipe (pode conter formatação HTML se vier da SP com status).
- `TM1_Codigo` <string> - Código do usuário, cargo ou equipe.
- `TM1_Emp` <string> - Código da empresa.
- `TM1_Cargo` <string> - Código do cargo (se aplicável).
- `TM1_Equipe` <string> - Código da equipe (se aplicável).
- `TM1_Desativado` <string> - Indica se o responsável está desativado ("1" para desativado, "0" para ativo).
- `TM1_DescricaoCargo` <string> - Descrição do cargo (pode ser o nome da equipe ou "Empresa", "Transporte" etc., dependendo do tipo de responsável).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Salvar Nova Ocorrência
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/SalvaNovaOcorrencia`  
**Descrição:** Registra uma nova ocorrência de montagem ou AT.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja
- `Cliente` <string> - Código do cliente
- `Contrato` <string> - Número do contrato
- `Ambiente` <string> - Código do ambiente
- `TipoOcorrencia` <int32> - Tipo da ocorrência (1=Serviço, 2=Produto)
- `Fornecedor` <string, ==opcional==> - Código do fornecedor
- `Linha` <string, ==opcional==> - Código da linha
- `Produto` <string, ==opcional==> - Código do produto
- `ProdutoDescricao` <string, ==opcional==> - Descrição do produto
- `Quantidade` <int32> - Quantidade
- `TipoAT` <int32, ==opcional==> - Tipo de AT
- `Altura` <decimal, ==opcional==> - Altura do produto
- `Largura` <decimal, ==opcional==> - Largura do produto
- `Profundidade` <decimal, ==opcional==> - Profundidade do produto
- `ValorUnitario` <decimal, ==opcional==> - Valor unitário
- `Observacao` <string, ==opcional==> - Observações
- `UsuarioResponsavel` <int32> - Código do usuário responsável

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "Cliente": "12345",
  "Contrato": "67890",
  "Ambiente": "AA",
  "TipoOcorrencia": 1,
  "Observacao": "Instalação de móveis",
  "UsuarioResponsavel": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao salvar ocorrência: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Salvar Observação
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/SalvaObservacao`  
**Descrição:** Adiciona uma observação a uma ocorrência.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Usuario` <string> - Código do usuário
- `Loja` <string> - Código da loja
- `Cliente` <string> - Código do cliente
- `Contrato` <string> - Número do contrato
- `Ambiente` <string> - Código do ambiente
- `IdOcorrencia` <string> - ID da ocorrência
- `Observacao` <string> - Texto da observação

**Exemplo:**
```json
{
  "Emp": "116",
  "Usuario": "1",
  "Loja": "2009",
  "Cliente": "12345",
  "Contrato": "67890",
  "Ambiente": "AA",
  "IdOcorrencia": "123",
  "Observacao": "Serviço concluído com sucesso"
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao salvar observação: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Finalizar Ocorrência
**Método:** POST  
**URL:** `/api/GerenciamentoMontagem/FinalizaOcorrencia`  
**Descrição:** Finaliza uma ocorrência de montagem ou AT.

**Parâmetros:**
- `Emp` <string> - Código da empresa
- `Loja` <string> - Código da loja
- `Usuario` <string> - Código do usuário
- `Cliente` <string> - Código do cliente
- `Contrato` <string> - Número do contrato
- `Ambiente` <string> - Código do ambiente
- `codOcorrencia` <string> - ID da ocorrência
- `ComPendencia` <boolean> - Se finaliza com pendência
- `Observacao` <string> - Observação de finalização

**Exemplo:**
```json
{
  "Emp": "116",
  "Loja": "2009",
  "Usuario": "1",
  "Cliente": "12345",
  "Contrato": "67890",
  "Ambiente": "AA",
  "codOcorrencia": "123",
  "ComPendencia": false,
  "Observacao": "Montagem finalizada"
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao finalizar ocorrência: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

:::warning Observações
### Gerenciamento de Montagem
- Agrupamento de ocorrências é feito por ambiente
- Possibilidade de anexar fotos durante o processo
- Geração de ficha com histórico completo

### AT de Serviço
- Valores de serviço podem ser fixos ou variáveis
- Responsável pode ser usuário, cargo ou equipe
- Permite finalização parcial com pendências

### AT de Produto
- Para fabricantes integrados, pedido é gerado automaticamente
- AT com custo permite compra parcial de itens
- AT sem custo tem custos atribuídos ao fabricante
- AT com custo (prioritária) permite compra de itens completos com acréscimo de 50%
- Dimensões e valores são obrigatórios para alguns tipos de AT
:::

# Arquivos de Projetos

:::info Descrição
Sistema integrado para gerenciamento de arquivos relacionados aos projetos dos clientes, com armazenamento em nuvem (Azure Storage). Permite visualizar, fazer upload e gerenciar arquivos por cliente, contrato e ambiente.
:::

## Fluxo no APP
1. Acessar menu de `Arquivos de Projetos`
2. Visualizar lista de clientes com projetos
   - Filtros disponíveis por período e busca por nome
   - Indicadores visuais de arquivos por pasta
3. Ao selecionar um cliente:
   - Ver ambientes do projeto
   - Acessar arquivos por ambiente
   - Upload de novos arquivos
   - Visualização de miniaturas para imagens
   - Download de arquivos

## Endpoints Utilizados

### Listar Clientes com Projetos
**Método:** POST  
**URL:** `/api/ArquivosClienteProjeto`  
**Descrição:** Lista os clientes com projetos e arquivos.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `EmpPadrao` <int32> - Código da empresa padrão
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `Busca` <string, ==opcional==> - Termo para filtrar resultados
- `Campo` <string, ==opcional==> - Campo para filtrar a busca

**Exemplo:**
```json
{
  "Emp": 116,
  "EmpPadrao": 116,
  "Usuario": 1,
  "Loja": 2009,
  "Busca": "Cliente A",
  "Campo": "CLI_Nome"
}
```

**Response (Exemplo):**
```json
[
  {
    "CLI_Codigo": 12345,
    "CLI_Nome": "Cliente A Soluções Digitais",
    "CLI_Loja": 2009,
    "UltimoContrato": "200912345",
    "QtdProjetosComArquivos": 3,
    "TotalProjetosCliente": 5,
    "DataUltimaModificacaoArquivo": "2024-07-29T10:30:00",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "CLI_Codigo": 67890,
    "CLI_Nome": "Cliente A B C Comércio",
    "CLI_Loja": 2009,
    "UltimoContrato": "200967890",
    "QtdProjetosComArquivos": 0,
    "TotalProjetosCliente": 1,
    "DataUltimaModificacaoArquivo": null,
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `CLI_Codigo` <int> - Código do cliente.
- `CLI_Nome` <string> - Nome/razão social do cliente.
- `CLI_Loja` <int> - Código da loja do cliente.
- `UltimoContrato` <string> - Número do último contrato ou de um contrato de referência do cliente.
- `QtdProjetosComArquivos` <int> - Quantidade de projetos/ambientes do cliente que possuem arquivos associados.
- `TotalProjetosCliente` <int> - Quantidade total de projetos/ambientes do cliente.
- `DataUltimaModificacaoArquivo` <string> - Data e hora da última modificação em qualquer arquivo do cliente (formato ISO 8601, opcional).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Ambientes com Arquivos
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemArquivosAmbientes`  
**Descrição:** Retorna os ambientes do projeto que contêm arquivos.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `Cliente` <string> - Código do cliente
- `Contrato` <string> - Número do contrato

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009,
  "Cliente": "12345",
  "Contrato": "67890"
}
```

**Response (Exemplo):**
```json
[
  {
    "PRO_Opcao": "AA",
    "PRO_Ambiente": "COZINHA PLANEJADA",
    "PRO_Contrato": "67890",
    "QtdArquivosNaPasta": 5,
    "CaminhoPasta": "Projetos/Cozinha",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "PRO_Opcao": "AB",
    "PRO_Ambiente": "SALA DE TV",
    "PRO_Contrato": "67890",
    "QtdArquivosNaPasta": 0,
    "CaminhoPasta": "Projetos/SalaDeTV",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "PRO_Opcao": "AC",
    "PRO_Ambiente": "QUARTO CASAL",
    "PRO_Contrato": "67890",
    "QtdArquivosNaPasta": 12,
    "CaminhoPasta": "Projetos/QuartoCasal",
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `PRO_Opcao` <string> - Código do ambiente/opção do projeto (ex: "AA", "AB").
- `PRO_Ambiente` <string> - Descrição do ambiente (ex: "COZINHA", "SALA").
- `PRO_Contrato` <string> - Número do contrato ao qual o ambiente pertence.
- `QtdArquivosNaPasta` <int> - Quantidade de arquivos encontrados neste ambiente para a `Pasta` (módulo) especificada na requisição.
- `CaminhoPasta` <string> - Descrição ou caminho da pasta/módulo onde os arquivos foram contados (informativo, pode ser derivado do parâmetro `Pasta` da requisição).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Listar Arquivos do Ambiente
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemArquivos`  
**Descrição:** Retorna a lista de arquivos do ambiente.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja
- `Cliente` <string> - Código do cliente
- `Ambientes` <string> - Códigos dos ambientes

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009,
  "Cliente": "12345",
  "Ambientes": "AA"
}
```

**Response (Exemplo):**
```json
[
  {
    "ARQ_GUID": "guid-arquivo-1",
    "ARQ_Arquivo_Nome": "Planta Baixa Cozinha",
    "ARQ_Arquivo_Extencao": ".pdf",
    "ARQ_DataCadastro": "2024-07-28T14:00:00",
    "ARQ_Arquivo_DataModificado": "2024-07-29T09:15:00",
    "USU_Nome": "Silvio Santarosa",
    "ARQ_Modulo": "6",
    "ARQ_Categoria": "1",
    "ARQ_URL": "https://url.do.azure.storage/container/guid-arquivo-1.pdf?token=xyz",
    "MiniaturaURL": "https://url.do.azure.storage/container/thumbnails/guid-arquivo-1.jpg?token=abc",
    "TamanhoBytes": 1024576,
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  },
  {
    "ARQ_GUID": "guid-arquivo-2",
    "ARQ_Arquivo_Nome": "Render Final Sala",
    "ARQ_Arquivo_Extencao": ".jpg",
    "ARQ_DataCadastro": "2024-07-27T10:00:00",
    "ARQ_Arquivo_DataModificado": "2024-07-27T10:05:00",
    "USU_Nome": "Ana Lima",
    "ARQ_Modulo": "6",
    "ARQ_Categoria": "2",
    "ARQ_URL": "https://url.do.azure.storage/container/guid-arquivo-2.jpg?token=123",
    "MiniaturaURL": "https://url.do.azure.storage/container/thumbnails/guid-arquivo-2.jpg?token=456",
    "TamanhoBytes": 204800,
    "ERR_Codigo": 0,
    "ERR_Mensagem": ""
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `ARQ_GUID` <string> - Identificador único global do arquivo.
- `ARQ_Arquivo_Nome` <string> - Nome do arquivo (sem extensão).
- `ARQ_Arquivo_Extencao` <string> - Extensão do arquivo (ex: ".pdf", ".jpg").
- `ARQ_DataCadastro` <string> - Data e hora do cadastro do arquivo (formato ISO 8601).
- `ARQ_Arquivo_DataModificado` <string> - Data e hora da última modificação do arquivo (formato ISO 8601).
- `USU_Nome` <string> - Nome do usuário que cadastrou/modificou o arquivo.
- `ARQ_Modulo` <string> - Código do módulo/pasta onde o arquivo está (relacionado ao parâmetro `Pasta` da requisição).
- `ARQ_Categoria` <string> - Código da categoria do arquivo.
- `ARQ_URL` <string> - URL para download/visualização do arquivo no Azure Storage (gerada pela API com token de acesso temporário).
- `MiniaturaURL` <string> - URL para a miniatura da imagem, se aplicável (gerada pela API com token, opcional).
- `TamanhoBytes` <int> - Tamanho do arquivo em bytes (obtido da tabela `Advanced_Arquivos` ou do Azure).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Obter Token Azure
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemGetTokenAzure`  
**Descrição:** Obtém token para operações no Azure Storage.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Loja` <int32> - Código da loja

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Loja": 2009
}
```

**Response (Exemplo):**
```json
{
  "AzureStorageToken": "sv=2021-06-08&ss=b&srt=sco&sp=rwdlacup&se=2024-07-30T12:00:00Z&st=2024-07-30T10:00:00Z&spr=https&sig=aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890AbCdEfG%3D",
  "AzureStorageBaseUrl": "https://seustorageaccount.blob.core.windows.net/seucontainer/",
  "TokenExpiry": "2024-07-30T12:00:00Z",
  "ERR_Codigo": 0,
  "ERR_Mensagem": ""
}
```

**Propriedades da Resposta:**
- `AzureStorageToken` <string> - O token SAS (Shared Access Signature) para acesso ao Azure Storage.
- `AzureStorageBaseUrl` <string> - A URL base do contêiner no Azure Storage onde os arquivos estão localizados.
- `TokenExpiry` <string> - Data e hora de expiração do token (formato ISO 8601 UTC).
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).

### Salvar Arquivo
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemSaveArquivoAzure`  
**Descrição:** Salva novo arquivo no Azure Storage.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário
- `Guid` <string> - Identificador único do arquivo
- `Modulo` <string> - Código do módulo
- `Ref1` <string> - Referência 1 (geralmente código do cliente)
- `Ref2` <string> - Referência 2 (geralmente código do ambiente)
- `Tamanho` <int32> - Tamanho do arquivo em bytes
- `Extencao` <string> - Extensão do arquivo
- `Descricao` <string, ==opcional==> - Descrição do arquivo
- `Categoria` <string, ==opcional==> - Categoria do arquivo
- `Origem` <string, ==opcional==> - Origem do arquivo
- `NomeArquivo` <string, ==opcional==> - Nome original do arquivo

**Exemplo:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "Guid": "novo-guid",
  "Modulo": "6",
  "Ref1": "12345",
  "Ref2": "AA",
  "Tamanho": 1024,
  "Extencao": ".jpg",
  "Descricao": "Foto do ambiente",
  "NomeArquivo": "foto_ambiente.jpg"
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Arquivo salvo com sucesso.",
  "ARQ_GUID": "novo-guid"
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao salvar arquivo: [descrição do erro]",
  "ARQ_GUID": null
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.
- `ARQ_GUID` <string> - O GUID do arquivo que foi salvo (em caso de sucesso, nulo em caso de erro).

### Excluir Arquivo
**Método:** POST  
**URL:** `/api/GerenciamentoMontagemDeleteArquivoAzure`  
**Descrição:** Remove arquivo do Azure Storage.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário
- `Guid` <string> - Identificador único do arquivo

**Exemplo:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "Guid": "arquivo-guid"
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Arquivo excluído com sucesso."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao excluir arquivo: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, outros valores = erro).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

:::warning Observações
- Arquivos são armazenados no Azure Storage em containers específicos por empresa/loja
- Sistema gera automaticamente miniaturas para arquivos de imagem
- Suporte para diversos tipos de arquivo:
  - Imagens: JPG, PNG, JPEG
  - Documentos: PDF, DOC, DOCX, XLS, XLSX
  - Projetos: PROMOB, KIT
  - Compactados: ZIP, RAR, 7Z
- URLs dos arquivos são geradas com token de acesso temporário
- Organização hierárquica: Empresa > Loja > Cliente > Ambiente
- Integração com módulo de Gerenciamento de Montagem/AT para anexar fotos às ocorrências
:::

# Gerenciar Usuários

:::info Descrição
Sistema para gerenciamento de usuários do aplicativo, permitindo visualizar, bloquear/desbloquear usuários e resetar senhas. O controle é feito por loja e inclui informações como cargo, status e permissões.
:::

## Fluxo no APP
1. Acessar o menu `Gerenciar Usuários`
2. Selecionar a loja desejada
3. Filtrar usuários por:
   - Campo de busca (personalizado)
   - Texto da busca
4. Ao selecionar um usuário, é possível:
   - Visualizar detalhes (nome, cargo, loja)
   - Bloquear/Desbloquear acesso
   - Resetar senha

---

## Endpoints Utilizados

### Listar Usuários
**Método:** POST  
**URL:** `/api/Users`  
**Descrição:** Lista os usuários cadastrados.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `Usuario` <int32> - Código do usuário
- `Status` <int32> - Status (-1=Todos, 0=Ativos, 1=Inativos)
- `Campo` <string, ==opcional==> - Campo para filtrar a busca
- `Busca` <string, ==opcional==> - Texto para busca

**Exemplo:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "Usuario": 1,
  "Status": -1,
  "Campo": "",
  "Busca": ""
}
```

**Response (Exemplo):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 1,
    "Nome": "Silvio Santarosa",
    "Login": "santarosa",
    "Cargo": "GERENTE COMERCIAL",
    "Loja": "Matriz SP",
    "Status": "Ativo",
    "Email": "s.santarosa@email.com",
    "Bloqueado": false
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 287,
    "Nome": "Danielle Silva",
    "Login": "dani",
    "Cargo": "ANALISTA FINANCEIRO",
    "Loja": "Filial RJ",
    "Status": "Ativo",
    "Email": "dani.silva@email.com",
    "Bloqueado": true
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 500,
    "Nome": "Usuario Inativo Teste",
    "Login": "inativo.teste",
    "Cargo": "VENDEDOR",
    "Loja": "Matriz SP",
    "Status": "Inativo",
    "Email": "inativo@email.com",
    "Bloqueado": false
  }
]
```

**Propriedades da Resposta (por item da lista, baseado na Model Users.vb):**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).
- `Codigo` <int> - Código interno do usuário.
- `Nome` <string> - Nome completo do usuário.
- `Login` <string> - Login de acesso do usuário.
- `Cargo` <string> - Descrição do cargo do usuário.
- `Loja` <string> - Nome/apelido da loja à qual o usuário está vinculado.
- `Status` <string> - Descrição do status do usuário (ex: "Ativo", "Inativo").
- `Email` <string> - Endereço de e-mail do usuário.
- `Bloqueado` <boolean> - Indica se o usuário está bloqueado (`true`) ou não (`false`).

### Bloquear Usuário
**Método:** POST  
**URL:** `/api/Users/Bloquear`  
**Descrição:** Bloqueia o acesso do usuário.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CodigoUsuario` <int32> - Código do usuário a ser bloqueado

**Exemplo:**
```json
{
  "Emp": 116,
  "CodigoUsuario": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Usuário bloqueado com sucesso."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao bloquear usuário: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Desbloquear Usuário
**Método:** POST  
**URL:** `/api/Users/Desbloquear`  
**Descrição:** Desbloqueia o acesso do usuário.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CodigoUsuario` <int32> - Código do usuário a ser desbloqueado

**Exemplo:**
```json
{
  "Emp": 116,
  "CodigoUsuario": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Usuário desbloqueado com sucesso."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao desbloquear usuário: [descrição do erro]"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Resetar Senha
**Método:** POST  
**URL:** `/api/Users/ResetarSenha`  
**Descrição:** Reseta a senha do usuário para o padrão.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Loja` <int32> - Código da loja
- `CodigoUsuario` <int32> - Código do usuário

**Exemplo:**
```json
{
  "Emp": 116,
  "Loja": 2009,
  "CodigoUsuario": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Senha resetada com sucesso.",
  "NovaSenha": "aB1!cDe2"
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao resetar senha: [descrição do erro]",
  "NovaSenha": null
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.
- `NovaSenha` <string> - A nova senha gerada para o usuário (em caso de sucesso, nulo em caso de erro). Esta senha deve ser informada ao usuário.

### Verificar Permissões
**Método:** POST  
**URL:** `/api/Permissao`  
**Descrição:** Verifica as permissões do usuário para construir o menu.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Versao` <string> - Versão do aplicativo

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Versao": "0.2"
}
```

**Response (Exemplo):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 1, 
    "Descricao": "Liberar Pontuação", 
    "Icone": "icon_liberar_pontuacao", 
    "Ordem": 1, 
    "Status": true, 
    "IdentificadorOriginal": "liLiberacoes" 
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 2,
    "Descricao": "Autorização Deb/Cred",
    "Icone": "icon_autorizacao_de_cred",
    "Ordem": 2,
    "Status": true,
    "IdentificadorOriginal": "liAutorizacoes"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "Codigo": 7,
    "Descricao": "Limpar Senha", 
    "Icone": "icon_reset_senha",
    "Ordem": 7,
    "Status": true,
    "IdentificadorOriginal": "btnResetSenha"
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).
- `Codigo` <int> - Código numérico da permissão (pode ser derivado da `Seq` da SP ou ser um ID de permissão interno).
- `Descricao` <string> - Descrição textual da permissão/item de menu.
- `Icone` <string> - Nome/identificador do ícone para a permissão (pode ser nulo/vazio se não definido).
- `Ordem` <int> - Ordem de exibição da permissão (derivado da `Seq` da SP).
- `Status` <boolean> - Sempre `true` para permissões retornadas, indicando que o usuário tem acesso.
- `IdentificadorOriginal` <string> - O campo `Identificador` original retornado pela Stored Procedure (ex: "liLiberacoes", "btnResetSenha").

:::warning Observações
- O bloqueio/desbloqueio de usuários requer permissão específica
- O reset de senha requer permissão específica
- Usuários bloqueados são identificados com ícone de cadeado
- Após bloqueio/desbloqueio, a lista é atualizada automaticamente
- A senha padrão após reset é definida no sistema
- As permissões são verificadas ao carregar o menu principal
- O sistema mantém histórico de alterações de status dos usuários
:::

# Comunicação Interna

:::info Descrição
Sistema completo de mensagens corporativas que permite a troca de comunicações entre usuários, cargos e equipes. Inclui recursos de organização por pastas, acompanhamento de mensagens, respostas e busca avançada.
:::

## Fluxo no APP
1. Acessar o menu `Comunicação Interna`
2. Visualizar mensagens organizadas por pastas:
   - Entrada
   - Enviadas
   - Importantes
   - Arquivadas
3. Ao selecionar uma mensagem e/ou (arrastar para a esquerda):
   - Ler conteúdo completo
   - Marcar como lida/não lida
   - Sinalizar para acompanhamento
   - Mover para outra pasta
   - Responder
4. Para nova mensagem:
   - Selecionar destinatários (usuários, cargos ou equipes)
   - Definir assunto e conteúdo
   - Enviar

---

## Endpoints Utilizados

### Listar Mensagens
**Método:** POST  
**URL:** `/api/ComunicacaoInterna`  
**Descrição:** Lista as mensagens de uma pasta.

**Parâmetros:**
- `Pasta` <int32> - Tipo da pasta (-1=Todas, 100=Entrada, 300=Enviadas, 400=Acompanhamento, 500=Lixeira)
- `Usuario` <string> - ID do usuário
- `Posicao` <int32> - Início da paginação
- `RegPorPagina` <int32> - Quantidade de registros por página

**Exemplo:**
```json
{
  "Pasta": -1,
  "Usuario": "160200900001",
  "Posicao": 0,
  "RegPorPagina": 20
}
```

**Response (Exemplo de um item da lista):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "_Seq": "1",
    "CAB_ID": 7313221,
    "USU_NomeCompletoDe": "Silvio Santarosa ",
    "CON_Assunto": "Exportação de informações do sistema - Usuário: Silvio",
    "CON_Conteudo": null,
    "CAB_DataEnviado": "14/05/2025 17:29:34",
    "Usuarios": "Silvio Santarosa ;",
    "CAB_Acompanhar": 0,
    "CAB_Pasta": 100,
    "CAB_DataLida": "",
    "CAB_Pai": "7313220",
    "CAB_Conteudo": null,
    "TipoCampoBusca": null,
    "TitHeader": null
  }
]
```

**Propriedades da Resposta (por item da lista):**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).
- `_Seq` <string> - Sequencial ou identificador de ordenação na lista.
- `CAB_ID` <int> - ID único do cabeçalho da mensagem.
- `USU_NomeCompletoDe` <string> - Nome completo do usuário remetente.
- `CON_Assunto` <string> - Assunto da mensagem.
- `CON_Conteudo` <string> - Conteúdo HTML principal da mensagem (pode ser `null`).
- `CAB_DataEnviado` <string> - Data e hora do envio da mensagem (formato "dd/MM/yyyy HH:mm:ss").
- `Usuarios` <string> - Lista de destinatários (nomes separados por ponto e vírgula, ex: "Nome1 ; Nome2 ;").
- `CAB_Acompanhar` <int> - Indica se a mensagem está marcada para acompanhamento (0 = Não, 1 = Sim).
- `CAB_Pasta` <int> - Código numérico da pasta onde a mensagem se encontra (ex: 100 para Caixa de Entrada, 300 para Enviadas, etc.).
- `CAB_DataLida` <string> - Data e hora em que a mensagem foi lida pelo usuário atual (formato "dd/MM/yyyy HH:mm:ss"). String vazia (`""`) se não lida.
- `CAB_Pai` <string> - ID da mensagem original à qual esta é uma resposta. Pode ser uma string numérica ou `null` se não for uma resposta.
- `CAB_Conteudo` <string> - Um conteúdo secundário ou preview relacionado ao cabeçalho da mensagem (pode ser `null`). Distinto de `CON_Conteudo`.
- `TipoCampoBusca` <string> - Informa qual campo foi utilizado caso a mensagem tenha sido encontrada através de uma busca (ex: "Assunto", "Remetente"). Pode ser `null`.
- `TitHeader` <string> - Título sugerido para exibição no cabeçalho da interface ao visualizar os detalhes da mensagem. Pode ser `null`.

### Detalhes da Mensagem
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/Item`  
**Descrição:** Retorna o conteúdo de uma mensagem específica.

**Parâmetros:**
- `CAB_ID` <int32> - ID da mensagem

**Exemplo:**
```json
{
  "CAB_ID": 12345
}
```

### Buscar Mensagens
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/Busca`  
**Descrição:** Busca mensagens por conteúdo.

**Parâmetros:**
- `Pasta` <int32> - Tipo da pasta
- `Usuario` <string> - Código do usuário
- `Criterio` <string> - Texto para busca

**Exemplo:**
```json
{
  "Pasta": -1,
  "Usuario": "160200900001",
  "Criterio": "texto para busca"
}
```

**Response (Exemplo de um item da lista - similar a Listar Mensagens):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "CAB_ID": 12380,
    "CAB_Tipo": 1,
    "CON_Assunto": "Urgente: Revisão da Proposta Cliente X",
    "CON_DataCadastro": "28/07/2024 15:00:00",
    "CAB_Usuario": "102009000001", 
    "USU_Nome": "Silvio Santarosa", 
    "CIC_Lida": false,
    "CAB_Acompanhar": false,
    "CAB_Prioridade": 3, // Ex: 3=Urgente
    "TotalDestinatarios": 1,
    "Destinatarios": "Danielle Silva",
    "TemAnexo": true,
    "Pasta": "Caixa de Entrada",
    "Icone": "email_urgent",
    "Cor": "#FFDAB9",
    "Respondida": false,
    "Encaminhada": false,
    "CAB_IdResposta": null
  }
  // ... mais mensagens encontradas na busca
]
```

**Propriedades da Resposta (por item da lista, baseado na Model ComunicacaoInterna.vb - igual a Listar Mensagens):**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso).
- `CAB_ID` <int> - ID único da mensagem (cabeçalho).
- `CAB_Tipo` <int> - Tipo da mensagem/documento.
- `CON_Assunto` <string> - Assunto da mensagem.
- `CON_DataCadastro` <string> - Data e hora do cadastro/envio da mensagem (formato "dd/MM/yyyy HH:mm:ss").
- `CAB_Usuario` <string> - ID do usuário remetente original.
- `USU_Nome` <string> - Nome do usuário remetente original.
- `CIC_Lida` <boolean> - Indica se a mensagem foi lida pelo usuário atual.
- `CAB_Acompanhar` <boolean> - Indica se a mensagem está marcada para acompanhamento.
- `CAB_Prioridade` <int> - Nível de prioridade da mensagem.
- `TotalDestinatarios` <int> - Número total de destinatários da mensagem.
- `Destinatarios` <string> - String com os nomes dos primeiros destinatários.
- `TemAnexo` <boolean> - Indica se a mensagem possui anexos.
- `Pasta` <string> - Nome da pasta onde a mensagem está.
- `Icone` <string> - Identificador do ícone para a mensagem.
- `Cor` <string> - Cor associada à mensagem.
- `Respondida` <boolean> - Indica se esta mensagem foi respondida.
- `Encaminhada` <boolean> - Indica se esta mensagem foi encaminhada.
- `CAB_IdResposta` <int> - ID da mensagem original à qual esta é uma resposta.

### Marcar Acompanhamento
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/MudaAcompanhar`  
**Descrição:** Marca/desmarca mensagem para acompanhamento.

**Parâmetros:**
- `CAB_ID` <int32> - ID da mensagem
- `CAB_Acompanhar` <int32> - Status do acompanhamento (0=Não, 1=Sim)

**Exemplo:**
```json
{
  "CAB_ID": 12345,
  "CAB_Acompanhar": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Status de acompanhamento atualizado."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao atualizar acompanhamento."
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Mover Mensagem
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/MudaPasta`  
**Descrição:** Move mensagem para outra pasta.

**Parâmetros:**
- `CAB_ID` <int32> - ID da mensagem
- `CAB_Pasta` <int32> - Código da pasta destino
- `Lida` <int32> - Status de leitura

**Exemplo:**
```json
{
  "CAB_ID": 12345,
  "CAB_Pasta": 500,
  "Lida": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Mensagem movida com sucesso."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao mover mensagem."
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Marcar Leitura
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/MudaLida`  
**Descrição:** Marca/desmarca mensagem como lida.

**Parâmetros:**
- `CAB_ID` <int32> - ID da mensagem
- `Modo` <int32> - Status de leitura (0=Não lida, 1=Lida)

**Exemplo:**
```json
{
  "CAB_ID": 12345,
  "Modo": 1
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Status de leitura atualizado."
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao marcar leitura."
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.

### Nova Mensagem
**Método:** POST  
**URL:** `/api/ComunicacaoInterna/NovaCI`  
**Descrição:** Envia nova mensagem.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `CAB_IdResposta` <int32> - ID da mensagem respondida (-1 para nova)
- `CAB_Usuario` <string> - Código do usuário remetente
- `CAB_NaoResponder` <int32> - Permite resposta (0=Sim, 1=Não)
- `CAB_Tipo` <int32> - Tipo da mensagem
- `CAB_Pasta` <int32> - Pasta inicial
- `CAB_Acompanhar` <int32> - Marca para acompanhamento
- `CAB_Prioridade` <int32> - Nível de prioridade
- `CON_Assunto` <string> - Assunto da mensagem
- `CON_Conteudo` <string> - Conteúdo da mensagem
- `CON_IP` <string, ==opcional==> - IP do remetente
- `Participantes` <string, ==opcional==> - Lista de usuários (separados por ;)
- `Cargos` <string, ==opcional==> - Lista de cargos (separados por ;)
- `CargosEquipe` <string, ==opcional==> - Lista de equipes (separados por ;)

**Exemplo:**
```json
{
  "Emp": 116,
  "CAB_IdResposta": -1,
  "CAB_Usuario": "160200900001",
  "CAB_NaoResponder": 0,
  "CAB_Tipo": 1,
  "CAB_Pasta": 100,
  "CAB_Acompanhar": 0,
  "CAB_Prioridade": 1,
  "CON_Assunto": "Assunto da mensagem",
  "CON_Conteudo": "Conteúdo da mensagem",
  "CON_IP": "",
  "Participantes": "1;2;3;",
  "Cargos": "10;20;",
  "CargosEquipe": "100;200;"
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "Mensagem enviada com sucesso.",
  "CAB_ID": 12346 // ID da nova mensagem criada
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao enviar mensagem: [descrição do erro]",
  "CAB_ID": null
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro ou sucesso.
- `CAB_ID` <int> - ID da nova mensagem (cabeçalho principal) criada (em caso de sucesso, nulo em caso de erro).

### Buscar Usuários
**Método:** POST  
**URL:** `/api/GetBuscaUsuarioCI`  
**Descrição:** Busca usuários para envio de mensagem.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `UserCI` <string> - Código do usuário
- `Busca` <string> - Termo para busca

**Exemplo:**
```json
{
  "Emp": 116,
  "UserCI": "160200900001",
  "Busca": "nome do usuário"
}
```

:::warning Observações
- A busca de mensagens requer no mínimo 3 caracteres
- Mensagens podem ser enviadas para múltiplos destinatários
- Destinatários podem ser usuários, cargos ou equipes
- Sistema mantém histórico completo de mensagens
- Mensagens não lidas são destacadas visualmente
- Respostas mantêm referência à mensagem original
- Conteúdo suporta formatação HTML básica
- Anexos não são suportados na versão atual
:::

# Registro de Visita

:::info Descrição
Sistema para registro e controle de visitas técnicas aos clientes, permitindo check-in e check-out com geolocalização. Integrado com os módulos de montagem e assistência técnica, possibilita o acompanhamento em tempo real das visitas realizadas.
:::

## Fluxo no APP
1. Acessar o menu `Registro de Visita`
2. Visualizar lista de clientes agendados
   - Filtrar por nome do cliente
   - Ver status da visita (pendente, em andamento, finalizada)
3. Ao selecionar um cliente:
   - Realizar check-in
     - Registra localização atual
     - Registra data/hora
     - Adiciona observações
   - Durante a visita:
     - Registrar ocorrências
     - Adicionar observações
   - Realizar check-out
     - Registra localização de saída
     - Registra data/hora final
     - Adiciona observações finais

---

## Endpoints Utilizados

### Listar Visitas
**Método:** POST  
**URL:** `/api/visitasLista`  
**Descrição:** Lista as visitas agendadas.

**Parâmetros:**
- `Emp` <int32> - Código da empresa
- `Usuario` <int32> - Código do usuário
- `Busca` <string, ==opcional==> - Termo para filtrar resultados

**Exemplo:**
```json
{
  "Emp": 116,
  "Usuario": 1,
  "Busca": ""
}
```

**Response (Exemplo):**
```json
[
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "PMT_Emp": 116,
    "PMT_Loja": 2009,
    "PMT_Cliente": 12345,
    "CLI_Nome": "Nome Completo do Cliente Exemplo",
    "PMT_Contrato": "200901234",
    "PMT_TipoMontagem": 1,
    "Ambientes": "AA-AB-AC [Montagem]",
    "MIN_PMT_MontagemI": "2024-08-01T09:00:00",
    "MAX_PMT_MontagemT": "2024-08-05T18:00:00",
    "REV_ID": 789,
    "REV_CheckinData": "2024-08-02T10:00:00.123", // Exemplo com milissegundos
    "REV_CheckOutData": "0001-01-01T00:00:00",    // Visita em aberto
    "USU_Nome": "MONTADOR - Fulano de Tal",
    "StatusVisita": 1,
    "StatusVisitaDescricao": "Iniciado em 02/08/2024 10:00"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "PMT_Emp": 116,
    "PMT_Loja": 2009,
    "PMT_Cliente": 67890,
    "CLI_Nome": "Outro Cliente Teste",
    "PMT_Contrato": "200967890",
    "PMT_TipoMontagem": 10,
    "Ambientes": "BA [Retorno]",
    "MIN_PMT_MontagemI": "2024-07-20T08:00:00",
    "MAX_PMT_MontagemT": "2024-07-20T17:00:00",
    "REV_ID": 790,
    "REV_CheckinData": "2024-07-20T08:05:00.00",
    "REV_CheckOutData": "2024-07-20T16:55:00.456", // Visita finalizada
    "USU_Nome": "MONTADOR - Ciclano Alves",
    "StatusVisita": 0,
    "StatusVisitaDescricao": "Última visita em 20/07/2024 16:55"
  },
  {
    "ERR_Codigo": 0,
    "ERR_Mensagem": "",
    "PMT_Emp": 116,
    "PMT_Loja": 2009,
    "PMT_Cliente": 11223,
    "CLI_Nome": "Cliente Sem Visita Registrada",
    "PMT_Contrato": "200911223",
    "PMT_TipoMontagem": 1,
    "Ambientes": "DA-DB",
    "MIN_PMT_MontagemI": "2024-08-10T00:00:00",
    "MAX_PMT_MontagemT": "2024-08-12T00:00:00",
    "REV_ID": null, // Sem visita registrada
    "REV_CheckinData": null,
    "REV_CheckOutData": null,
    "USU_Nome": "Sem visita",
    "StatusVisita": 0,
    "StatusVisitaDescricao": "Sem visita"
  }
]
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso).
- `ERR_Mensagem` <string> - Mensagem de erro (vazio se sucesso, ou "Nenhum registro encontrado").
- `PMT_Emp` <int> - Código da empresa.
- `PMT_Loja` <int> - Código da loja.
- `PMT_Cliente` <int> - Código do cliente.
- `CLI_Nome` <string> - Nome do cliente.
- `PMT_Contrato` <string> - Número do contrato.
- `PMT_TipoMontagem` <int> - Código do tipo de montagem (ex: 1, 4, 10).
- `Ambientes` <string> - String com os códigos dos ambientes agregados (ex: "AA-AB-AC"), pode incluir sufixo como "[Retorno]".
- `MIN_PMT_MontagemI` <datetime> - Data e hora previstas para o início da montagem do primeiro ambiente (formato ISO 8601, ex: "2024-08-01T09:00:00").
- `MAX_PMT_MontagemT` <datetime> - Data e hora previstas para o término da montagem do último ambiente (formato ISO 8601, ex: "2024-08-05T18:00:00").
- `REV_ID` <int> - ID do último registro de visita associado (pode ser `null` se não houver visita registrada para o agrupamento de montagem).
- `REV_CheckinData` <datetime> - Data e hora do check-in da última visita (formato ISO 8601, ex: "2024-08-02T10:00:00.123", pode incluir milissegundos). Será `null` se não houver visita.
- `REV_CheckOutData` <datetime> - Data e hora do check-out da última visita (formato ISO 8601, ex: "2024-07-20T16:55:00.456"). Retorna `"0001-01-01T00:00:00"` se a visita foi iniciada (check-in realizado) mas ainda não finalizada (check-out não realizado). Será `null` se não houver visita.
- `USU_Nome` <string> - Nome do usuário (técnico/montador) que realizou a última visita, formatado com o cargo (ex: "MONTADOR - Fulano de Tal"), ou "Sem visita".
- `StatusVisita` <int> - Código do status da visita (0 = Sem visita / Finalizada, 1 = Em andamento).
- `StatusVisitaDescricao` <string> - Descrição textual do status da visita (ex: "Sem visita", "Iniciado em dd/MM/yyyy HH:mm", "Última visita em dd/MM/yyyy HH:mm").

### Registrar Check-in
**Método:** POST  
**URL:** `/api/visitasCheckin`  
**Descrição:** Registra o início da visita (check-in).

**Parâmetros:**
- `REV_Emp` <int32> - Código da empresa.
- `REV_Loja` <int32> - Código da loja.
- `REV_Cliente` <int32> - Código do cliente.
- `REV_Contrato` <int32> - Número do contrato.
- `REV_Ambientes` <string> - Códigos dos ambientes (separados por vírgula, ex: "AA,AB").
- `REV_CheckinUsuario` <int32> - Código do usuário que está fazendo o check-in.
- `REV_CheckinLatitude` <string> - Latitude da localização no momento do check-in.
- `REV_CheckinLongitude` <string> - Longitude da localização no momento do check-in.
- `REV_CheckinDevice` <string> - Identificador/nome do dispositivo utilizado.
- `REV_Observacao` <string> - Observações iniciais da visita.
- `PMT_TipoMontagem` <int32> - Código do tipo de montagem (Este valor é passado para o parâmetro `@REV_TipoMontagem` da Stored Procedure. O parâmetro `@REV_TipoVisita` da SP é fixado em `1` pela API para check-in, indicando "Montagem").

**Exemplo:**
```json
{
  "REV_Emp": 116,
  "REV_Loja": 2009,
  "REV_Cliente": 12345,
  "REV_Contrato": 67890,
  "REV_Ambientes": "AA,AB",
  "REV_TipoVisita": 1, // A API envia este valor fixo para a SP (@REV_TipoVisita = 1)
  "REV_CheckinUsuario": 1,
  "REV_CheckinLatitude": "-19.123456",
  "REV_CheckinLongitude": "-43.123456",
  "REV_CheckinDevice": "iPhone 12",
  "REV_Observacao": "Início da visita",
  "PMT_TipoMontagem": 1 // Mapeado para @REV_TipoMontagem na SP
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "98765" // Contém o ID (REV_ID) do novo registro de visita criado
}
```

**Response (Erro - Ex: Check-in pendente):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Existe cliente sem finalizar visita. Finalize a visita antes de iniciar uma nova. <br>Loja: 2009 - Cliente: 12340 - Nome Cliente Pendente"
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, 1 = erro).
- `ERR_Mensagem` <string> - Em caso de sucesso, contém o ID (string) do novo registro de visita (`REV_ID`). Em caso de erro, contém a mensagem de erro do sistema ou da Stored Procedure.

### Registrar Check-out
**Método:** POST  
**URL:** `/api/visitasChekout`  
**Descrição:** Finaliza a visita (check-out).

**Parâmetros:**
- `REV_Emp` <int32> - Código da empresa.
- `REV_Loja` <int32> - Código da loja.
- `REV_Cliente` <int32> - Código do cliente.
- `REV_Contrato` <int32> - Número do contrato.
- `REV_Ambientes` <string> - Códigos dos ambientes (separados por vírgula, ex: "AA,AB").
- `REV_TipoVisita` <int32> - Tipo da visita (A API atualmente envia o valor fixo `1` para a Stored Procedure, indicando "Montagem", durante o check-out).
- `REV_CheckOutUsuario` <int32> - Código do usuário que está fazendo o check-out.
- `REV_CheckOutLatitude` <string> - Latitude da localização no momento do check-out.
- `REV_CheckOutLongitude` <string> - Longitude da localização no momento do check-out.
- `REV_CheckOutDevice` <string> - Identificador/nome do dispositivo utilizado.
- `REV_Observacao` <string> - Observações finais da visita (obrigatórias para check-out).
- `REV_ID` <int32> - ID do registro de visita que está sendo finalizado (este ID foi retornado no momento do check-in).

**Exemplo:**
```json
{
  "REV_Emp": 116,
  "REV_Loja": 2009,
  "REV_Cliente": 12345,
  "REV_Contrato": 67890,
  "REV_Ambientes": "AA,AB",
  "REV_TipoVisita": 1, // A API envia este valor fixo para a SP (@REV_TipoVisita = 1)
  "REV_CheckOutUsuario": 1,
  "REV_CheckOutLatitude": "-19.123456",
  "REV_CheckOutLongitude": "-43.123456",
  "REV_CheckOutDevice": "iPhone 12",
  "REV_Observacao": "Visita finalizada com sucesso. Todas as pendências resolvidas.",
  "REV_ID": 98765
}
```

**Response (Sucesso):**
```json
{
  "ERR_Codigo": 0,
  "ERR_Mensagem": "" 
}
```

**Response (Erro):**
```json
{
  "ERR_Codigo": 1,
  "ERR_Mensagem": "Falha ao registrar o check-out. Detalhes do erro aqui."
}
```

**Propriedades da Resposta:**
- `ERR_Codigo` <int> - Código de erro (0 = sucesso, 1 = erro).
- `ERR_Mensagem` <string> - Mensagem de sucesso (geralmente vazia) ou mensagem de erro detalhada.

:::warning Observações
- O sistema registra automaticamente data, hora e localização do dispositivo
- É necessário permitir acesso à localização do dispositivo
- Visitas podem ser de três tipos: Montagem, AT ou Cliente avulso
- O histórico completo de visitas é mantido no sistema
- Observações são obrigatórias no check-out
- O status da visita é atualizado em tempo real
- Integração com módulo de Gerenciamento de Montagem/AT para registro de ocorrências
- Visitas sem check-out são sinalizadas como pendentes no sistema
:::
