# Catálogo de Campos — Cadastros e Movimentos

**Projeto:** `D:\Claude\Especificos\Possamai` · **Delphi 5** · banco **Firebird 2.5**
**Cobertura:** as 212 telas de cadastro (`ucad_*`) e movimento (`umov_*`) que têm campos ligados a
dados — **4.175 campos**, sendo 2.923 campos de tela e 1.252 colunas de grade.

Companheiro do [Relatório da Função das Telas](Relatorio_Funcao_das_Telas.md), que descreve o que
cada uma das 578 telas faz. Aqui está o nível abaixo: o que cada tela **grava**.

---

## 1. De onde vêm o tipo e o tamanho

**Do banco, não do código.** Os metadados foram lidos em 27/08/2026 direto do
`DADOS\DADOS.FDB`, por conexão somente-leitura através do serviço Firebird 2.5 já em execução
(`SELECT` em `RDB$RELATION_FIELDS`, `RDB$FIELDS`, `RDB$RELATION_CONSTRAINTS` e
`RDB$INDEX_SEGMENTS`). Nenhuma escrita, nenhum DDL, nenhum acesso direto ao arquivo.

Isso importa porque **o DFM mente por omissão**: o Delphi só grava a propriedade `Size` quando ela
difere do padrão. Em `ucad_cliente`, `NOME` aparece no DFM como `Size = 70` e `FANTASIA` aparece
sem `Size` nenhum — o que parece "sem limite" e na verdade é `VARCHAR(20)`, o padrão. Um catálogo
montado só a partir dos fontes erraria esse campo e outros 3.400 como ele.

Cada campo carrega a procedência do seu tipo:

| Procedência | O que significa | Campos |
| --- | --- | --- |
| **banco** | coluna encontrada na tabela principal do dataset da tela | 3.137 |
| **banco (tabela relacionada)** | coluna de uma tabela do `JOIN` do mesmo dataset | 155 |
| **tipo inferido de `TABELA.COLUNA`** | a coluna não está na tabela do dataset, mas existe com esse nome em uma única tabela do banco, e o tipo foi tomado de lá — **indicação, não fato** | 147 |
| **calculado na consulta** | não é coluna de tabela: é expressão do `SELECT` ou campo calculado do Delphi; o tipo vem da declaração do `TField` | 725 |
| sem tipo | não foi possível resolver | 11 |

## 2. Como o rótulo de cada campo foi obtido

Delphi não amarra o rótulo ao campo: `TLabel` e `TEdit` são objetos independentes, posicionados
por coordenada. O rótulo foi recuperado por **geometria** — para cada controle, procurou-se, dentro
do mesmo painel, o label imediatamente acima na mesma coluna (a convenção deste sistema) ou o label
imediatamente à esquerda na mesma linha. Em `ucad_cliente`, `edtNome` está em `Left 240, Top 59` e
`lbNome` em `Left 240, Top 46` — daí sai "Razão Social / Nome do Cliente", que é a função do campo
como o usuário a vê.

O método achou rótulo para **95% dos campos**. Os 5% restantes foram descritos por leitura do
código.

## 3. Números

| | |
| --- | --- |
| Telas catalogadas | 212 |
| Campos | 4.175 (2.923 de tela + 1.252 de grade) |
| Pares tela × coluna distintos | 3.816 |
| Tabelas do banco alcançadas por essas telas | 219 de 253 |
| Colunas em chave primária | 262 |
| Campos somente-leitura | 453 |

Campo e coluna não são a mesma contagem: em **359 casos a mesma coluna aparece em mais de um
controle da mesma tela**. Quase sempre é consequência do que o capítulo 4 do relatório de telas
descreve — a tela multifunção tem um conjunto de editores por modo. Em
`umov_nota_fiscal_compra`, por exemplo, o cabeçalho do modo *Energia Elétrica* não reaproveita o
cabeçalho geral: traz 34 editores próprios com sufixo `_energia`, apontando para as mesmas colunas.
No catálogo cada controle aparece na sua seção, porque é assim que o operador o encontra na tela.

**Distribuição por tipo:**

| Tipo | Campos |
| --- | --- |
| `VARCHAR` | 1.987 |
| `DOUBLE PRECISION` | 1.042 |
| `INTEGER` | 841 |
| `TIMESTAMP` | 243 |
| `DATE` | 25 |
| `BLOB` | 24 |
| `TIME` | 1 |

**Tabelas mais movimentadas pelas telas:**

| Tabela | Telas que a usam | Campos expostos |
| --- | --- | --- |
| `MATERIA_PRIMA` | 21 | 251 |
| `RECEBER` | 13 | 116 |
| `NOTA` | 11 | 377 |
| `CHEQUE_RECEBIDO` | 10 | 62 |
| `PAGAR` | 10 | 81 |
| `ENTRADA` | 7 | 259 |
| `LOTE` | 6 | 82 |

`MATERIA_PRIMA` aparecer em 21 telas é a mesma constatação do capítulo 6 do relatório de telas:
produto e material são o mesmo cadastro, na mesma tabela, com duas telas completas e quatro telas
de acerto por cima.

## 4. Três convenções do modelo de dados

Valem para o banco inteiro e economizam a leitura de milhares de linhas do catálogo.

### 4.1 Todo registro é por empresa

**213 das 245 tabelas com chave primária têm `EMPRESA` como primeira coluna da chave.** O sistema
é multi-empresa por construção: o número do documento não é único no banco, é único *dentro da
empresa*. Toda consulta do sistema carrega `WHERE EMPRESA = :EMPRESA`, e a global `vempresa` é o
que alimenta esse parâmetro.

Por isso, no catálogo, `EMPRESA` aparece marcado como chave (`PK0`) em quase toda tela e quase
nunca tem campo visível: é preenchido pelo sistema.

### 4.2 Cabeçalho e itens: as tabelas `IT_`

**86 das 253 tabelas começam com `IT_`** e guardam os itens do documento cujo cabeçalho está na
tabela de mesmo nome sem o prefixo: `NOTA` / `IT_NOTA`, `ENTRADA` / `IT_ENTRADA`,
`PEDIDO_VENDA` / `IT_PEDIDO_VENDA`, `RECEBER` / `IT_RECEBER`. Na tela, o cabeçalho são os campos
soltos e os itens são a grade — é por isso que cada tela de movimento tem uma seção **Campos** e
uma ou mais seções **Grade**.

A chave dos itens repete a do cabeçalho e acrescenta `SEQ`.

### 4.3 Marcador é `'2'` para sim e `'1'` para não

Não é `'S'`/`'N'`, não é `0`/`1`, não é booleano. **Nos 221 checkboxes ligados a dados do sistema
inteiro, sem uma única exceção, `ValueChecked = '2'` e `ValueUnchecked = '1'`.** Há 314 colunas
`VARCHAR(1)` no banco, e esse é o conteúdo delas.

Consequência prática: `INATIVO = '2'` significa **inativo**, e `INATIVO = '1'` (ou nulo, em registro
antigo) significa ativo. Uma consulta escrita como `WHERE INATIVO <> '2'` está certa; uma escrita
como `WHERE INATIVO = 0` não retorna nada.

Onde o campo codificado não é um marcador de dois estados — `STATUS`, `TIPO_*`, `SITUACAO_*` — o
catálogo lista os valores literais que aquele campo assume naquela tela.

## 5. Como ler cada tela

Cada tela tem:

- **um parágrafo** dizendo o que ela grava e em quais tabelas;
- **uma tabela `Campos`**, na ordem em que aparecem no formulário, subdividida por painel ou aba
  quando a tela tem seções;
- **uma tabela `Grade`** para cada grade, com a tabela de itens no título.

Colunas:

| Coluna | Conteúdo |
| --- | --- |
| **Campo** | o rótulo como aparece na tela. Recebe **·chave** quando a coluna faz parte da chave primária da tabela, e **·obrig** quando o banco a declara `NOT NULL` |
| **Coluna** | a coluna do banco |
| **Tipo** / **Tam.** | tipo e tamanho reais, do Firebird |
| **Obr.** | obrigatoriedade — quase sempre vazia, porque o banco tem apenas 17 colunas `NOT NULL`. **A obrigatoriedade real deste sistema está no código**, no `BeforePost` e no botão Gravar de cada tela, e é isso que a coluna Função registra ("Obrigatório na gravação: o Gravar aborta com aviso se estiver vazio") |
| **Função** | o que o campo é; para campo codificado, os valores que assume e o que cada um faz |

> Vale insistir no ponto da coluna **Obr.**: o banco praticamente não tem restrição de
> obrigatoriedade. Das 4.175 colunas expostas nas telas, apenas 17 são `NOT NULL` e 262 fazem
> parte de chave primária. Tudo o mais que "não pode ficar em branco" é regra de tela, verificada
> em Object Pascal na hora de gravar. Quem for escrever carga de dados ou integração direta no
> banco não encontrará essas regras lá.

## 6. Limites

- O catálogo cobre **cadastro e movimento**. Consultas (`ucons_*`) e relatórios (`urel_*`) ficaram
  de fora: os "campos" delas são colunas de grade e filtros de parâmetro, não campos de gravação.
  São mais 3.400 campos, disponíveis se fizerem falta.
- **Tipo e tamanho são do banco desta instalação.** Outra instalação do mesmo sistema, com upgrade
  aplicado em data diferente, pode ter colunas a mais ou tamanhos diferentes — o
  `uatualizacao.pas` altera o schema em tempo de execução.
- Campos marcados **calculado na consulta** não existem como coluna: são alias de `SELECT` ou campo
  calculado do Delphi. Procurar por eles no banco não encontra nada.
- A ordem dos campos é a ordem em que aparecem no `.dfm`, que é a ordem visual, não
  necessariamente a ordem de tabulação.


---

# Módulo 1 — Gerais

39 telas.

<a id="ucad_plano_contas"></a>

## `ucad_plano_contas` — Cadastro do Plano de Contas...

Cadastro do plano de contas, gravado na tabela `PLANO_CONTAS`. A tela tem o bloco de identificação da conta no topo e o painel " Dados Adicionais da Contabilidade ( EFD ) " embaixo, que só é exigido para contas analíticas. Não tem grades.

### Campos

#### Cadastro do Plano de Contas...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(20) | 20 |  | Código da conta no plano, digitado pelo usuário com a máscara de níveis do próprio plano — não é sequencial, a tela não sugere próximo número. Obrigatório: o Gravar recusa a gravação com o campo vazio. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição do Plano de Contas | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da conta. Obrigatório: o Gravar recusa a gravação com o campo vazio. |
| Contabilidade | `CODIGO_CONTABILIDADE` | INTEGER |  |  | Código equivalente da conta no sistema da contabilidade, usado na exportação. Digitado. |
| Gasto Fixo | `GASTO_FIXO_MENSAL` | INTEGER |  |  | Código do gasto fixo mensal ao qual a conta pertence. F4 abre a consulta de gastos fixos e F3 o cadastro deles; ao sair do campo o sistema busca o registro e, se não achar, limpa código e descrição. Só é aceito quando a conta é Analítica: se o TIPO for 'Sintético' e este campo estiver preenchido, o Gravar avisa e recusa. |
| Descrição do Gasto Fixo Mensal | `DESCRICAO_GASTO_FIXO_MENSAL` | VARCHAR(50) | 50 |  | Descrição do gasto fixo escolhido. Não é digitada: o sistema copia de GASTO_FIXO_MENSAL.DESCRICAO ao sair do código ou ao escolher pela consulta. |

#### Dados Adicionais da Contabilidade ( EFD )

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nível da Conta | `NIVEL_CONTA_ANALITICA` | INTEGER |  |  | Nível hierárquico da conta no plano referencial da EFD Contábil. Exigido apenas quando o TIPO da conta é 'Analítico'; nesse caso o Gravar recusa valor zerado. |
| Cód. Conta Analítica | `CODIGO_CONTA_ANALITICA` | VARCHAR(20) | 20 |  | Código da conta analítica no plano referencial da EFD. Digitado. A validação de obrigatoriedade existe no código, mas está comentada — hoje o campo pode ficar vazio. |
| Nome da Conta Analítica / Grupo de Contas | `NOME_CONTA_ANALITICA` | VARCHAR(60) | 60 |  | Nome da conta analítica ou do grupo de contas para a EFD. Exigido apenas quando o TIPO da conta é 'Analítico'. |
| Inclusão / Alteração | `DATA_INCLUSAO_ALTERACAO` | TIMESTAMP |  |  | Data de inclusão ou da última alteração da conta, informada pelo usuário e enviada na EFD. Exigida apenas quando o TIPO da conta é 'Analítico': o Gravar tenta converter o texto e recusa data em branco ou inválida. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Nivel | `TIPO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Nivel”. Função não verificada no código. |
| Lacto Financeiro | `TIPO_LANCAMENTO_FINANCEIRO` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Lacto Financeiro”. Função não verificada no código. |
| Código da Natureza da Conta | `CODIGO_NATUREZA_CONTA` | VARCHAR(50) | 50 | campo da tela | Rótulo na tela: “Código da Natureza da Conta”. Função não verificada no código. |

<a id="ucad_cidade"></a>

## `ucad_cidade` — Cadastro das Cidades...

Cadastro de municípios na tabela `CIDADE`, chave `EMPRESA` + `CADASTRO`, com o nome do país trazido de `PAIS` por LEFT JOIN. Tela de painel único, sem abas nem grade. É a tabela que abastece os campos Cidade do CEP, do cliente, do fornecedor e do transportador, e é dela que sai o código IBGE gravado na NF-e.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código interno da cidade. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta, F7/F8/F9 navegam. |
| Nome da Cidade | `NOME` | VARCHAR(50) | 50 |  | Nome do município. Exigido no Gravar: vazio aborta com "Nome da Cidade". |
| Pais | `CODIGO_PAIS` | INTEGER |  |  | Código do país em `PAIS` (1058 é o Brasil, valor que as demais telas usam como padrão). F4 abre a consulta de países. Ao sair do campo o sistema busca o país e preenche o nome ao lado; se o código não existir, limpa os dois. |
| Nome Pais | `NOME_PAIS` |  |  |  | Nome do país, trazido de `PAIS.NOME` pelo LEFT JOIN da consulta e preenchido pelo Exit do campo Pais. Não é digitado. |
| Código Estado IBGE | `CODIGO_ESTADO_IBGE` | INTEGER |  |  | Código IBGE da unidade da federação. Não é digitado: ao sair do combo de UF o sistema grava aqui o código correspondente, pela tabela fixa de `pega_codigo_estado` — AC 12, AL 27, AM 13, AP 16, BA 29, CE 23, DF 53, ES 32, EX 99, GO 52, MA 21, MG 31, MS 50, MT 51, PA 15, PB 25, PE 26, PI 22, PR 41, RJ 33, RN 24, RO 11, RR 14, RS 43, SC 42, SE 28, SP 35, TO 17. |
| Alíquota IBS | `ALIQUOTA_IBS` | DOUBLE PRECISION |  |  | Percentual do IBS (reforma tributária) atribuído a este município. |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF do município, combo com lista fechada de 28 opções: as 27 unidades da federação mais `EX` para exterior. Exigido no Gravar: vazio aborta com "Estado da Cidade". Ao sair do combo o sistema grava o código IBGE correspondente em `CODIGO_ESTADO_IBGE`. Campo não listado n |

`EMPRESA` é preenchida pelo sistema no NewRecord com a empresa logada e não tem controle na tela.

<a id="ucad_pais"></a>

## `ucad_pais` — Cadastro dos Paises...

Cadastro simples de países, gravado na tabela `PAIS`. Tela de campo único de identificação mais o nome; não tem abas, painéis nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do país. Ao abrir a tela ou ao clicar em Limpar (F5) o sistema já sugere `MAX(CADASTRO) + 1` da tabela PAIS. Se o usuário digitar um código que não existe, a tela pergunta (janela de seleção) se grava com o número digitado ou com o próximo da sequência. F4 abre a consulta de países, F7 volta o registro anterior, F8 avança e F9 procura. |
| Nome do Pais | `NOME` | VARCHAR(50) | 50 |  | Nome do país. Obrigatório: o Gravar recusa a gravação com o campo vazio e devolve o foco para ele. |

<a id="umov_memorando"></a>

## `umov_memorando` — Memorando...

Registra e imprime um memorando endereçado a um cliente, fornecedor, representante ou transportadora. Grava tudo em `MEMORANDO` (chave `EMPRESA` + `NUMERO`), em uma tabela só: não há grade nem itens. Os dados do destinatário não são digitados um a um — escolhido o tipo e o código, o sistema copia nome, contato, telefone e endereço do cadastro correspondente para dentro do memorando, que fica com a cópia dos dados no momento da emissão.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do memorando. Sugerido como o maior número da empresa mais um. F7 volta ao anterior, F8 avança, F9 e o botão localizam o mais próximo abaixo. |
| Código | `CODIGO` | INTEGER |  |  | Código do destinatário no cadastro escolhido em Filtrar pelo. Muda de sentido conforme esse tipo: é o código do cliente, do fornecedor, do representante ou da transportadora. F4 ou o botão abrem a consulta do cadastro correspondente, F3 abre esse cadastro. Ao sair do campo, o sistema carrega o cadastro e preenche nome, contato, fone, endereço, bairro, CEP, cidade e estado de uma vez; código inexistente limpa esses oito campos junto com o próprio código. |
| Nome | `NOME` | VARCHAR(80) | 80 |  | Razão social ou nome do destinatário. Vem do cadastro pelo Exit do Código, mas pode ser digitado à mão para um destinatário sem cadastro. Obrigatório: o Gravar recusa em branco e devolve o foco. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do memorando. Vem com a data do dia no NewRecord. Obrigatória: o Gravar recusa data inválida com "Data da Emissão não Informada ou Inválida". |
| Contato | `CONTATO` | VARCHAR(30) | 30 |  | Pessoa de contato no destinatário, copiada do cadastro pelo Exit do Código. Pode ser alterada à mão. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone do destinatário, copiado do cadastro pelo Exit do Código. Pode ser alterado à mão. |
| Bairro | `BAIRRO` | VARCHAR(50) | 50 |  | Bairro do destinatário, copiado do cadastro pelo Exit do Código. Pode ser alterado à mão. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro do destinatário, copiado do cadastro pelo Exit do Código. Pode ser alterado à mão. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do destinatário, copiado do cadastro pelo Exit do Código. Pode ser alterado à mão. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Cidade do destinatário, copiada do cadastro pelo Exit do Código. Obrigatória: o Gravar recusa em branco e devolve o foco. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | Sigla do estado do destinatário, copiada do cadastro pelo Exit do Código. Pode ser alterada à mão. |
| Texto | `TEXTO` | BLOB |  |  | Corpo do memorando, em texto livre de várias linhas, que sai impresso no formulário. Dentro do memo o Enter quebra linha em vez de pular de campo. |
| Filtrar pelo | `TIPO` | VARCHAR(15) | 15 |  | Tipo do destinatário. Grupo de opções com quatro alternativas, gravadas por extenso: `'Cliente'`, `'Fornecedor'`, `'Representante'` ou `'Transportadora'`. Nasce como `'Cliente'` no NewRecord. É o que decide de qual cadastro o Código busca os dados, qual consulta o F4 abre e qual cadastro o F3 abre. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada no NewRecord.

<a id="ucad_unidade_medida"></a>

## `ucad_unidade_medida` — Cadastro da Unidade de Medida

Cadastro das unidades de medida na tabela `UNIDADE_MEDIDA`, chave `EMPRESA` + `CADASTRO`. Painel único, sem abas nem grade. Ao contrário dos demais cadastros, a chave não é sequencial numérica: é a própria sigla digitada pelo usuário.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Sigla **·chave** | `CADASTRO` | VARCHAR(6) | 6 |  | Sigla da unidade (KG, MT, PC), digitada pelo usuário e usada como chave do registro. Não há sequencial: o Exit do campo consulta a sigla e, se não existir, abre um registro novo já com ela preenchida. Obrigatória no Gravar, que aborta com "Sigla da Unidade de Medida". F4 consulta as unidades, F7/F8/F9 navegam entre registros. |
| Descrição da Unidade de Medida | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome por extenso da unidade. Obrigatória no Gravar, que aborta com "Descrição da Unidade de Medida". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de unidade fora de uso. `'2'` = inativo (caixa marcada), `'1'` = ativo. O NewRecord grava `'1'`, ou seja, toda unidade nasce ativa. |
| Fator Conversão | `FATOR_CONVERSAO` | DOUBLE PRECISION |  |  | Fator de conversão da unidade, usado para converter unidade de compra em unidade de consumo. |
| Permite Efetuar Compras e Vendas com Quantidade Fracionária | `PERMITE_QUANTIDADE_FRACIONADO` | VARCHAR(1) | 1 |  | Autoriza quantidade com casas decimais nesta unidade. `'2'` = permite (caixa marcada), `'1'` = não permite. O NewRecord grava `'1'`: por padrão a unidade só aceita quantidade inteira. |
| Unidade FCI | `UNIDADE_FCI` | INTEGER |  |  | Código da unidade correspondente na tabela oficial de unidades do FCI. F4 abre a consulta `frmcons_unidade_medida_fci`. O Exit do campo busca a abreviatura no cadastro do FCI; se o código não existir, o próprio Exit limpa este campo e a abreviatura. |
| Abreviatura Unidade FCI | `ABREVIATURA_UNIDADE_FCI` |  |  |  | Abreviatura da unidade FCI. Não é digitada: o Exit e o F4 da Unidade FCI a trazem do cadastro do FCI, e a limpam quando o código não é encontrado. |
| Unidade NFe | `UNIDADE_MEDIDA_NFE` | VARCHAR(6) | 6 |  | Sigla que vai para o XML da NFe quando ela difere da sigla interna. |

<a id="ucad_classificacao_fiscal"></a>

## `ucad_classificacao_fiscal` — Cadastro da Classificação Fiscal do NCM

Cadastro do NCM em `CLASSIFICACAO_FISCAL` (chave `CADASTRO`, o próprio código NCM), com a descrição do CEST vinda de `CEST` e o nome do tributo IBS/CBS vindo de `TRIBUTO_IBS_CBS`, ambos por LEFT JOIN. A grade `dbimpostos` guarda as alíquotas de substituição tributária por UF em `IMPOSTOS_CLASSIFICACAO_FISCAL` (chave `CLASSIFICACAO_FISCAL` + `SEQ`). O cabeçalho tem dois quadros à parte: Alíquotas de Transparência de Impostos e Aliquotas.

### Campos

#### Cabeçalho

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Código NCM **·chave** | `CADASTRO` | VARCHAR(10) | 10 |  | Código NCM, chave do registro. Exigido no Gravar e validado: descontada a pontuação, precisa ter exatamente 2 ou 8 dígitos, senão aborta com "O Código NCM é formado por 02 ou 08 Dígitos Numéricos". Ao sair do campo a tela carrega o NCM e recarrega a grade de impostos. O valor `9999.99.99` é tratado como registro de sistema: com ele aberto, a caixa Inativo fica desabilitada. |
| Descrição da Classificação Fiscal do NCM | `DESCRICAO` | VARCHAR(100) | 100 |  | Texto do NCM. Exigido no Gravar: vazio aborta com "Descrição da Classificação Fiscal do NCM". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de NCM desativado. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativo). Fica desabilitado quando o NCM aberto é `9999.99.99`. |
| Incide Substituição Tributária | `INCIDE_SUBSTITUICAO_TRIBUTARIA` | VARCHAR(1) | 1 |  | Diz se o NCM está sujeito a ICMS-ST. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (não incide). É este marcador que faz sentido junto com as linhas por UF da grade. |

#### Alíquotas de Transparência de Impostos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Aliquota Importação | `ALIQUOTA_IMPOSTO_IMPORTACAO` | DOUBLE PRECISION |  |  | Percentual de tributo sobre produto importado usado na informação de transparência de impostos ao consumidor (Lei da Transparência). Fica desabilitado quando o registro aberto tem `CLASSIFICACAO_IMPORTADA = '2'`. |
| Aliquota Nacional | `ALIQUOTA_IMPOSTO_NACIONAL` | DOUBLE PRECISION |  |  | Percentual de tributo sobre produto nacional usado na mesma informação de transparência. Também desabilitado quando `CLASSIFICACAO_IMPORTADA = '2'`. |
| Exceção Fiscal | `EXCESSAO_FISCAL` | INTEGER |  |  | Número da exceção da TIPI (EX) associada ao NCM. Também desabilitado quando `CLASSIFICACAO_IMPORTADA = '2'`. |

#### Aliquotas

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| %  I.P.I | `IPI` | DOUBLE PRECISION |  |  | Percentual de IPI do NCM, aplicado no cálculo do imposto do item. |
| %  PIS | `PIS` | DOUBLE PRECISION |  |  | Percentual de PIS do NCM. |
| %  COFINS | `COFINS` | DOUBLE PRECISION |  |  | Percentual de COFINS do NCM. |

#### Cabeçalho (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| CEST | `CEST` | VARCHAR(10) | 10 |  | Código CEST vinculado ao NCM. Somente leitura no controle: não se digita, escolhe-se por F4 na consulta de CEST, e o Exit valida o código e traz a descrição. Quando o código não é encontrado a rotina limpa `GRUPO` e `DESCRICAO_GRUPO` em vez de limpar o CEST. |
| Descrição do  Código Especificador da Substituição Tributária | `DESCRICAO_CEST` | BLOB |  |  | Texto do CEST, trazido de `CEST.DESCRICAO` pelo LEFT JOIN e pelo Exit do campo CEST. Somente leitura (calculado na consulta). |
| Un. Exportação | `UNIDADE_MEDIDA_EXPORTACAO` | VARCHAR(10) | 10 |  | Unidade de medida estatística exigida na exportação para este NCM. Digitado em caixa alta. |
| Tributo IBS/CBS | `TRIBUTO_IBS_CBS` | VARCHAR(6) | 6 |  | Código do tributo de IBS/CBS (reforma tributária) do NCM, apontando para `TRIBUTO_IBS_CBS.CADASTRO`. F4 abre a consulta. Ao sair do campo o sistema busca o tributo e preenche o nome ao lado; se o código não existir, limpa os dois. |
| Descrição do Tributo IBS/CBS | `NOME_TRIBUTO_IBS_CBS` | VARCHAR(200) | 200 |  | Nome do tributo IBS/CBS, trazido de `TRIBUTO_IBS_CBS.NOME` pelo LEFT JOIN e pelo Exit do campo acima. Não é digitado (calculado na consulta). |

### Grade `dbimpostos` — tabela IMPOSTOS_CLASSIFICACAO_FISCAL

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Estado | `ESTADO` | VARCHAR(2) | 2 | Sigla da UF de destino a que esta linha de ST se aplica. Ao sair da coluna o sistema busca a UF em `ALIQUOTA_ESTADO` e preenche o nome do estado e o ICMS ST; se a UF não estiver cadastrada, limpa as três colunas. |
| Nome do Estado | `NOME_ESTADO` | VARCHAR(50) | 50 | Nome da unidade da federação, trazido de `ALIQUOTA_ESTADO.NOME` ao informar a sigla. Não é digitado (calculado na consulta). |
| `MVA` | `MVA` | DOUBLE PRECISION |  | Margem de Valor Agregado do NCM naquela UF, em percentual. A coluna não tem legenda na grade e aparece com o nome do campo. Exigida quando a UF existe em `ALIQUOTA_ESTADO`: se MVA e % Carga Trib.Média estiverem ambos zerados, o BeforePost recusa com "Percentual do MVA não Informado". |
| ICMS ST | `ICMS_ST` | DOUBLE PRECISION |  | Percentual de ICMS usado no cálculo da substituição tributária naquela UF. Vem preenchido com `ALIQUOTA_ESTADO.ICMS_ORIGEM_ESTADO` ao informar a sigla, e é reescrito em massa sempre que o Icms Origem daquela UF é alterado em `ucad_aliquota_estado`. Zerado é recusado no BeforePost com "Percentual do ICMS da Substituição Tributária não Informado". |
| % Red.ST | `PERCENTUAL_REDUCAO_BASE_ST` | DOUBLE PRECISION |  | Percentual de redução da base de cálculo da substituição tributária naquela UF. |
| % Carga Trib.Média | `PERCENTUAL_CARGA_TRIB_MEDIA` | DOUBLE PRECISION |  | Percentual de carga tributária média, alternativa ao MVA: preenchê-lo dispensa o MVA na validação do BeforePost. |

Campos sem controle na tela: `CLASSIFICACAO_IMPORTADA` (NewRecord grava `'1'`; o valor `'2'` desabilita as três caixas do quadro de transparência) e `TIPO_CLASSIFICACAO` (NewRecord grava `'0'`). Na grade, `CLASSIFICACAO_FISCAL` e `SEQ` são preenchidos no NewRecord, com `SEQ` recebendo o maior do mesmo NCM mais um.

<a id="ucad_cest"></a>

## `ucad_cest` — Cadastro do Código Especificador da Substituição Tributária ( CEST )

Cadastro dos códigos CEST na tabela `CEST`, chave `CADASTRO`. Tela de três campos, sem abas nem grade. É a tabela que o cadastro de NCM (`ucad_classificacao_fiscal`) consulta para trazer a descrição do CEST.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Código CEST **·chave** | `CADASTRO` | VARCHAR(10) | 10 |  | Código CEST, chave do registro; é digitado, não é sequencial. Ao sair do campo a tela carrega o registro; se não existir, entra em inclusão com o código digitado. F4 consulta, F7/F8/F9 navegam. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de código desativado. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativo). |
| Descrição do Código Especificador da Substituição Tributária | `DESCRICAO` | BLOB |  |  | Texto do CEST, em memo. Único campo exigido no Gravar: vazio aborta a gravação. Ao sair do memo o texto é convertido para maiúsculas preservando acentos. É este texto que aparece como Descrição do CEST no cadastro de NCM. |

<a id="ucad_beneficio_fiscal"></a>

## `ucad_beneficio_fiscal` — Cadastro do Benefício Fiscal

Cadastro dos códigos de benefício fiscal na tabela `BENEFICIO_FISCAL`, chave `CADASTRO`. Tela de três campos, sem abas nem grade: o código do benefício, o marcador de inativo e a descrição em memo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** **·obrig** | `CADASTRO` | VARCHAR(10) | 10 | sim | Código do benefício fiscal, chave do registro; é digitado, não é sequencial. Ao sair do campo a tela carrega o registro; se não existir, entra em inclusão com o código digitado. F4 consulta, F7/F8/F9 navegam. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de benefício desativado. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativo). |
| Descrição do Benefício Fiscal | `DESCRICAO` | BLOB |  |  | Texto do benefício, em memo. Único campo exigido no Gravar: vazio aborta a gravação. Ao sair do memo o texto é convertido para maiúsculas preservando acentos. |

<a id="ucad_cenq"></a>

## `ucad_cenq` — Cadastro do Enquadramento do IPI ( CENQ )

Cadastro dos códigos de enquadramento legal do IPI (CENQ) na tabela `CENQ`, chave `CADASTRO`. Tela de três campos, sem abas nem grade; é a tabela consultada na montagem da NF-e para preencher o enquadramento do IPI do item.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Código CENQ **·chave** | `CADASTRO` | VARCHAR(3) | 3 |  | Código de enquadramento do IPI, de três posições, conforme a tabela oficial da NF-e. É digitado, não é sequencial. Ao sair do campo a tela carrega o registro; se não existir, entra em inclusão com o código digitado. F4 consulta, F7/F8/F9 navegam. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de código desativado. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativo). |
| Descrição do Cadastro do Enquadramento do IPI | `DESCRICAO` | BLOB |  |  | Texto do enquadramento, em memo. Único campo exigido no Gravar: vazio aborta a gravação. Ao sair do memo o texto é convertido para maiúsculas preservando acentos. |

Há ainda `GRUPO_CST`, sem controle na tela: o NewRecord o grava fixo com o literal `'OUTROS'`.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Grupo CST | `GRUPO_CST` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Grupo CST”. Função não verificada no código. |

<a id="ucad_tipo_item_produto"></a>

## `ucad_tipo_item_produto` — Cadastro do Tipo do Item da Mercadoria

Tabela de apoio `TIPO_ITEM_PRODUTO`, chave `CADASTRO`. Painel único. Classifica o item da mercadoria e, por meio de dois campos codificados, decide como aquele tipo participa do controle de lote de produção e se aparece na consulta de estoque por lote.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do tipo de item, chave do registro. A tela abre com o próximo número livre (maior `CADASTRO` da tabela mais um — numeração global, não por empresa). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de tipos de item. |
| Descrição do Tipo do Item da Mercadoria | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do tipo. Único campo exigido no Gravar — vazio aborta com "Descrição do Tipo do Item". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de tipo fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativo). |
| Tipo de Controle (Produção) | `TIPO_CONTROLE_LOTE_PRODUCAO` | VARCHAR(15) | 15 |  | Define como o item entra no controle de lote de produção. O campo guarda o texto da lista, não um código: `Nenhum`, `Materia Prima` ou `Produto` — grafado exatamente assim, sem acento em "Materia". O NewRecord inicia em `Nenhum`. Na composição do produto, item com `Nenhum` fica fora do controle de lote, e misturar subconjuntos de `Materia Prima` com os de `Produto` na mesma composição é recusado com aviso. |
| Listar na Consulta de Produtos por Lote | `LISTAR_CONSULTA_ESTOQUE_LOTE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord não define valor. A consulta de estoque de produtos por lote só traz itens cujo tipo tem `'2'` aqui — é o filtro que mantém a consulta enxuta. |

<a id="ucad_aliquota_estado"></a>

## `ucad_aliquota_estado` — Cadastro da Aliquota do Estado...

Cadastro das alíquotas de ICMS por unidade da federação, na tabela `ALIQUOTA_ESTADO` (chave `EMPRESA` + `ESTADO`). É a tabela que abastece o cálculo de imposto das notas e a coluna ICMS ST do cadastro de NCM. Fora do cabeçalho, os campos ficam em três quadros: Importação InterEstadual, ICMS Venda e ICMS Venda Consumidor Final.

### Campos

#### Cabeçalho

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Estado **·chave** | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF, chave do registro. Obrigatório no Gravar. Ao sair do campo a tela recarrega o registro daquela UF; se não existir, entra em inclusão. |
| Nome do Estado | `NOME` | VARCHAR(50) | 50 |  | Nome da unidade da federação. Obrigatório no Gravar. |

#### Importação InterEstadual

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| CST Icms | `CST_ICMS_INTER_PROD_IMPORTADO` | VARCHAR(8) | 8 |  | Código do tributo (CST de ICMS) aplicado na venda interestadual de produto importado. Aponta para `TRIBUTO.CADASTRO`. Ao sair do campo o sistema busca a descrição; se o código não existir, limpa o próprio código e a descrição. |
| Descrição da Situação Tributaria do Icms | `DESCRICAO_TRIBUTO` | VARCHAR(50) | 50 |  | Descrição do tributo acima, trazida de `TRIBUTO.DESCRICAO` pelo Exit do campo CST Icms. Não é digitada (calculado na consulta). |
| Icms Interestadual | `ALIQ_ICMS_INTER_PROD_IMPORTADO` | DOUBLE PRECISION |  |  | Percentual de ICMS interestadual aplicado a produto importado destinado a esta UF. |

#### ICMS Venda

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Icms Origem | `ICMS_ORIGEM_ESTADO` | DOUBLE PRECISION |  |  | Percentual de ICMS da UF de origem na venda para contribuinte. Obrigatório no Gravar: valor zerado aborta com "Icms de Origem". Além de gravar aqui, o BeforePost replica este percentual em `IMPOSTOS_CLASSIFICACAO_FISCAL.ICMS_ST` de todas as linhas desta UF — uma alteração aqui muda o ICMS ST de todos os NCM de uma vez. |
| Icms Destino | `ICMS_DESTINO_ESTADO` | DOUBLE PRECISION |  |  | Percentual de ICMS da UF de destino na venda para contribuinte. Obrigatório no Gravar: valor zerado aborta com "Icms de Destino". |

#### ICMS Venda Consumidor Final

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Icms Origem | `ICMS_ORIGEM_ESTADO_CONS_FINAL` | DOUBLE PRECISION |  |  | Percentual de ICMS da UF de origem quando a venda é a consumidor final (base do DIFAL). |
| Icms Destino | `ICMS_DESTINO_ESTADO_CONS_FINAL` | DOUBLE PRECISION |  |  | Percentual de ICMS da UF de destino quando a venda é a consumidor final (base do DIFAL). |

#### Cabeçalho (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Alíquota FCP | `ALIQUOTA_FCP` | DOUBLE PRECISION |  |  | Percentual do Fundo de Combate à Pobreza cobrado por esta UF. |
| Alíquota IBS | `ALIQUOTA_IBS` | DOUBLE PRECISION |  |  | Percentual do IBS (reforma tributária) atribuído a esta UF. |

`EMPRESA` é preenchida pelo sistema no NewRecord com a empresa logada e não tem controle na tela.

<a id="ucad_genero_item_produto"></a>

## `ucad_genero_item_produto` — Cadastro do Gênero do Item da Mercadoria / Serviço

Tabela de apoio fiscal: grava o gênero do item (código da tabela de gêneros usada no SPED e na NFe) na tabela GENERO_ITEM_PRODUTO. Cadastro simples, sem abas, sem grade e sem separação por empresa — o SELECT filtra apenas por CADASTRO.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do gênero. Proposto pelo sistema como MAX(CADASTRO)+1 da tabela inteira, mas digitável: informar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Gênero do Item da Mercadoria / Serviço | `DESCRICAO` | BLOB |  |  | Obrigatória no Gravar. Digitada em um memo, por isso é BLOB e não tem limite de tamanho no banco. Enter dentro do memo quebra linha; dois Enters seguidos passam para o próximo campo. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (gênero fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |

<a id="ucad_lista_servico"></a>

## `ucad_lista_servico` — Cadastro da Lista de Serviço

Grava na tabela LISTA_SERVICO os itens da lista de serviços da Lei Complementar 116/03, usados na nota fiscal de serviço. O código é o próprio item da lista (por exemplo 14.01), digitado pelo usuário, e cada linha é marcada como sintética (o grupo) ou analítica (o item que se lança de fato). Tela de bloco único, sem abas nem grade, e sem separação por empresa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(5) | 5 |  | Código do item na lista da LC 116/03, digitado pelo usuário — a tela não sugere valor nenhum ao limpar. Obrigatório no Gravar. Limitado a 5 caracteres na tela e também na volta da consulta, que só aceita o retorno se tiver até 5 caracteres, o que acomoda o formato com ponto. F4 abre a consulta e F7/F8/F9 navegam. |
| `medescricao` | `DESCRICAO` | BLOB |  |  | Sem rótulo casado por geometria. O rótulo acima do memo diz Descrição da Lista de Serviço, de acordo com a Lei Complementar 116/03: é o texto do item da lista. Obrigatório no Gravar. Digitado em memo, por isso é BLOB e não tem limite de tamanho no banco. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (item fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| `cbnivel` | `NIVEL` | VARCHAR(10) | 10 |  | Combo Nivel, no canto superior direito. Grava o texto escolhido, sem tradução: `'Analítico'` ou `'Sintético'` (o EnableValues está desligado, então a lista Values do DFM é ignorada). Sintético é o grupo da lista, analítico é o item que se lança na nota. NewRecord inicia em `'Sintético'`. Campo não presente n |

<a id="ucad_observacao_lancamento_fiscal"></a>

## `ucad_observacao_lancamento_fiscal` — Cadastro da Observação do Lançamento Fiscal

Cadastro dos textos de observação usados nos lançamentos fiscais, gravado na tabela `OBSERVACAO_LANCAMENTO_FISCAL`. Tela sem abas nem grades: código, memo do texto e o marcador de inativo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da observação. Sugerido pelo sistema como `MAX(CADASTRO) + 1` da tabela OBSERVACAO_LANCAMENTO_FISCAL dentro da empresa corrente. Se o código digitado não existir, a tela pergunta se grava com ele ou com o próximo da sequência. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição da Observação do Lançamento Fiscal | `DESCRICAO` | BLOB |  |  | Texto livre da observação, digitado em memo (Enter duas vezes passa para o próximo controle). Obrigatório: o Gravar recusa a gravação com o memo vazio. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador. `'2'` marcado (observação inativa, fora de uso), `'1'` desmarcado (ativa). Novo registro nasce com `'1'`. |

<a id="ucad_modelo_documento_fiscal"></a>

## `ucad_modelo_documento_fiscal` — Cadastro do Modelo do Documento Fiscal

Cadastro dos modelos de documento fiscal da tabela oficial da SEFAZ (55 = NF-e, 65 = NFC-e, 01 = Nota Fiscal modelo 1, e assim por diante). Grava na tabela `MODELO_DOCUMENTO_FISCAL`, chaveada só por `CADASTRO` — é tabela global, sem coluna `EMPRESA`. Tela de campo único, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | Código do modelo, com 2 posições, digitado pelo usuário — é o próprio código da tabela da SEFAZ, não um sequencial gerado. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. F4 abre a consulta de modelos, F7/F8/F9 navegam entre registros. |
| Descrição do Modelo do Documento Fiscal | `DESCRICAO` | VARCHAR(100) | 100 |  | Nome do modelo. Obrigatório na gravação: o botão Gravar aborta com mensagem de campo vazio. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de modelo fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'` (ativo). |

<a id="ucad_situacao_documento_fiscal"></a>

## `ucad_situacao_documento_fiscal` — Cadastro da Situação do Documento Fiscal

Tabela de apoio `SITUACAO_DOCUMENTO_FISCAL`, chave `CADASTRO`. Três campos apenas. O código cadastrado aqui é o que a Nota Fiscal de Compra e as rotinas de NFe gravam na coluna `SITUACAO_DOCUMENTO_FISCAL` do documento, e os valores são referenciados por número no código do sistema.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da situação, chave do registro. A tela abre com o próximo número livre (maior `CADASTRO` da tabela mais um — numeração global, não por empresa). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de situações. Os códigos usados diretamente no código do sistema são `2` (situação gravada na baixa da nota), `5` (situação aplicada quando a nota é regravada por rotina) e `8` (situação que a Nota Fiscal de Compra trata como exceção, liberando validações). |
| Descrição da Situação do Documento Fiscal | `DESCRICAO` | VARCHAR(100) | 100 |  | Texto da situação, como aparece na nota. Único campo exigido no Gravar — vazio aborta com "Descrição da Situação do Documento". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de situação fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |

<a id="ucad_indicador_forma_pagamento"></a>

## `ucad_indicador_forma_pagamento` — Cadastro do Indicador da Forma de Pagamento da NFe

Grava na tabela INDICADOR_FORMA_PAGAMENTO a tabela de apoio das formas de pagamento da NFe. Cada forma aponta para um indicador de tipo de pagamento do SPED FISCAL, cuja descrição vem por LEFT JOIN com INDICADOR_TIPO_PAGAMENTO. Tela de bloco único, sem abas nem grade, e sem separação por empresa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da forma de pagamento. Proposto como MAX(CADASTRO)+1 da tabela inteira; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Indicador da Forma de Pagamento da NFe | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Serve de referência no log do sistema. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (forma fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| Indicador Pagto | `INDICADOR_TIPO_PAGAMENTO` | INTEGER |  |  | Obrigatório no Gravar. Código do indicador do tipo de pagamento do SPED FISCAL. Ao digitar, o OnSetText do campo confere se o código existe em INDICADOR_TIPO_PAGAMENTO: se existir, grava e traz a descrição ao lado; se não existir, limpa os dois em silêncio. F4 abre a consulta, F3 abre o cadastro de indicadores de tipo de pagamento. |
| Descrição do Indicador do Tipo de Pagamento do SPED FISCAL | `DESCRICAO_INDICADOR_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição do indicador escolhido, trazida do JOIN com INDICADOR_TIPO_PAGAMENTO e reescrita sempre que o código muda. Não é digitada. |

<a id="ucad_indicador_tipo_pagamento"></a>

## `ucad_indicador_tipo_pagamento` — Cadastro do Indicador do Tipo de Pagamento do SPED FISCAL

Tabela de apoio fiscal: grava os indicadores de tipo de pagamento do SPED FISCAL na tabela INDICADOR_TIPO_PAGAMENTO. É a tabela consumida pelo cadastro do indicador da forma de pagamento da NFe (`ucad_indicador_forma_pagamento`). Cadastro simples, sem abas, sem grade e sem separação por empresa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do indicador. Proposto como MAX(CADASTRO)+1 da tabela inteira; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. É este número que a forma de pagamento da NFe grava em INDICADOR_TIPO_PAGAMENTO, e ele deve seguir a tabela oficial do SPED. |
| Descrição do Indicador do Tipo de Pagamento do SPED FISCAL | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Texto livre com o significado do indicador; é essa descrição que aparece no cadastro da forma de pagamento da NFe. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (indicador fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |

<a id="ucad_modalidade_frete"></a>

## `ucad_modalidade_frete` — Cadastro da Modalidade do Frete da NFe

Cadastro das modalidades de frete usadas na NF-e (CIF, FOB, por conta de terceiros, sem frete). Grava na tabela `MODALIDADE_FRETE`, chaveada só por `CADASTRO`. O dataset traz junto, por LEFT JOIN em `INDICADOR_TIPO_FRETE`, a descrição do indicador de frete exigido pelo SPED FISCAL. Tela de campo único, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código sequencial da modalidade. Ao limpar a tela o sistema sugere o próximo código livre (último `CADASTRO` da tabela + 1). Digitar um código existente carrega o registro para alteração. F4 abre a consulta de modalidades, F7/F8/F9 navegam entre registros. |
| Descrição da Modalidade do Frete da NFe | `DESCRICAO` | VARCHAR(60) | 60 |  | Nome da modalidade, como sai na NF-e. Obrigatório na gravação: o botão Gravar aborta com mensagem de campo vazio. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de modalidade fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'` (ativa). |
| Indicador Frete | `INDICADOR_TIPO_FRETE` | INTEGER |  |  | Código do indicador do tipo de frete do SPED FISCAL, ligado ao cadastro `INDICADOR_TIPO_FRETE`. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. Ao digitar, o SetText do campo consulta o cadastro: se o código existir, preenche sozinho a descrição ao lado; se não existir, limpa o próprio código e a descrição. F4 abre a consulta de indicadores, F3 abre o cadastro de indicadores. |
| Descrição do Indicador do Tipo de Frete do SPED FISCAL | `DESCRICAO_INDICADOR_FRETE` | VARCHAR(50) | 50 |  | Nome do indicador, trazido do cadastro `INDICADOR_TIPO_FRETE` pelo JOIN e reescrito pela unidade quando o código é digitado ou escolhido na consulta. Não é digitado pelo usuário (calculado na consulta). |

<a id="ucad_indicador_tipo_frete"></a>

## `ucad_indicador_tipo_frete` — Cadastro do Indicador do Tipo de Frete do SPED FISCAL

Tabela de apoio fiscal: grava os indicadores de tipo de frete usados no SPED FISCAL na tabela INDICADOR_TIPO_FRETE. Cadastro simples, sem abas, sem grade e sem separação por empresa — o SELECT filtra apenas por CADASTRO.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do indicador. Proposto como MAX(CADASTRO)+1 da tabela inteira; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. Aqui o número não é decorativo: é o código do indicador que vai para o arquivo do SPED, então deve seguir a tabela oficial. |
| Descrição do Indicador do Tipo de Frete do SPED FISCAL | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Texto livre com o significado do indicador. Serve de referência no log do sistema. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (indicador fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |

<a id="ucad_tributo_ibs_cbs"></a>

## `ucad_tributo_ibs_cbs` — Cadastro de Classificação Tributária IBS/CBS...

Cadastro da classificação tributária do IBS e da CBS na tabela `TRIBUTO_IBS_CBS`, chave `CADASTRO` — sem `EMPRESA`: o cadastro é único para toda a base. Painel principal com o código de classificação, o CST associado, as reduções e as datas de vigência; um quadro "Configurações" reúne oito marcadores de regime e o destino do crédito. É o cadastro que espelha a tabela oficial da reforma tributária, por isso quase tudo aqui é transcrição do texto legal, e não uma decisão do usuário.

### Campos

#### Cadastro de Classificação Tributária IBS/CBS...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** **·obrig** | `CADASTRO` | VARCHAR(6) | 6 | sim | Código da classificação tributária (cClassTrib), digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com a mensagem "Cadastro o Tributo". F4 abre a consulta de classificações. |
| Descrição | `DESCRICAO` | VARCHAR(1500) | 1500 |  | Texto longo da classificação, copiado da tabela oficial — daí o tamanho de 1500 caracteres. Exigido no Gravar — vazio aborta com "Descrição do Tributo". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de classificação fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| `cbtipo_aliquota` | `TIPO_ALIQUOTA` | VARCHAR(50) | 50 |  | Como a alíquota da classificação é determinada. Valores literais da lista: `FIXA`, `PADRAO`, `SEM ALIQUOTA`, `UNIFORME NACIONAL (REFERENCIA)` e `UNIFORME SETORIAL`. Atenção: o NewRecord grava `Padrão` — com acento e em caixa mista, forma que não existe na lista da tela. |
| Nome | `NOME` | VARCHAR(200) | 200 |  | Nome curto da classificação, para exibição onde a descrição longa não cabe. Exigido no Gravar — vazio aborta com "Nome do Tributo". |
| CST | `CST` | VARCHAR(3) | 3 |  | Código de Situação Tributária do IBS/CBS ao qual esta classificação pertence. Digitado; a tela não faz busca automática. |
| Descrição da CST | `DESCRICAO_CST` | VARCHAR(100) | 100 |  | Texto da CST informada. Também é digitado: não há Exit que o preencha a partir do campo CST. |
| % Red. IBS | `PERCENTUAL_REDUCAO_IBS` | DOUBLE PRECISION |  |  | Percentual de redução aplicado à alíquota do IBS nesta classificação. |
| % Red. CBS | `PERCENTUAL_REDUCAO_CBS` | DOUBLE PRECISION |  |  | Percentual de redução aplicado à alíquota da CBS nesta classificação. |
| Início Vigência | `INICIO_VIGENCIA` | VARCHAR(10) | 10 |  | Data em que a classificação passa a valer. Guardada como texto de 10 posições, não como data — o campo não tem máscara nem validação de calendário. |
| Fim Vigência | `FIM_VIGENCIA` | VARCHAR(10) | 10 |  | Data em que a classificação deixa de valer. Também texto de 10 posições, sem validação. Vazio significa vigência em aberto. |
| Data Atualização | `DATA_ATUALIZACAO` | VARCHAR(10) | 10 |  | Data da última atualização da classificação na tabela oficial. Texto de 10 posições, digitado. |

#### Configurações

Os oito marcadores gravam `'2'` quando marcados e `'1'` quando desmarcados, e todos nascem em `'1'` pelo NewRecord. Descrevem características que a classificação carrega da tabela oficial; não são preferências do usuário.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Redução da Base de Cálculo | `REDUCAO_BASE_CALCULO` | VARCHAR(1) | 1 |  | `'2'` indica que a classificação reduz a base de cálculo; `'1'`, que não reduz. É o marcador que dá sentido aos dois percentuais de redução do painel principal. |
| Tributação Regular | `TRIBUTACAO_REGULAR` | VARCHAR(1) | 1 |  | `'2'` indica tributação regular; `'1'`, que a operação segue regime diferenciado. |
| Operação de Crédito Presumido | `OPERACAO_CREDITO_PRESUMIDO` | VARCHAR(1) | 1 |  | `'2'` indica operação que gera crédito presumido; `'1'`, que não gera. |
| Regime Monofásico | `REGIME_MONOFASICO_PADRAO` | VARCHAR(1) | 1 |  | `'2'` indica regime monofásico padrão; `'1'`, que não se aplica. |
| Regime Monofásico (Retenção) | `REGIME_MONOFASICO_RETENCAO` | VARCHAR(1) | 1 |  | `'2'` indica monofásico com retenção na operação; `'1'`, que não se aplica. |
| Regime Monofásico (Retido Anteriormente) | `REGIME_MONOFASICO_RETIDO_ANT` | VARCHAR(1) | 1 |  | `'2'` indica monofásico já retido em etapa anterior; `'1'`, que não se aplica. |
| Regime Monofásico (Diferimento) | `REGIME_MONOFASICO_DIFERIMENTO` | VARCHAR(1) | 1 |  | `'2'` indica monofásico com diferimento; `'1'`, que não se aplica. |
| Estorno de Crédito | `ESTORNO_CREDITO` | VARCHAR(1) | 1 |  | `'2'` indica que a classificação obriga o estorno do crédito; `'1'`, que não obriga. |
| Crédito Para | `DESTINO_CREDITO` | VARCHAR(500) | 500 |  | Texto que descreve a quem o crédito da operação se destina, transcrito da tabela oficial — daí o tamanho de 500 caracteres. |

<a id="ucad_transportadora"></a>

## `ucad_transportadora` — Cadastro das Transportadoras...

Cadastro da transportadora em três tabelas: o cabeçalho em `TRANSPORTADORA` (chave `EMPRESA` + `CADASTRO`), os motoristas em `IT_TRANSPORTADORA_MOTORISTA` e os veículos em `IT_TRANSPORTADORA_VEICULO`. O painel principal traz identificação, documentos, endereço vindo do CEP e o vínculo com o fornecedor; um controle de abas guarda as Informações Extras e as duas grades, "Motoristas" e "Placas". Motorista e veículo são numerados por transportadora, e o veículo aponta para um motorista da mesma transportadora.

### Campos

#### Cadastro das Transportadoras...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da transportadora, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de transportadoras. |
| Razão Social / Nome da Transportadora | `NOME` | VARCHAR(50) | 50 |  | Razão social da transportadora. Exigido no Gravar de duas formas: vazio aborta com "Nome da Transportadora" e nome com dois caracteres ou menos aborta com o aviso de que o nome deve ter mais de dois caracteres. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço. Ao sair do campo, busca no cadastro de CEP e preenche Cidade e Estado. F3 abre o cadastro de CEP. |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia. O NewRecord grava um espaço em branco de propósito: as consultas concatenam este campo no SQL e um valor nulo apagaria a linha inteira do resultado. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro e número. Digitado — o CEP não preenche este campo. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro. Digitado — o CEP não preenche este campo. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Cidade. Campo somente-leitura na tela: só o CEP o preenche. Exigido no Gravar — vazio aborta com "Cidade da Transportadora", de modo que CEP fora do cadastro impede gravar. |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | Documento da transportadora. Ao sair, o campo é limpo de pontuação e medido: 11 dígitos vira CPF formatado, 14 vira CNPJ formatado, qualquer outro tamanho recusa a saída com "C.N.P.J. ou C.P.F. inválido". Feito o formato, os dígitos verificadores são conferidos e o erro é avisado. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual da transportadora. Não é validada. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone fixo. |
| Fax | `FAX` | VARCHAR(15) | 15 |  | Número de fax. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de transportadora fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Contato da Coleta | `CONTATO` | VARCHAR(30) | 30 |  | Pessoa de contato para agendar a coleta. O NewRecord grava um espaço em branco pelo mesmo motivo da Fantasia. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Cadastro de fornecedor vinculado à transportadora, por onde o frete vira título a pagar. Botão abre a consulta de fornecedores, F3 abre o cadastro. Ao sair, busca o fornecedor: achando, regrava o código e preenche a razão social; não achando, limpa os dois. A exigência deste campo no Gravar existe no código, mas está comentada — hoje não é obrigatório. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Preenchido pelo sistema ao sair do campo Fornecedor. Não é digitado (calculado na consulta). |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | UF do endereço, preenchida pelo sistema a partir do CEP. A lista oferece as 27 UFs mais `EX` (exterior). Exigido no Gravar — vazio aborta com "Estado da Transportadora". |
| Contato Financeiro | `CONTATO_FINANCEIRO` | VARCHAR(30) | 30 |  | Pessoa de contato no financeiro da transportadora. |
| Enviar Comunicado por E-mail quando a NFe estiver Autorizada ou Cancelada | `ENVIAR_EMAIL_NFE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord já inicia em `'2'` (marcado). Com `'2'` o campo Email NFe passa a ser obrigatório: o Gravar aborta com "E-mail da NFe" se ele estiver vazio. |

#### Informações Extras

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| RNTRC | `RNTRC` | VARCHAR(12) | 12 |  | Registro Nacional de Transportadores Rodoviários de Carga da empresa. |
| Email | `EMAIL` | VARCHAR(60) | 60 |  | E-mail geral da transportadora. O NewRecord grava um espaço em branco pelo mesmo motivo da Fantasia. |
| Email NFe | `EMAIL_NFE` | VARCHAR(60) | 60 |  | E-mail para o comunicado de NFe autorizada ou cancelada. Só é exigido quando o marcador de envio por e-mail está em `'2'`; nesse caso, vazio aborta o Gravar com "E-mail da NFe". |
| Home Page | `HOME_PAGE` | VARCHAR(60) | 60 |  | Endereço do site. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Texto livre. Enter dentro do memo pula linha; dois Enters seguidos saem do campo. |

### Grade `dbtransportadora_motorista` — tabela IT_TRANSPORTADORA_MOTORISTA

Aba "Motoristas". A linha nova recebe `EMPRESA`, `CADASTRO` (o da transportadora) e `SEQ` (maior sequência daquela transportadora mais um) no NewRecord. Depois de gravada, a linha é conferida: sem nome ou sem documento, ela é apagada.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Motorista **·chave** | `SEQ` | INTEGER |  | Sequência do motorista dentro da transportadora, gerada pelo sistema no NewRecord. É por este número que o veículo aponta para o motorista. |
| Razão Social / Nome do Motorista | `NOME` | VARCHAR(50) | 50 | Nome do motorista. O sistema converte o texto para maiúsculas ao gravar. Obrigatório de fato: linha sem nome é apagada depois do post. |
| C.P.F. | `CNPJ_CPF` | VARCHAR(18) | 18 | Documento do motorista. Ao confirmar, o texto é limpo de pontuação e medido: 11 dígitos vira CPF formatado, 14 vira CNPJ formatado, outro tamanho recusa com "C.N.P.J. ou C.P.F. inválido". Os dígitos verificadores são conferidos e o campo é limpo se estiverem errados. Obrigatório de fato: linha sem documento é apagada depois do post. |

### Grade `dbtransportadora_veiculo` — tabela IT_TRANSPORTADORA_VEICULO

Aba "Placas". A linha nova recebe `EMPRESA`, `CADASTRO` (o da transportadora) e `CODIGO_INTERNO` (maior daquela transportadora mais um) no NewRecord. Antes de gravar, a placa é procurada em outros veículos da mesma transportadora e, se já existir, o aviso "Placa já cadastrada" cancela a linha. Depois de gravada, linha sem Tipo é apagada.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CODIGO_INTERNO` | INTEGER |  | Sequência do veículo dentro da transportadora, gerada pelo sistema no NewRecord. |
| Tipo | `TIPO` | VARCHAR(10) | 10 | Papel do veículo na composição. O campo guarda o texto, não um código, e só aceita dois valores: `Tração` e `Reboque`. Digitar `T`, `TRACAO` ou `TRAÇÃO` grava `Tração`; `R` ou `REBOQUE` grava `Reboque`; qualquer outra coisa limpa o campo — e linha sem Tipo é apagada depois do post. |
| Placa | `PLACA` | VARCHAR(8) | 8 | Placa do veículo. O sistema converte para maiúsculas e insere o hífen depois do terceiro caractere quando ele não foi digitado. Não pode repetir dentro da mesma transportadora. |
| UF Placa | `ESTADO_PLACA` | VARCHAR(2) | 2 | UF de emplacamento. Conferida contra uma lista fixa no código com as 27 UFs mais `EX` (exterior); texto fora da lista não é gravado e o valor anterior permanece. |
| Motorista | `MOTORISTA` | INTEGER |  | Sequência do motorista que dirige o veículo, dentro da mesma transportadora. Ao confirmar o número, busca o motorista: achando, preenche o Nome do Motorista; não achando, limpa os dois. O botão da coluna abre a consulta de motoristas daquela transportadora. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 | Preenchido pelo sistema a partir da sequência do motorista. Não é digitado (calculado na consulta). |
| Tara | `TARA` | INTEGER |  | Peso do veículo vazio, em quilos. |
| Cap. Kg | `CAPACIDADE_KG` | DOUBLE PRECISION |  | Capacidade de carga do veículo, em quilos. |
| Cap. M³ | `CAPACIDADE_M3` | DOUBLE PRECISION |  | Capacidade de carga do veículo, em metros cúbicos. |

<a id="ucad_tributo_pis"></a>

## `ucad_tributo_pis` — Cadastro do Codigo da Situação Tributaria PIS...

Tabela de apoio `TRIBUTO_PIS`, chave `EMPRESA` + `CADASTRO`. Só dois campos. Guarda os códigos de Situação Tributária do PIS, de dois dígitos, que os documentos fiscais e o arquivo da NFe consomem.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | O próprio código CST do PIS, de dois dígitos, digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Código do Tributo PIS". F4 abre a consulta. |
| Descrição da Situação Tributaria PIS | `DESCRICAO` | VARCHAR(120) | 120 |  | Texto oficial da situação tributária do PIS. Exigido no Gravar — vazio aborta com "Descrição da Tributação PIS". |

<a id="ucad_tributo_cofins"></a>

## `ucad_tributo_cofins` — Cadastro do Codigo da Situação Tributaria COFINS...

Tabela de apoio `TRIBUTO_COFINS`, chave `EMPRESA` + `CADASTRO`. Só dois campos. Guarda os códigos de Situação Tributária da COFINS, de dois dígitos, que os documentos fiscais e o arquivo da NFe consomem.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | O próprio código CST da COFINS, de dois dígitos, digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Código do Tributo COFINS". F4 abre a consulta. |
| Descrição da Situação Tributaria COFINS | `DESCRICAO` | VARCHAR(120) | 120 |  | Texto oficial da situação tributária da COFINS. Exigido no Gravar — vazio aborta com "Descrição da Tributação COFINS". |

<a id="ucad_tributo_ipi"></a>

## `ucad_tributo_ipi` — Cadastro do Codigo da Situação Tributaria IPI...

Tabela de apoio `TRIBUTO_IPI`, chave `EMPRESA` + `CADASTRO`. Só dois campos. Guarda os códigos de Situação Tributária do IPI, de dois dígitos, que os documentos fiscais e o arquivo da NFe consomem.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | O próprio código CST do IPI, de dois dígitos, digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Código do Tributo IPI". F4 abre a consulta. |
| Descrição da Situação Tributaria IPI | `DESCRICAO` | VARCHAR(120) | 120 |  | Texto oficial da situação tributária do IPI. Exigido no Gravar — vazio aborta com "Descrição da Tributação IPI". |

<a id="ucad_tributo_simples_nacional"></a>

## `ucad_tributo_simples_nacional` — Cadastro da Situação da Operação no Simples Nacional

Tabela de apoio `TRIBUTO_SIMPLES_NACIONAL`, chave `EMPRESA` + `CADASTRO`. Só dois campos na tela. Guarda os códigos CSOSN — a situação da operação para quem é do Simples Nacional — de três dígitos: `101`, `102`, `103`, `201`, `202`, `203`, `300`, `400`, `500` e `900`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(3) | 3 |  | O próprio código CSOSN, de três dígitos, digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Cadastro da Situação da Operação no Simples Nacional". F4 abre a consulta. |
| Descrição da Situação da Operação no Simples Nacional | `DESCRICAO` | VARCHAR(120) | 120 |  | Texto oficial do CSOSN. Exigido no Gravar — vazio aborta com "Descrição da Situação da Operação no Simples Nacional". |

<a id="ucad_motivo_desoneracao_icms"></a>

## `ucad_motivo_desoneracao_icms` — Cadastro de Motivo de Desoneração do ICMS...

Cadastra os motivos de desoneração do ICMS exigidos na NF-e e amarra cada motivo aos tributos de ICMS em que ele pode ser usado. O cabeçalho grava em `MOTIVO_DESONERACAO_ICMS` (chave só `CADASTRO`, tabela global sem `EMPRESA`); a grade grava em `IT_MOTIVO_DESONERACAO_ICMS`, uma linha por tributo, chaveada por `CADASTRO` + `SEQ`. A descrição do tributo vem por LEFT JOIN em `TRIBUTO`, filtrado pela empresa logada.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código sequencial do motivo. Ao limpar a tela o sistema sugere o próximo código livre. Digitar um código existente carrega o registro para alteração. F4 abre a consulta de motivos, F7/F8/F9 navegam entre registros. Grava com tratamento de chave duplicada: se dois usuários gravarem o mesmo código, a tela avisa que o registro está sendo usado por outro usuário e desfaz. |
| Descrição da Rota | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição do motivo de desoneração. O rótulo da tela está errado — é sobra de outra tela; a mensagem de validação também erra e fala em Descrição do Centro de Custo. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de motivo fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'` (ativo). |

### Grade `dbtributo` — tabela IT_MOTIVO_DESONERACAO_ICMS

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Tributo | `TRIBUTO_ICMS` | INTEGER |  | Código do tributo de ICMS em que o motivo vale, ligado ao cadastro `TRIBUTO` da empresa. Digitar o código dispara o SetText, que busca o tributo e traz a descrição; código não encontrado deixa a descrição em branco. O botão de reticências na célula e a tecla F4 abrem a consulta de tributos. A `SEQ` da linha é gerada sozinha no NewRecord da grade (MAX(SEQ) + 1 do mesmo motivo) e não aparece na tela. |
| Descrição do Tributo de ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 | Nome do tributo, trazido do cadastro `TRIBUTO` pelo JOIN. Somente leitura na grade; não é digitado (calculado na consulta). |

<a id="ucad_consumo_energia_eletrica"></a>

## `ucad_consumo_energia_eletrica` — Cadastro do Consumo de Energia Elétrica

Tela de cadastro simples, sem abas nem grade. Grava na tabela `CONSUMO_ENERGIA_ELETRICA`, um registro por classe de consumo de energia, com código, descrição e marcador de inativo. É a gêmea da tela de consumo de água canalizada, com o mesmo comportamento e uma descrição mais curta.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | Código da classe de consumo, de até 2 caracteres, digitado pelo usuário — não há sequencial automático. É a chave da tabela. Ao sair do campo o sistema procura o código: se existir, carrega o registro para alteração; se não existir, inicia um registro novo já com esse código. F4 (ou o botão do campo) abre a consulta de classes; F7 volta para o código anterior, F8 avança para o próximo e F9 posiciona no maior código menor ou igual ao digitado. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Descrição da Classe de Consumo de Energia Elétrica | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da classe de consumo. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. É o texto usado no log do sistema e o índice da tela de consulta. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de registro fora de uso. Valores `'2'` = inativo (caixa marcada) e `'1'` = ativo (caixa desmarcada). O NewRecord grava `'1'`, ou seja, todo registro nasce ativo. |

<a id="ucad_consumo_agua_canalizada"></a>

## `ucad_consumo_agua_canalizada` — Cadastro do Consumo de Água Canalizada

Tela de cadastro simples, sem abas nem grade. Grava na tabela `CONSUMO_AGUA_CANALIZADA`, um registro por classe de consumo de água, com código, descrição e marcador de inativo. Serve de tabela de apoio para a classificação de consumo de água usada na escrituração fiscal.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | Código da classe de consumo, de até 2 caracteres, digitado pelo usuário — não há sequencial automático. É a chave da tabela. Ao sair do campo o sistema procura o código: se existir, carrega o registro para alteração; se não existir, inicia um registro novo já com esse código. F4 (ou o botão do campo) abre a consulta de classes; F7 volta para o código anterior, F8 avança para o próximo e F9 posiciona no maior código menor ou igual ao digitado. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Descrição da Classe de Consumo de Água Canalizada | `DESCRICAO` | VARCHAR(120) | 120 |  | Nome da classe de consumo. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. É o texto usado no log do sistema e o índice da tela de consulta (`IDXDESCRICAO_CONSUMO_AGUA`). |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de registro fora de uso. Valores `'2'` = inativo (caixa marcada) e `'1'` = ativo (caixa desmarcada). O NewRecord grava `'1'`, ou seja, todo registro nasce ativo. |

<a id="ucad_grupo_tensao_energia_eletrica"></a>

## `ucad_grupo_tensao_energia_eletrica` — Cadastro do Grupo de Tensão da Energia Elétrica

Tabela de apoio fiscal para notas de energia elétrica: grava o grupo de tensão na tabela GRUPO_TENSAO_ENERGIA_ELETRICA. Cadastro simples, sem abas e sem grade, e sem separação por empresa. Diferente da maioria dos cadastros, o código não é numérico nem gerado pelo sistema.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(2) | 2 |  | Código do grupo de tensão, digitado pelo usuário — a tela não sugere valor nenhum ao limpar, e o campo aceita letras. Obrigatório no Gravar. Limitado a 2 caracteres na tela e também na volta da consulta, que só aceita o retorno se tiver até 2 caracteres. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Grupo de Tensão da Energia Elétrica | `DESCRICAO` | VARCHAR(120) | 120 |  | Obrigatória no Gravar. Serve de referência no log do sistema. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (grupo fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |

<a id="ucad_modelo_etiqueta"></a>

## `ucad_modelo_etiqueta` — Cadastro do Modelo de Etiquetas

Cadastro dos modelos de etiqueta usados na impressão de código de barras. Grava na tabela `MODELO_ETIQUETA`, chaveada por `EMPRESA` + `CADASTRO`. Além do nome do modelo, guarda o formato de impressão (quantas etiquetas por linha) e a porta em que a impressora está ligada. Tela de campo único, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Modelo do Documento Fiscal | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do modelo de etiqueta. O rótulo da tela está errado — é sobra de copiar a tela de modelo de documento fiscal; o campo é a descrição da etiqueta, e as validações da unidade o chamam de Descrição do Modelo das Etiquetas. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de modelo fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'` (ativo). |
| Colunas | `COLUNA_ETIQUETA` | INTEGER |  |  | Quantas etiquetas o formulário tem lado a lado, por linha de impressão. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. |
| Porta de Comunicação | `PORTA_COMUNICACAO` | VARCHAR(50) | 50 |  | Porta em que a impressora de etiquetas está ligada, digitada em caixa alta (o controle força maiúsculas). Texto livre, do tipo LPT1 ou COM1. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código sequencial do modelo. Ao limpar a tela o sistema sugere o próximo código livre (MAX(CADASTRO) + 1 da empresa). Digitar um código existente carrega o registro para alteração; um código acima do último abre a seleção que pergunta se usa o próximo da sequência ou o digitado. F4 abre a consulta de modelos, F7/F8/F9 navegam entre registros. |

<a id="ucad_rota"></a>

## `ucad_rota` — Cadastro de Rota...

Cadastro de rota de entrega em duas tabelas: o cabeçalho em `ROTA` (chave `CADASTRO`) e os estados que a rota atende em `IT_ROTA`. O cabeçalho tem código, descrição e sigla; a grade lista as UFs.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da rota, chave do registro. A tela abre com o próximo número livre (maior `CADASTRO` da tabela mais um — aqui a numeração é global, não por empresa). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de rotas. |
| Descrição da Rota | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da rota. Único campo exigido no Gravar — vazio aborta, embora a mensagem diga "Descrição do Centro de Custo", texto herdado de outra tela. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de rota fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Sigla | `SIGLA` | VARCHAR(10) | 10 |  | Abreviação da rota, para uso em listagens e etiquetas. |

### Grade `dbrota` — tabela IT_ROTA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Estado | `ESTADO` | VARCHAR(2) | 2 | UF atendida pela rota. Único campo digitável da grade. O texto é conferido contra uma lista fixa de 28 siglas gravada no próprio código — as 27 UFs mais `EX` (exterior): aceita, grava em maiúsculas e preenche o Nome do Estado; não aceita, limpa os dois. |
| Nome do Estado | `NOME_ESTADO` | VARCHAR(50) | 50 | Nome do estado por extenso, escrito pelo sistema a partir da sigla, sem acentos (`SAO PAULO`, `PARANA`, `EXTERIOR`). Não é digitado. Se ficar vazio depois de gravar, a linha é apagada. |

A linha nova recebe `CADASTRO` (o do cabeçalho) e `SEQ` (maior sequência da rota mais um) no NewRecord, sem passar pela tela.

<a id="ucad_impressora"></a>

## `ucad_impressora` — Cadastro das Impressoras...

Grava as impressoras usadas pelo sistema na tabela IMPRESSORA, por empresa. Bloco único de três campos, sem abas, sem grade e sem marcador de inativo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da impressora. Proposto como MAX(CADASTRO)+1 da empresa; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição da Impressora | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar (a mensagem de erro fala em Descrição do Tipo de Frete, sobra de cópia de outra tela). Serve de referência no log do sistema. |
| `edtporta_comunicacao` | `PORTA_COMUNICACAO` | VARCHAR(100) | 100 |  | Sem rótulo casado por geometria. O rótulo acima do campo diz Porta de Comunicação (Descrição da Impressora no Painel de Controle): guarda o destino de impressão, ou seja, o nome exato com que a impressora aparece no Painel de Controle do Windows, ou a porta local. Texto livre, sem validação nem lista de opções. |

<a id="ucad_atividade"></a>

## `ucad_atividade` — Cadastro de Atividades

Cadastro de atividades (tarefas) na tabela `ATIVIDADE`, chave `EMPRESA` + `CADASTRO`. Tela de três campos, sem abas nem grade. Além do que aparece na tela, o NewRecord grava `EMPRESA` com a empresa logada, `USUARIO_SISTEMA` com o usuário que está criando a atividade e `FINALIZADO` em branco.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** **·obrig** | `CADASTRO` | INTEGER |  | sim | Número sequencial da atividade. O sistema já abre a tela com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Se o usuário digitar um número acima do último, a tela pergunta por `frmselecao_cadastro_novo` se deve usar o próximo da sequência ou o número digitado. F4 consulta, F7/F8/F9 navegam. |
| Descrição da Atividade | `TEXTO` | VARCHAR(1000) | 1000 |  | Texto da atividade. Único campo realmente exigido no Gravar: vazio aborta com "Texto". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de atividade desativada. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativa). Marcar como inativa (`'2'`) faz o BeforePost limpar `FINALIZADO`, ou seja, a atividade deixa de contar como concluída. |

<a id="ucad_natureza_operacao"></a>

## `ucad_natureza_operacao` — Cadastro da Natureza de Operação

Cadastro das naturezas de operação (CFOP) usadas nos lançamentos fiscais, gravado na tabela `NATUREZA_OPERACAO`. O bloco de cima guarda o código, a descrição e todos os códigos tributários (CST de ICMS, IPI, PIS, COFINS, CSOSN, CENQ, benefício fiscal e IBS/CBS); as caixas " Configurações ", " SPED FISCAL " e " Configurações da CFOP " guardam os marcadores que dizem o que o documento faz ao ser lançado. A aba Extensões tem uma grade própria, na tabela `IT_NATUREZA_OPERACAO`.

Todos os marcadores desta tela usam a mesma convenção: `'2'` marcado, `'1'` desmarcado.

### Campos

#### Cadastro da Natureza de Operação

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(10) | 10 |  | Código da natureza de operação (o CFOP). Digitado pelo usuário — não é sequencial. Obrigatório: o Gravar recusa a gravação com o campo vazio. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição da Natureza de Operação | `DESCRICAO` | VARCHAR(70) | 70 |  | Descrição interna da natureza, usada nas consultas. Obrigatória no Gravar. |
| Legislação | `LEGISLACAO` | INTEGER |  |  | Código da legislação (texto legal) ligada à natureza. F4 abre a consulta já filtrada por `TIPO_LANCAMENTO = 'Venda'` e F3 abre o cadastro de legislações. O Gravar verifica o registro escolhido e recusa a gravação se a legislação for de `TIPO_LANCAMENTO = 'Compra'`. |
| Descrição da Legislação | `DESCRICAO_LEGISLACAO` | VARCHAR(50) | 50 |  | Descrição da legislação escolhida. Não é digitada: copiada de LEGISLACAO.DESCRICAO ao sair do código ou ao escolher pela consulta; se o código não existir, os dois campos são limpos. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador. `'2'` marcado (natureza inativa, não deve ser oferecida em novos lançamentos), `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Descrição na Nota Fiscal | `DESCRICAO_NOTA_FISCAL` | VARCHAR(50) | 50 |  | Texto que sai impresso como natureza da operação na nota fiscal. Obrigatório no Gravar; é separado da descrição interna justamente porque é o texto do documento. |
| CST ICMS | `TRIBUTO` | VARCHAR(8) | 8 |  | Código da situação tributária do ICMS (origem mais CST). F4 abre a consulta de tributos e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. Obrigatório no Gravar. |
| Descrição da Situação Tributária do ICMS | `DESCRICAO_TRIBUTO` | VARCHAR(50) | 50 |  | Descrição do CST de ICMS. Não é digitada: copiada de TRIBUTO.DESCRICAO ao sair do código ou pela consulta. |
| CST IPI | `TRIBUTO_IPI` | VARCHAR(2) | 2 |  | Código da situação tributária do IPI. F4 abre a consulta e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. Não é exigido no Gravar. |
| Descrição da Situação Tributária do IPI | `DESCRICAO_TRIBUTO_IPI` | VARCHAR(120) | 120 |  | Descrição do CST de IPI, copiada do cadastro ao informar o código. |
| CST PIS | `TRIBUTO_PIS` | VARCHAR(2) | 2 |  | Código da situação tributária do PIS. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. |
| Descrição da Situação Tributária do PIS | `DESCRICAO_TRIBUTO_PIS` | VARCHAR(120) | 120 |  | Descrição do CST de PIS, copiada do cadastro ao informar o código. |
| CST COFINS | `TRIBUTO_COFINS` | VARCHAR(2) | 2 |  | Código da situação tributária do COFINS. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. |
| Descrição da Situação Tributária do COFINS | `DESCRICAO_TRIBUTO_COFINS` | VARCHAR(120) | 120 |  | Descrição do CST de COFINS, copiada do cadastro ao informar o código. |
| Descrição da Situação da Operação no Simples Nacional | `DESCRICAO_SIMPLES_NACIONAL` | VARCHAR(120) | 120 |  | Descrição da CSOSN. Não é digitada: copiada do cadastro de tributos do Simples Nacional ao informar o código. |
| CSOSN | `TRIBUTO_SIMPLES_NACIONAL` | VARCHAR(3) | 3 |  | Código de situação da operação no Simples Nacional, usado no lugar do CST de ICMS quando a empresa é optante. F4 abre a consulta e F3 o cadastro; código inexistente limpa os dois campos. |
| CENQ | `CENQ` | VARCHAR(3) | 3 |  | Código de enquadramento legal do IPI. F4 abre a consulta e F3 o cadastro; código inexistente limpa código e descrições. |
| Descrição do Cadastro do Enquadramento do IPI | `DESCRICAO_CENQ_VARCHAR` | VARCHAR(100) | 100 |  | Descrição do enquadramento do IPI. Campo calculado no Delphi: o OnCalcFields corta `DESCRICAO_CENQ` nos primeiros 100 caracteres para caber no edit. |
| Benef. Fiscal | `BENEFICIO_FISCAL` | VARCHAR(10) | 10 |  | Código do benefício fiscal (cBenef) aplicado à operação. F4 abre a consulta de benefícios e F3 o cadastro; código inexistente limpa código e descrição. |
| Descrição do Benefício Fiscal | `DESC_BENEFICIO_FISCAL_STRING` | VARCHAR(100) | 100 |  | Descrição do benefício fiscal. Somente leitura. Campo calculado no Delphi: primeiros 100 caracteres de `DESCRICAO_BENEFICIO_FISCAL`. |
| Tributo IBS/CBS | `TRIBUTO_IBS_CBS` | VARCHAR(6) | 6 |  | Código da classificação tributária de IBS/CBS (reforma tributária). F4 abre a consulta e F3 o cadastro. |
| Descrição do Tributo IBS/CBS | `NOME_TRIBUTO_IBS_CBS` | VARCHAR(200) | 200 |  | Nome da classificação IBS/CBS. Não é digitado: copiado de TRIBUTO_IBS_CBS.NOME ao informar o código. |

#### Configurações

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Controle das Operações de Mercadorias | `TIPO_OPERACAO_MERCADORIA` | VARCHAR(1) | 1 |  | Radiogroup de três opções: `'1'` Não Controla, `'2'` Registra a Entrada das Mercadorias, `'3'` Registra a Baixa das Mercadorias. Define o sentido do movimento de mercadoria que o documento gera. Novo registro nasce com `'1'`. |

#### SPED FISCAL

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Gera Crédito/Débito de IPI | `CREDITO_DEBITO_IPI` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Quando marcado, a operação entra na apuração do IPI. Novo registro nasce com `'1'`. |
| Gera Crédito/Débito de ICMS | `CREDITO_DEBITO_ICMS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Quando marcado, a operação entra na apuração do ICMS. Novo registro nasce com `'1'`. |
| Gera Crédito/Débito de PIS | `GERA_CREDITO_DEBITO_PIS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Gera Crédito/Débito de COFINS | `GERA_CREDITO_DEBITO_COFINS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Movimenta Estoque das Mercadorias | `MOVIMENTA_ESTOQUE` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Diz se o documento movimenta estoque no bloco de inventário do SPED. Novo registro nasce com `'1'`. |
| Utiliza Nota Fiscal Referenciada | `USA_NOTA_FISCAL_REFERENCIADA` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado quando a operação exige informar a nota de origem (devoluções, complementos). Novo registro nasce com `'1'`. |
| Gera Crédito/Débito de Substituição Tributária | `GERA_CREDITO_DEBITO_ST` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Deduzir ICMS da Base do PIS/COFINS | `DEDUZIR_ICMS_BASE_PIS_COFINS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. É o único marcador da tela que nasce marcado: novo registro recebe `'2'`. |

#### Configurações da CFOP

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Incide IPI | `INCIDE_IPI` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Incide ICMS | `INCIDE_ICMS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Incide Desconto ICMS (Suframa) | `DESCONTO_ICMS_SUFRAMA` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado nas operações para a Zona Franca, em que o ICMS é abatido do preço. Novo registro nasce com `'1'`. |
| Gera Comissão | `GERA_COMISSAO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Quando marcado, o documento gera comissão de representante. Novo registro nasce com `'1'`. |
| Consignação | `CONSIGNACAO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Identifica a natureza como operação de consignação. Novo registro nasce com `'1'`. |
| Gera Fatur./Compra Operacional | `GERA_FATURAMENTO_OPERACIONAL` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Quando marcado, o documento conta como faturamento (na saída) ou compra (na entrada) para os relatórios operacionais. Novo registro nasce com `'1'`. |
| Gera Duplicata | `GERA_DUPLICATA` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Quando marcado, o lançamento gera títulos no financeiro. Novo registro nasce com `'1'`. |
| Controla Estoque | `CONTROLA_ESTOQUE` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Incide Subs. Tributária | `INCIDE_SUBSTITUICAO_TRIBUTARIA` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Devolução de Venda | `DEVOLUCAO_VENDA` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Identifica a natureza como devolução de venda. Novo registro nasce com `'1'`. |
| Produção de Terceiros | `PRODUCAO_TERCEIROS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Identifica operações de industrialização por conta de terceiros. Novo registro nasce com `'1'`. |
| Exceções da Lei 10.297/96, Art. 19, III, "n" (não utilizar a alíquota de 12%) | `EXCECAO_ALIQUOTA_12_SC` | VARCHAR(1) | 1 |  | Campo sem rótulo próprio no arranjo da tela; o texto acima é a legenda do checkbox. `'2'` marcado, `'1'` desmarcado. Marcado, a natureza fica fora da alíquota de 12% de SC. A dica do controle lista as exceções: produtos tributados a 25%; uso e consumo ou ativo imobilizado; produtos usados em prestação de serviço sujeita ao ISS; saídas de têxteis, vestuário e artefatos de couro do próprio industrial. Novo registro nasce com `'1'`. |
| Utiliza Preço de Custo na Nota Fiscal | `USA_PRECO_CUSTO_NOTA_FISCAL` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, o documento sai valorizado pelo preço de custo do produto em vez do preço de venda (remessas, amostras). Novo registro nasce com `'1'`. |
| Gera Partilha do ICMS | `GERA_PARTILHA_ICMS` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado nas vendas interestaduais a consumidor final, que exigem o DIFAL partilhado. Novo registro nasce com `'1'`. |
| Nota Fiscal de Exportação | `NOTA_FISCAL_EXPORTACAO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Nota Fiscal de Importação | `NOTA_FISCAL_IMPORTACAO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Sempre Utilizar CST do Produto em Vendas Interestaduais | `USA_CST_PRODUTO_VENDA_INTER` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, a venda interestadual usa o CST cadastrado no produto e ignora o CST desta natureza. Único marcador que o NewRecord não inicializa. |

### Grade `RxDBGrid1` — tabela IT_NATUREZA_OPERACAO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `EXTENSAO` | VARCHAR(3) | 3 | Código da extensão que qualifica esta natureza. É digitado direto na grade: o botão de reticências da coluna não tem ação ligada, então não abre consulta. O SEQ da linha é gerado no NewRecord como `MAX(SEQ) + 1` dentro da natureza. Delete na linha exclui a extensão. |
| Descrição da Extensão | `DESCRICAO` | VARCHAR(50) | 50 | Texto da extensão, digitado na própria grade e gravado em IT_NATUREZA_OPERACAO — a grade não copia a descrição do cadastro `ucad_natureza_operacao_extensao`. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Tipo | `TIPO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Tipo”. Função não verificada no código. |

<a id="ucad_tributo"></a>

## `ucad_tributo` — Cadastro do Codigo da Situação Tributaria...

Tabela de apoio `TRIBUTO`, chave `EMPRESA` + `CADASTRO`. Só dois campos. Guarda os códigos de Situação Tributária do ICMS (CST) usados pelo sistema: é este cadastro que a Natureza de Operação consulta quando pede o "CST do ICMS", e é dele que a alíquota por estado e o motivo de desoneração buscam o tributo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(8) | 8 |  | O próprio código da situação tributária do ICMS, digitado pelo usuário — não há sequencial nesta tela. Ao sair do campo, a tela refaz a consulta por este código: existindo, abre em edição; não existindo, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Código do Tributo". F4 abre a consulta de tributos. |
| Descrição da Situação Tributaria | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto oficial da situação tributária. Exigido no Gravar — vazio aborta com "Descrição da Tributação". |

<a id="ucad_legislacao"></a>

## `ucad_legislacao` — Cadastro de Legislação...

Grava na tabela LEGISLACAO os textos legais que a nota fiscal cita (isenções, reduções, regimes especiais), por empresa. Além da descrição curta e do detalhamento longo, o registro é marcado como de compra ou de venda, o que separa a lista conforme o tipo de operação. Tela de bloco único, sem abas nem grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da legislação. Proposto como MAX(CADASTRO)+1 da empresa e regravado com esse valor na inclusão; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição da Legislação | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Nome curto da legislação, usado nas consultas e no log do sistema. |
| Detalhamento da Legislação | `OBSERVACAO` | VARCHAR(500) | 500 |  | Obrigatório no Gravar. Texto completo que vai para os dados adicionais da nota. Digitado em memo, sem MaxLength no controle: o limite de 500 caracteres só é cobrado na hora de gravar, com aviso informando quantos caracteres foram digitados. Enter dentro do memo quebra linha; dois Enters seguidos passam para o próximo campo. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (legislação fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| `cbtipo_lancamento` | `TIPO_LANCAMENTO` | VARCHAR(10) | 10 |  | Combo à direita. Grava o texto escolhido, sem tradução: `'Compra'` ou `'Venda'` (o EnableValues está desligado, então a lista Values do DFM é ignorada). Define em que tipo de operação a legislação pode ser usada. NewRecord inicia em `'Compra'`. Campo não presente n |

<a id="ucad_tipo_frete"></a>

## `ucad_tipo_frete` — Cadastro dos Tipos de Frete...

Tabela de apoio `TIPO_FRETE`, chave `EMPRESA` + `CADASTRO`. Só dois campos: código e descrição. Alimenta a escolha do tipo de frete nos documentos; não há marcador de inativo nem qualquer campo codificado nesta tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do tipo de frete, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de tipos de frete. |
| Descrição do Tipo de Frete | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do tipo de frete. Único campo exigido no Gravar — vazio aborta com "Descrição do Tipo de Frete". |

<a id="ucad_ramo_atividade"></a>

## `ucad_ramo_atividade` — Cadastro de Ramo \ Atividade...

Cadastro do ramo de atividade usado na classificação de clientes e fornecedores, gravado na tabela `RAMO_ATIVIDADE`. Tela de dois campos, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do ramo de atividade. Sugerido pelo sistema como `MAX(CADASTRO) + 1` da tabela RAMO_ATIVIDADE dentro da empresa corrente. Se o código digitado não existir, a tela pergunta se grava com ele ou com o próximo da sequência. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição do Ramo de Atividade | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do ramo de atividade. Obrigatório: o Gravar recusa a gravação com o campo vazio. |

---

# Módulo 2 — Compras

26 telas.

<a id="umov_controle_operacao_mercadoria_baixa"></a>

## `umov_controle_operacao_mercadoria_baixa` — Baixa do Controle das Operações das Mercadorias...

Tela de baixa manual do saldo de mercadorias em operação triangular (remessa e retorno). A
janela é uma grade só, alimentada por um ClientDataSet em memória (`tbtemp`): nada na grade é
coluna de tabela. As linhas vêm de CONTROLE_OPERACAO_MERCADORIA com SALDO maior que zero, e o
Gravar transforma cada linha com quantidade baixada em um registro de
IT_CONTROLE_OPERACAO_MERCADORIA, cujo AfterPost abate a quantidade do SALDO da
CONTROLE_OPERACAO_MERCADORIA correspondente.

O que é carregado depende da variável global `vtipo`. Com `vtipo` igual a 'Compra' a tela lista
as mercadorias com TIPO_NOTA_FISCAL 'Venda/Saida', descritas por IT_NOTA. Com 'Venda' lista
dois blocos, 'Compra/Entrada' descrito por IT_ENTRADA e 'Venda/Entrada' descrito por IT_NOTA.
Quando a tela é aberta fora do fluxo das telas de baixa manual de nota fiscal, entra também o
filtro por CNPJ/CPF da variável global `vcnpj_cpf`. Sem nenhuma linha a janela se fecha sozinha.
O registro gravado guarda ainda o número e a série da nota fiscal que está consumindo o saldo,
vindos das variáveis globais, e a data de hoje.

### Grade `RxDBGrid1` — ClientDataSet `tbtemp`, sem tabela no banco

Só a última coluna é digitável: o cursor entra direto em Qtde Baixa e as colunas anteriores são
puladas na navegação. Ponto é convertido em vírgula na digitação da quantidade.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nota Fiscal | `NUMERO` | INTEGER |  | Número da nota fiscal de origem da mercadoria em operação (calculado na consulta). |
| C.F.O.P. | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | Natureza de operação da nota de origem, o CFOP que caracterizou a remessa (calculado na consulta). |
| Código | `CODIGO` | INTEGER |  | Código do produto, trazido da coluna PRODUTO do controle. Coluna somente leitura (calculado na consulta). |
| Descrição da Mercadoria | `DESCRICAO_MERCADORIA` | VARCHAR(150) | 150 | Descrição do item, vinda de IT_NOTA nas notas de venda e de IT_ENTRADA nas de compra. Coluna somente leitura (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade original da operação. Coluna somente leitura (calculado na consulta). |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo ainda pendente de retorno. Recalculado na tela como o saldo original menos a quantidade digitada, e abatido de verdade no banco só no Gravar (calculado na consulta). |
| Qtde Baixa | `QUANTIDADE_BAIXADA` | DOUBLE PRECISION |  | Quantidade a baixar nesta operação, o único campo digitado. Linha com valor zero é ignorada no Gravar; com valor maior que zero, gera o item de baixa e abate o saldo (calculado na consulta). |

<a id="ucad_fornecedor"></a>

## `ucad_fornecedor` — Cadastro de Fornecedores

Cadastro completo de fornecedores, gravado na tabela `FORNECEDOR`. O painel de cima reúne identificação, endereço, documentos fiscais, amarração contábil e fiscal, transportadora e frete; ao lado dele fica o quadro de preferência de vencimentos do pedido de compra. Abaixo, um controle de abas: Informações Adicionais traz contatos, representante e desconto, com o quadro Dados do Representante somente de exibição; Documentos traz a grade de anexos, gravada em `IT_FORNECEDOR_DOCUMENTOS`. Descrições de cidade, país, tipo de fornecedor, plano de contas, natureza de operação, transportadora, modalidade de frete e representante vêm por LEFT JOIN. Todo registro gravado por esta tela recebe `ACERTO_CADASTRO = '2'` no BeforePost, o que o tira da lista da tela de acerto de fornecedores.

#### Cadastro de Fornecedores

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do fornecedor, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(CADASTRO) + 1` da empresa, e na gravação de registro novo o código é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; código inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de fornecedores; F7, F8 e F9 navegam entre os códigos. Se ficar vazio ou zerado, o botão Gravar apenas limpa a tela e não grava nada. Também nomeia a pasta de anexos no servidor. |
| Razão Social / Nome do Fornecedor | `NOME` | VARCHAR(70) | 70 |  | Razão social da empresa ou nome da pessoa física. Obrigatório na gravação: o botão Gravar aborta com "Nome do Fornecedor" em branco. É o texto usado no log do sistema e o índice da consulta. |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia ou sobrenome. Não é validado na gravação. O NewRecord grava um espaço em branco em vez de deixar nulo, porque consultas do sistema concatenam este campo e um valor nulo apagaria a expressão inteira. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de fornecedor fora de uso. Valores `'2'` = inativo (caixa marcada) e `'1'` = ativo (caixa desmarcada). O NewRecord grava `'1'`: todo fornecedor novo nasce ativo. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro do fornecedor. Obrigatório na gravação: o botão Gravar aborta com "Endereço do Fornecedor" em branco. O NewRecord grava um espaço em branco pelo mesmo motivo do campo Fantasia. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro do endereço. Não é validado na gravação. Nasce com um espaço em branco. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço. Não é validado na gravação. Nasce com um espaço em branco. |
| Nome da Cidade | `NOME_CIDADE` | VARCHAR(50) | 50 |  | Nome da cidade, trazido de `CIDADE.NOME` pelo LEFT JOIN e regravado pelo sistema quando a cidade é escolhida. Não é digitado (calculado na consulta). |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | CNPJ ou CPF do fornecedor. Não é obrigatório em geral, mas quando o País é `1058`, o código do Brasil, o Gravar avisa que o campo é exigido pelo SPED Fiscal e pergunta se o usuário quer informá-lo; respondendo que sim, a gravação é abortada e o foco volta para cá. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual da empresa ou RG da pessoa física. Com País `1058` e CNPJ de 14 dígitos, o Gravar avisa que a inscrição é exigida pelo SPED Fiscal, e quando preenchida valida o número contra a regra do Estado da cidade, abortando a gravação com "Inscrição Estadual Inválida" se não conferir. |
| Fone 01 | `FONE` | VARCHAR(15) | 15 |  | Telefone principal. Nasce com um espaço em branco. |
| Fone 02 | `FONE_02` | VARCHAR(15) | 15 |  | Telefone alternativo. Nasce com um espaço em branco. |
| Fax | `FAX` | VARCHAR(15) | 15 |  | Fax do fornecedor. Nasce com um espaço em branco. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Celular do fornecedor. Nasce com um espaço em branco. |
| Tipo Fornecedor | `TIPO_FORNECEDOR` | INTEGER |  |  | Código da classificação do fornecedor, do cadastro `TIPO_FORNECEDOR`. F4 abre a consulta e F3 abre o cadastro de tipos. Ao sair do campo o sistema busca o tipo e preenche a descrição ao lado; se não achar, limpa os dois. Obrigatório na gravação: o botão Gravar aborta com "Tipo do Fornecedor" em branco. |
| Descrição do Tipo do Fornecedor | `DESCRICAO_TIPO_FORNECEDOR` | VARCHAR(50) | 50 |  | Descrição do tipo, trazida pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta do plano de contas em que as compras deste fornecedor são escrituradas. F4 abre a consulta e F3 abre o cadastro do plano de contas. Ao sair do campo o sistema valida, regrava o código no formato do cadastro e preenche a descrição ao lado. Obrigatório na gravação, e com regra extra: o Gravar lê o tipo da conta e recusa qualquer conta que não seja `'Analítico'`, avisando que só conta analítica pode ser lançada. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta contábil, trazida pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada (calculado na consulta). |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | Código da natureza de operação padrão para as entradas deste fornecedor, do cadastro `NATUREZA_OPERACAO`. F4 abre a consulta. Ao sair do campo o sistema busca a natureza, preenche a descrição ao lado e recarrega a lista do campo Extensão da CFOP com as extensões daquela natureza; se não achar, limpa código e descrição. Não é validado na gravação. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da natureza de operação, trazida de `NATUREZA_OPERACAO.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada (calculado na consulta). |
| Extensão da CFOP | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 |  | Extensão da CFOP dentro da natureza escolhida — na prática, qual linha de `IT_NATUREZA_OPERACAO` daquela natureza se aplica a este fornecedor. A lista não é fixa: é montada em tempo de execução, ao abrir o combo ou ao sair do campo Natureza, com as extensões e descrições da natureza corrente, ordenadas pela sequência. Campo do controle `cbextensao_cfop`, ficam em branco; a coluna está no SELECT, no INSERT e no UPDATE da tela. |
| Número | `NUMERO_ENDERECO` | VARCHAR(10) | 10 |  | Número do imóvel no logradouro. Não é validado na gravação. |
| Cidade | `CIDADE` | INTEGER |  |  | Código da cidade, do cadastro `CIDADE`. F4 abre a consulta de cidades e F3 abre o cadastro. Escolhida a cidade, o sistema preenche sozinho Nome da Cidade, Estado, País e Nome do País; se o código não existir, limpa os cinco. Obrigatório na gravação: o botão Gravar aborta com "Cidade do Fornecedor" em branco. |
| Nome do País | `NOME_PAIS` | VARCHAR(50) | 50 |  | Nome do país, trazido de `PAIS.NOME` pelo LEFT JOIN. Preenchido pelo sistema junto com a cidade, ou ao informar o código do país. Não é digitado (calculado na consulta). |
| País | `PAIS` | INTEGER |  |  | Código do país, coluna própria de `FORNECEDOR` e não herdada da cidade. Vem preenchido junto com a cidade, mas pode ser digitado: ao sair do campo o sistema busca o país e preenche o nome ao lado, ou limpa os dois se não achar. Obrigatório na gravação: o Gravar aborta com "País do Fornecedor" em branco. O valor `1058` (Brasil) é o que liga as exigências de CNPJ e inscrição estadual do SPED Fiscal. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da unidade federativa. Vem de `CIDADE.ESTADO` no SELECT, preenchida pelo sistema junto com a cidade — não é digitada. É o Estado usado para validar a inscrição estadual na gravação.ESTADO`, da tabela `CIDADE`; o tipo e o tamanho são os mesmos. |
| Complemento | `COMPLEMENTO` | VARCHAR(40) | 40 |  | Complemento do endereço, como sala ou bloco. Não é validado na gravação. |
| Cód. SPED | `PARTICIPANTE_SPED_FISCAL` | INTEGER |  |  | Código do fornecedor como participante no arquivo do SPED Fiscal. Somente leitura na tela e nunca escrito por esta unit: quem grava é a rotina de geração do SPED. Serve só para conferência. |

#### Preferência dos Vencimentos no Pedido de Compra

Dez campos sem rótulo, um por parcela, que guardam o prazo em dias de cada vencimento sugerido ao lançar um pedido de compra deste fornecedor. Nenhum é validado na gravação. Funcionam como uma sequência que termina no primeiro zero: ao teclar Enter, se a segunda ou a terceira parcela estiver zerada, o foco pula direto para o campo Modalidade Frete, ignorando as parcelas seguintes.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtdias_vencimento_01` | `DIAS_VENCIMENTO_01` | INTEGER |  |  | Prazo em dias da 1ª parcela sugerida no pedido de compra. |
| `edtdias_vencimento_02` | `DIAS_VENCIMENTO_02` | INTEGER |  |  | Prazo em dias da 2ª parcela. Zerado, encerra a sequência e o foco salta para Modalidade Frete. |
| `edtdias_vencimento_03` | `DIAS_VENCIMENTO_03` | INTEGER |  |  | Prazo em dias da 3ª parcela. Zerado, encerra a sequência e o foco salta para Modalidade Frete. |
| `edtdias_vencimento_04` | `DIAS_VENCIMENTO_04` | INTEGER |  |  | Prazo em dias da 4ª parcela. |
| `edtdias_vencimento_05` | `DIAS_VENCIMENTO_05` | INTEGER |  |  | Prazo em dias da 5ª parcela. |
| `edtdias_vencimento_06` | `DIAS_VENCIMENTO_06` | INTEGER |  |  | Prazo em dias da 6ª parcela. |
| `edtdias_vencimento_07` | `DIAS_VENCIMENTO_07` | INTEGER |  |  | Prazo em dias da 7ª parcela. |
| `edtdias_vencimento_08` | `DIAS_VENCIMENTO_08` | INTEGER |  |  | Prazo em dias da 8ª parcela. |
| `edtdias_vencimento_09` | `DIAS_VENCIMENTO_09` | INTEGER |  |  | Prazo em dias da 9ª parcela. |
| `edtdias_vencimento_10` | `DIAS_VENCIMENTO_10` | INTEGER |  |  | Prazo em dias da 10ª e última parcela. |

#### Cadastro de Fornecedores (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora habitual deste fornecedor, do cadastro `TRANSPORTADORA`. F4 abre a consulta e F3 abre o cadastro. Ao sair do campo o sistema busca a razão social; se não achar, limpa este campo e o nome. Não é validado na gravação. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Razão social da transportadora, trazida de `TRANSPORTADORA.NOME` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada (calculado na consulta). |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete, trazida de `MODALIDADE_FRETE.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao escolher o código ao lado. Não é digitada (calculado na consulta). |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete padrão do fornecedor, do cadastro `MODALIDADE_FRETE` — a tabela que traduz o campo de frete por conta do emitente, do destinatário e afins da nota fiscal. F4 abre a consulta; escolhida a modalidade, o sistema preenche a descrição ao lado. Note que zero é modalidade válida: a consulta usa `-1` como marca de nada escolhido. Não é validado na gravação. |

#### Informações Adicionais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| E-mail | `EMAIL` | VARCHAR(60) | 60 |  | Endereço de e-mail do fornecedor. Nasce com um espaço em branco. |
| Home Page | `HOME_PAGE` | VARCHAR(60) | 60 |  | Site do fornecedor. Nasce com um espaço em branco. |
| Contato ---> Financeiro | `CONTATO_FINANCEIRO` | VARCHAR(30) | 30 |  | Nome da pessoa de contato no setor financeiro do fornecedor. Nasce com um espaço em branco. |
| Contato ---> Venda | `CONTATO_VENDA` | VARCHAR(30) | 30 |  | Nome da pessoa de contato no setor de vendas do fornecedor. Nasce com um espaço em branco. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante de compras que atende este fornecedor, do cadastro `REPRESENTANTE_COMPRA`. F4 abre a consulta e F3 abre o cadastro. Ao sair do campo o sistema preenche de uma vez o nome e todos os sete campos do quadro Dados do Representante; se não achar o código, limpa os oito. Não é validado na gravação. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, trazido de `REPRESENTANTE_COMPRA.NOME` pelo LEFT JOIN e regravado pelo sistema ao informar o código ao lado. Não é digitado (calculado na consulta). |
| Regime de Tributação | `REGIME_TRIBUTACAO` | VARCHAR(25) | 25 |  | Regime tributário do fornecedor, que orienta o tratamento de crédito de impostos na entrada. Combo com três opções, gravadas como texto literal: vazio, `'Lucro Real ou Presumido'` e `'Simples Federal'`. O NewRecord não define valor, então nasce vazio. Campo do controle `cbregime_tributario`, ficam em branco; a coluna está no SELECT, no INSERT e no UPDATE da tela. |
| Observação | `OBSERVACAO` | VARCHAR(240) | 240 |  | Campo de texto livre para anotações sobre o fornecedor. Nasce com um espaço em branco. Sendo memo, Enter dentro dele quebra linha; são precisos dois Enter seguidos para sair do campo. |

#### Dados do Representante

Quadro somente de exibição, dentro da aba Informações Adicionais. Nenhum destes campos é coluna de `FORNECEDOR`: todos são apelidos do SELECT vindos de `REPRESENTANTE_COMPRA` e preenchidos em bloco quando o código do representante é informado. Não são digitáveis e não são atualizados no UPDATE da tela. Para alterar qualquer um deles é preciso ir ao cadastro de representantes de compra.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_REPRESENTANTE` | VARCHAR(91) | 91 |  | Logradouro do representante, de `REPRESENTANTE_COMPRA.ENDERECO` (calculado na consulta). |
| Cidade | `CIDADE_REPRESENTANTE` | VARCHAR(53) | 53 |  | Cidade e Estado do representante juntos, montados no SELECT pela concatenação da cidade com um espaço e a sigla do Estado — por isso o tamanho maior que o da cidade sozinha (calculado na consulta). |
| Fone | `FONE_REPRESENTANTE` | VARCHAR(15) | 15 |  | Telefone do representante (calculado na consulta). |
| Celular | `CELULAR_REPRESENTANTE` | VARCHAR(15) | 15 |  | Celular do representante (calculado na consulta). |
| Email | `EMAIL_REPRESENTANTE` | VARCHAR(60) | 60 |  | E-mail do representante (calculado na consulta). |
| Fax | `FAX_REPRESENTANTE` | VARCHAR(15) | 15 |  | Fax do representante (calculado na consulta). |
| Bairro | `BAIRRO_REPRESENTANTE` | VARCHAR(40) | 40 |  | Bairro do representante (calculado na consulta). |

#### Informações Adicionais (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| % Desconto | `PERCENTUAL_DESCONTO` | DOUBLE PRECISION |  |  | Percentual de desconto habitual concedido por este fornecedor, com duas casas decimais, usado como sugestão no pedido de compra. Não é validado na gravação. |

### Grade `dbfornecedor_documentos` — tabela IT_FORNECEDOR_DOCUMENTOS

Anexos do fornecedor, na aba Documentos. A chave é empresa, cadastro do fornecedor e `SEQ`. Ao gravar a linha, o sistema copia o arquivo escolhido para `\Arquivo\Fornecedores\<cadastro>\` no servidor, criando a pasta se preciso, e regrava o caminho apontando para a cópia — o original em disco local deixa de ser referenciado. Linha sem caminho de arquivo é cancelada no BeforePost, ou seja, não chega a ser gravada. A coluna `NOME_ARQUIVO`, gravada junto, não aparece na grade.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** **·obrig** | `SEQ` | INTEGER |  | Sequencial do anexo dentro do fornecedor, gerado pelo NewRecord como `MAX(SEQ) + 1`. Não é digitado: o ColEnter da grade pula esta coluna. Obrigatório no banco (NOT NULL) e parte da chave primária. |
| Descrição do Documento | `DESCRICAO` | VARCHAR(50) | 50 | Texto livre que identifica o anexo, por exemplo contrato social ou certidão. É a primeira coluna em que o cursor entra. |
| Caminho do Arquivo | `CAMINHO_ARQUIVO` | VARCHAR(250) | 250 | Caminho do arquivo anexado. O botão da célula abre o seletor de arquivos, e o que é escolhido preenche esta coluna e a coluna `NOME_ARQUIVO`. Depois da gravação, o conteúdo passa a ser o caminho da cópia no servidor, não o do arquivo de origem. Vazio, a linha é descartada. |
| (sem título) | `ABRIR` | VARCHAR(5) | 5 | Coluna de ação, não de dado: o SELECT devolve a constante `'ABRIR'` para todas as linhas. Clicar na célula abre o arquivo anexado no programa padrão do Windows. Não é digitável — o ColEnter pula esta coluna (calculado na consulta). |

<a id="ucad_tipo_fornecedor"></a>

## `ucad_tipo_fornecedor` — Cadastro de Tipos de Fornecedores...

Tabela de apoio `TIPO_FORNECEDOR`, chave `EMPRESA` + `CADASTRO`. Só dois campos: código e descrição. Classifica o fornecedor no cadastro de fornecedores; não há marcador de inativo nem qualquer campo codificado nesta tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do tipo de fornecedor, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de tipos de fornecedor. |
| Descrição do Tipo de Fornecedor | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do tipo. Único campo exigido no Gravar — vazio aborta com "Descrição do Tipo de Fornecedor". |

<a id="ucad_fornecedor_acerto"></a>

## `ucad_fornecedor_acerto` — Cadastro do Acerto dos Fornecedores

Tela de acerto, não de inclusão: serve para completar os dados fiscais e de endereço de fornecedores que ainda estão pendentes de conferência. Grava na tabela `FORNECEDOR`, e traz cidade, estado e país por LEFT JOIN com `CIDADE` e `PAIS`. O fornecedor é escolhido pelo campo Cadastro, no topo, cuja consulta já vem filtrada por `ACERTO_CADASTRO = '1'`, ou seja, só lista quem ainda não foi acertado; ao gravar, o BeforePost marca `ACERTO_CADASTRO = '2'` e o registro sai da lista. Todos os campos são caixa alta. Tela de uma seção só, sem abas nem grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Fornecedor | `NOME` | VARCHAR(70) | 70 |  | Razão social da empresa ou nome da pessoa física. Obrigatório na gravação: o botão Gravar aborta com "Nome do Fornecedor" em branco. É o texto usado no log do sistema. |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia da empresa ou sobrenome da pessoa física. Não é validado na gravação. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro do fornecedor. Obrigatório na gravação: o botão Gravar aborta com "Endereço do Fornecedor" em branco. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro do endereço. Não é validado na gravação. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço, digitado com a máscara `##.###-###`. Não é validado na gravação. |
| Nome da Cidade | `NOME_CIDADE` | VARCHAR(50) | 50 |  | Nome da cidade, trazido de `CIDADE.NOME` pelo LEFT JOIN. Preenchido pelo sistema ao informar o código da cidade, seja digitando, seja pela consulta; se o código não existir, é limpo junto com Cidade, Estado, País e Nome do País. Não é atualizado no UPDATE da tela (calculado na consulta). |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | CNPJ ou CPF do fornecedor. Obrigatório na gravação: o botão Gravar aborta com "CNPJ / CPF do Fornecedor" em branco. Ao sair do campo o sistema tira a pontuação, exige 11 dígitos (CPF) ou 14 (CNPJ), formata o número e roda o dígito verificador, avisando se estiver inválido. Em seguida procura o mesmo CNPJ ou CPF em outro fornecedor da empresa: se achar, abandona o registro em edição e carrega o fornecedor já existente, trocando o código no campo Cadastro — é a forma de a tela evitar duplicidade. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual da empresa ou RG da pessoa física. Não é validado na gravação. |
| Número | `NUMERO_ENDERECO` | VARCHAR(10) | 10 |  | Número do imóvel no logradouro. Não é validado na gravação. |
| Cidade | `CIDADE` | INTEGER |  |  | Código da cidade no cadastro de cidades. Obrigatório na gravação: o botão Gravar aborta com "Cidade do Fornecedor" em branco. F4 abre a consulta de cidades e F3 abre o cadastro de cidade para incluir uma nova. Ao sair do campo o sistema busca a cidade e preenche sozinho Nome da Cidade, Estado, País e Nome do País; se o código não existir, limpa os quatro e o próprio campo. |
| Nome do País | `NOME_PAIS` | VARCHAR(50) | 50 |  | Nome do país, trazido de `PAIS.NOME` pelo LEFT JOIN a partir da cidade. Preenchido pelo sistema junto com os demais dados da cidade; não é digitado. Não é atualizado no UPDATE da tela (calculado na consulta). |
| País | `PAIS` | INTEGER |  |  | Código do país. Vem de `CIDADE.CODIGO_PAIS`, apelidado de `PAIS` no SELECT — não é coluna de `FORNECEDOR`. Preenchido pelo sistema junto com os demais dados da cidade e não atualizado no UPDATE da tela, ou seja, é somente exibição. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da unidade federativa, vinda de `CIDADE.ESTADO` pelo LEFT JOIN. Preenchido pelo sistema junto com os demais dados da cidade e não atualizado no UPDATE da tela, ou seja, é somente exibição. |
| Complemento | `COMPLEMENTO` | VARCHAR(40) | 40 |  | Complemento do endereço, como sala ou bloco. Não é validado na gravação. |

<a id="umov_alerta_compra"></a>

## `umov_alerta_compra` — Alerta de Compra...

Tela de consulta apenas: lista os materiais cujo saldo projetado caiu abaixo do estoque mínimo e sugere quanto comprar. Não grava nada — só tem os botões Sair e Limpar (F5), que apenas refazem a consulta. Toda a tela é uma grade sobre um SELECT montado a partir de `MATERIA_PRIMA`, considerando apenas os materiais com `VALIDAR_ESTOQUE_MINIMO = '2'` e trazendo somente as linhas em que o saldo ficou abaixo do mínimo.

### Grade `dbagenda` — consulta sobre MATERIA_PRIMA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  | Código do material em falta. |
| Descrição | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO`. |
| Estoque | `SALDO` | DOUBLE PRECISION |  | Saldo projetado, não o saldo físico. Calculado na consulta como estoque menos estoque empenhado, mais o que está em pedido de compra pendente (`IT_PEDIDO_COMPRA` com `STATUS = 'Pendente'`), mais o que está em produção (`LOTE` com `STATUS = 'Pendente'`). |
| Est. Mínimo | `ESTOQUE_MINIMO` | DOUBLE PRECISION |  | Estoque mínimo a respeitar. Calculado na consulta: usa `MINIMA` quando ela é maior que zero, senão cai para `MINIMA_PRODUTO`. Linhas com mínimo zero não aparecem na tela. |
| Sug. Compra | `SUGESTAO` | DOUBLE PRECISION |  | Quantidade sugerida de compra, calculada na consulta como (estoque mínimo menos saldo) multiplicado pelo fator de compra do material (`FATOR_COMPRA`, tratado como 1 quando não preenchido). |

<a id="umov_alteracao_preco_venda_materia_prima"></a>

## `umov_alteracao_preco_venda_materia_prima` — Alteração do Preço de Venda dos Materiais...

Reajusta em lote o preço de venda dos materiais a partir do markup. A tela não tem cabeçalho gravável: acima da grade ficam o filtro por estrutura do material, os campos soltos "Markup" e "% Desconto" e uma caixa de marcação "Alterar Configuração de Preço por Markup na Matéria Prima". O Filtrar carrega a grade em um `TClientDataSet` de memória (`tbtemp`) já com os preços calculados, e o Gravar regrava `PRECO_VENDA` e `PRECO_VENDA_CONSUMIDOR` em `MATERIA_PRIMA`.

### Grade `RxDBGrid1` — tabela de trabalho `tbtemp` (em memória)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material trazido pelo filtro (calculado na consulta). |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO` (calculado na consulta). |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida do cadastro (calculado na consulta). |
| Custo Atual | `PRECO_CUSTO` | DOUBLE PRECISION |  | Custo do material hoje gravado (`MATERIA_PRIMA.PRECO_CUSTO`). É a base do novo preço, e não é regravado por esta tela (calculado na consulta). |
| Preço Atual | `PRECO_VENDA_ATUAL` | DOUBLE PRECISION |  | Preço de venda hoje gravado no material. Serve de referência para o % Reajuste. Somente conferência (calculado na consulta). |
| Novo Preço | `NOVO_PRECO_VENDA` | DOUBLE PRECISION |  | Novo preço de venda ao revendedor, calculado no Filtrar como custo atual vezes o Markup informado no topo da tela. Vai para `MATERIA_PRIMA.PRECO_VENDA` no Gravar (calculado na consulta). |
| Preço Consum. | `PRECO_CONSUMIDOR` | DOUBLE PRECISION |  | Novo preço ao consumidor, derivado do novo preço dividido por (100 menos o % Desconto informado no topo). Vai para `MATERIA_PRIMA.PRECO_VENDA_CONSUMIDOR` no Gravar (calculado na consulta). |
| % Reajuste | `PERCENTUAL_REAJUSTE` | DOUBLE PRECISION |  | Variação percentual entre o novo preço e o preço atual. Sempre calculado, nunca digitado; fica zero quando o preço atual é zero. (calculado na consulta) |

<a id="ucad_materia_prima"></a>

## `ucad_materia_prima` — Cadastro de Materiais...

Cadastro central de materiais e produtos. O cabeçalho grava em `MATERIA_PRIMA`, chaveada por `EMPRESA` + `CADASTRO`; o SELECT ainda traz por LEFT JOIN a descrição da estrutura (três níveis de `ESTRUTURA_MATERIA_PRIMA` concatenados), o nome do fornecedor da última compra, o NCM, o tipo e o gênero do item, a lista de serviço, o plano de contas, o benefício fiscal, o setor e os dados do bem principal do ativo imobilizado.

A janela tem duas faixas de abas. A de cima (`pcultima_compra`) mostra a última compra e sete consultas de histórico, todas somente leitura. A de baixo (`pc`) reúne as abas de dados: Informações Gerais (com os quadros Unidades, Tributação, Estoques, Pesos e Localização), Materiais Complementares, Lotes, Especificação Técnica dos Fornecedores, SPED Fiscal, Documentos e Informações do Bem do Ativo Imobilizado. Quatro grades gravam em tabelas próprias: `MATERIA_PRIMA_SIMILARES`, `ESPECIFICACAO_TECNICA_MATERIAL` e `IT_MATERIA_PRIMA_DOCUMENTOS`; as demais são consulta.

O rótulo `( F12 ) Duplica Cadastro do Material` copia o registro inteiro para um novo código, zerando saldos, custos e todos os campos da última compra.

### Campos

#### Cadastro de Materiais...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código sequencial do material. Ao limpar a tela o sistema sugere o próximo código livre da empresa. Digitar um código existente carrega o registro para alteração; um código acima do último abre a seleção que pergunta se usa o próximo da sequência ou o digitado. F4 abre a consulta de materiais, F7/F8/F9 navegam. F12 duplica o cadastro inteiro em um código novo. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 |  | Nome do material. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. Quando a tela é chamada pela importação de XML de nota de compra, vem preenchida com a descrição do produto do XML. |
| Controla Estoque | `CONTROLA_ESTOQUE` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (controla estoque), desmarcado grava `'1'`. O NewRecord já marca em `'2'`. Com `'2'` o Setor da baixa do estoque passa a ser obrigatório e a caixa Empenha Estoque na Programação do Lote fica habilitada; com `'1'` essa caixa é desabilitada. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (material fora de uso), desmarcado grava `'1'`. O NewRecord inicia em `'1'`. Trocar este campo exige senha de prevenção: ao gravar, se o valor mudou, a tela pede a senha e cancela a gravação se ela não for aceita. |
| Estrutura | `ESTRUTURA` | VARCHAR(10) | 10 |  | Código da estrutura contábil do material (grupo, subgrupo e analítico, no formato NN.NN.NN). Ao sair do campo o sistema busca em `ESTRUTURA_MATERIA_PRIMA` e traz a descrição; código inexistente limpa o campo. Obrigatório na gravação, e só aceita estrutura do tipo Analítico — estrutura Sintética é recusada com aviso. F4 abre a consulta, F3 o cadastro de estruturas. |
| Descrição da Estrutura do Material | `DESCRICAO_ESTRUTURA` | VARCHAR(200) | 200 |  | Descrição montada na consulta: junta as descrições dos três níveis da estrutura separadas por barra. Reescrita ao sair do campo do código. Não é digitada (calculado na consulta). |
| Especificação Técnica | `ESPESSURA_TECNICA` | VARCHAR(70) | 70 |  | Especificação técnica do material, texto livre. O nome da coluna fala em espessura, mas o rótulo e o uso são de especificação técnica. |

#### Inf. da Última Compra

Foto da última nota de entrada do material. É gravada pela entrada de nota fiscal de compra, mas fica editável aqui. A duplicação por F12 zera todos estes campos.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nº Lançto | `COMPRA_ENTRADA` | INTEGER |  |  | Número do lançamento de entrada que registrou a última compra. |
| Nota Fiscal | `COMPRA_NOTA` | INTEGER |  |  | Número da nota fiscal da última compra. |
| Série | `COMPRA_SERIE` | VARCHAR(5) | 5 |  | Série da nota fiscal da última compra. |
| Data | `COMPRA_DATA` | TIMESTAMP |  |  | Data de recebimento da última compra. |
| Fornecedor | `COMPRA_FORNECEDOR` | INTEGER |  |  | Código do fornecedor da última compra, ligado ao cadastro `FORNECEDOR` da empresa. Ao sair do campo o sistema busca o fornecedor e traz o nome; código inexistente limpa os dois campos. F4 abre a consulta de fornecedores. |
| Razão Social / Nome do Fornecedor | `COMPRA_NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor, trazido de `FORNECEDOR` pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Quantidade | `COMPRA_QUANTIDADE` | DOUBLE PRECISION |  |  | Quantidade comprada na última nota. |
| Preço | `COMPRA_PRECO` | DOUBLE PRECISION |  |  | Preço unitário da última compra. |
| Frete | `COMPRA_FRETE` | DOUBLE PRECISION |  |  | Valor do frete da última nota. |
| Despesas | `COMPRA_OUTRAS_DESPESAS` | DOUBLE PRECISION |  |  | Outras despesas acessórias da última nota. |
| I.P.I. | `COMPRA_VALOR_IPI` | DOUBLE PRECISION |  |  | Valor de IPI da última nota. |
| Subst.Tribut. | `COMPRA_VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor de ICMS por substituição tributária da última nota. |
| Desc.Prod. | `COMPRA_DESCONTO_TOTAL` | DOUBLE PRECISION |  |  | Desconto somado dos itens da última nota. |
| Desc. N.F. | `COMPRA_DESCONTO` | DOUBLE PRECISION |  |  | Desconto aplicado no total da última nota. |
| Total Nota | `COMPRA_TOTAL` | DOUBLE PRECISION |  |  | Valor total da última nota de compra. |
| Último Custo | `COMPRA_ULTIMO_CUSTO` | DOUBLE PRECISION |  |  | Custo unitário apurado na última compra, já com frete, despesas e impostos. |
| Tributo ICMS | `COMPRA_TRIBUTO_ICMS` | VARCHAR(8) | 8 |  | Código do tributo de ICMS aplicado na última compra. A duplicação por F12 grava vazio neste campo. |
| Observação | `OBSERVACAO` | BLOB |  |  | Observações livres sobre o material. Memo de várias linhas: dentro dele o Enter só passa para o próximo campo quando teclado duas vezes seguidas. |

#### Unidades

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Compra | `UNIDADE_COMPRA` | VARCHAR(3) | 3 |  | Sigla da unidade em que o material é comprado, ligada a `UNIDADE_MEDIDA` da empresa. Ao sair do campo o sistema confere a sigla e limpa se não existir. Obrigatória na gravação. F4 abre a consulta, F3 o cadastro de unidades. |
| Consumo | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Sigla da unidade em que o material é consumido ou produzido. Mesmas regras da unidade de compra, e também obrigatória na gravação. É a unidade em que o saldo é mantido. |
| Conversão | `UNIDADE_CONVERSAO` | DOUBLE PRECISION |  |  | Quantas unidades de consumo cabem em uma unidade de compra. Divide o estoque disponível para mostrar o disponível na unidade de compra; se estiver em zero, esse disponível fica zerado. |
| Peso (Kgs) | `PESO` | DOUBLE PRECISION |  |  | Peso unitário do material em quilos. |
| Conversão XML | `UNIDADE_CONVERSAO_NOTA_COMPRA` | DOUBLE PRECISION |  |  | Fator de conversão usado ao lançar a nota de compra a partir do XML. O NewRecord inicia em zero. Quando o Tipo Item é 8, gravar com este fator em zero ou negativo dispara aviso e leva o foco para cá. |

#### Tributação

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição da Classificação Fiscal do NCM | `DESCRICAO_CLASSIFICACAO_FISCAL` | VARCHAR(100) | 100 |  | Texto do NCM, trazido de `CLASSIFICACAO_FISCAL` pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Código NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(20) | 20 |  | Código NCM do material, ligado ao cadastro `CLASSIFICACAO_FISCAL`. Ao sair do campo o sistema busca a descrição; código inexistente limpa os dois campos. Obrigatório na gravação, exceto quando o Tipo Item for 7, 8, 9, 10 ou 99. A conferência é feita sobre o código sem pontos nem traços. F4 abre a consulta, F3 o cadastro de NCM. |
| %  I.C.M.S. | `ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS do material, em percentual. |
| %  I.P.I. | `IPI` | DOUBLE PRECISION |  |  | Alíquota de IPI, somente leitura. Não é coluna de `MATERIA_PRIMA`: vem do NCM (`CLASSIFICACAO_FISCAL.IPI`) pelo JOIN, então muda junto com o NCM escolhido. |

#### Estoques

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Estoque | `SALDO` | DOUBLE PRECISION |  |  | Saldo em estoque, na unidade de consumo. Somente leitura, liberado em tempo de execução apenas para usuário administrador ou com `MODIFICA_ESTOQUE_MATERIAIS = '2'`. Alterar aqui não é livre: no BeforePost a tela compara o novo saldo com o anterior e grava a diferença como movimentação de estoque, de entrada ou de saída, com histórico Entrada - Cadastro de Materiais ou Saida - Cadastro de Materiais. |
| Custo Médio | `COMPRA_CUSTO_MEDIO` | DOUBLE PRECISION |  |  | Custo médio do material. Somente leitura, liberado apenas para administrador ou usuário com `MODIFICA_CUSTO_MEDIO_MATERIAIS = '2'`. É o custo usado na movimentação de estoque gerada pela tela e no saldo financeiro. |
| Estoq. Mínimo | `MINIMA` | DOUBLE PRECISION |  |  | Estoque mínimo, usado no ponto de reposição e nas críticas de compra. |
| Markup | `LUCRO` | DOUBLE PRECISION |  |  | Multiplicador que transforma o custo padrão em preço de revenda. O campo e o rótulo só aparecem quando Utiliza Preço de Venda por Markup está marcado. É recalculado sozinho ao sair de Preço Revenda ou de Preço Consum., como preço de revenda dividido pelo custo padrão. |
| Saldo Fin. | `SALDO_FINANCEIRO` | DOUBLE PRECISION |  |  | Valor financeiro do estoque. Somente leitura, campo calculado do Delphi: saldo multiplicado pelo custo médio, recalculado a cada linha (calculado na consulta). |
| Preço Revenda | `PRECO_VENDA` | DOUBLE PRECISION |  |  | Preço de revenda do material. Ao sair do campo a tela recalcula o preço ao consumidor (dividindo pelo complemento do percentual de desconto) e o markup (dividindo pelo custo padrão). Quando o markup está ativo, este preço também é reescrito ao sair do Custo Padrão. |
| Custo Padrão | `PRECO_CUSTO` | DOUBLE PRECISION |  |  | Custo padrão do material. Ao sair do campo, se Utiliza Preço de Venda por Markup estiver marcado, a tela reescreve o preço de revenda como custo padrão vezes markup, e em seguida recalcula o preço ao consumidor. |
| Empenhado | `ESTOQUE_EMPENHADO` | DOUBLE PRECISION |  |  | Quantidade empenhada em lotes de produção. O NewRecord inicia em zero. Só é editável para administrador ou usuário com `MODIFICA_ESTOQUE_MATERIAIS = '2'`; para os demais a tela o deixa somente leitura. |
| Disponível | `ESTOQUE_DISPONIVEL` | DOUBLE PRECISION |  |  | Saldo menos empenhado, na unidade de consumo. Somente leitura, campo calculado do Delphi. O rótulo recebe a sigla da unidade de consumo quando o registro é aberto (calculado na consulta). |
| Disponível | `ESTOQUE_DISPONIVEL_UND_COMPRA` | DOUBLE PRECISION |  |  | O mesmo disponível convertido para a unidade de compra, dividido pelo fator de Conversão; fica zero quando o fator é zero. Somente leitura, campo calculado do Delphi. O rótulo recebe a sigla da unidade de compra quando o registro é aberto (calculado na consulta). |
| Estoq. Nacional | `ESTOQUE_NACIONAL` | DOUBLE PRECISION |  |  | Parte do saldo de origem nacional. Somente leitura, liberado só para administrador ou usuário com `MODIFICA_ESTOQUE_MATERIAIS = '2'`. |
| Estoq. Importado | `ESTOQUE_IMPORTADO` | DOUBLE PRECISION |  |  | Parte do saldo de origem importada. Somente leitura, com a mesma liberação por privilégio do estoque nacional. |
| Preço Consum. | `PRECO_VENDA_CONSUMIDOR` | DOUBLE PRECISION |  |  | Preço final ao consumidor. É recalculado ao sair do Preço Revenda e do Custo Padrão. Digitado diretamente, faz o caminho inverso ao sair do campo: reescreve o preço de revenda descontando o percentual do revendedor e recalcula o markup. |
| % Desconto | `PERCENTUAL_DESCONTO_REVENDEDOR` | DOUBLE PRECISION |  |  | Percentual de desconto do revendedor. É a ponte entre o preço de revenda e o preço ao consumidor nas duas contas acima. |
| Conferência | `ESTOQUE_LOTE` | DOUBLE PRECISION |  |  | Somente leitura. Não é coluna de tabela: no SELECT vem fixo em 0,00 e é preenchido quando a aba Lotes abre, somando as quantidades empenhadas dos lotes em aberto. Serve para conferir contra o campo Empenhado (calculado na consulta). |
| Data Alteração | `DATA_ALTERACAO_PRECO_CUSTO` | TIMESTAMP |  |  | Data da última alteração do custo padrão, gravada pela rotina de alteração de custo. Somente leitura nesta tela. |
| Separado | `ESTOQUE_SEPARADO` | DOUBLE PRECISION |  |  | Somente leitura. Subconsulta do SELECT: soma quantidade menos quantidade baixada dos itens de lote com status do lote Pendente e marcador `SEPARADO = '2'`, ou seja, o que já foi separado e ainda não foi baixado (calculado na consulta). |
| Fator Compra | `FATOR_COMPRA` | DOUBLE PRECISION |  |  | Fator aplicado na sugestão de compra do material. O NewRecord inicia em zero. |

#### Pesos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Volume unitário do material, usado no transporte e na NF-e. |
| Peso Liquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido unitário. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto unitário. |

#### Localização

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Localização Física do Material | `LOCALIZACAO` | VARCHAR(50) | 50 |  | Onde o material fica no almoxarifado, texto livre (prateleira, corredor, box). |
| Setor | `SETOR_BAIXA_ESTOQUE_MATERIAL` | VARCHAR(3) | 3 |  | Sigla do setor que dá baixa no estoque deste material, ligada ao cadastro de setores. Ao sair do campo o sistema busca a descrição e limpa se não existir. Obrigatório na gravação sempre que Controla Estoque estiver marcado. F4 abre a consulta, F3 o cadastro de setores. |
| Nome do Setor da Baixa do Estoque do Material | `DESCRICAO_SETOR` | VARCHAR(50) | 50 |  | Nome do setor, trazido pelo JOIN e reescrito ao sair do campo da sigla. Não é digitado (calculado na consulta). |

#### Informações Gerais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta contábil do material, ligada ao cadastro `PLANO_CONTAS`. Ao sair do campo o sistema busca a descrição e limpa se não existir. F4 abre a consulta, F3 o cadastro de contas. |
| Descrição do Plano de Contas | `DESC_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Nome da conta contábil, trazido pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Benefício Fiscal | `BENEFICIO_FISCAL` | VARCHAR(10) | 10 |  | Código do benefício fiscal aplicável ao material, ligado ao cadastro de benefícios. Ao sair do campo o sistema busca a descrição e limpa se não existir. F4 abre a consulta, F3 o cadastro. |
| Descrição do Benefício Fiscal | `DESC_BENEFICIO_FISCAL_STRING` | VARCHAR(100) | 100 |  | Texto do benefício fiscal, somente leitura. Campo calculado do Delphi: copia a descrição vinda do JOIN, tira as quebras de linha e corta em 100 caracteres (calculado na consulta). |

#### SPED Fiscal

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Tipo Item | `TIPO_ITEM_PRODUTO` | INTEGER |  |  | Código do tipo do item da mercadoria para o SPED, ligado ao cadastro `TIPO_ITEM_PRODUTO`. Ao sair do campo o sistema busca a descrição; código inexistente limpa os dois campos. Obrigatório na gravação, e é ele que comanda duas outras regras: nos tipos 7, 8, 9, 10 e 99 o NCM deixa de ser cobrado, e no tipo 8 a aba do ativo imobilizado passa a ser exigida. F4 abre a consulta, F3 o cadastro. |
| Descrição do Tipo do Item da Mercadoria | `DESCRICAO_TIPO_ITEM_PRODUTO` | VARCHAR(50) | 50 |  | Nome do tipo do item, trazido pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Gênero Item | `GENERO_ITEM_PRODUTO` | INTEGER |  |  | Código do gênero do item da mercadoria (tabela do SPED, alinhada aos dois primeiros dígitos do NCM), ligado ao cadastro `GENERO_ITEM_PRODUTO`. Ao sair do campo busca a descrição e limpa se não existir. Não é cobrado na gravação. F4 abre a consulta, F3 o cadastro. |
| Descrição do Gênero do Item da Mercadoria | `DESC_GENERO_ITEM_PRODUTO` | VARCHAR(150) | 150 |  | Nome do gênero. Campo calculado do Delphi: copia a descrição do JOIN, que é um BLOB, tira as quebras de linha e corta em 150 caracteres (calculado na consulta). |
| Lista Serviço | `LISTA_SERVICO` | VARCHAR(5) | 5 |  | Código do item da lista de serviços da LC 116, ligado ao cadastro `LISTA_SERVICO`. Só se aplica a itens de serviço. Ao sair do campo busca a descrição e limpa se não existir. Não é cobrado na gravação. F4 abre a consulta, F3 o cadastro. |
| Descrição da Lista de Serviço | `DESC_LISTA_SERVICO` | VARCHAR(150) | 150 |  | Texto do item da lista de serviços. Campo calculado do Delphi, feito do mesmo jeito do gênero: BLOB do JOIN, sem quebras de linha, cortado em 150 caracteres (calculado na consulta). |
| Controla Bloco K | `CONTROLA_BLOCO_K` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o material entra no Bloco K do SPED), desmarcado grava `'1'`. O NewRecord já marca em `'2'`. Com `'2'`, o Tipo do Produto (SPED) passa a ser obrigatório na gravação. |

#### Informações do Bem\Componentes do Ativo Imobilizado

Aba exigida quando o Tipo Item é 8. Fora desse tipo os campos ficam disponíveis, mas nada aqui é cobrado na gravação.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Bem Principal | `PATRIMONIO_PRINCIPAL` | INTEGER |  |  | Código do bem principal ao qual este componente pertence, apontando para outro material. Só é cobrado quando o Tipo de Mercadoria da aba for `'2 = Componente'`, e nesse caso a gravação aborta se estiver vazio. Ao sair do campo busca a descrição e limpa se não existir. F4 abre a consulta de materiais. |
| Descrição do Bem ou Componente Principal | `DESCRICAO_PATRIMONIO_PRINCIPAL` | VARCHAR(150) | 150 |  | Nome do bem principal, trazido pelo JOIN em `MATERIA_PRIMA` e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS_PATRIMONIO` | VARCHAR(20) | 20 |  | Conta contábil do bem, ligada ao cadastro `PLANO_CONTAS`. Obrigatória na gravação sempre que o Tipo Item for 8. Ao sair do campo busca a descrição e limpa se não existir. F4 abre a consulta, F3 o cadastro. |
| Descrição do Plano de Contas | `DESC_PLANO_CONTAS_PATRIMONIO` | VARCHAR(50) | 50 |  | Nome da conta contábil do bem, trazido pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Centro Custo | `CENTRO_CUSTO_PATRIMONIO` | INTEGER |  |  | Centro de custo do bem, ligado ao cadastro `CENTRO_CUSTO`. Só é cobrado quando o Tipo Item é 8 e o Tipo de Mercadoria da aba é `'1 = Bem'`. Ao sair do campo busca a descrição e limpa se não existir. F4 abre a consulta, F3 o cadastro. |
| Descrição do Centro de Custo | `DESC_CENTRO_CUSTO_PATRIMONIO` | VARCHAR(50) | 50 |  | Nome do centro de custo, trazido pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Descrição Sucinta da Função do Bem na Atividade do Estabelecimento | `FUNCAO_PATRIMONIO` | VARCHAR(100) | 100 |  | Texto que descreve para que o bem serve no estabelecimento, exigido no registro do ativo imobilizado do SPED. O rótulo não foi casado automaticamente porque a legenda está quebrada em duas linhas no DFM. Só é cobrado quando o Tipo Item é 8 e o Tipo de Mercadoria é `'1 = Bem'`. |
| Vida Útil (Meses) | `VIDA_UTIL_PATRIMONIO` | INTEGER |  |  | Vida útil do bem em meses. Não é cobrado na gravação. |
| Total Parcelas | `TOTAL_PARCELAS_PATRIMONIO` | INTEGER |  |  | Número de parcelas de depreciação ou de apropriação do crédito do bem. Obrigatório, e maior que zero, sempre que o Tipo Item for 8. |

#### Cadastro de Materiais... (continuação)

Caixas de marcação soltas na parte de baixo da janela, fora das abas.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Empenha Estoque na Programação do Lote | `CONTROLA_ESTOQUE_POR_EMPENHO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'`. A caixa só fica habilitada quando Controla Estoque está marcado; com `'2'`, a programação do lote empenha o material em vez de baixá-lo direto. |
| Utiliza Preço de Venda por Markup | `UTILIZA_PRECO_VENDA_MARKUP` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'`. Com `'2'`, o campo Markup aparece no quadro Estoques e o preço de revenda passa a ser calculado como custo padrão vezes markup ao sair do Custo Padrão; com `'1'` o Markup fica escondido e o preço de revenda é digitado. |
| Produto | `TIPO_PRODUTO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o item é vendido como produto), desmarcado grava `'1'`. O NewRecord inicia em `'1'`. |
| Materiais | `TIPO_MATERIA_PRIMA` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o item é usado como material), desmarcado grava `'1'`. O NewRecord já marca em `'2'`. Um item com `'1'` aqui é recusado pela tela de acerto de cadastro dos materiais, que exige que ele esteja configurado como material. |
| Bloqueio para Compras | `BLOQUEIO_COMPRA` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o material não pode ser comprado), desmarcado grava `'1'`. |
| Validar Estoque Mínimo | `VALIDAR_ESTOQUE_MINIMO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o sistema critica o estoque mínimo deste material), desmarcado grava `'1'`. O NewRecord inicia em `'1'`. |

### Grade `dbnota_fiscal` — tabelas ENTRADA e IT_ENTRADA

Aba Notas Fiscais. Últimas 20 entradas do material, da mais recente para a mais antiga. Grade somente leitura; duplo clique abre a nota fiscal de compra correspondente.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| CFOP | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | Natureza da operação do item da entrada, ou seja, o CFOP com que o material entrou. |
| Nota Fiscal | `NOTA` | INTEGER |  | Número da nota fiscal de entrada. |
| Recto | `RECEBIMENTO` | TIMESTAMP |  | Data de recebimento da nota. É por ela que a grade é ordenada. |
| Código | `FORNECEDOR` | INTEGER |  | Código do fornecedor da nota. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido de `FORNECEDOR` pelo JOIN (calculado na consulta). |
| Quantidade | `QUANTIDADE_COMPRA` | DOUBLE PRECISION |  | Quantidade do item na unidade de compra. |
| Valor | `VALOR_COMPRA` | DOUBLE PRECISION |  | Valor unitário do item na unidade de compra. |
| Nº Pedido | `NUMERO_PEDIDO` | INTEGER |  | Pedido de compra que originou o item da entrada. |
| % Desc. | `PERCENTUAL_DESCONTO` | DOUBLE PRECISION |  | Percentual de desconto do fornecedor aplicado no item. |
| Vencimentos | `VENCIMENTOS` | VARCHAR(50) | 50 | Lista dos vencimentos da nota, montada em tempo de execução pelo OnCalcFields do dataset, não lida do banco (calculado na consulta). |

### Grade `RxDBGrid1` — tabelas PEDIDO_COMPRA e IT_PEDIDO_COMPRA

Aba Pedidos em Aberto. Traz só os itens com status Pendente, do pedido mais novo para o mais antigo. Grade somente leitura; duplo clique abre o histórico do fornecedor no pedido de compra.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nº Pedido **·chave** | `NUMERO` | INTEGER |  | Número do pedido de compra pendente. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do pedido. |
| Embarque | `DATA_EMBARQUE` | TIMESTAMP |  | Data de embarque prevista para o item. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor do pedido, trazido pelo JOIN (calculado na consulta). |
| Quantidade | `QUANTIDADE_CONSUMO` | DOUBLE PRECISION |  | Quantidade pedida, convertida para a unidade de consumo. |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Sigla da unidade de consumo do item do pedido. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário do item no pedido. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Valor total do item no pedido. |
| Faturado | `QUANTIDADE_FATURADA` | DOUBLE PRECISION |  | Quanto do item já foi faturado pelo fornecedor. O que falta faturar é a diferença para a quantidade pedida. |

### Grade `dbalteracao_preco` — tabela IT_MATERIA_PRIMA_TABELA_CUSTO

Aba Alterações de Preços. Últimas 20 alterações de custo padrão do material, da mais recente para a mais antiga. Grade somente leitura.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data em que o custo padrão foi alterado. |
| Preço Anterior | `CUSTO_PADRAO_ANTERIOR` | DOUBLE PRECISION |  | Custo padrão que vigorava antes da alteração. |
| Preço Atual | `CUSTO_PADRAO_ATUAL` | DOUBLE PRECISION |  | Custo padrão que passou a valer. |
| % Reajuste | `PERCENTUAL_REAJUSTE` | DOUBLE PRECISION |  | Percentual de reajuste aplicado na alteração. |

### Grade `dbproduto` — tabela PRODUTO_COMPOSICAO

Aba Lista dos Produtos. Mostra os produtos ativos que levam este material na composição, com quantidade maior que zero. Grade somente leitura.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `PRODUTO` | INTEGER |  | Código do produto que consome este material. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, trazida de `MATERIA_PRIMA` pelo JOIN. É a primeira chave de ordenação da grade. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Nome do produto, trazido de `MATERIA_PRIMA` pelo JOIN. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo deste material, apelidada de UNIDADE na consulta. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quanto deste material entra em uma unidade do produto. |

### Grade `dbconsumo` — consulta agregada sobre MOVIMENTACAO_ESTOQUE

Aba Consumo Mensal. Agrupa as saídas do material por mês e ano, últimos 12 meses, ignorando a tela de sistema 38. Grade somente leitura. Abaixo dela, dois rótulos calculados quando a consulta abre: o total geral e o consumo médio, que soma os três meses anteriores ao mês corrente e divide por três — o mês em curso fica de fora da média, mas entra no total.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Consumo do Material dos Últimos 06 Meses | `NOME_MES` | VARCHAR(18) | 18 | Mês e ano por extenso, montado no SELECT por uma sequência de CASE sobre o mês. Apesar do título falar em seis meses, a consulta traz doze (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Soma das saídas do material no mês (calculado na consulta). |

### Grade `dbconsumo_lote` — tabelas IT_REQUISICAO_MATERIAL e LOTE

Aba Consumo por Lote. Consumo do material agrupado por lote de produção. Grade somente leitura.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Lote | `LOTE` | INTEGER |  | Número do lote de produção que requisitou o material. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do lote, trazida de `LOTE` pelo JOIN. |
| Previsão | `PREVISAO_ENTREGA` | TIMESTAMP |  | Previsão de entrega do lote, trazida de `LOTE` pelo JOIN. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material requisitada para o lote. |

### Grade `dbdesenhos` — tabelas IT_DESENHO e DESENHO

Aba Desenhos. Lista os desenhos técnicos em que o material aparece. Grade somente leitura.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(15) | 15 | Código do desenho. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do desenho, trazida de `DESENHO` pelo JOIN. |
| Descrição Desenho | `DESCRICAO` | VARCHAR(50) | 50 | Nome do desenho, trazido de `DESENHO` pelo JOIN. |
| Número Desenho | `NUMERO_DESENHO` | VARCHAR(15) | 15 | Número da prancha do desenho, trazido de `DESENHO` pelo JOIN. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material prevista no desenho. |

### Grade `dbmateriais_similares` — tabela MATERIA_PRIMA_SIMILARES

Aba Materiais Complementares. Grade editável: cada linha é um material equivalente aceito no lugar deste. A `SEQ` da linha é gerada sozinha no NewRecord (maior SEQ do material mais um) e não aparece na tela; `EMPRESA` e `MATERIA_PRIMA` também são preenchidas ali. Cada linha gravada ou excluída confirma a transação na hora.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Descrição | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material similar. Gravada sempre em caixa alta: o SetText do campo converte o que foi digitado. |
| Conversão | `UNIDADE_CONVERSAO` | DOUBLE PRECISION |  | Fator que converte a quantidade do similar para a unidade deste material. |

### Grade `dblotes` — tabelas IT_LOTE_MATERIAL_EMPENHADO e LOTE

Aba Lotes. Empenhos ainda em aberto do material: só entram itens com status de empenho diferente de Baixado, em lotes emitidos nos últimos doze meses, agrupados por lote. Consulta apenas — o dataset não tem comandos de gravação. Quando esta grade abre, a soma da coluna Quantidade é lançada no campo Conferência do quadro Estoques.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Lote **·chave** | `LOTE` | INTEGER |  | Número do lote de produção que empenhou o material. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material empenhada no lote e ainda não baixada. |
| Qtde. Produção Lote | `QUANTIDADE_PRODUCAO_LOTE` | INTEGER |  | Quantidade que o lote vai produzir, trazida de `LOTE.QUANTIDADE` com apelido na consulta (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do lote, trazida de `LOTE` pelo JOIN. |

### Grade `dbespecificacao_tecnica_material` — tabela ESPECIFICACAO_TECNICA_MATERIAL

Aba Especificação Técnica dos Fornecedores. Grade editável: uma linha por fornecedor, com o código e a especificação que aquele fornecedor usa para este material. A `SEQ` é gerada no NewRecord (maior SEQ do material mais um), junto com `EMPRESA` e `MATERIA_PRIMA`. No BeforePost, se o fornecedor existir, a especificação técnica passa a ser obrigatória e a linha é cancelada com aviso quando está vazia; depois de gravar, linha sem fornecedor válido é apagada. Cada gravação ou exclusão confirma a transação na hora.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `FORNECEDOR` | INTEGER |  | Código do fornecedor, ligado ao cadastro `FORNECEDOR` da empresa. Digitar o código dispara o SetText, que busca o fornecedor e traz o nome; não encontrado, limpa o código e o nome. O botão da célula abre a consulta de fornecedores. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido pelo JOIN e reescrito quando o código é digitado ou escolhido na consulta (calculado na consulta). |
| Código | `CODIGO_PRODUTO_FORNECEDOR` | VARCHAR(50) | 50 | Código com que o fornecedor identifica este material no catálogo e no XML dele. |
| Especificação Técnica do Material | `ESPECIFICACAO_TECNICA` | VARCHAR(150) | 150 | Especificação técnica do material naquele fornecedor. Gravada em caixa alta pelo SetText. Obrigatória quando a linha tem fornecedor válido. |
| Preço Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  | Preço de custo do material naquele fornecedor. |
| Conv. XML | `UNIDADE_CONVERSAO_NOTA_COMPRA` | DOUBLE PRECISION |  | Fator de conversão a usar quando a nota daquele fornecedor for importada do XML. |

### Grade `dbmateria_prima_documentos` — tabela IT_MATERIA_PRIMA_DOCUMENTOS

Aba Documentos. Grade editável, com no máximo três arquivos por material — o BeforeInsert simplesmente aborta a inclusão da quarta linha, sem avisar. Entrar na grade dispara antes a gravação do cadastro. No BeforePost, linha sem caminho de arquivo é cancelada; com caminho, o arquivo é copiado para a pasta de anexos. Chave duplicada é tratada com aviso e desfaz a gravação.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** **·obrig** | `SEQ` | INTEGER |  | Sequencial do documento dentro do material, gerado no NewRecord como maior SEQ mais um. Obrigatório no banco e não digitado. A grade pula esta coluna ao navegar. |
| Data | `DATA` | TIMESTAMP |  | Data do anexo. Preenchida no NewRecord com a data de hoje. |
| Descrição do Documento | `DESCRICAO` | VARCHAR(50) | 50 | Nome dado ao documento. Gravada em caixa alta pelo SetText do campo. |
| Caminho do Arquivo | `CAMINHO_ARQUIVO` | VARCHAR(250) | 250 | Caminho completo do arquivo anexado. Preenchido pelo botão da célula, que abre a caixa de seleção de arquivo e grava também o nome do arquivo em `NOME_ARQUIVO`, coluna que a grade não mostra. Linha sem caminho não é gravada. |
| `ABRIR` | `ABRIR` | VARCHAR(5) | 5 | Coluna sem título, desenhada como botão em cada linha. Não é dado do material: o SELECT devolve o literal ABRIR. Clicar nela abre o arquivo anexado no programa padrão do Windows (calculado na consulta). |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Frequência Contagem | `FREQUENCIA_CONTAGEM` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Frequência Contagem”. Função não verificada no código. |
| Tipo do Produto (SPED) | `TIPO_PRODUTO_SPED` | VARCHAR(25) | 25 | campo da tela | Rótulo na tela: “Tipo do Produto (SPED)”. Função não verificada no código. |
| Tipo de Mercadoria | `TIPO_PATRIMONIO` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Tipo de Mercadoria”. Função não verificada no código. |
| Componente | `TIPO_COMPONENTE` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Componente”. Função não verificada no código. |

<a id="ucad_materia_prima_acerto"></a>

## `ucad_materia_prima_acerto` — Cadastro do Acerto dos Mateiais

Tela de acerto fiscal do cadastro de materiais: abre um material já existente e completa só os dados que a nota fiscal eletrônica exige (unidades, tipo e gênero do item, lista de serviço, NCM). Não cria material — todos os campos gravam por UPDATE em `MATERIA_PRIMA`, chaveada por `EMPRESA` + `CADASTRO`. As descrições ao lado de cada código vêm por LEFT JOIN em `TIPO_ITEM_PRODUTO`, `GENERO_ITEM_PRODUTO`, `LISTA_SERVICO` e `CLASSIFICACAO_FISCAL`.

O material é escolhido no campo `edtcadastro`, um edit comum sem ligação com o banco, no alto da tela: digitar o código e teclar Enter carrega o registro, o botão de reticências (ou F4) abre a consulta de materiais pendentes de acerto e F3 abre o cadastro completo de materiais. A consulta só lista materiais com `ACERTO_CADASTRO = '1'`, ou seja, os que ainda não passaram por esta tela. Material com `TIPO_MATERIA_PRIMA = '1'` (configurado só como produto) é recusado com aviso.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 |  | Nome do material, trazido do cadastro e editável aqui. Obrigatório na gravação: o botão Gravar aborta se estiver vazio. |
| Compra | `UNIDADE_COMPRA` | VARCHAR(3) | 3 |  | Sigla da unidade de medida usada na compra, ligada ao cadastro `UNIDADE_MEDIDA` da empresa. Ao sair do campo o sistema confere a sigla; se não existir, limpa o campo. F4 abre a consulta de unidades, F3 abre o cadastro de unidades. Obrigatório na gravação. |
| Tipo Item | `TIPO_ITEM_PRODUTO` | INTEGER |  |  | Código do tipo do item da mercadoria para o SPED (mercadoria para revenda, matéria-prima, uso e consumo, imobilizado, serviço e afins), ligado ao cadastro `TIPO_ITEM_PRODUTO`. Ao sair do campo o sistema busca a descrição; código inexistente limpa o próprio campo e a descrição. Obrigatório na gravação. É este valor que decide se o NCM será cobrado: nos tipos 7, 8, 9, 10 e 99 o NCM fica dispensado. |
| Descrição do Tipo do Item da Mercadoria | `DESCRICAO_TIPO_ITEM_PRODUTO` | VARCHAR(50) | 50 |  | Nome do tipo do item, trazido do cadastro `TIPO_ITEM_PRODUTO` pelo JOIN e reescrito ao sair do campo do código. Não é digitado (calculado na consulta). |
| Gênero Item | `GENERO_ITEM_PRODUTO` | INTEGER |  |  | Código do gênero do item (os dois primeiros dígitos do NCM, na tabela do SPED), ligado ao cadastro `GENERO_ITEM_PRODUTO`. Ao sair do campo o sistema busca a descrição; código inexistente limpa o próprio campo e a descrição. F4 abre a consulta, F3 o cadastro de gêneros. Não é cobrado na gravação. |
| Descrição do Gênero do Item da Mercadoria | `DESC_GENERO_ITEM_PRODUTO` | VARCHAR(150) | 150 |  | Nome do gênero. Campo calculado do Delphi: o OnCalcFields copia `DESCRICAO_GENERO_ITEM_PRODUTO` (um BLOB vindo do JOIN), tira as quebras de linha e corta em 150 caracteres. Não é digitado (calculado na consulta). |
| Lista Serviço | `LISTA_SERVICO` | VARCHAR(5) | 5 |  | Código do item da lista de serviços da LC 116, ligado ao cadastro `LISTA_SERVICO`. Só se aplica a itens de serviço. Ao sair do campo o sistema busca a descrição; código inexistente limpa o próprio campo e a descrição. F4 abre a consulta, F3 o cadastro. Não é cobrado na gravação. |
| Descrição da Lista de Serviço | `DESC_LISTA_SERVICO` | VARCHAR(150) | 150 |  | Texto do item da lista de serviços. Campo calculado do Delphi: o OnCalcFields copia `DESCRICAO_LISTA_SERVICO` (BLOB do JOIN), tira as quebras de linha e corta em 150 caracteres. Não é digitado (calculado na consulta). |
| Consumo | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Sigla da unidade de medida usada no consumo ou na produção, ligada ao cadastro `UNIDADE_MEDIDA` da empresa. Ao sair do campo o sistema confere a sigla; se não existir, limpa o campo. F4 abre a consulta de unidades, F3 o cadastro. Obrigatório na gravação. |
| Descrição da Classificação Fiscal do NCM | `DESCRICAO_CLASSIFICACAO_FISCAL` | VARCHAR(100) | 100 |  | Texto da classificação fiscal, trazido do cadastro `CLASSIFICACAO_FISCAL` pelo JOIN e reescrito ao sair do campo do NCM. Não é digitado (calculado na consulta). |
| Código NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(20) | 20 |  | Código NCM do material, ligado ao cadastro `CLASSIFICACAO_FISCAL`. Ao sair do campo o sistema busca a descrição; código inexistente limpa o próprio campo e a descrição. F4 abre a consulta de NCM, F3 o cadastro. Obrigatório na gravação, exceto quando o Tipo Item for 7, 8, 9, 10 ou 99 — nesses a validação é pulada. A conferência de vazio é feita sobre o código sem caracteres especiais, então só pontos e traços não passam por preenchimento. |

<a id="ucad_materia_prima_correcao_empenhado"></a>

## `ucad_materia_prima_correcao_empenhado` — Correção do Empenho dos Materiais...

Ferramenta de manutenção que reconcilia o saldo de estoque empenhado dos materiais. Não tem campos de cabeçalho: só três botões (Filtrar, Gravar, Limpar) e uma grade.

O botão Filtrar, após confirmação, roda uma consulta que soma `QUANTIDADE - QUANTIDADE_BAIXADA` de `IT_LOTE_MATERIAL_EMPENHADO` para os empenhos com `STATUS_EMPENHO_MATERIAL <> 'Baixado'` em lotes emitidos nos últimos doze meses, e compara com `MATERIA_PRIMA.ESTOQUE_EMPENHADO`. Só entram na grade os materiais em que os dois valores divergem, arredondados a três casas. A grade é um ClientDataSet em memória (`tbtemp`) — nada é gravado nesse momento.

O botão Gravar, após confirmação, percorre a grade e faz `UPDATE MATERIA_PRIMA SET ESTOQUE_EMPENHADO = <Conferência>` para cada linha, na empresa logada. Ou seja: o valor da coluna Conferência substitui o saldo empenhado do material.

### Grade `dblote` — ClientDataSet em memória `tbtemp` (grava em MATERIA_PRIMA)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Matéria Prima | `MATERIA_PRIMA` | INTEGER |  | Código do material com divergência, vindo de `MATERIA_PRIMA.CADASTRO`. Preenchido pelo Filtrar; é a chave usada no UPDATE do Gravar. Não é digitado (calculado na consulta). |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Nome do material, vindo de `MATERIA_PRIMA.DESCRICAO`. Somente leitura na grade; preenchido pelo Filtrar (calculado na consulta). |
| Empenhado | `EMPENHADO` | DOUBLE PRECISION |  | Saldo empenhado que está hoje em `MATERIA_PRIMA.ESTOQUE_EMPENHADO` — o valor errado, mostrado só para comparação. Somente leitura na grade (calculado na consulta). |
| Conferência | `CONFERENCIA` | DOUBLE PRECISION |  | Saldo empenhado recalculado a partir dos itens de lote em aberto dos últimos doze meses. É o valor que o Gravar escreve por cima de `ESTOQUE_EMPENHADO`. Somente leitura na grade; calculado pelo Filtrar (calculado na consulta). |

<a id="ucad_estrutura_materia_prima"></a>

## `ucad_estrutura_materia_prima` — Cadastro da Estrutura dos Materiais...

Tela de cadastro simples, sem abas nem grade. Grava na tabela `ESTRUTURA_MATERIA_PRIMA`, a árvore de classificação das matérias-primas: o código é hierárquico, com máscara de três níveis, e cada registro é sintético (agrupador) ou analítico (folha). O registro é por empresa: o SELECT filtra por `EMPRESA` e o NewRecord grava a empresa corrente, mas esse campo não aparece na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(10) | 10 |  | Código hierárquico da estrutura, chave primária junto com a empresa. Digitado com a máscara `##.##.###`, ou seja, três níveis: grupo, subgrupo e item. Não há sequencial automático. Ao sair do campo o sistema procura o código; se não existir, inicia registro novo com ele. F4 abre a consulta de estruturas; F7, F8 e F9 navegam entre os códigos. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. Quando os dois últimos níveis estão em branco (registro de primeiro nível), o Gravar zera o campo % Perca automaticamente. |
| Descrição da Estrutura do Material | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da estrutura. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Tipo | `TIPO` | VARCHAR(10) | 10 |  | Nível da estrutura na árvore. Combo com dois valores, gravados como o texto literal: `'Sintético'` = agrupador, e `'Analítico'` = folha, o nível que recebe material. O NewRecord já grava `'Sintético'`. Regra ligada ao campo Markup: estrutura `'Sintético'` não pode ter Markup maior que zero — o Gravar aborta com a mensagem "Impossível lançar Markup p/ Estrutura do Material do Nível Sintético". Campo do controle `cbtipo`, ficam em branco aqui; a coluna `TIPO` está no SELECT, no INSERT e no UPDATE da tela, e o TField no DFM a declara como texto de 10 posições. |
| Markup | `MARKUP` | DOUBLE PRECISION |  |  | Markup aplicado sobre o custo dos materiais desta estrutura, com três casas decimais. Só é aceito em estrutura do tipo `'Analítico'`: com `'Sintético'` a gravação é abortada. Não é validado como obrigatório. |
| % Perca | `PERCENTUAL_PERCA` | DOUBLE PRECISION |  |  | Percentual de perda de material previsto para a estrutura. Zerado pelo sistema na gravação quando o código está apenas no primeiro nível da máscara. Não é validado como obrigatório. |

<a id="umov_requisicao_materiais"></a>

## `umov_requisicao_materiais` — Requisição de Materiais...

Retirada de material do almoxarifado por um funcionário. O cabeçalho fica em `REQUISICAO_MATERIAL`, chave `EMPRESA` + `NUMERO`, e os itens em `IT_REQUISICAO_MATERIAL`, na grade `RxDBGrid1`. Cada item gravado baixa o estoque da matéria-prima (`baixa_estoque_materia_prima`) e grava a data da última movimentação com o documento `'RE'`; excluir o item estorna a baixa. A tela recusa o item que deixaria o saldo do material negativo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da requisição, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REQUISICAO_MATERIAL` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta requisições, F7 anterior, F8 próximo, F9 posiciona. |
| Funcionário | `FUNCIONARIO` | INTEGER |  |  | Código do funcionário que está retirando o material. Exigido no Gravar. F4 abre a consulta de funcionários, F3 abre o cadastro. Ao sair do campo, o sistema busca o cadastro e preenche o nome; código inexistente limpa código e nome. |
| Nome do Funcionário | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 |  | Nome do funcionário, trazido do JOIN com `FUNCIONARIO`. Preenchido pelo Exit do código; não é digitado (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da requisição. Preenchida com a data de hoje no NewRecord; ao entrar no campo, se estiver vazia ou inválida, volta para a data de hoje. Precisa ser data válida no Gravar. É a data gravada como última movimentação do material. |

### Grade `RxDBGrid1` — tabela IT_REQUISICAO_MATERIAL

Materiais retirados. A sequência (`SEQ`) é gerada pelo sistema como `MAX(SEQ) + 1` dentro da requisição, não aparece na grade. A grade é ordenada pela descrição do material. Cada linha gravada baixa o estoque; alterar a quantidade movimenta apenas a diferença em relação à quantidade anterior.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material retirado. Só aceita cadastro com `TIPO_MATERIA_PRIMA = '2'` (Material) e `INATIVO = '1'` (ativo): item marcado como `'1'` (somente Produto) é recusado com o aviso de configurá-lo como Material, e item inativo é recusado com o aviso de que está inativo; em ambos os casos a linha é limpa. Aceito o código, a tela traz a descrição e a unidade de consumo e, se a quantidade estiver zerada, preenche com 1. Item cujo material não existir é apagado no AfterPost. F4 abre a consulta de materiais. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, trazida de `MATERIA_PRIMA` quando o código é aceito. Não é digitada. (calculado na consulta) |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, vinda do cadastro de matéria-prima. Não é digitada. |
| Lote | `LOTE` | INTEGER |  | Lote de produção a que a retirada se destina, para apropriar o consumo. Ao sair da coluna, o sistema confere o número em `LOTE`: não existindo, a coluna é limpa. Não é obrigatório. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade retirada, na unidade de consumo. Precisa ser maior que zero: quantidade zerada faz o item ser apagado logo após o post, com aviso. É esta quantidade que baixa o estoque, e a baixa é recusada se deixar o saldo do material negativo. |

<a id="umov_baixa_estoque_materia_prima_empenhada"></a>

## `umov_baixa_estoque_materia_prima_empenhada` — Baixa do Estoque por Lote dos Materiais Empenhados...

Baixa de uma vez todos os materiais empenhados de um lote de produção. O usuário informa o lote nos campos soltos do topo (lote, produto, descrição e referência, todos `TEdit` não ligados a dataset) e a grade carrega os materiais empenhados desse lote, somando `LOTE.QUANTIDADE` vezes a quantidade do componente. O botão Baixar gera a requisição em `REQUISICAO_MATERIAL` e `IT_REQUISICAO_MATERIAL`, chama a baixa de estoque e atualiza `LOTE.STATUS_EMPENHO_MATERIAL`, que assume `'Empenhado'`, `'Baixado Parcial'` ou `'Baixado'` — o lote só vira `'Baixado'` quando nenhum material ficou com saldo insuficiente. A grade é um `TClientDataSet` de memória (`tbmateria_prima`); a etiqueta vermelha "Existem materiais com saldo insuficiente para atender o lote, estes materiais não serão baixados." aparece quando alguma linha fica com disponível abaixo de -1.

### Grade `dbmateria_prima` — tabela de trabalho `tbmateria_prima` (em memória)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro | `MATERIA_PRIMA` | INTEGER |  | Código do material empenhado no lote (calculado na consulta). |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO` (calculado na consulta). |
| UN | `M_UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida do cadastro (calculado na consulta). |
| Estoque | `SALDO_ATUAL` | DOUBLE PRECISION |  | Saldo físico do material, lido de `MATERIA_PRIMA.SALDO` (calculado na consulta). |
| Empenhado | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade empenhada do material para o lote, somada na consulta como quantidade do lote vezes quantidade do componente na estrutura. Só entram os empenhos com `STATUS_EMPENHO_MATERIAL` igual a `'Empenhado'` ou `'Baixado Parcial'` (calculado na consulta). |
| Baixar | `QUANTIDADE_BAIXAR` | DOUBLE PRECISION |  | Quantidade que será baixada. Nasce igual ao Empenhado e pode ser reduzida pelo usuário; é o valor gravado em `IT_REQUISICAO_MATERIAL.QUANTIDADE` (calculado na consulta). |
| Disponível | `DISPONIVEL` | DOUBLE PRECISION |  | Campo calculado do Delphi: estoque menos quantidade a baixar, recalculado a cada mudança na coluna Baixar. Negativo abaixo de -1 marca o material como saldo insuficiente e ele não é baixado; entre -1 e 1 e diferente de zero, o sistema ajusta a baixa para consumir o saldo restante (calculado na consulta). |

<a id="umov_requisicao_compra_por_lote"></a>

## `umov_requisicao_compra_por_lote` — Requisição de Compra por Lote...

Gera a necessidade de compra a partir dos lotes de produção. O cabeçalho fica em `REQUISICAO_COMPRA`, chave `EMPRESA` + `NUMERO`. O usuário informa os lotes de produção na grade `dblote` (`IT_REQUISICAO_COMPRA_LOTE`) e aciona o Filtrar: a tela explode a composição dos produtos daqueles lotes — composição direta e composição dos subconjuntos — soma o consumo de cada matéria-prima e grava os materiais em `IT_REQUISICAO_COMPRA_MATERIAL`, agrupados pelo fornecedor de compra cadastrado em cada material, em `IT_REQUISICAO_COMPRA_FORNECEDOR`. As três grades trabalham em cascata: escolher o lote alimenta a lista de fornecedores, e escolher o fornecedor filtra os materiais dele. A partir da grade de fornecedores a tela gera pedido de compra e cotação. Filtrar apaga e refaz todos os fornecedores e materiais da requisição.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Lote Compra **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da requisição de compra, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REQUISICAO_COMPRA` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta requisições, F7 anterior, F8 próximo, F9 posiciona. Não confundir com o Nº Lote da grade: este é o número da requisição. |
| Total | `TOTAL` | DOUBLE PRECISION |  |  | Valor total da requisição. Somente leitura e não é coluna de `REQUISICAO_COMPRA`: vem de uma subconsulta que soma `TOTAL` de todos os itens de `IT_REQUISICAO_COMPRA_MATERIAL` da requisição, de todos os fornecedores. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da requisição. Preenchida com a data de hoje no NewRecord e regravada com a data de hoje toda vez que o Filtrar é executado — ou seja, marca a última vez que a necessidade foi calculada. |

### Grade `dblote` — tabela IT_REQUISICAO_COMPRA_LOTE

Lotes de produção que entram no cálculo da necessidade. É o que o usuário digita; o resto da tela é consequência. A sequência (`SEQ`) é gerada pelo sistema como `MAX(SEQ) + 1` dentro da requisição.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nº Lote | `LOTE` | INTEGER |  | Número do lote de produção a incluir. Ao ser digitado, o sistema procura o lote e só aceita se o `TIPO_LOTE` for `'Lote'`: sendo `'Pré-Lote'`, avisa e limpa a linha; não existindo, limpa a linha em silêncio. A linha também é apagada no AfterPost se o lote não for encontrado. F4 abre a consulta de lotes. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do produto do lote, trazida de `LOTE` junto com a descrição do produto quando o número do lote é aceito. Não é digitada. |

### Grade `dbfornecedor` — tabela IT_REQUISICAO_COMPRA_FORNECEDOR

Fornecedores apurados pelo Filtrar, um por fornecedor de compra dos materiais explodidos. A grade é gerada, não digitada: o Filtrar apaga todas as linhas e as recria. Posicionar numa linha filtra a grade de materiais abaixo. As cores indicam a situação: vermelho quando ainda há quantidade a comprar, azul quando o status já saiu de Pendente, preto nos demais casos. O check "não listar sugestão de compra zerada" acrescenta `WHERE SUGESTAO_E3 > 0` e some com os fornecedores sem nada a comprar.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `FORNECEDOR` | INTEGER |  | Código do fornecedor. Não é escolhido aqui: vem do campo `COMPRA_FORNECEDOR` do cadastro de cada matéria-prima explodida. Para trocar o fornecedor de um material, use duplo clique na grade de materiais. |
| Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido do JOIN com `FORNECEDOR` (calculado na consulta). |
| Nº Pedido | `NUMERO_PEDIDO` | INTEGER |  | Número do pedido de compra gerado para este fornecedor. Preenchido pelo botão Gerar Pedido, que cria o `PEDIDO_COMPRA` e grava aqui o número. O botão Consultar Pedido abre esse pedido. Fica zero enquanto o pedido não foi gerado. |
| Quantidade | `SUGESTAO_E3` | DOUBLE PRECISION |  | Quantidade total ainda a comprar deste fornecedor. Não é coluna de tabela: é a soma, só das parcelas positivas, das sugestões de compra dos materiais dele (calculado na consulta). Maior que zero pinta a linha de vermelho e é o critério do filtro de sugestão zerada. |
| Status | `STATUS` | VARCHAR(50) | 50 | Situação da compra junto a este fornecedor, definida pelo menu de contexto da grade, não digitada. Assume `'Pendente'` (padrão na criação da linha, ainda a resolver), `'Materiais em Estoque'` (não precisa comprar, já há material), `'Pedido Efetivado Antecipadamente'` (a compra já havia sido feita antes desta requisição) e `'Pedido Efetivado por outro Fornecedor'` (o material foi comprado de outro fornecedor). Qualquer valor diferente de `'Pendente'` pinta a linha de azul, sinalizando fornecedor já resolvido. |

### Grade `dbrequisicao_compra` — tabela IT_REQUISICAO_COMPRA_MATERIAL

Materiais a comprar do fornecedor selecionado acima, com as quantidades apuradas pelo Filtrar. Duplo clique numa linha abre a consulta de fornecedores alternativos daquele material e transfere o item para o fornecedor escolhido — a tela recusa transferir para o mesmo fornecedor. F3 sobre o material abre o cadastro, usado quando falta NCM: gerar pedido é bloqueado enquanto algum material do fornecedor estiver sem classificação fiscal.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `MATERIA_PRIMA` | INTEGER |  | Código da matéria-prima apurada na explosão da composição dos lotes. Não é digitado. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição da matéria-prima, trazida de `MATERIA_PRIMA`. Ordena a grade. (calculado na consulta) |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Consumo total do material nos lotes selecionados: soma de `quantidade da composição vezes quantidade do lote`, considerando composição direta e composição dos subconjuntos. Calculada pelo Filtrar. |
| UC | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, vinda do cadastro de matéria-prima. É a unidade em que Quantidade, Estoque, Empenho e Sugestão estão expressos. |
| Estoque | `ESTOQUE` | DOUBLE PRECISION |  | Saldo em estoque do material no momento do Filtrar, copiado de `MATERIA_PRIMA.SALDO`. |
| Empenho | `ESTOQUE_EMPENHADO` | DOUBLE PRECISION |  | Quantidade já empenhada do material, lida de `MATERIA_PRIMA.ESTOQUE_EMPENHADO`. É a necessidade que serve de ponto de partida para a sugestão. |
| Estoque Min. | `ESTOQUE_MINIMO` | DOUBLE PRECISION |  | Estoque mínimo cadastrado no material (`MATERIA_PRIMA.MINIMA`). Somado à falta apurada, para que a compra reponha também o mínimo (calculado na consulta). |
| Pedido | `QUANTIDADE_PEDIDO` | DOUBLE PRECISION |  | Quantidade do material já pedida e ainda não faturada, somada dos itens de pedido de compra com quantidade faturada zero e status `'Pendente'`. Abate a necessidade: o que já está a caminho não é sugerido de novo. |
| Sugestão | `SUGESTAO_CONSUMO` | DOUBLE PRECISION |  | Sugestão de compra na unidade de consumo. Calculada na consulta a partir de `Empenho menos Pedido menos Estoque`, somando o estoque mínimo; a falta negativa é invertida antes de somar o mínimo (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Custo unitário usado no cálculo. O Filtrar busca primeiro o preço da especificação técnica daquele material para aquele fornecedor; não havendo, usa o `PRECO_CUSTO` do cadastro da matéria-prima. |
| Total | `TOTAL_SUGESTAO` | DOUBLE PRECISION |  | Sugestão na unidade de consumo multiplicada pelo valor unitário. Calculado na consulta, não digitado (calculado na consulta). |
| Qtd. URC | `SUGESTAO_COMPRA` | DOUBLE PRECISION |  | Sugestão de compra convertida para a unidade de compra, dividindo a falta pelo fator de conversão do material antes de somar o mínimo. É esta coluna que alimenta o pedido de compra e a Quantidade da grade de fornecedores. |
| URC | `UNIDADE_COMPRA` | VARCHAR(3) | 3 | Unidade de compra do material, vinda do cadastro de matéria-prima. É a unidade da coluna Qtd. URC. |

<a id="umov_alteracao_custo_padrao_materia_prima"></a>

## `umov_alteracao_custo_padrao_materia_prima` — Alteração do Custo Padrão dos Materiais...

Reajusta em lote o custo padrão dos materiais. A tela não tem cabeçalho gravável: os filtros são controles soltos (radiogroup `rgfiltro` com "Estrutura do Material", "Fornecedor Ultima Compra" e "Especificação Técnica do Material", o código do filtro escolhido e o campo "% Reajuste"), o Filtrar carrega a grade em um `TClientDataSet` de memória (`tbtemp`) e o Gravar percorre essa grade. Para os filtros 0 e 1 o Gravar grava o histórico em `IT_MATERIA_PRIMA_TABELA_CUSTO`; para o filtro 2 ele altera o `PRECO_CUSTO` da especificação técnica do material daquele fornecedor. Só entram na gravação as linhas em que custo atual e novo preço diferem.

### Grade `RxDBGrid1` — tabela de trabalho `tbtemp` (em memória)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material trazido pelo filtro (calculado na consulta). Somente leitura na prática: o AfterPost reconsulta o material e descarta a linha se ele não existir mais. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO` (calculado na consulta). |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida do cadastro (calculado na consulta). |
| Custo Atual | `CUSTO_PADRAO_ANTERIOR` | DOUBLE PRECISION |  | Custo padrão vigente, carregado de `MATERIA_PRIMA.PRECO_CUSTO` no Filtrar (ou do preço da especificação técnica, no filtro 2). É a base dos dois cálculos da linha (calculado na consulta). |
| % Reajuste | `PERCENTUAL_REAJUSTE` | DOUBLE PRECISION |  | Percentual aplicado sobre o custo atual. Vem preenchido com o "% Reajuste" digitado no topo da tela, e pode ser corrigido linha a linha. Digitar aqui recalcula o Novo Preço como custo atual mais o percentual; se o custo atual for zero, o Novo Preço repete o custo atual (calculado na consulta). |
| Novo Preço | `CUSTO_PADRAO_ATUAL` | DOUBLE PRECISION |  | Novo custo padrão. Calculado a partir do % Reajuste, mas também pode ser digitado direto — nesse caso o sistema recalcula o % Reajuste pela diferença sobre o custo atual, ou zera o percentual quando o custo atual é zero (calculado na consulta). |
| Data | `DATA` | DATE |  | Data do último reajuste já registrado para o material, lida de `IT_MATERIA_PRIMA_TABELA_CUSTO` no Filtrar. É informativa: o registro gravado pelo Gravar usa a data de hoje, não esta (calculado na consulta). |
| Data Ult. Compra | `COMPRA_DATA` | TIMESTAMP |  | Data da última compra do material, trazida de `MATERIA_PRIMA.COMPRA_DATA`. Somente para conferência, não é regravada. (calculado na consulta) |
| Preço Ult. Compra | `COMPRA_PRECO` | DOUBLE PRECISION |  | Preço da última compra do material, trazido de `MATERIA_PRIMA.COMPRA_PRECO`. Somente para conferência, serve de referência ao definir o novo custo. (calculado na consulta) |

<a id="ucad_representante_compra"></a>

## `ucad_representante_compra` — Cadastro dos Representantes dos Fornecedores...

Cadastro do representante que atende a empresa pelo lado do fornecedor, na tabela `REPRESENTANTE_COMPRA`, chave `EMPRESA` + `CADASTRO`. Painel único, sem abas nem grade: identificação, documentos, endereço vindo do CEP e contatos. É o cadastro-espelho de `ucad_representante_venda`, mas sem comissão, banco nem região.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do representante, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de representantes. |
| Razão Social / Nome do Representante | `NOME` | VARCHAR(50) | 50 |  | Razão social, se pessoa jurídica; nome, se pessoa física. Exigido no Gravar — vazio aborta com "Nome do Representante". |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia ou sobrenome. O NewRecord grava um espaço em branco de propósito: as consultas concatenam este campo com outros no SQL e um valor nulo apagaria a linha inteira do resultado. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de representante fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativo). |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço. Ao sair do campo, busca no cadastro de CEP: achando, regrava o CEP no formato do cadastro e preenche Cidade e Estado. F3 abre o cadastro de CEP. Também é o campo que alimenta Cidade e Estado, que não têm busca própria. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Cidade, preenchida pelo sistema a partir do CEP. Exigida no Gravar — vazia aborta com "Cidade do Representante". Como só o CEP a preenche, CEP inexistente no cadastro impede gravar. |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | UF do endereço, preenchida pelo sistema a partir do CEP. A lista oferece as 27 UFs mais `EX` (exterior). Exigido no Gravar — vazio aborta com "Estado do Representante". |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | Documento do representante. Ao sair, o campo é limpo de pontuação e medido: 11 dígitos vira CPF formatado, 14 vira CNPJ formatado, qualquer outro tamanho recusa a saída com "C.N.P.J. ou C.P.F. inválido". Feito o formato, os dígitos verificadores são conferidos e o erro é avisado. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual, se pessoa jurídica; RG, se pessoa física. Não é validado. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone fixo. |
| Fax | `FAX` | VARCHAR(15) | 15 |  | Número de fax. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Telefone celular. |
| Email | `EMAIL` | VARCHAR(60) | 60 |  | Endereço de e-mail. |
| Home Page | `HOME_PAGE` | VARCHAR(60) | 60 |  | Endereço do site. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro e número. Digitado — o CEP não preenche este campo. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro. Digitado — o CEP não preenche este campo. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Texto livre. Enter dentro do memo pula linha; dois Enters seguidos saem do campo. |
| Data Cadastro | `DATA_CADASTRO` | TIMESTAMP |  |  | Data em que o representante foi cadastrado. Ao entrar no campo, se o conteúdo não for uma data válida, o sistema grava a data de hoje. |

<a id="umov_nota_fiscal_compra"></a>

## `umov_nota_fiscal_compra` — Lançamento da Nota Fiscal de Entrada...

Tela multifunção que grava toda a entrada fiscal no cabeçalho `ENTRADA` e os itens em `IT_ENTRADA`, com as filhas `IT_ENTRADA_VENCIMENTO` (parcelas), `IT_ENTRADA_PEDIDO_COMPRA` (vínculo com o pedido), `IT_ENTRADA_NOTA_REFERENCIADA`, `IT_ENTRADA_CONHECIMENTO_FRETE`, `IT_ENTRADA_ENERGIA_TERCEIROS` e `IT_ENTRADA_LEGISLACAO`. O campo `TIPO_NOTA_FISCAL` manda em tudo: ele decide quais painéis e abas ficam visíveis, quais modelos de documento fiscal são aceitos e quais campos são exigidos na gravação, de modo que a mesma coluna do banco muda de sentido conforme o tipo (por exemplo `TOTAL` é o total da nota na Compra, o valor do frete no Conhecimento e o total da fatura na Energia Elétrica).

### Campos

#### Barra superior — Lançamento da Nota Fiscal de Entrada...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do lançamento, exibida em negrito no canto superior direito. Assume `Pendente` (gravado no NewRecord, é o estado em que a nota pode ser editada), `Lançada` (após o botão Fechar; bloqueia qualquer alteração de cabeçalho, itens, vencimentos, legislações e referenciadas, e é nesse momento que o Contas a Pagar é gerado a partir das parcelas) e `Aberto` (resultado da Reabrir quando já existem pagamentos em IT_PAGAR; nesse caso os títulos não são apagados). Reabrir sem pagamentos devolve a nota para `Pendente`. Somente leitura, é TDBText. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno do lançamento, não é o número da nota do fornecedor. Faz parte da chave primária. No Exit o sistema busca o último número usado e sugere o próximo, ou abre o lançamento existente se o número já foi gravado. |
| Tipo da Nota Fiscal | `TIPO_NOTA_FISCAL` | VARCHAR(30) | 30 |  | Radiogroup com `Compra`, `Conhecimento Frete`, `Serviço`, `Energia Elétrica`, `Nota de Comunicação` e `Transporte`. O NewRecord grava `Compra`. Compra libera as abas de Itens, Nota Fiscal Referenciada e Dados Adicionais mais os painéis de Transportadora e Cálculo do Imposto; Conhecimento Frete e Transporte trocam para o painel de frete; Serviço mantém itens e cálculo do imposto mas esconde o modelo do documento; Energia Elétrica troca todo o cabeçalho pelos painéis da fatura de energia; Nota de Comunicação mostra o painel de telecomunicação. |

#### Fornecedor

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| CNPJ / CPF | `CNPJ_CPF_FORNECEDOR` | VARCHAR(18) | 18 |  | Chave de busca do fornecedor. Aceita só 11 dígitos (CPF) ou 14 (CNPJ), confere o dígito verificador e formata. Achando o cadastro, preenche sozinho nome, plano de contas, IE/RG, contato, fone, endereço, número, bairro, cidade, estado e regime de tributação; não achando, limpa todos eles. O fornecedor é exigido na gravação em qualquer tipo de nota. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do cadastro do fornecedor pelo CNPJ/CPF, não é digitado (calculado na consulta). |
| Nome do Contato | `CONTATO_FORNECEDOR` | VARCHAR(30) | 30 |  | Contato de compras, trazido do campo CONTATO_VENDA do cadastro do fornecedor (calculado na consulta). |
| Fone | `FONE_FORNECEDOR` | VARCHAR(15) | 15 |  | Telefone trazido do cadastro do fornecedor (calculado na consulta). |
| Endereço | `ENDERECO_FORNECEDOR` | VARCHAR(50) | 50 |  | Logradouro trazido do cadastro do fornecedor (calculado na consulta). |
| Cidade | `NOME_CIDADE_FORNECEDOR` | VARCHAR(55) | 55 |  | Cidade trazida do cadastro do fornecedor (calculado na consulta). |
| Bairro | `BAIRRO_FORNECEDOR` | VARCHAR(50) | 50 |  | Bairro trazido do cadastro do fornecedor (calculado na consulta). |
| Insc. Est. / RG | `IE_RG_FORNECEDOR` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG, trazida do cadastro do fornecedor (calculado na consulta). |
| Número | `NUMERO_ENDERECO_FORNECEDOR` | VARCHAR(10) | 10 |  | Número do endereço, trazido do cadastro do fornecedor (calculado na consulta). |

#### Dados Adicionais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Indicador Pagto | `INDICADOR_FORMA_PAGAMENTO` | INTEGER |  |  | Código do cadastro INDICADOR_FORMA_PAGAMENTO. O NewRecord já grava o código 1. Exigido na gravação quando o tipo é Compra ou Serviço. |
| Descrição do Indicador da Forma de Pagamento | `DESCRICAO_INDICADOR_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição do indicador, preenchida junto com o código (calculado na consulta). |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano, preenchida junto com o código (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Vem preenchido do cadastro do fornecedor e pode ser trocado por consulta. Exigido em Compra e em Serviço, e a gravação só aceita plano cujo TIPO seja `Analítico` — plano sintético é recusado com aviso. |
| Descrição do Serviço | `DESCRICAO_SERVICO` | VARCHAR(150) | 150 |  | Só aparece e só é exigido quando o tipo da nota é Serviço. |
| Chave de Acesso da NFe | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 |  | Só fica visível quando o modelo do documento é `55`. Nesse modelo é obrigatória, precisa ter 44 dígitos e passa por conferência do dígito verificador, do CNPJ do emitente, do mês da emissão e do número/série. Em qualquer outro modelo, preencher a chave é recusado. |

#### Dados da Nota Fiscal de Serviços de Telecomunicação

Painel visível somente quando o tipo é `Nota de Comunicação`. Nesse tipo os modelos aceitos são `21`, `22` e `62` (NFCom).

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da fatura de comunicação. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS da fatura de comunicação. |
| Valor Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da fatura de comunicação. Nesta tela a mesma coluna guarda o total da nota, o valor do frete ou o total da fatura conforme o tipo. |
| Valor Desconto | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto da fatura de comunicação. |
| Descrição da CST do ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 |  | Descrição do CST, trazida do cadastro junto com o código (calculado na consulta). |
| CST ICMS | `TRIBUTO_ICMS` | VARCHAR(8) | 8 |  | Código do cadastro de tributação do ICMS. O conteúdo é origem da mercadoria mais CST: a validação lê as posições 2 e 3. Os CST `00`, `10`, `20` e `70` exigem base, alíquota e valor de ICMS preenchidos; `30`, `40`, `41`, `50`, `51` e `60` exigem os três zerados; nos CST `20` e `70` a base tem de ser menor que o total. Fornecedor do Simples Federal não pode usar `00`, `10`, `20` nem `70`. |
| Alíquota ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota aplicada sobre a base do ICMS. |
| Valor não Trib. | `VALOR_NAO_TRIBUTADO` | DOUBLE PRECISION |  |  | Parcela da fatura fora da tributação do ICMS. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano, preenchida junto com o código (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Plano de contas do lançamento; só aceita plano do tipo `Analítico`. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas cobradas na fatura. |
| Base ICMS ST | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base da substituição tributária. |
| Valor ICMS ST | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor do ICMS retido por substituição. |
| Valor PIS | `VALOR_PIS` | DOUBLE PRECISION |  |  | PIS destacado na fatura. |
| Valor COFINS | `VALOR_COFINS` | DOUBLE PRECISION |  |  | COFINS destacada na fatura. |
| % Red. Icms | `PERCENTUAL_REDUCAO_ICMS` | DOUBLE PRECISION |  |  | Percentual de redução da base do ICMS. O BeforePost do cabeçalho sobrescreve este campo: grava 20 quando o tipo é Energia Elétrica e 0 em todos os demais tipos, inclusive neste. |
| 2ª CFOP | `NATUREZA_02` | VARCHAR(10) | 10 |  | Segunda natureza de operação, usada quando a fatura de comunicação precisa de dois CFOP. Validada contra o cadastro de naturezas. |
| Descrição da Segunda CFOP | `DESCRICAO_SEGUNDA_NATUREZA` | VARCHAR(70) | 70 |  | Descrição da segunda CFOP, preenchida junto com o código (calculado na consulta). |
| Chave de Acesso da NFCom | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 |  | Mesma coluna da chave da NFe, reaproveitada para a NFCom no modelo `62`. |

#### Dados do Conhecimento de Frete

Painel visível quando o tipo é `Conhecimento Frete` ou `Transporte`. Em Conhecimento Frete os modelos aceitos são `07`, `08`, `8B`, `09`, `10`, `11`, `26`, `27` e `57` (CT-e).

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base do ICMS do conhecimento. Fornecedor do Simples Federal não pode ter base preenchida. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS do conhecimento. Fornecedor do Simples Federal não pode ter valor preenchido. |
| Valor do Frete | `TOTAL` | DOUBLE PRECISION |  |  | Valor do serviço de transporte. Exigido maior que zero na gravação deste tipo. |
| Valor Desconto | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto concedido no frete. |
| Descrição da CST do ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 |  | Descrição do CST, preenchida junto com o código (calculado na consulta). |
| CST ICMS | `TRIBUTO_ICMS` | VARCHAR(8) | 8 |  | Obrigatório neste tipo. Origem mais CST nas posições 2 e 3: `00`, `10`, `20` e `70` exigem base, alíquota e valor; `30`, `40`, `41`, `50`, `51` e `60` exigem tudo zerado. Se a CFOP não dá direito a crédito (CREDITO_DEBITO_ICMS diferente de `2`), os CST `00`, `10`, `20` e `70` são recusados. |
| Alíquota ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota do ICMS do frete. Fornecedor do Simples Federal não pode informar alíquota. |
| Indicador Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código do cadastro MODALIDADE_FRETE. Obrigatório na gravação do conhecimento. |
| Descrição do Indicador do Tipo de Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade, preenchida junto com o código (calculado na consulta). |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano, preenchida junto com o código (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Obrigatório no conhecimento de frete e só aceita plano do tipo `Analítico`. |
| Tipo da Nota Fiscal Transportada | `TIPO_NOTA_CONHECIMENTO_FRETE` | VARCHAR(10) | 10 |  | Radiogroup com `Compra` e `Venda`; o NewRecord grava `Compra`. Escolhe qual das duas grades de notas transportadas aparece: `Compra` mostra a grade de notas de entrada, `Venda` mostra a grade de notas de saída. |
| Chave de Acesso da CTe | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 |  | Mesma coluna da chave da NFe. Obrigatória quando o modelo é `57`, com 44 dígitos e conferência do dígito verificador; em outros modelos preencher a chave é recusado. |

#### pnlcte — origem e destino do CT-e

Painel dentro do Conhecimento de Frete, escondido quando o tipo é `Transporte`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cidade Origem | `CIDADE_INICIO_CTE` | INTEGER |  |  | Código da cidade de início da prestação. Obrigatório na gravação do conhecimento. Vem preenchido da tag cMunIni quando o XML do CT-e é importado. |
| Nome da Cidade de Origem | `NOME_CIDADE_INICIO_CTE` | VARCHAR(50) | 50 |  | Somente leitura. Preenchido pelo sistema a partir do código da cidade. |
| UF Orig. | `ESTADO_INICIO_CTE` | VARCHAR(2) | 2 |  | Somente leitura. Preenchido pelo sistema a partir do código da cidade. |
| Cidade Destino | `CIDADE_FIM_CTE` | INTEGER |  |  | Código da cidade de fim da prestação. Obrigatório na gravação do conhecimento. Vem da tag cMunFim na importação do XML. |
| Nome da Cidade de Destino | `NOME_CIDADE_FIM_CTE` | VARCHAR(50) | 50 |  | Somente leitura. Preenchido pelo sistema a partir do código da cidade. |
| UF Dest. | `ESTADO_FIM_CTE` | VARCHAR(2) | 2 |  | Somente leitura. Preenchido pelo sistema a partir do código da cidade. |

#### pnlcteos — CT-e OS

Painel dentro do Conhecimento de Frete, visível somente quando o tipo é `Transporte` (CT-e Outros Serviços, modelo `67`).

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Serviço | `DESCRICAO_SERVICO` | VARCHAR(150) | 150 |  | Descrição do serviço de transporte prestado. Mesma coluna usada pela nota de serviço. |
| Quantidade Carga | `QUANTIDADE_CARGA_CTEOS` | DOUBLE PRECISION |  |  | Quantidade de carga transportada declarada no CT-e OS. |
| Data Viagem | `DATA_VIAGEM` | TIMESTAMP |  |  | Data da viagem do CT-e OS. |

#### Transportadora

Painel visível somente quando o tipo é `Compra`; os campos de transportadora e modalidade em si continuam visíveis nos demais tipos.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora, com consulta por F4. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome trazido do cadastro junto com o código. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código do cadastro MODALIDADE_FRETE. Obrigatório quando o tipo é Compra. O valor `0` é o frete por conta do emitente, único aceito para amarrar a nota a um conhecimento de frete de venda; o valor `9` significa sem frete e é recusado nessa amarração; qualquer outro valor é tratado como frete já pago pelo destinatário. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade, preenchida junto com o código (calculado na consulta). |
| Total Conhec. Frete | `TOTAL_CONHECIMENTO_FRETE` | DOUBLE PRECISION |  |  | Somente leitura. Valor do conhecimento de frete já lançado para esta nota; só aparece quando existe conhecimento vinculado (calculado na consulta). |
| Nº Conhec. Frete | `NUMERO_CONHECIMENTO_FRETE` | INTEGER |  |  | Somente leitura. Número do lançamento do conhecimento de frete vinculado; só aparece quando existe vínculo. |

#### Cálculo do Imposto

Painel visível quando o tipo é `Compra` ou `Serviço`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base Subst. | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base da substituição tributária da nota. |
| Valor Subst. | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor do ICMS retido por substituição na nota. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base do ICMS informada no documento do fornecedor. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS informado no documento do fornecedor. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI da nota. No fechamento é regravado com o somatório do IPI dos itens. |
| Total Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Total dos produtos conforme o documento do fornecedor. Serve de divisor no rateio de frete, despesa e desconto entre os itens, feito no fechamento. |
| Total Nota | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota fiscal. |
| Valor Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Frete cobrado na nota. No fechamento é rateado por item, proporcional ao total bruto de cada item. |
| Desconto | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto da nota. No fechamento é rateado por item, proporcional ao total bruto de cada item. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas da nota. No fechamento é rateada por item, proporcional ao total bruto. |
| Serviços | `TOTAL_SERVICO` | DOUBLE PRECISION |  |  | Parcela de serviços dentro da nota. |

#### Crédito do Simples Nacional

Painel visível apenas em nota de Compra e apenas quando o fornecedor tem regime `Simples Federal` ou já existe CSOSN lançado em algum item.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base Crédito | `BASE_CREDITO_SIMPLES` | DOUBLE PRECISION |  |  | Base do crédito do Simples Nacional da nota. Na importação do XML é preenchida com a soma das bases dos itens. |
| Valor Crédito | `VALOR_CREDITO_SIMPLES` | DOUBLE PRECISION |  |  | Valor do crédito do Simples Nacional da nota. Na importação do XML é preenchido com a soma dos créditos dos itens. |

#### Nota Fiscal de Energia Elétrica Eletrônica

Painel visível somente quando o tipo é `Energia Elétrica`; nesse tipo o único modelo aceito é `66`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da fatura de energia. Mesma coluna do cabeçalho comum, repetida neste painel. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 |  | Mês/ano de referência do consumo faturado. |
| Série | `SERIE` | VARCHAR(5) | 5 |  | Série da fatura. Exigida na gravação. |
| Modelo | `MODELO_DOCUMENTO_FISCAL` | VARCHAR(2) | 2 |  | Exigido na gravação e, neste tipo, só aceita `66` (Nota Fiscal de Energia Elétrica Eletrônica); qualquer outro modelo é recusado com aviso. |
| Descrição do Modelo do Documento Fiscal | `DESCRICAO_MODELO_DOCUMENTO` | VARCHAR(100) | 100 |  | Descrição do modelo, preenchida junto com o código (calculado na consulta). |
| Descrição da Situação do Documento Fiscal | `DESCRICAO_SITUACAO_DOCUMENTO` | VARCHAR(100) | 100 |  | Descrição da situação, preenchida junto com o código (calculado na consulta). |
| Unidade Consumidora | `UNIDADE_CONSUMIDORA` | VARCHAR(20) | 20 |  | Identificação da unidade consumidora na distribuidora. |
| Consumo em kWh | `CONSUMO_KWH` | INTEGER |  |  | Consumo faturado em kWh. |
| Vencimento | `DATA_VENCIMENTO_FATURA` | DATE |  |  | Vencimento da fatura de energia. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano, preenchida junto com o código (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Plano de contas do lançamento; só aceita plano do tipo `Analítico`. |
| CFOP | `NATUREZA` | VARCHAR(10) | 10 |  | Natureza de operação da fatura. Exigida na gravação e validada contra o estado do fornecedor. |
| Descrição da CFOP | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição da CFOP, preenchida junto com o código (calculado na consulta). |
| Descrição da CST do ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 |  | Descrição do CST, preenchida junto com o código (calculado na consulta). |
| CST ICMS | `TRIBUTO_ICMS` | VARCHAR(8) | 8 |  | Obrigatório neste tipo. Origem mais CST nas posições 2 e 3, com as mesmas regras dos demais painéis: `00`, `10`, `20` e `70` exigem base, alíquota e valor; `30`, `40`, `41`, `50`, `51` e `60` exigem tudo zerado. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  |  | Data em que a fatura foi recebida. |
| Número | `NOTA` | INTEGER |  |  | Número da fatura de energia. Exigido na gravação. |
| Situação | `SITUACAO_DOCUMENTO_FISCAL` | INTEGER |  |  | Código do cadastro SITUACAO_DOCUMENTO_FISCAL. Exigido na gravação. |
| Chave de Acesso da NFe | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 |  | Mesma coluna da chave da NFe, aqui usada para a chave da fatura eletrônica de energia. |
| Espécie | `ESPECIE` | VARCHAR(10) | 10 |  | Espécie do documento de energia. |

#### Valores da Fatura de Energia Elétrica

Painel visível somente quando o tipo é `Energia Elétrica`. Quase todos os valores são recalculados pelo sistema a cada alteração: a base dos impostos é `VALOR_CONSUMO` menos `VALOR_NAO_TRIBUTADO` menos `VALOR_DESCONTO` mais `VALOR_DESPESA`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Valor não Trib. | `VALOR_NAO_TRIBUTADO` | DOUBLE PRECISION |  |  | Parcela da fatura fora da tributação. Entra subtraindo na base de ICMS, PIS e COFINS. |
| Valor Desconto | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto da fatura. Subtrai da base dos impostos e do total. |
| Valor PIS | `VALOR_PIS` | DOUBLE PRECISION |  |  | PIS da fatura, calculado sobre a base de PIS. |
| Valor COFINS | `VALOR_COFINS` | DOUBLE PRECISION |  |  | COFINS da fatura, calculada sobre a base de COFINS. |
| Valor ICMS Aprov. | `VALOR_ICMS_APROVEITAMENTO` | DOUBLE PRECISION |  |  | Calculado pelo sistema: base de aproveitamento vezes a alíquota do ICMS. É a parte do ICMS efetivamente creditada. |
| Base ICMS Aprov. | `BASE_ICMS_APROVEITAMENTO` | DOUBLE PRECISION |  |  | Calculada pelo sistema: base dos impostos aplicada ao percentual de aproveitamento. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Calculado pelo sistema: base do ICMS vezes a alíquota. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Calculada pelo sistema a partir de consumo, não tributado, desconto e despesas. |
| Alíq. ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota usada nos dois cálculos de ICMS, o total e o aproveitado. |
| Valor Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas da fatura. Somam na base dos impostos e no total. |
| Valor Total | `TOTAL` | DOUBLE PRECISION |  |  | Somente leitura. Calculado como consumo mais valores de terceiros mais despesas menos desconto. |
| Valor Consumido | `VALOR_CONSUMO` | DOUBLE PRECISION |  |  | Valor do consumo de energia propriamente dito; é o ponto de partida de todos os cálculos do painel. |
| % Aprov. | `PERC_APROVEITAMENTE_CREDITO` | DOUBLE PRECISION |  |  | Percentual do ICMS aproveitado como crédito. Zero faz a base de aproveitamento igualar a base cheia. |
| Alíq. PIS | `ALIQUOTA_PIS` | DOUBLE PRECISION |  |  | Alíquota do PIS da fatura. |
| Alíq. COFINS | `ALIQUOTA_COFINS` | DOUBLE PRECISION |  |  | Alíquota da COFINS da fatura. |
| Base PIS | `BASE_PIS` | DOUBLE PRECISION |  |  | Base do PIS, recalculada pelo sistema junto com a base do ICMS. |
| Base COFINS | `BASE_COFINS` | DOUBLE PRECISION |  |  | Base da COFINS, recalculada pelo sistema junto com a base do ICMS. |
| Valor Terceiros | `VALOR_TERCEIROS` | DOUBLE PRECISION |  |  | Valores cobrados na fatura em nome de terceiros. Soma no total e é detalhado na grade de Valores de Terceiros. |

#### gbcabecalho — cabeçalho do documento

Painel sem legenda, visível em todos os tipos menos Energia Elétrica, que tem cabeçalho próprio.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do documento do fornecedor. Não pode ser maior que a data atual e o sistema avisa quando passa de 30 dias de atraso no lançamento. |
| Nº Nota Fiscal | `NOTA` | INTEGER |  |  | Número do documento do fornecedor. Exigido na gravação. Junto com fornecedor, série e modelo é o que impede lançar a mesma nota duas vezes. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  |  | Data de entrada da mercadoria. Não pode ser menor que a emissão nem maior que a data do lançamento. |
| CFOP | `NATUREZA` | VARCHAR(10) | 10 |  | Natureza de operação do documento. Exigida na gravação e validada contra o estado do fornecedor. É herdada por cada item novo. |
| Descrição da CFOP | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição da CFOP, preenchida junto com o código (calculado na consulta). |
| Série | `SERIE` | VARCHAR(5) | 5 |  | Série do documento do fornecedor. Exigida na gravação. |
| Modelo | `MODELO_DOCUMENTO_FISCAL` | VARCHAR(2) | 2 |  | Exigido em todos os tipos menos Serviço, onde o campo fica escondido. A lista aceita depende do tipo: Compra aceita os modelos que não são de comunicação, energia ou frete; Nota de Comunicação aceita `21`, `22` e `62`; Energia Elétrica só `66`; Conhecimento Frete aceita `07`, `08`, `8B`, `09`, `10`, `11`, `26`, `27` e `57`; Transporte usa `67`. Escolher `55` ou `57` oferece importar o XML do fornecedor. |
| Descrição do Modelo do Documento Fiscal | `DESCRICAO_MODELO_DOCUMENTO` | VARCHAR(100) | 100 |  | Descrição do modelo, preenchida junto com o código (calculado na consulta). |
| Situação | `SITUACAO_DOCUMENTO_FISCAL` | INTEGER |  |  | Código do cadastro SITUACAO_DOCUMENTO_FISCAL. Exigido na gravação; o NewRecord já grava o código `0`, a situação regular. Dois códigos mudam o comportamento da tela: `6` dispensa quantidade e valor unitário do item (lançamento complementar), e `8` dispensa a conferência do CNPJ do emitente contra a chave de acesso. |
| Descrição da Situação do Documento Fiscal | `DESCRICAO_SITUACAO_DOCUMENTO` | VARCHAR(100) | 100 |  | Descrição da situação, preenchida junto com o código (calculado na consulta). |

#### pan_itens_produto — edição do item (aba Itens da Nota Fiscal)

Aba visível apenas em nota de Compra e de Serviço. Todos os campos gravam em `IT_ENTRADA`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  |  | Código do material. F4 abre a consulta de materiais e F3 abre o cadastro. Exigido maior que zero; o código `1` é reservado e recusado. Se o item já foi vinculado a um pedido de compra faturado, o código não pode mais ser trocado. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição gravada no item, trazida do cadastro do material. |
| UN | `UNIDADE` | VARCHAR(3) | 3 |  | Unidade de medida usada na compra. Define, pelo cadastro da unidade, se a quantidade pode ser fracionada e qual o fator de conversão. |
| Quantidade | `QUANTIDADE_COMPRA` | DOUBLE PRECISION |  |  | Quantidade na unidade de compra. Exigida maior que zero, salvo quando a situação do documento é `6`. Unidade que não permite fracionamento recusa casas decimais. |
| Valor Unitário | `VALOR_COMPRA` | DOUBLE PRECISION |  |  | Preço unitário na unidade de compra. Exigido maior que zero, salvo situação `6`. É recalculado sozinho quando o usuário digita o total do item. |
| Total | `TOTAL` | DOUBLE PRECISION |  |  | Total líquido do item: total bruto menos desconto rateado menos desconto do item. Digitar aqui um valor diferente faz o sistema recalcular o valor unitário. |
| Desconto | `DESCONTO` | DOUBLE PRECISION |  |  | Desconto próprio do item, informado na linha. |
| Conv. | `FATOR_CONVERSAO` | DOUBLE PRECISION |  |  | Somente leitura. Fator que converte a unidade de compra na unidade de estoque, buscado no cadastro do material e, quando existir, na conversão específica daquele fornecedor. |
| Frete Rateado | `VALOR_FRETE_RATEADO` | DOUBLE PRECISION |  |  | Preenchido pelo sistema no fechamento: valor do frete da nota dividido pelo total dos produtos e multiplicado pelo total bruto do item. |
| Seguro Rateado | `VALOR_SEGURO_RATEADO` | DOUBLE PRECISION |  |  | Seguro rateado por item. Só é preenchido pela importação do XML; o fechamento não o recalcula. |
| Desp. Rateado | `VALOR_DESPESA_RATEADO` | DOUBLE PRECISION |  |  | Preenchido pelo sistema no fechamento, na mesma proporção do frete rateado. |
| Total Bruto | `TOTAL_BRUTO` | DOUBLE PRECISION |  |  | Somente leitura. Calculado como quantidade de compra vezes valor unitário. |
| Desc. Rateado | `VALOR_DESCONTO_RATEADO` | DOUBLE PRECISION |  |  | Somente leitura. Preenchido no fechamento: desconto da nota dividido pelo total dos produtos e multiplicado pelo total bruto do item. |
| CST ICMS | `TRIBUTO_ICMS` | VARCHAR(8) | 8 |  | Origem mais CST do ICMS do item. Vem sugerido da CFOP no NewRecord. Os CST `00`, `10`, `20` e `70` exigem base e valor de ICMS; os demais exigem os campos zerados. |
| Descrição da CST do ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 |  | Descrição do CST, preenchida junto com o código (calculado na consulta). |
| Alíquota ICMS | `ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS do item; alimenta o cálculo do valor do ICMS. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base do ICMS do item, calculada pelo sistema a partir do total e da redução de base. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Calculado pelo sistema: base do ICMS dividida por 100 e multiplicada pela alíquota. |
| % Red. Icms | `PERCENTUAL_REDUCAO_BC_ICMS` | DOUBLE PRECISION |  |  | Percentual de redução da base do ICMS do item. Zerado no NewRecord. |
| CSOSN | `CSOSN` | VARCHAR(4) | 4 |  | Código de situação da operação no Simples Nacional. Só fica visível quando o fornecedor tem regime `Simples Federal` ou o item já tem CSOSN gravado. |
| Alíq. Créd. Simp. | `ALIQUOTA_CREDITO_SIMPLES` | DOUBLE PRECISION |  |  | Alíquota de crédito do Simples Nacional. Só visível junto com o CSOSN; sendo maior que zero, dispara o cálculo da base e do valor do crédito. |
| B.C. Créd. Simp. | `BASE_CREDITO_SIMPLES` | DOUBLE PRECISION |  |  | Calculada pelo sistema: total do item mais frete, seguro e despesa rateados. |
| Valor Créd. Simp. | `VALOR_CREDITO_SIMPLES` | DOUBLE PRECISION |  |  | Calculado pelo sistema: base do crédito dividida por 100 e multiplicada pela alíquota. |
| Alíquota ST | `SUBSTITUICAO` | DOUBLE PRECISION |  |  | Alíquota da substituição tributária. Visível em Compra, Conhecimento Frete, Energia Elétrica e Nota de Comunicação; escondida em Serviço e Transporte. Nos CST com ST, a gravação do item exige alíquota, base e valor preenchidos. |
| Base ST | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base da substituição tributária do item. |
| Valor ST | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor do ICMS ST do item. |
| CST IPI | `TRIBUTO_IPI` | VARCHAR(2) | 2 |  | CST do IPI, sugerido pela CFOP no NewRecord. O código `00` obriga informar alíquota, base e valor de IPI. |
| Descrição da CST do IPI | `DESCRICAO_TRIBUTO_IPI` | VARCHAR(120) | 120 |  | Descrição do CST do IPI, preenchida junto com o código (calculado na consulta). |
| Alíquota IPI | `IPI` | DOUBLE PRECISION |  |  | Alíquota do IPI do item. Zerada no NewRecord. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base do IPI do item. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI do item; somado no IPI da nota no fechamento. |
| CST PIS | `TRIBUTO_PIS` | VARCHAR(2) | 2 |  | CST do PIS, sugerido pela CFOP no NewRecord. |
| Descrição da CST do PIS | `DESCRICAO_TRIBUTO_PIS` | VARCHAR(120) | 120 |  | Descrição do CST do PIS, preenchida junto com o código (calculado na consulta). |
| Alíquota PIS | `ALIQUOTA_PIS` | DOUBLE PRECISION |  |  | Preenchida no NewRecord com a alíquota dos parâmetros do sistema quando a CFOP gera crédito de PIS, e com zero quando não gera. |
| Base PIS | `BASE_PIS` | DOUBLE PRECISION |  |  | Base do PIS do item, recalculada junto com o total. |
| Valor PIS | `VALOR_PIS` | DOUBLE PRECISION |  |  | Valor do PIS do item, recalculado junto com o total. |
| CST COFINS | `TRIBUTO_COFINS` | VARCHAR(2) | 2 |  | CST da COFINS, sugerido pela CFOP no NewRecord. |
| Descrição da CST do COFINS | `DESCRICAO_TRIBUTO_COFINS` | VARCHAR(120) | 120 |  | Descrição do CST da COFINS, preenchida junto com o código (calculado na consulta). |
| Alíq. COFINS | `ALIQUOTA_COFINS` | DOUBLE PRECISION |  |  | Preenchida no NewRecord com a alíquota dos parâmetros quando a CFOP gera crédito de COFINS, e com zero quando não gera. |
| Base COFINS | `BASE_COFINS` | DOUBLE PRECISION |  |  | Base da COFINS do item, recalculada junto com o total. |
| Valor COFINS | `VALOR_COFINS` | DOUBLE PRECISION |  |  | Valor da COFINS do item, recalculado junto com o total. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano do item, preenchida junto com o código (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Plano de contas do item. Herdado do cabeçalho no NewRecord e alterável por item. |
| CFOP | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | Natureza de operação do item. Herdada do cabeçalho no NewRecord; trocá-la re-sugere os CST de ICMS, IPI, PIS e COFINS e o indicador de movimentação de estoque. Exigida na gravação do item. |
| Descrição da CFOP | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da CFOP do item, preenchida junto com o código (calculado na consulta). |

#### pan_itens_botoes

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total dos Produtos ==> | `TOTAL_PRODUTO_INF` | DOUBLE PRECISION |  |  | Somente leitura, é TDBText. Soma dos totais dos itens efetivamente lançados, atualizada a cada gravação ou exclusão de item. Serve para conferir contra o Total Produtos digitado no cabeçalho. |

#### Informações Complementares - XML

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `DBMemo1` | `OBSERVACAO` | BLOB |  |  | Memo sem rótulo próprio, identificado pela legenda do quadro. Guarda o texto das informações complementares do documento, o mesmo que vem do XML importado. |

#### Informações Adicionais Interesse do Fisco - XML

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `DBMemo2` | `OBSERVACAO_FISCO` | BLOB |  |  | Memo sem rótulo próprio. Guarda as informações adicionais de interesse do fisco do documento, também trazidas do XML. |

#### Observações do Lançamento Fiscal

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtobservacao_lancamento_fiscal` | `OBSERVACAO_LANCAMENTO_FISCAL` | INTEGER |  |  | Campo sem rótulo, identificado pela legenda do quadro. Código da observação padrão do cadastro OBSERVACAO_LANCAMENTO_FISCAL, com consulta pelo botão. Código inexistente é rejeitado e o campo volta vazio. |
| `medescricao_lancamento_fiscal` | `DESCRICAO_LANCAMENTO_FISCAL` | BLOB |  |  | Memo sem rótulo. Texto da observação escolhida, preenchido pelo sistema a partir do código; não é digitado (calculado na consulta). |

#### Legislações da Nota Fiscal

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Legislação | `LEGISLACAO` | INTEGER |  |  | Código da legislação, do cadastro de legislações. Só aceita legislação cujo TIPO_LANCAMENTO seja `Compra`; se for `Venda`, o sistema avisa e limpa o campo. |
| Observação da Legislação | `OBSERVACAO_LEGISLACAO` | VARCHAR(500) | 500 |  | Texto completo da legislação, copiado do cadastro quando o código é informado (calculado na consulta). |
| Descrição da Legislação | `DESCRICAO_LEGISLACAO` | VARCHAR(50) | 50 |  | Descrição da legislação, copiada do cadastro junto com o código (calculado na consulta). |

### Grade `dbnota_fiscal_venda_conhecimento` — tabela IT_ENTRADA_CONHECIMENTO_FRETE

Grade das notas de saída transportadas pelo conhecimento. Só aparece quando o tipo é Conhecimento Frete e a Nota Fiscal Transportada é `Venda`. Só série e número são digitados; o restante é lido da nota de saída. A nota de venda precisa estar `Faturada` ou `NFE Autorizada` e com modalidade de frete `0`; modalidade `9` significa sem frete e é recusada.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Série | `SERIE_NOTA_FISCAL_SAIDA` | INTEGER |  | Série da nota fiscal de venda transportada. Digitada; dispara a busca da nota de saída. |
| Nº Nota | `NUMERO_NOTA_FISCAL_SAIDA` | INTEGER |  | Número da nota fiscal de venda transportada. Digitado; junto com a série identifica a nota. |
| Código | `NFS_CLIENTE` | INTEGER |  | Código do cliente da nota de venda, trazido da nota de saída (calculado na consulta). |
| Nome do Cliente | `NFS_NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente da nota de venda, trazido da nota de saída (calculado na consulta). |
| Nome da Transportadora | `NFS_NOME_TRANSPORTADORA` | VARCHAR(50) | 50 | Transportadora indicada na nota de venda (calculado na consulta). |
| Modalidade do Frete | `NFS_DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 | Descrição da modalidade de frete da nota de venda (calculado na consulta). |
| Valor Frete | `NFS_VALOR_FRETE_COMBINADO` | DOUBLE PRECISION |  | Frete combinado registrado na nota de venda (calculado na consulta). |
| CFOP | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 | Natureza de operação da nota transportada, lida da tabela NOTA. |
| Descrição do CFOP | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 | Descrição da natureza de operação da nota transportada, lida da tabela NOTA. (calculado na consulta) |
| Chave de Acesso | `CHAVE_ACESSO` | VARCHAR(44) | 44 | Chave de acesso da nota transportada, com 44 dígitos. |
| Nome do Contato | `NFS_CONTATO_FRETE_COMBINADO` | VARCHAR(25) | 25 | Contato do frete combinado registrado na nota de venda (calculado na consulta). |
| Cidade do Cliente | `NFS_CIDADE_CLIENTE` | VARCHAR(50) | 50 | Cidade do cliente da nota de venda (calculado na consulta). |
| UF | `NFS_ESTADO_CLIENTE` | VARCHAR(2) | 2 | Estado do cliente da nota de venda (calculado na consulta). |
| Nome do Redespacho | `NFS_NOME_REDESPACHO` | VARCHAR(50) | 50 | Transportadora de redespacho indicada na nota de venda (calculado na consulta). |
| Frete do Redespacho | `NFS_TIPO_REDESPACHO` | VARCHAR(10) | 10 | Tipo de frete do redespacho registrado na nota de venda (calculado na consulta). |

### Grade `dbnota_fiscal_compra_conhecimento` — tabela IT_ENTRADA_CONHECIMENTO_FRETE

Grade das notas de entrada transportadas pelo conhecimento. Só aparece quando o tipo é Conhecimento Frete e a Nota Fiscal Transportada é `Compra`. Série, número e CNPJ do fornecedor são digitados; os demais vêm do lançamento de entrada localizado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Série | `SERIE_NOTA_FISCAL_ENTRADA` | VARCHAR(5) | 5 | Série da nota fiscal de compra transportada. |
| Nº Nota | `NUMERO_NOTA_FISCAL_ENTRADA` | INTEGER |  | Número da nota fiscal de compra transportada. |
| CNPJ/CPF | `CNPJ_FORNECEDOR_NOTA_ENTRADA` | VARCHAR(18) | 18 | CNPJ ou CPF do fornecedor da nota transportada; junto com série e número localiza o lançamento de entrada. |
| Código | `NFE_FORNECEDOR` | INTEGER |  | Código do fornecedor da nota de entrada localizada (calculado na consulta). |
| Nome do Fornecedor | `NFE_NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor da nota de entrada localizada (calculado na consulta). |
| Cidade | `NFE_CIDADE_FORNECEDOR` | VARCHAR(50) | 50 | Cidade do fornecedor da nota de entrada (calculado na consulta). |
| UF | `NFE_ESTADO_FORNECEDOR` | VARCHAR(2) | 2 | Estado do fornecedor da nota de entrada (calculado na consulta). |
| Total | `NFE_TOTAL` | DOUBLE PRECISION |  | Total da nota de entrada transportada (calculado na consulta). |
| CFOP | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 | Natureza de operação da nota transportada, lida da tabela NOTA. |
| Descrição do CFOP | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 | Descrição da natureza de operação da nota transportada, lida da tabela NOTA. (calculado na consulta) |
| Chave de Acesso | `CHAVE_ACESSO` | VARCHAR(44) | 44 | Chave de acesso da nota transportada, com 44 dígitos. |

### Grade `dbenergia_valores_terceiros` — tabela IT_ENTRADA_ENERGIA_TERCEIROS

Detalhamento dos valores cobrados na fatura de energia em nome de terceiros, um por CFOP e CST. Só aparece quando o tipo é Energia Elétrica. CST do ICMS e CFOP são obrigatórios na gravação da linha.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| CST ICMS | `TRIBUTO_ICMS` | VARCHAR(3) | 3 | Código do cadastro de tributação do ICMS. Código inexistente é rejeitado com aviso e a linha não grava sem ele. |
| Descrição do CST do ICMS | `DESCRICAO_TRIBUTO_ICMS` | VARCHAR(50) | 50 | Descrição do CST, preenchida junto com o código (calculado na consulta). |
| CFOP | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | Natureza de operação da linha. Validada contra o cadastro e contra o estado do fornecedor; trocá-la limpa a extensão. Obrigatória. |
| Descrição do CFOP | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 | Descrição da CFOP, preenchida junto com o código (calculado na consulta). |
| Extensão | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 | Extensão da CFOP, validada contra o cadastro de extensões daquela CFOP. |
| Descrição da Extensão do CFOP | `DESCRICAO_NATUREZA_EXTENSAO` | VARCHAR(50) | 50 | Descrição da extensão, preenchida junto com o código (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor cobrado para aquele terceiro. Começa em zero no NewRecord. |

### Grade `dbvencimentos` — tabela IT_ENTRADA_VENCIMENTO

Parcelas da nota. É a partir desta grade que o fechamento gera os títulos no Contas a Pagar, um por linha, com documento `NF` e situação de título `1`.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela. Faz parte da chave primária. Gerado pelo sistema no NewRecord como o maior SEQ da nota mais um. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Preenchida no NewRecord com a emissão da nota. Data inválida é rejeitada e o título não grava sem ela. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias. Digitar aqui recalcula o vencimento como emissão mais os dias; digitar o vencimento recalcula os dias. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Vencimento do título. Não pode ser menor que a emissão e é obrigatório para gravar a parcela. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. Exigido maior que zero. |

### Grade `dbit_nota` — tabela IT_ENTRADA

Lista dos itens já lançados, na aba Itens da Nota Fiscal. As colunas de quantidade e valor trocam de campo conforme o tipo: em Serviço a grade mostra `QUANTIDADE_COMPRA` e `VALOR_COMPRA`, nos demais tipos mostra `QUANTIDADE` e `VALOR`, que são os valores já convertidos para a unidade de estoque.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material do item. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material gravada no item. |
| UN | `UNIDADE_COMPRA` | VARCHAR(3) | 3 | Unidade de compra. Quando o fator de conversão é 1 ou a unidade está vazia, o BeforePost a iguala à unidade do item. |
| Conv. | `FATOR_CONVERSAO` | DOUBLE PRECISION |  | Fator de conversão aplicado ao item, buscado no cadastro do material e do fornecedor. |
| Qtde. | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade na unidade de estoque, resultado da quantidade de compra multiplicada pelo fator de conversão. Em nota de Serviço esta coluna passa a exibir `QUANTIDADE_COMPRA`. |
| Valor Unit. | `VALOR` | DOUBLE PRECISION |  | Valor unitário na unidade de estoque. Em nota de Serviço esta coluna passa a exibir `VALOR_COMPRA`. |
| Total Bruto | `TOTAL_BRUTO` | DOUBLE PRECISION |  | Quantidade de compra vezes valor unitário, calculado pelo sistema. |
| Desc. | `VALOR_DESCONTO_RATEADO` | DOUBLE PRECISION |  | Parcela do desconto da nota rateada para o item no fechamento. |
| Icms | `ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item. |
| Ipi | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do item. |
| `STATUS` | `STATUS` | VARCHAR(10) | 10 | Coluna sem título, desenhada como ícone. Campo calculado do Delphi a partir de `ITEM_CONFERIDO`: vale `Conferido` quando ITEM_CONFERIDO é `2` e `Pendente` no restante, e o item novo nasce com `1`, ou seja, pendente. |

### Grade `dbit_nota_pedido_compra` — tabela IT_ENTRADA_PEDIDO_COMPRA

Grade pequena ao lado da edição do item, mostrando de quais pedidos de compra aquele item foi atendido. É preenchida pela importação de pedidos pendentes ou pela consulta de pedidos por material.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Pedido **·chave** **·obrig** | `NUMERO_PEDIDO` | INTEGER |  | Número do pedido de compra atendido pelo item. Faz parte da chave primária e é obrigatório no banco. Havendo pedido vinculado e já faturado, o material do item não pode mais ser trocado. |
| Seq. **·chave** **·obrig** | `SEQ_PEDIDO` | INTEGER |  | Sequência do item dentro do pedido de compra. Faz parte da chave primária e é obrigatório no banco. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade daquele pedido consumida por este item. Havendo pedido faturado vinculado, a quantidade do item não pode mais ser alterada. |

### Grade `dbnota_fiscal_referenciada` — tabela IT_ENTRADA_NOTA_REFERENCIADA

Aba Nota Fiscal Referênciada, visível somente em nota de Compra. Só série e número são digitados; cliente, nome, emissão e total são lidos da nota de saída referenciada, que precisa estar `Faturada` ou `NFE Autorizada` — em qualquer outra situação a linha é recusada com aviso.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Série | `SERIE_NOTA_FISCAL` | INTEGER |  | Série da nota fiscal referenciada. Digitada. |
| Nº Nota | `NUMERO_NOTA_FISCAL` | INTEGER |  | Número da nota fiscal referenciada. Digitado; junto com a série localiza a nota de saída. |
| Cliente | `CLIENTE` | INTEGER |  | Código do cliente da nota referenciada, lido da tabela NOTA. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente da nota referenciada, lido da tabela NOTA. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da nota referenciada, lida da tabela NOTA. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total da nota referenciada, lido da tabela NOTA. |

### Grade `dbit_legislacao` — tabela IT_ENTRADA_LEGISLACAO

Legislações associadas à nota, na aba Dados Adicionais. A sequência é gerada pelo sistema no NewRecord.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `LEGISLACAO` | INTEGER |  | Código da legislação. Só aceita legislação de TIPO_LANCAMENTO `Compra`. |
| Descrição da Legislação | `DESCRICAO_LEGISLACAO` | VARCHAR(50) | 50 | Descrição copiada do cadastro de legislações (calculado na consulta). |
| Observação da Legislação | `DESC_OBSERVACAO_LEGISLACAO` | VARCHAR(150) | 150 | Campo calculado do Delphi: os 150 primeiros caracteres da observação da legislação, com as quebras de linha removidas, só para caber na grade (calculado na consulta). |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Finalidade do Documento | `FINALIDADE_EMISSAO` | INTEGER |  | campo da tela | Rótulo na tela: “Finalidade do Documento”. Função não verificada no código. |
| Tipo de Faturamento | `TIPO_FATURAMENTO` | INTEGER |  | campo da tela | Rótulo na tela: “Tipo de Faturamento”. Função não verificada no código. |
| Tipo Fretamento | `TIPO_FRETAMENTO` | INTEGER |  | campo da tela | Rótulo na tela: “Tipo Fretamento”. Função não verificada no código. |
| Responsável pelo Seguro | `RESPONSAVEL_SEGURO` | INTEGER |  | campo da tela | Rótulo na tela: “Responsável pelo Seguro”. Função não verificada no código. |
| Tipo Ligação | `TIPO_LIGACAO` | VARCHAR(1) | 1 | campo da tela | Rótulo na tela: “Tipo Ligação”. Função não verificada no código. |
| Grupo de Tensão | `GRUPO_TENSAO` | VARCHAR(2) | 2 | campo da tela | Rótulo na tela: “Grupo de Tensão”. Função não verificada no código. |
| Extensão da CFOP | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Extensão da CFOP”. Função não verificada no código. |
| Classe Consumo | `CLASSE_CONSUMO` | VARCHAR(2) | 2 | campo da tela | Rótulo na tela: “Classe Consumo”. Função não verificada no código. |
| Mov. Estoque | `MOVIMENTA_ESTOQUE_ITEM` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Mov. Estoque”. Função não verificada no código. |
| Apuração IPI | `INDICADOR_PERIODO_APURACAO_IPI` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Apuração IPI”. Função não verificada no código. |

<a id="umov_nota_fiscal_compra_conferencia_arquivo_xml"></a>

## `umov_nota_fiscal_compra_conferencia_arquivo_xml` — Conferência do Arquivo XML das Notas Fiscais de Entrada

Tela de cobrança do XML que o fornecedor não enviou. Não grava documento nenhum: monta uma consulta sobre `ENTRADA`, com JOIN em FORNECEDOR para o nome e o e-mail, e mostra tudo numa grade única somente-leitura. O filtro é fixo no código e define quem entra na lista: `STATUS` = `Lançada`, `TIPO_NOTA_FISCAL` diferente de `Serviço`, `MODELO_DOCUMENTO_FISCAL` igual a `55` (NF-e) ou `57` (CT-e), chave de acesso preenchida e `ARQUIVO_XML_IMPORTADO` = `1`, ou seja, XML ainda não recebido. Ao abrir, a tela avisa quantas notas estão nessa situação. As seis caixas de marcação da lateral (F2 a F7) apenas escolhem por qual campo a pesquisa incremental e a ordenação acontecem — nome do fornecedor, CNPJ/CPF, número da nota, emissão, recebimento ou total — e não são campos de tabela. Os botões atuam sobre a lista: Consultar abre a nota em `umov_nota_fiscal_compra`, Confirmar varre todas as linhas chamando a DLL de importação e, achando o arquivo, copia-o para o diretório do fornecedor e marca `ARQUIVO_XML_IMPORTADO` = `2`; E-mail dispara o comunicado de solicitação e carimba data e hora; Imprimir gera o relatório da seleção; F11 na grade abre o cadastro do fornecedor para corrigir o e-mail.

### Grade `dbconsulta` — tabela ENTRADA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nº Nota | `NOTA` | INTEGER |  | Número da nota do fornecedor. Vira critério de pesquisa e ordenação quando a caixa "Consultar pelo Número da Nota Fiscal (F4)" está marcada, e é citado no texto do e-mail com seis dígitos. |
| Série | `SERIE` | VARCHAR(5) | 5 | Série da nota do fornecedor, citada no e-mail com três dígitos. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da nota. Critério de pesquisa da caixa F5; a busca começa em 01/01/0001 quando ela é marcada. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  | Data de entrada da mercadoria. Critério de pesquisa da caixa F6. |
| CNPJ / CPF | `CNPJ_CPF_FORNECEDOR` | VARCHAR(18) | 18 | CNPJ ou CPF gravado na própria entrada. Critério de pesquisa da caixa F3. |
| Código | `FORNECEDOR` | INTEGER |  | Código do fornecedor. É por ele que F11 abre o cadastro do fornecedor em modo alteração. |
| Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome vindo do JOIN com FORNECEDOR, não é coluna da entrada. É o critério de ordenação padrão e o da caixa F2; digitando `*` no começo, a busca vira LIKE por parte do nome (calculado na consulta). |
| Total Nota | `TOTAL` | DOUBLE PRECISION |  | Valor total da nota. Critério de pesquisa da caixa F7, com busca a partir de 0,00. |
| Possui E-mail | `POSSUE_EMAIL` | VARCHAR(3) | 3 | Campo calculado no Delphi, não existe na tabela: vale `Sim` quando o fornecedor tem e-mail cadastrado e `Não` quando o campo está vazio. Com `Não` o comunicado não é enviado e a tela avisa que o fornecedor não possui e-mail (calculado na consulta). |
| Data E-mail | `DATA_COMUNICADO_ARQUIVO_XML` | TIMESTAMP |  | Data do último comunicado enviado ao fornecedor, gravada pelo botão E-mail junto com a hora. Vazia significa que a nota nunca foi cobrada — é exatamente esse o recorte da opção que envia só para quem ainda não recebeu aviso. |
| Hora E-mail | `HORA_COMUNICADO_ARQUIVO_XML` | TIME |  | Hora do último comunicado, gravada junto com a data no envio do e-mail. |

<a id="umov_pedido_compra"></a>

## `umov_pedido_compra` — Pedido de Fornecedores...

Grava o pedido de compra: cabeçalho em `PEDIDO_COMPRA` e itens na grade em `IT_PEDIDO_COMPRA`, com material, descrição e localização vindos do JOIN com `MATERIA_PRIMA`. Os totais e impostos do cabeçalho não são digitados: cada item gravado soma ou subtrai a sua parte, usando as colunas `LAST_*` do item para saber o que já tinha entrado.

Ao redor da grade há três quadros de consulta, todos alimentados pelo próprio SELECT dos itens e somente leitura: Informações da Última Compra do Material, Informações da Última Compra do Fornecedor (recalculada em tempo real pelo CalcFields, buscando a última entrada daquele fornecedor com aquele material) e Informações dos Estoques.

Ao gravar, exige fornecedor, data de emissão válida, data de embarque válida e natureza de operação, e — quando a natureza tem `GERA_DUPLICATA = '2'` — exige também o primeiro prazo de vencimento. Gravando pelo botão, a tela ainda dispara o envio por e-mail e a impressão.

#### Pedido de Fornecedores...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do pedido. Ao sair do campo, se o número não existir a tela pergunta se é cadastro novo e assume o próximo sequencial ou o número digitado. F4 abre a consulta de pedidos; F7, F8 e F9 navegam. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor. Obrigatório na gravação. Ao sair, traz do cadastro nome, endereço completo, CNPJ/CPF, IE/RG, fone, contato, representante, transportadora, modalidade de frete, natureza de operação, os dez prazos de vencimento e o percentual de desconto. Código inexistente limpa tudo isso. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor, copiado do cadastro no Exit do código. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | CFOP da compra. Obrigatória na gravação. Ao sair, valida contra o estado do fornecedor: dentro do estado só aceita natureza iniciada em `1` ou `5`; fora do estado, só `2` ou `6`. Reprovando, limpa o campo e a descrição. É ela que decide se incidem IPI e ICMS nos itens e se o pedido gera duplicata. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição do CFOP, buscada da natureza. Não digitada. (calculado na consulta) |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora do pedido, sugerida do cadastro do fornecedor. O botão abre a consulta de transportadoras. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, preenchido junto com o código. Não digitado. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do pedido. O NewRecord traz a data do dia. Data inválida impede gravar. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante do fornecedor, sugerido do cadastro. O botão abre a consulta. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, preenchido junto com o código. Não digitado. (calculado na consulta) |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS do pedido. Somada dos itens a cada gravação e devolvida na exclusão. Não digitada. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS do pedido, somado dos itens. Só há ICMS quando a natureza tem `INCIDE_ICMS = '2'` e o fornecedor não é do regime `Simples Federal`. Não digitado. |
| R$ Produtos | `TOTAL_MATERIA_PRIMA` | DOUBLE PRECISION |  |  | Soma dos totais dos itens, sem IPI. Não digitada. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total do pedido: produtos mais IPI. Não digitado. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Contato de vendas no fornecedor, trazido do cadastro e editável aqui. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete, sugerido do cadastro do fornecedor. O botão abre a consulta de modalidades. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete, preenchida junto com o código. Não digitada. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Observação livre do pedido, impressa e enviada ao fornecedor. Digitação convertida para maiúsculas. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI, somada dos itens. Não digitada. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI do pedido, somado dos itens. Só há IPI quando a natureza tem `INCIDE_IPI = '2'`, o fornecedor não é `Simples Federal` e o material tem alíquota de IPI. Entra no R$ Total. Não digitado. |
| Vencimentos | `DIAS_01` | INTEGER |  |  | Primeiro prazo de pagamento, em dias a partir da emissão. Sugerido de `DIAS_VENCIMENTO_01` do fornecedor; zerado no pedido novo. É o único obrigatório, e só quando a natureza gera duplicata. |
| `edtdias_02` | `DIAS_02` | INTEGER |  |  | Segundo prazo de pagamento, em dias. Sem rótulo próprio; segue a caixa anterior. Sugerido do cadastro do fornecedor. |
| `edtdias_03` | `DIAS_03` | INTEGER |  |  | Terceiro prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_04` | `DIAS_04` | INTEGER |  |  | Quarto prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| Taxa Financ. | `TAXA_FINANCEIRA` | DOUBLE PRECISION |  |  | Percentual de acréscimo financeiro combinado com o fornecedor pelo prazo. Digitado; sai impresso no pedido. |
| Lotes de Aplicação | `LOTES_APLICACAO` | VARCHAR(50) | 50 |  | Texto livre indicando em quais lotes de produção o material será aplicado. |
| Qtde Consumo | `QUANTIDADE_CONSUMO` | DOUBLE PRECISION |  |  | Soma das quantidades de consumo dos itens do pedido. Recalculada a cada item; não digitada. |
| % Desconto | `PERCENTUAL_DESCONTO` | DOUBLE PRECISION |  |  | Percentual de desconto negociado, trazido do cadastro do fornecedor. Somente leitura. |
| Comprador | `FUNCIONARIO` | INTEGER |  |  | Código do comprador responsável. O NewRecord já assume o usuário logado. O botão abre a consulta de usuários. |
| Nome Comprador | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 |  | Nome do comprador, preenchido junto com o código a partir do cadastro de usuários. Não digitado. |
| `edtdias_05` | `DIAS_05` | INTEGER |  |  | Quinto prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_10` | `DIAS_10` | INTEGER |  |  | Décimo prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_06` | `DIAS_06` | INTEGER |  |  | Sexto prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_07` | `DIAS_07` | INTEGER |  |  | Sétimo prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_08` | `DIAS_08` | INTEGER |  |  | Oitavo prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| `edtdias_09` | `DIAS_09` | INTEGER |  |  | Nono prazo de pagamento, em dias. Sugerido do cadastro do fornecedor. |
| Data Embarque | `DATA_EMBARQUE` | TIMESTAMP |  |  | Data prevista de embarque da mercadoria. Obrigatória e válida na gravação. Ao sair do campo, se a data mudou, a tela regrava a mesma data em `DATA_EMBARQUE` de todos os itens. |

#### Informações da Última Compra do Material

Quadro somente leitura com a última compra do material, independentemente de fornecedor, tomada do cadastro de matéria-prima pelo SELECT dos itens.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nome do Fornecedor | `NOME_FORNECEDOR_ULTIMA_COMPRA` | VARCHAR(70) | 70 |  | Nome do fornecedor da última compra registrada do material. Somente leitura (calculado na consulta). |
| Preço Compra | `PRECO_ULTIMA_COMPRA` | DOUBLE PRECISION |  |  | Último preço pago pelo material (`COMPRA_PRECO` da matéria-prima). Somente leitura (calculado na consulta). |
| Data Compra | `DATA_ULTIMA_COMPRA` | TIMESTAMP |  |  | Data da última compra do material (`COMPRA_DATA` da matéria-prima). Não digitada (calculado na consulta). |

#### Informações da Última Compra do Fornecedor

Quadro somente leitura, recalculado pelo CalcFields do item: busca a entrada mais recente daquele fornecedor com aquele material em `ENTRADA` e `IT_ENTRADA`. Fica vazio quando não há fornecedor ou material informado.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Preço Compra | `PRECO_COMPRA_FORNECEDOR` | DOUBLE PRECISION |  |  | Preço da última entrada deste material vinda deste fornecedor. Somente leitura (calculado na consulta). |
| Data Compra | `DATA_COMPRA_FORNECEDOR` | DATE |  |  | Data de recebimento dessa última entrada. Não digitada (calculado na consulta). |

#### Informações dos Estoques

Quadro somente leitura com a posição do material, calculada no SELECT dos itens a partir de `MATERIA_PRIMA` e dos pedidos de compra pendentes.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Empenho | `PRODUTO_EMPENHADO` | DOUBLE PRECISION |  |  | Quantidade do material já empenhada (`ESTOQUE_EMPENHADO` da matéria-prima). Somente leitura (calculado na consulta). |
| Pedidos | `PRODUTO_PEDIDO` | DOUBLE PRECISION |  |  | Quantidade ainda por receber, somada dos itens de pedidos de compra com status `Pendente` (consumo menos baixado). Somente leitura (calculado na consulta). |
| Disponível | `PRODUTO_DISPONIVEL` | DOUBLE PRECISION |  |  | Saldo menos o empenhado. Somente leitura (calculado na consulta). |
| Estoque | `ESTOQUE` | DOUBLE PRECISION |  |  | Saldo em estoque do material (`SALDO` da matéria-prima). Somente leitura (calculado na consulta). |
| Custo Padrão | `PRECO_CUSTO` | DOUBLE PRECISION |  |  | Preço de custo cadastrado do material. Somente leitura. Serve de referência para o botão que atualiza o custo da matéria-prima com o preço digitado no item. |

### Grade `dbitens` — tabela IT_PEDIDO_COMPRA

Itens do pedido. O NewRecord gera o sequencial, zera o baixado e assume `STATUS = 'Pendente'`, `TIPO_BAIXA = 'Integral'`, `DESTINO = 'Industrialização'` e a data de embarque do cabeçalho. Ao gravar o item, a tela recusa material inexistente e quantidade, preço ou total zerados, apagando a linha; em seguida atualiza os totais do cabeçalho. A navegação pula as colunas calculadas.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material. O botão da célula abre a consulta de materiais. O código `1` é tratado à parte: abre a consulta de estruturas e o item passa a referenciar uma estrutura, que precisa ser do tipo `Analítico`. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, copiada do cadastro. Não digitada. |
| Unid. | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, copiada do cadastro. |
| Qtde. | `QUANTIDADE_CONSUMO` | DOUBLE PRECISION |  | Quantidade pedida na unidade de consumo, com três casas. Só aceita fração quando o cadastro tem `PERMITE_QUANTIDADE_FRACIONADO = '2'`; senão zera com aviso. Precisa ser maior que zero. |
| Preço Unit. | `VALOR` | DOUBLE PRECISION |  | Preço unitário negociado. Precisa ser maior que zero. |
| Preço Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade de consumo x preço unitário, calculado ao sair das colunas de quantidade e preço e reconfirmado no BeforePost. Não digitado. |
| Baixado | `QUANTIDADE_FATURADA` | DOUBLE PRECISION |  | Quantidade já recebida contra este item. Zerada no item novo e atualizada pela entrada; marcar o item como `Faturado` iguala o baixado à quantidade pedida. |
| Status | `STATUS` | VARCHAR(10) | 10 | Situação do item: `Pendente` ou `Faturado`. Lista de escolha na célula, e a digitação aceita a inicial (`P` ou `F`); qualquer outro texto vira `Pendente`. Só itens `Pendente` entram na coluna Pedidos do quadro de estoques. |
| Aliq. ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item. Deixada em zero, o BeforePost assume o ICMS do cadastro do material. É a base do valor de ICMS do item. |
| Destino | `DESTINO` | VARCHAR(20) | 20 | Destinação da compra: `Industrialização`, `Uso ou Consumo` ou `Comercialização`. Lista de escolha na célula, e a digitação aceita a inicial (`I`, `U` ou `C`); outra letra deixa em branco. O item novo já vem como `Industrialização`. |
| URC | `UNIDADE_COMPRA` | VARCHAR(3) | 3 | Unidade de compra do material, quando diferente da de consumo. |
| QRC | `QUANTIDADE_COMPRA` | DOUBLE PRECISION |  | Quantidade na unidade de compra. Calculada da quantidade de consumo dividida pela `UNIDADE_CONVERSAO` do material; sem fator de conversão, repete a quantidade de consumo. Não digitada. |
| Localiz. | `LOCALIZACAO` | VARCHAR(50) | 50 | Localização do material no almoxarifado, vinda do cadastro de matéria-prima. Coluna somente leitura. |

<a id="umov_cotacao"></a>

## `umov_cotacao` — Cotação de Compras...

Registra a cotação de preços de materiais junto a um fornecedor. O cabeçalho vai para a tabela `COTACAO` (chave `EMPRESA` + `NUMERO`) e os itens cotados para `IT_COTACAO`, na grade `RxDBGrid1`. O painel Informações dos Estoques não grava nada: mostra, em quatro números somente-leitura, a posição de estoque do material da linha corrente da grade. Aprovada a cotação, o botão de gerar pedido cria um pedido de compra completo em `PEDIDO_COMPRA` e `IT_PEDIDO_COMPRA` e marca a cotação como `'Aprovado'`.

### Campos

#### Cotação de Compras...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da cotação dentro da empresa, gerado na gravação. O botão do campo abre a consulta de cotações. Parte da chave primária (PK1). Chave duplicada é tratada com o aviso de que outro usuário está usando o registro. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor consultado. Ao sair do campo, preenche sozinho nome, fax, endereço (logradouro mais número), bairro, CEP, cidade, estado, CNPJ/CPF, inscrição/RG, contato de venda e as Condições de Pagamento; fornecedor inexistente limpa todos. Também define a natureza de operação e a alíquota de ICMS quando a cotação vira pedido de compra. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor, trazido do cadastro. É este campo que a gravação exige preenchido — a crítica é feita sobre o nome, não sobre o código. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da cotação. Preenchida com a data de hoje no NewRecord. A gravação recusa data inválida. |
| R$ Produtos | `TOTAL_MATERIA_PRIMA` | DOUBLE PRECISION |  |  | Soma dos totais dos itens da grade, sem IPI. Recalculada pelo programa a cada item incluído, alterado ou excluído. Campo desabilitado, não digitável. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos itens mais o IPI, ou seja, R$ Produtos mais Valor IPI. Recalculada pelo programa a cada mudança nos itens. Campo desabilitado, não digitável. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Pessoa de contato no fornecedor. Vem preenchido com o contato de venda do cadastro e é copiado para o pedido de compra gerado. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Texto livre sobre a cotação, impresso no documento enviado ao fornecedor. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Soma das bases de IPI dos itens — o total de cada linha que tem alíquota de IPI maior que zero. Recalculada pelo programa. Campo desabilitado, não digitável. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Soma do IPI dos itens, cada um calculado como a base da linha vezes a alíquota dividida por cem. Recalculada pelo programa. Campo desabilitado, não digitável. |
| CNPJ / CPF | `CNPJ_CPF_FORNECEDOR` | VARCHAR(18) | 18 |  | CNPJ ou CPF do fornecedor, trazido do cadastro mas editável. Ao sair do campo o programa valida: aceita só 11 dígitos (CPF) ou 14 (CNPJ), confere os dígitos verificadores e formata. Sair pelos botões Sair ou Limpar escapa da crítica. |
| Insc.Estadual / RG | `IE_RG_FORNECEDOR` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do fornecedor, trazido do cadastro. |
| Endereço | `ENDERECO_FORNECEDOR` | VARCHAR(50) | 50 |  | Logradouro do fornecedor, montado pelo programa juntando o endereço e o número do cadastro, separados por vírgula. |
| Bairro | `BAIRRO_FORNECEDOR` | VARCHAR(50) | 50 |  | Bairro do fornecedor, trazido do cadastro. |
| Cep | `CEP_FORNECEDOR` | VARCHAR(50) | 50 |  | CEP do fornecedor, trazido do cadastro. |
| Cidade | `CIDADE_FORNECEDOR` | VARCHAR(50) | 50 |  | Cidade do fornecedor. Vem do nome da cidade do cadastro, não do código. |
| Estado | `ESTADO_FORNECEDOR` | VARCHAR(50) | 50 |  | Unidade federativa do fornecedor, trazida do cadastro. Ao gerar o pedido de compra, é comparada com o estado da empresa para escolher a alíquota de ICMS aplicável. |
| Validade | `VALIDADE` | VARCHAR(50) | 50 |  | Até quando o preço cotado vale, em texto livre — não é campo de data. Informado pelo fornecedor. |
| Prazo de Entrega | `PRAZO_ENTREGA` | VARCHAR(50) | 50 |  | Prazo de entrega prometido, em texto livre. |
| Frete | `FRETE` | VARCHAR(50) | 50 |  | Condição de frete cotada, em texto livre. |
| Condições de Pagamento | `CONDICAO_PAGAMENTO` | VARCHAR(50) | 50 |  | Prazos de pagamento. Preenchido automaticamente ao informar o fornecedor: o programa junta os dias de vencimento cadastrados para ele, separados por barra, e acrescenta a palavra DIAS ao final (por exemplo 30/60/90 DIAS), cortando em 50 caracteres. Pode ser alterado à mão. |
| Fax | `FONE_FORNECEDOR` | VARCHAR(15) | 15 |  | Apesar do nome da coluna, o rótulo é Fax e o valor vem do campo FAX do cadastro do fornecedor. |

#### Informações dos Estoques

Painel de conferência, alimentado pela consulta dos itens: os quatro números se referem ao material da linha corrente da grade e nenhum deles é digitado.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Empenho | `PRODUTO_EMPENHADO` | DOUBLE PRECISION |  |  | Quantidade do material já comprometida com a produção — o estoque empenhado do cadastro do material. Somente leitura (calculado na consulta). |
| Pedidos | `PRODUTO_PEDIDO` | DOUBLE PRECISION |  |  | Quantidade do material já pedida a fornecedores e ainda não recebida: soma da quantidade de consumo menos a faturada nos itens de pedido de compra com STATUS `'Pendente'`. Somente leitura (calculado na consulta). |
| Disponível | `PRODUTO_DISPONIVEL` | DOUBLE PRECISION |  |  | Saldo livre: o saldo do material menos o estoque empenhado. Somente leitura (calculado na consulta). |
| Estoque | `ESTOQUE` | DOUBLE PRECISION |  |  | Saldo físico do material no cadastro, sem descontar empenho. Somente leitura (calculado na consulta). |

### Grade `RxDBGrid1` — tabela IT_COTACAO

A sequência (`SEQ`) é gerada pelo programa por MAX(SEQ)+1. O botão da célula de código abre a consulta de materiais.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material cotado. Só aceita cadastro com TIPO_MATERIA_PRIMA = `'2'`, ou seja, item configurado como Material; item marcado apenas como Produto é recusado com o aviso para reconfigurá-lo. Item com INATIVO = `'2'` e item com BLOQUEIO_COMPRA = `'2'` também são recusados, este último com o aviso de que o material será substituído; material sem código NCM cadastrado gera aviso. Ao aceitar, traz descrição, unidade de compra, unidade de consumo e a alíquota de IPI. Material inexistente faz a linha ser apagada. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, trazida do cadastro. |
| URC | `UNIDADE_COMPRA` | VARCHAR(3) | 3 | Unidade em que o fornecedor vende (unidade de compra), trazida do cadastro do material. |
| Qtd. Compra | `QUANTIDADE_COMPRA` | DOUBLE PRECISION |  | Quantidade na unidade de compra do fornecedor. Ao ser informada, o programa converte para a unidade de consumo multiplicando pelo fator de conversão do cadastro; sem fator cadastrado, a quantidade de consumo fica igual à de compra. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário cotado, por unidade de consumo. Ao gerar o pedido de compra, valor zerado vira 0,01 para não deixar o item sem preço. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Qtd. Consumo vezes Valor, calculado pelo programa. Alimenta o R$ Produtos do cabeçalho e, quando há IPI, também a Base IPI. |
| % IPI | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do material, trazida do cadastro. Maior que zero, o programa toma o Total da linha como base e calcula o IPI da linha; zerada, base e valor de IPI da linha ficam em zero. |
| Destino | `DESTINO` | VARCHAR(20) | 20 | Destino da compra, escolhido numa lista fixa: `'Industrialização'`, `'Uso ou consumo'` ou `'Comercialização'`. Determina o tratamento fiscal e é copiado para o item do pedido de compra gerado. |
| UC | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade em que a empresa consome o material, trazida do cadastro. |
| Qtd. Consumo | `QUANTIDADE_CONSUMO` | DOUBLE PRECISION |  | Quantidade convertida para a unidade de consumo. Calculada a partir da Qtd. Compra pelo fator de conversão do cadastro. Zero ou negativo faz o programa avisar Quantidade do Produto não informado e apagar a linha. É esta quantidade, e não a de compra, que multiplica o Valor no Total. |

### Observações

- A coluna `STATUS` da cotação não aparece na tela, mas comanda o fluxo: nasce `'Pendente'` no NewRecord e passa a `'Aprovado'` quando o botão de gerar pedido é confirmado. O pedido de compra criado nasce com seus itens em STATUS `'Pendente'` e TIPO_BAIXA `'Integral'`, e a tela de pedido de compra abre em seguida com o número recém-gerado.
- A impressão pode ser enviada por e-mail ao fornecedor; sem e-mail cadastrado, o programa avisa e não envia.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Status | `STATUS` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Status”. Função não verificada no código. |

<a id="umov_conhecimento_frete"></a>

## `umov_conhecimento_frete` — Conhecimento de Frete...

Lançamento do conhecimento de frete recebido da transportadora, gravado em `CONHECIMENTO_FRETE` (chave `EMPRESA` + `NUMERO`). O cabeçalho traz a transportadora, o número e a data do conhecimento, os valores de ICMS e do frete, e a conta do plano de contas; nome da transportadora vem por LEFT JOIN com `TRANSPORTADORA` e a descrição da conta contábil por LEFT JOIN com `PLANO_CONTAS`. O rádio Tipo divide a tela em dois casos, e só o caso Saída abre a aba Informações da Nota Fiscal de Saída, que amarra o conhecimento a uma nota de venda por LEFT JOIN com `NOTA` e `MODALIDADE_FRETE` — todos os campos dessa aba, menos o número e a série da nota, são somente-leitura, copiados da nota.

Gravar não faz só o cabeçalho: no AfterPost a tela gera ou atualiza o título em `PAGAR` para a transportadora, sempre com documento `'CF'`, série `'1'`, parcela 1, número igual ao número do conhecimento, fornecedor igual ao `FORNECEDOR` da transportadora, vencimento 30 dias depois da emissão, situação de título 1 e marcador de confirmação de recebimento de fatura em `'1'`. Por isso a transportadora precisa ter fornecedor cadastrado, senão o Gravar recusa. O registro fica travado depois que o título é pago, mesmo que parcialmente, e também quando o conhecimento já foi conferido.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do conhecimento, exibida como texto fixo ao lado do número, sem rótulo. Não é digitável. O NewRecord grava `'Pendente'`; a tela de conferência (`umov_conhecimento_frete_conferencia`) é quem passa para `'Conferido'`. Com `'Conferido'` o Gravar aborta logo na entrada, com o aviso de que é impossível alterar o registro. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno do lançamento, chave primária junto com a empresa — não confundir com o Nº Conhec. Frete, que é o número do documento da transportadora. Preenchido pelo sistema: ao limpar a tela já traz `MAX(NUMERO) + 1` da empresa, e na gravação de registro novo é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; número inexistente e acima da sequência abre a tela de seleção de cadastro novo. F7, F8 e F9 navegam entre os números. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do conhecimento de frete. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. É dela que sai o vencimento do título em `PAGAR`, sempre emissão mais 30 dias. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, trazido de `TRANSPORTADORA.NOME` pelo LEFT JOIN e regravado pelo sistema ao informar o código ao lado. Controle desabilitado, não é digitado. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora emitente do conhecimento, do cadastro `TRANSPORTADORA`. Obrigatória, e mais: a transportadora precisa existir e ter um `FORNECEDOR` cadastrado, senão o Gravar recusa com a instrução de cadastrar o fornecedor — é esse fornecedor que recebe o título em `PAGAR`. F4 abre a consulta de transportadoras e F3 abre o cadastro. Ao sair do campo o sistema busca o nome e, se o par transportadora mais número do conhecimento já existir, a tela troca sozinha para aquele registro. Não pode ser trocada depois de gravada: o BeforePost guarda o valor em `LAST_TRANSPORTADORA` e o Gravar recusa qualquer divergência. |
| Aliquota Icms | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS do frete, em percentual. Ao sair do campo o sistema recalcula o Valor Icms como base de cálculo vezes alíquota dividido por cem; erro no cálculo zera o valor. |
| Base Cálculo | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS do frete. Entra no cálculo automático do Valor Icms disparado pela saída da alíquota. |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS do frete. Digitável, mas normalmente preenchido pelo sistema: a saída do campo Aliquota Icms o sobrescreve com base vezes alíquota sobre cem. |
| Valor Frete | `VALOR` | DOUBLE PRECISION |  |  | Valor total do conhecimento de frete. Obrigatório e maior que zero: Gravar aborta com "Valor do Conhecimento de Frete" zerado. É o valor que vai para `VALOR`, `SALDO` e `SALDO_LIQUIDO` do título gerado em `PAGAR`. |
| Cnpj Transportadora | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF da transportadora. Obrigatório: Gravar aborta com "CNPJ Transportadora" em branco. Ao sair do campo o sistema tira a pontuação, exige 11 ou 14 dígitos, formata como CPF ou CNPJ conforme o tamanho e valida o dígito verificador, avisando quando está inválido. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta do plano de contas em que a despesa de frete é escriturada. Obrigatória: Gravar aborta com "Plano de Contas" em branco e recusa conta cujo `TIPO` em `PLANO_CONTAS` não seja `'Analítico'`, informando o tipo encontrado. F4 abre a consulta do plano de contas e F3 abre o cadastro. Ao sair do campo o sistema valida, regrava o código no formato do cadastro e preenche a descrição; não achando, limpa os dois. É repassada ao título em `PAGAR`. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta contábil, trazida de `PLANO_CONTAS.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Controle desabilitado, não é digitado, e não entra no INSERT (calculado na consulta). |
| Nº Conhec. Frete | `NUMERO_CONHEC_FRETE` | VARCHAR(25) | 25 |  | Número do documento impresso pela transportadora. Obrigatório: Gravar aborta com "Nº do Conhecimento de Frete" em branco. Só aceita dígitos na digitação. Ao sair do campo o sistema procura o mesmo número na mesma transportadora e, achando outro lançamento, troca a tela para ele em vez de duplicar. Não pode ser trocado depois de gravado: o BeforePost guarda o valor em `LAST_NUMERO_CONHEC_FRETE` e o Gravar recusa a divergência. É este número, e não o Número da tela, que vai para `NUMERO` do título em `PAGAR`. |
| Tipo | `TIPO` | VARCHAR(10) | 10 |  | Diz se o frete se refere a uma entrada ou a uma saída de mercadoria. Rádio com dois valores, gravados como texto literal: `'Entrada'` e `'Saída'`. O NewRecord grava `'Saída'`. É o interruptor da aba Informações da Nota Fiscal de Saída, que só aparece com `'Saída'`; com `'Entrada'` a aba some e o conhecimento fica sem vínculo com nota de venda. Também entra na busca de nota fiscal já lançada e no LEFT JOIN com `NOTA`, que só casa quando o tipo é `'Saída'`. |

#### Informações da Nota Fiscal de Saída

Aba visível apenas quando o Tipo é `'Saída'`. Só o Nº Nota Fiscal e a Serie são digitáveis; todo o resto é copiado da nota e fica somente-leitura, com o controle desabilitado. Informar o número da nota dispara a cópia: a tela só aceita nota com `STATUS` igual a `'Faturada'` ou `'NFE Autorizada'` e com `MODALIDADE_FRETE` igual a zero, avisando "Para Poder Lançar o Conhecimento de Frete a Modalidade do Frete deverá ser 0 - POR CONTA DO EMITENTE" quando não é o caso. Recusada a nota, todos os campos da aba são limpos, inclusive o número e a série.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `REDESPACHO_NF` | INTEGER |  |  | Código da transportadora de redespacho da nota, copiado de `NOTA.REDESPACHO`. Somente leitura (calculado na consulta). |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO_NF` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho, copiado de `NOTA.NOME_REDESPACHO`. Somente leitura (calculado na consulta). |
| Tipo de Frete | `TIPO_REDESPACHO_NF` | VARCHAR(10) | 10 |  | Tipo do frete de redespacho declarado na nota, copiado de `NOTA.TIPO_REDESPACHO`. Somente leitura (calculado na consulta). |
| Nome do Contato | `NOME_CONTATO_FRETE_COMBINADO_NF` | VARCHAR(25) | 25 |  | Contato do frete combinado na nota, copiado de `NOTA.NOME_CONTATO_FRETE_COMBINADO`. Somente leitura (calculado na consulta). |
| Frete Comb. | `VALOR_FRETE_COMBINADO_NF` | DOUBLE PRECISION |  |  | Valor de frete combinado com o cliente na nota, copiado de `NOTA.VALOR_FRETE_COMBINADO`. Somente leitura. Serve de referência contra o Valor Frete cobrado pela transportadora (calculado na consulta). |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA_NF` | VARCHAR(50) | 50 |  | Nome da transportadora indicada na nota, copiado de `NOTA.NOME_TRANSPORTADORA`. Somente leitura. Pode divergir da transportadora do conhecimento (calculado na consulta). |
| Transportadora | `TRANSPORTADORA_NF` | INTEGER |  |  | Código da transportadora indicada na nota, copiado de `NOTA.TRANSPORTADORA`. Somente leitura (calculado na consulta). |
| Nº Nota Fiscal | `NUMERO_NOTA_FISCAL` | INTEGER |  |  | Número da nota fiscal de saída que este frete transportou. Digitável, e é o campo que comanda a aba: ao sair dele o sistema busca a nota e copia cliente, cidade, UF, transportadora, modalidade, frete combinado, contato e redespacho. Ao digitar, o SetText já verifica se a mesma nota não está em outro conhecimento — achando, avisa e troca a tela para aquele registro. Nota recusada limpa este campo junto com o resto da aba. |
| Cliente | `CLIENTE_NF` | INTEGER |  |  | Código do cliente da nota, copiado de `NOTA.CLIENTE`. Somente leitura (calculado na consulta). |
| Razão Social / Nome do Cliente | `NOME_CLIENTE_NF` | VARCHAR(70) | 70 |  | Nome do cliente da nota, copiado de `NOTA.NOME_CLIENTE`. Somente leitura (calculado na consulta). |
| Cidade do Cliente | `CIDADE_CLIENTE_NF` | VARCHAR(50) | 50 |  | Cidade de entrega da nota, copiada de `NOTA.CIDADE_CLIENTE`. Somente leitura (calculado na consulta). |
| UF | `ESTADO_CLIENTE_NF` | VARCHAR(2) | 2 |  | Sigla da UF de entrega da nota, copiada de `NOTA.ESTADO_CLIENTE`. Somente leitura (calculado na consulta). |
| Serie | `SERIE_NOTA_FISCAL` | VARCHAR(5) | 5 |  | Série da nota fiscal de saída. Digitável. Deixada em branco, o sistema assume a série padrão do parâmetro `NOTA_SERIE` na hora de procurar a nota, e grava essa série no registro. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete declarada na nota, lido de `NOTA.MODALIDADE_FRETE` pelo LEFT JOIN. Somente leitura, mas é o campo que barra o lançamento: só nota com modalidade zero, POR CONTA DO EMITENTE, pode receber conhecimento de frete. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade, trazida de `MODALIDADE_FRETE.DESCRICAO` pelo LEFT JOIN. Somente leitura (calculado na consulta). |

Colunas do dataset sem controle na tela: `EMPRESA`, preenchida com a empresa logada no NewRecord; `NUMERO_ENTRADA`, que liga o conhecimento à nota de entrada e não é alimentada por esta tela; e `LAST_TRANSPORTADORA` e `LAST_NUMERO_CONHEC_FRETE`, cópias no SELECT regravadas no BeforePost, usadas só para impedir a troca da transportadora e do número do conhecimento.

<a id="umov_conhecimento_frete_conferencia"></a>

## `umov_conhecimento_frete_conferencia` — Conferência do Conhecimento de Fretes...

Fecha a fatura da transportadora: junta vários conhecimentos de frete de notas de entrada em um documento só e gera o contas a pagar. O cabeçalho grava `CONHECIMENTO_FRETE_CONFERENCIA` (chave `EMPRESA` + `NUMERO`), com a transportadora identificada pelo CNPJ e o nome vindo por LEFT JOIN com `FORNECEDOR`. A grade grava `IT_CONHECIMENTO_FRETE_CONF`, uma linha por conhecimento, e todos os dados de cada linha — CNPJ, emissão, ICMS e valor — são copiados da nota de entrada em `ENTRADA` pelo LEFT JOIN; só o número do conhecimento é digitado.

Lançar um conhecimento na grade marca a entrada correspondente com `STATUS_CONHECIMENTO_FRETE = 'Conferido'` e grava nela o número desta conferência; tirar da grade devolve a `'Pendente'` e limpa o número. Digitar o número traz todas as entradas pendentes daquele conhecimento e daquele CNPJ de uma vez, uma linha por entrada. O total bruto é recalculado a cada item.

Gravar exige transportadora existente por CNPJ, emissão e vencimento válidos e Nº Documento preenchido, e então monta os títulos em `PAGAR` com documento `'FF'`, fornecedor da transportadora, número igual ao número da conferência e série `'1'` para conferências abaixo de 157 ou `'9'` daí para cima. Gera uma parcela por plano de contas distinto entre os itens, rateando o desconto proporcionalmente, com situação de título 1; e apaga os títulos `'NF'` de cada nota de entrada envolvida. Títulos já pagos travam tanto a gravação quanto a exclusão.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número da conferência, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(NUMERO) + 1` da empresa, e na gravação de registro novo é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; número inexistente e acima da sequência abre a tela de seleção de cadastro novo. F4 abre a consulta e as teclas de navegação andam entre os números. Vira o `NUMERO` dos títulos `'FF'` gerados em `PAGAR`, e decide a série deles: abaixo de 157 é série `'1'`, de 157 em diante é série `'9'`. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da fatura da transportadora. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. É copiada para `EMISSAO` dos títulos gerados. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento da fatura. Obrigatória e validada duas vezes: ao sair do campo, vencimento anterior à emissão é apagado com aviso, e sem emissão informada vencimento anterior a hoje também é apagado; no Gravar, data inválida ou incompleta aborta. É copiada para `VENCIMENTO` dos títulos gerados, e a diferença até a emissão vira `DIAS`. |
| CNPJ/CPF | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF da transportadora. É a chave da tela: o Gravar procura o fornecedor por ele em `FORNECEDOR` e aborta com "CNPJ/CPF da Transportadora não Informado ou Inexistente" quando não acha; o fornecedor achado é quem recebe os títulos. F4 abre a consulta de fornecedores. Também filtra as entradas trazidas ao digitar o número do conhecimento na grade. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, trazido de `FORNECEDOR.NOME` pelo LEFT JOIN feito pelo CNPJ. Controle desabilitado, não é digitado, e não entra no INSERT nem no UPDATE. É o texto gravado no log do sistema (calculado na consulta). |
| Nº Documento | `NUMERO_DOCUMENTO` | VARCHAR(50) | 50 |  | Número da fatura ou documento entregue pela transportadora. Obrigatório: Gravar aborta com "Nº Documento" em branco. Ao digitar, o sistema procura o mesmo número no mesmo CNPJ em outra conferência e, achando, limpa o campo e avisa em qual conferência ele já está. Entra na referência dos títulos gerados, no formato "FF número - documento". |
| Total | `TOTAL_VALOR_FRETE` | DOUBLE PRECISION |  |  | Soma dos valores de frete das linhas da grade. Controle desabilitado, não é digitado: o sistema regrava a cada item lançado, somando a diferença entre o valor novo e o anterior da linha, e abate de novo quando um item é excluído. É a base do rateio do desconto entre as parcelas. |
| Valor Desconto | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto concedido pela transportadora na fatura inteira. Único valor digitável do rodapé. O NewRecord grava zero. Gravar recusa desconto maior ou igual ao Total. Não vira parcela própria: é rateado proporcionalmente entre as parcelas geradas, na proporção do valor de cada plano de contas sobre o total. |
| Líquido | `TOTAL_VALOR_LIQUIDO` | DOUBLE PRECISION |  |  | Total menos desconto. Controle desabilitado, não é digitado: é expressão do SELECT e o sistema ainda o recalcula a cada mudança nos itens ou no desconto. É a soma do que os títulos em `PAGAR` vão totalizar (calculado na consulta). |

### Grade `dbconhecimento` — tabela IT_CONHECIMENTO_FRETE_CONF

Uma linha por conhecimento de frete conferido. Só a primeira coluna é digitável; o cursor pula todas as outras e, ao chegar no fim da linha, já abre uma linha nova. `SEQ` é o sequencial do item, calculado no NewRecord como `MAX(SEQ) + 1` da conferência, e não tem coluna na tela.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nº Conhec. Frete | `NUMERO_CONHECIMENTO` | INTEGER |  | Número do conhecimento de frete emitido pela transportadora. Única coluna digitável, e o motor da grade: ao digitar, o sistema procura em `ENTRADA` todas as notas com esse número de conhecimento, esse CNPJ de transportadora e `STATUS_CONHECIMENTO_FRETE` igual a `'Pendente'`, e gera uma linha para cada uma, já preenchida com entrada, CNPJ, emissão, ICMS, valor e plano de contas. Não achando nenhuma, avisa "Nº do Conhecimento de Frete não Encontrado" e limpa a linha inteira. |
| CNPJ Transportadora | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 | Apelido de `ENTRADA.CNPJ_CPF_FORNECEDOR` no SELECT: o CNPJ do fornecedor da nota de entrada. Coluna somente-leitura, copiada pelo sistema da entrada encontrada. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da nota de entrada, lida de `ENTRADA.EMISSAO`. Coluna somente-leitura, copiada pelo sistema. Não é a emissão da fatura, que fica no cabeçalho. |
| Icms | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do frete, lida de `ENTRADA.ALIQUOTA_ICMS`. Coluna somente-leitura, copiada pelo sistema. |
| Base Icms | `BASE_ICMS` | DOUBLE PRECISION |  | Base de cálculo do ICMS do frete, lida de `ENTRADA.BASE_ICMS`. Coluna somente-leitura, copiada pelo sistema. |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  | Valor do ICMS do frete, lido de `ENTRADA.VALOR_ICMS`. Coluna somente-leitura, copiada pelo sistema. |
| Valor Frete | `VALOR_FRETE` | DOUBLE PRECISION |  | Valor do frete da entrada, apelido de `ENTRADA.TOTAL` no SELECT. Coluna somente-leitura, copiada pelo sistema. É o que soma no Total do cabeçalho e o que é agrupado por plano de contas para gerar as parcelas em `PAGAR`. |

Colunas do item que o SELECT traz e não aparecem na grade: `NUMERO_ENTRADA`, a nota de entrada amarrada à linha, gravada pelo sistema e a única ligação real com `ENTRADA` — é por ela que o status do conhecimento na entrada é marcado e desmarcado; `PLANO_CONTAS`, copiado de `ENTRADA.PLANO_CONTAS`, que decide quantas parcelas o Gravar cria, uma por plano distinto; e `LAST_VALOR_FRETE`, cópia de `ENTRADA.TOTAL` no SELECT, usada só para o sistema saber o valor anterior da linha ao recalcular o Total.

<a id="umov_nota_fiscal_compra_registro_operacao_mercadoria"></a>

## `umov_nota_fiscal_compra_registro_operacao_mercadoria` — Registro das Operações de Mercadorias da Nota Fiscal de Entrada...

Tela de consulta que registra as mercadorias de uma nota de entrada no controle de operações. O cabeçalho vem de `ENTRADA` (dataset `query1`, com JOIN em FORNECEDOR, NATUREZA_OPERACAO, TRANSPORTADORA, MODALIDADE_FRETE e PLANO_CONTAS) e a grade mostra `IT_ENTRADA`. Nenhum campo é editável: todos os controles estão com `ReadOnly` ou desabilitados e a grade é somente-leitura; o UPDATE declarado no dataset alcança apenas `MODALIDADE_FRETE` e não é acionado. O botão Gravar exige natureza com `TIPO_OPERACAO_MERCADORIA` = `2`, recusa a nota se já houver registro, e então insere um item em `CONTROLE_OPERACAO_MERCADORIA` para cada linha de IT_ENTRADA, com `TIPO_NOTA_FISCAL` = `Compra/Entrada`, o CNPJ do fornecedor e `SALDO` igual à quantidade comprada — é esse saldo que a baixa consome depois. O botão Excluir desfaz o registro e, quando a natureza é `3`, devolve antes o saldo das mercadorias baixadas em `Venda/Saida`.

### Campos

#### Cabeçalho da nota

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da nota, exibida sem rótulo em TDBText — somente leitura. Assume `Pendente` (nota ainda em digitação), `Lançada` (encerrada, com estoque e Contas a Pagar gerados) e `Aberto` (reaberta com pagamentos já existentes). Aqui é informativo: o registro das mercadorias não testa o status. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno do lançamento da entrada, não o número da nota do fornecedor. Chave primária de ENTRADA e único campo em que se digita: Enter recarrega o registro, o botão e F4 abrem a consulta de notas de compra, F7 volta, F8 avança e F9 posiciona no menor ou igual. Ao abrir, a tela carrega a última entrada da empresa. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor da nota. Somente leitura. É gravado em CLIENTE_FORNECEDOR nos itens registrados e é por ele que o CNPJ da operação é buscado. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do JOIN com FORNECEDOR. Somente leitura (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota do fornecedor. Somente leitura. |
| Nº. Nota Fiscal | `NOTA` | INTEGER |  |  | Número impresso na nota do fornecedor. Somente leitura. É gravado como `NUMERO` do registro em CONTROLE_OPERACAO_MERCADORIA e usado para checar se a nota já foi registrada. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  |  | Data de entrada física da mercadoria. Somente leitura. |
| Natureza | `NATUREZA` | VARCHAR(10) | 10 |  | Código da natureza de operação. Somente leitura, mas é o campo que libera a tela: só com `TIPO_OPERACAO_MERCADORIA` = `2` o registro é feito; qualquer outro valor produz o aviso "Não está Habilitada p/ fazer o Registro das Mercadorias". O código também é copiado para NATUREZA_OPERACAO de cada item registrado. |
| Base Subst.Trib. | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base de cálculo da substituição tributária da nota, apurada no lançamento. Somente leitura. |
| Valor Subst.Trib. | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor da substituição tributária da nota. Somente leitura. |
| Valor Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Frete cobrado na própria nota. Somente leitura. |
| Desc. Total | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto sobre o total da nota. Somente leitura. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da nota. Somente leitura. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS da nota. Somente leitura. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI da nota. Somente leitura. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI da nota. Somente leitura. |
| R$  Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Total dos produtos apurado pelo sistema na soma dos itens. Somente leitura. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição vinda do JOIN com NATUREZA_OPERACAO. Somente leitura (calculado na consulta). |
| R$  Nota | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota apurado pelo sistema. Somente leitura. |
| Total Produtos | `TOTAL_PRODUTO_INF` | DOUBLE PRECISION |  |  | Total dos produtos informado no lançamento, conforme o documento do fornecedor. Somente leitura. |
| Total Nota | `TOTAL_NOTA_INF` | DOUBLE PRECISION |  |  | Total da nota informado no lançamento, conforme o documento do fornecedor. Somente leitura. |
| Outras Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas acessórias da nota. Somente leitura. |
| Desc Produto | `VALOR_DESCONTO_PRODUTO` | DOUBLE PRECISION |  |  | Desconto concedido sobre os produtos. Somente leitura. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora da nota. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome vindo do JOIN com TRANSPORTADORA. Somente leitura (calculado na consulta). |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade do frete no cadastro MODALIDADE_FRETE, que descreve por conta de quem corre o transporte. Somente leitura aqui. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição vinda do JOIN com MODALIDADE_FRETE. Somente leitura (calculado na consulta). |

#### Conhecimento de Frete

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base Cálculo | `BASE_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS do conhecimento de frete lançado com a nota. Somente leitura. |
| Valor Frete | `VALOR_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Valor do conhecimento de frete. Somente leitura. |
| Valor Icms | `VALOR_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | ICMS do conhecimento de frete. Somente leitura. |
| Cnpj Transportadora | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF de quem emitiu o conhecimento de frete. Somente leitura. |
| Aliquota Icms | `ALIQUOTA_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Alíquota do ICMS do frete, em percentual. Somente leitura. |
| Número | `NUMERO_CONHEC_FRETE` | VARCHAR(25) | 25 |  | Número do conhecimento de frete. Somente leitura. |

#### Cabeçalho da nota (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta de despesa usada no lançamento da compra. Somente leitura. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição vinda do JOIN com PLANO_CONTAS. Somente leitura (calculado na consulta). |
| Série | `SERIE` | VARCHAR(5) | 5 |  | Série da nota do fornecedor. Somente leitura. Junto com o número da nota e o fornecedor, forma a chave do registro em CONTROLE_OPERACAO_MERCADORIA. |
| Segmentação | `SEGMENTACAO` | INTEGER |  |  | Código de segmentação da entrada. Somente leitura. |

### Grade `RxDBGrid1` — tabela IT_ENTRADA

Grade com `ReadOnly` ligado. É esta lista que o Gravar percorre linha a linha para criar os itens do controle de operações de mercadorias.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do produto/matéria-prima. É gravado em PRODUTO no item registrado. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, gravada no lançamento a partir do cadastro. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo do produto, gravada no lançamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade comprada. Vai para o item registrado tanto em QUANTIDADE quanto em SALDO, e é esse saldo que a baixa vai consumindo. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário do item. Não é levado para o controle de mercadorias. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total do item. |
| Icms | `ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item, em percentual. |
| Ipi | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do item, em percentual. |

<a id="umov_nota_fiscal_compra_baixa_manual_registro_mercadoria"></a>

## `umov_nota_fiscal_compra_baixa_manual_registro_mercadoria` — Baixa Manual do Registro das Operações de Mercadorias da Nota Fiscal de Entrada...

Tela de consulta que serve de porta de entrada para a baixa manual das mercadorias controladas. O cabeçalho vem de `ENTRADA` (dataset `query1`, com JOIN em FORNECEDOR, NATUREZA_OPERACAO, TRANSPORTADORA, MODALIDADE_FRETE e PLANO_CONTAS) e a grade mostra os itens de `IT_ENTRADA`. Nada do que aparece é editável: todos os controles estão com `ReadOnly` ou desabilitados e a grade também é somente-leitura — o único UPDATE declarado no dataset é o de `MODALIDADE_FRETE`, que na prática nunca é acionado. O botão Gravar não grava a entrada: ele confere a natureza de operação e, quando `TIPO_OPERACAO_MERCADORIA` = `2` e o fornecedor tem CNPJ, abre a tela de baixa do controle de operação de mercadorias. O botão Excluir desfaz o registro, apagando os itens de `CONTROLE_OPERACAO_MERCADORIA` do tipo `Compra/Entrada` ou, quando a natureza é `3`, devolvendo o saldo das mercadorias baixadas em `Venda/Saida` antes de apagá-las.

### Campos

#### Cabeçalho da nota

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da nota, exibida sem rótulo em TDBText — somente leitura. Assume `Pendente` (nota ainda em digitação), `Lançada` (encerrada, com estoque e Contas a Pagar gerados) e `Aberto` (reaberta com pagamentos já existentes). Aqui é apenas informativo: a tela não testa o status para permitir ou barrar a baixa. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno do lançamento da entrada, não o número da nota do fornecedor. Chave primária de ENTRADA e único campo em que se digita: Enter recarrega o registro, o botão e F4 abrem a consulta de notas de compra, F7 volta, F8 avança e F9 posiciona no menor ou igual. Ao abrir, a tela carrega a última entrada da empresa. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor da nota. Somente leitura. Compõe a chave dos itens registrados em CONTROLE_OPERACAO_MERCADORIA. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do JOIN com FORNECEDOR. Somente leitura; é o nome citado no aviso de fornecedor sem CNPJ (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota do fornecedor. Somente leitura. |
| Nº. Nota Fiscal | `NOTA` | INTEGER |  |  | Número impresso na nota do fornecedor. Somente leitura. É o número passado à tela de baixa e usado para localizar as mercadorias registradas. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  |  | Data de entrada física da mercadoria. Somente leitura. |
| Natureza | `NATUREZA` | VARCHAR(10) | 10 |  | Código da natureza de operação. Somente leitura, mas é o campo que libera a tela: com `TIPO_OPERACAO_MERCADORIA` = `2` a baixa é permitida; qualquer outro valor produz o aviso "Não está Habilitada p/ fazer a Baixa das Mercadorias". No Excluir, `2` apaga os itens registrados como `Compra/Entrada` e `3` devolve o saldo dos itens baixados em `Venda/Saida`. |
| Base Subst.Trib. | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base de cálculo da substituição tributária da nota, apurada no lançamento. Somente leitura. |
| Valor Subst.Trib. | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor da substituição tributária da nota. Somente leitura. |
| Valor Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Frete cobrado na própria nota. Somente leitura. |
| Desc. Total | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto sobre o total da nota. Somente leitura. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da nota. Somente leitura. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS da nota. Somente leitura. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI da nota. Somente leitura. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI da nota. Somente leitura. |
| R$  Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Total dos produtos apurado pelo sistema na soma dos itens. Somente leitura. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição vinda do JOIN com NATUREZA_OPERACAO. Somente leitura (calculado na consulta). |
| R$  Nota | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota apurado pelo sistema. Somente leitura. |
| Total Produtos | `TOTAL_PRODUTO_INF` | DOUBLE PRECISION |  |  | Total dos produtos informado no lançamento, conforme o documento do fornecedor. Somente leitura. |
| Total Nota | `TOTAL_NOTA_INF` | DOUBLE PRECISION |  |  | Total da nota informado no lançamento, conforme o documento do fornecedor. Somente leitura. |
| Outras Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas acessórias da nota. Somente leitura. |
| Desc Produto | `VALOR_DESCONTO_PRODUTO` | DOUBLE PRECISION |  |  | Desconto concedido sobre os produtos. Somente leitura. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora da nota. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome vindo do JOIN com TRANSPORTADORA. Somente leitura (calculado na consulta). |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade do frete no cadastro MODALIDADE_FRETE, que descreve por conta de quem corre o transporte. Somente leitura aqui. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição vinda do JOIN com MODALIDADE_FRETE. Somente leitura (calculado na consulta). |

#### Conhecimento de Frete

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base Cálculo | `BASE_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS do conhecimento de frete lançado com a nota. Somente leitura. |
| Valor Frete | `VALOR_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Valor do conhecimento de frete. Somente leitura. |
| Valor Icms | `VALOR_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | ICMS do conhecimento de frete. Somente leitura. |
| Cnpj Transportadora | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF de quem emitiu o conhecimento de frete. Somente leitura. |
| Aliquota Icms | `ALIQUOTA_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Alíquota do ICMS do frete, em percentual. Somente leitura. |
| Número | `NUMERO_CONHEC_FRETE` | VARCHAR(25) | 25 |  | Número do conhecimento de frete. Somente leitura. |

#### Cabeçalho da nota (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta de despesa usada no lançamento da compra. Somente leitura. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição vinda do JOIN com PLANO_CONTAS. Somente leitura (calculado na consulta). |
| Série | `SERIE` | VARCHAR(5) | 5 |  | Série da nota do fornecedor. Somente leitura. Junto com o número da nota e o CNPJ, é a chave passada à tela de baixa das mercadorias. |
| Segmentação | `SEGMENTACAO` | INTEGER |  |  | Código de segmentação da entrada. Somente leitura. |

### Grade `RxDBGrid1` — tabela IT_ENTRADA

Grade com `ReadOnly` ligado: mostra os itens da nota apenas para o operador conferir o que será baixado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do produto/matéria-prima da nota. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, gravada no lançamento a partir do cadastro. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo do produto, gravada no lançamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade comprada, que é a quantidade candidata à baixa. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário do item. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total do item. |
| Icms | `ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item, em percentual. |
| Ipi | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do item, em percentual. |

<a id="ucad_moeda"></a>

## `ucad_moeda` — Cadastro da Moeda

Cadastro simples das moedas usadas pelo sistema. Grava na tabela `MOEDA`, chaveada por `EMPRESA` + `CADASTRO`. Tela de campo único, sem abas nem grades: código, descrição, sigla e o marcador de inativo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código sequencial da moeda. Ao limpar a tela o sistema sugere o próximo código livre (MAX(CADASTRO) + 1 da empresa). Se o usuário digitar um código já existente, a tela carrega o registro para alteração; se digitar um código maior que o último, abre a seleção que pergunta se quer usar o próximo da sequência ou o código digitado. F4 abre a consulta de moedas, F7/F8/F9 navegam entre registros. |
| Descrição da Moeda | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da moeda. Obrigatório na gravação, mesmo sem NOT NULL no banco: o botão Gravar aborta com a mensagem de campo vazio. É o texto usado no log do sistema e no índice de consulta IDXDESCRICAO_MOEDA. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de moeda fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia o campo em `'1'` (ativa). |
| Sigla | `SIGLA` | VARCHAR(3) | 3 |  | Sigla da moeda, até 3 caracteres (por exemplo BRL, USD). Não é validada na gravação. |

<a id="ucad_via_transporte"></a>

## `ucad_via_transporte` — Cadastro da Via de Transporte

Cadastro das vias de transporte na tabela `VIA_TRANSPORTE`, chave `EMPRESA` + `CADASTRO`. Painel único, três campos, sem abas nem grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da via de transporte, chave do registro. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta as vias, F7/F8/F9 navegam. |
| Descrição da Via de Transporte | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da via (rodoviário, aéreo, marítimo). Único campo exigido no Gravar: vazio aborta com "Descrição da Via de Transporte". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de via fora de uso. `'2'` = inativa (caixa marcada), `'1'` = ativa. O NewRecord grava `'1'`, ou seja, toda via nasce ativa. |

<a id="umov_registro_importacao"></a>

## `umov_registro_importacao` — Registro da Importação

Controla um processo de importação inteiro, do pedido ao desembaraço. O cabeçalho fica em `REGISTRO_IMPORTACAO`, chave `EMPRESA` + `NUMERO`, com os dados do fornecedor estrangeiro, transporte, moeda, pesos e os totalizadores. Abaixo há cinco abas, cada uma com sua tabela de itens: Produtos (`IT_IMPORTACAO_PRODUTO`), Previsão dos Gastos (`IT_IMPORTACAO_PREVISAO_GASTO`), Registro dos Gastos (`IT_IMPORTACAO_REGISTRO_GASTO`, pagamentos de cada despesa prevista), Contrato de Câmbio (`IT_IMPORTACAO_CONTRATO_CAMBIO`) e DI (`IT_IMPORTACAO_DI`). Os totais do cabeçalho não são digitados: são somados pelos itens conforme eles são gravados. O rateio dos gastos sobre o valor dos produtos é o que produz o custo unitário em reais de cada item importado.

### Campos

#### Registro da Importação

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do processo, exibida como texto no topo, sem rótulo e sem digitação. Assume `'Pendente'` ou `'Finalizado'`. Começa `'Pendente'` no NewRecord e é recalculado a cada Gravar: fica `'Finalizado'` quando o total da previsão dos gastos bate exatamente com o total pago (soma dos registros de gasto com operação `'Débito'` menos os de `'Crédito'`); em qualquer outra situação volta para `'Pendente'`. Somente leitura. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do registro de importação, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REGISTRO_IMPORTACAO` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta importações, F7 anterior, F8 próximo, F9 posiciona. |
| Local de Desembarque | `LOCAL_DESEMBARQUE` | VARCHAR(50) | 50 |  | Porto ou aeroporto onde a carga desembarca. Texto livre, não exigido no Gravar. |
| Data | `DATA` | TIMESTAMP |  |  | Data do registro da importação. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. Serve de piso para os vencimentos das despesas previstas: vencimento anterior a esta data é recusado. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor estrangeiro, trazido do JOIN com `FORNECEDOR`. Preenchido quando o código do fornecedor é informado; não é digitado (calculado na consulta). |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor estrangeiro. Exigido no Gravar. Ao ser informado, preenche de uma vez todo o bloco de endereço e contato abaixo (endereço, número, complemento, bairro, país, nome do país, fones) a partir do cadastro de fornecedor. F4 consulta fornecedores, F3 abre o cadastro. |
| Taxa Câmbio | `TAXA_CAMBIO` | DOUBLE PRECISION |  |  | Taxa de câmbio de referência do processo, digitada. Zerada no NewRecord. É informativa no cabeçalho: a conversão efetiva por contrato fica na aba Contrato de Câmbio. |
| Nº da ProForma | `NUMERO_PROFORMA` | VARCHAR(20) | 20 |  | Número da fatura proforma do fornecedor. Exigido no Gravar, é a primeira validação da tela. Vira a referência do log do sistema. |
| Endereço | `ENDERECO_FORNECEDOR` | VARCHAR(50) | 50 |  | Logradouro do fornecedor, copiado do cadastro quando o código do fornecedor é informado. Não é coluna de `REGISTRO_IMPORTACAO` (calculado na consulta). |
| Número | `NUMERO_ENDERECO_FORNECEDOR` | VARCHAR(10) | 10 |  | Número do endereço do fornecedor, copiado do cadastro (calculado na consulta). |
| Complemento | `COMPLEMENTO_FORNECEDOR` | VARCHAR(40) | 40 |  | Complemento do endereço do fornecedor, copiado do cadastro (calculado na consulta). |
| Bairro | `BAIRRO_FORNECEDOR` | VARCHAR(50) | 50 |  | Bairro do fornecedor, copiado do cadastro. Não é coluna de `REGISTRO_IMPORTACAO` (calculado na consulta). |
| Nome do País | `NOME_PAIS_FORNECEDOR` | VARCHAR(50) | 50 |  | Nome do país do fornecedor, copiado do cadastro (calculado na consulta). |
| Fone 01 | `FONE_01_FORNECEDOR` | VARCHAR(15) | 15 |  | Telefone principal do fornecedor, copiado do cadastro (calculado na consulta). |
| Fone 02 | `FONE_02_FORNECEDOR` | VARCHAR(15) | 15 |  | Telefone alternativo do fornecedor, copiado do cadastro (calculado na consulta). |
| País | `PAIS_FORNECEDOR` | INTEGER |  |  | Código do país do fornecedor, copiado do cadastro (calculado na consulta). |
| Descrição da Via de Transporte | `DESCRICAO_VIA_TRANSPORTE` | VARCHAR(50) | 50 |  | Descrição da via de transporte, trazida do JOIN. Preenchida quando o código é informado; não é digitada (calculado na consulta). |
| Via Transporte | `VIA_TRANSPORTE` | INTEGER |  |  | Código da via de transporte (marítima, aérea e demais cadastradas). Exigido no Gravar. F4 abre a consulta de vias de transporte. |
| Descrição da Moeda | `DESCRICAO_MOEDA` | VARCHAR(50) | 50 |  | Descrição da moeda da operação, trazida do JOIN. Preenchida quando o código é informado; não é digitada (calculado na consulta). |
| Moeda | `MOEDA` | INTEGER |  |  | Código da moeda estrangeira em que a importação é fechada. Exigido no Gravar. É a moeda em que os valores dos produtos e o total da moeda estrangeira são expressos. F4 abre a consulta de moedas. |
| Forma de Pagamento | `FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Condição de pagamento acertada com o fornecedor. Texto livre, não é código nem tem consulta; não é exigido no Gravar. |
| Prev. Embarque | `PREVISAO_EMBARQUE` | TIMESTAMP |  |  | Data prevista para o embarque da mercadoria. Informativa, não é exigida no Gravar. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto da carga. Zerado no NewRecord, digitado. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido da carga. Zerado no NewRecord, digitado. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes da carga. Zerado no NewRecord, digitado. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga. Zerada no NewRecord, digitada. |
| Total Moeda Nacional ==> | `TOTAL_MOEDA_NACIONAL` | DOUBLE PRECISION |  |  | Valor da importação convertido em reais. Zerado no NewRecord e digitado no cabeçalho; não é somado pelos itens, ao contrário dos outros totais da tela. |

#### Produtos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total da Moeda Estrangeira ==> | `TOTAL_MOEDA_ESTRANGEIRA` | DOUBLE PRECISION |  |  | Soma dos totais dos itens da aba Produtos, na moeda estrangeira. Somente leitura: é atualizado a cada item gravado ou excluído, nunca digitado. Zerado no NewRecord. É o divisor no cálculo do índice de rateio do custo unitário. |

#### Previsão dos Gastos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total da Previsão dos Gastos (em Reais) ==> | `TOTAL_PREVISAO_GASTO` | DOUBLE PRECISION |  |  | Soma dos valores das despesas previstas, em reais. Somente leitura: é atualizado a cada despesa gravada ou excluída. Zerado no NewRecord. Comparado com o total pago para definir se o STATUS vira `'Finalizado'`, e entra no numerador do índice de rateio do custo unitário. |

#### Registro dos Gastos

Bloco somente-leitura no topo da aba, que espelha a despesa prevista selecionada. Serve para saber a qual despesa os pagamentos da grade abaixo pertencem; nenhum destes campos é digitado aqui — todos vêm da aba Previsão dos Gastos.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  |  | Sequência da despesa prevista à qual os pagamentos se referem. Somente leitura. F4 abre a consulta de previsões de gasto da importação para trocar a despesa selecionada. |
| Descrição da Despesa | `DESCRICAO` | VARCHAR(50) | 50 |  | Descrição da despesa prevista selecionada. Somente leitura. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor previsto da despesa selecionada. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Emissão da despesa prevista selecionada. Somente leitura. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Vencimento da despesa prevista selecionada. Somente leitura. |
| Saldo | `SALDO` | DOUBLE PRECISION |  |  | Quanto ainda falta pagar da despesa selecionada. Somente leitura: começa igual ao valor previsto, cai a cada pagamento lançado na grade e volta a subir quando um pagamento é excluído. |

#### Registro da Importação

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Crédito Imposto | `TOTAL_CREDITO_IMPOSTO` | DOUBLE PRECISION |  |  | Parcela dos gastos que retorna como crédito de imposto e por isso não deve compor o custo. Zerado no NewRecord, digitado. É subtraído do total da previsão dos gastos no cálculo do índice de rateio; ao sair do campo, todos os custos unitários da aba Produtos são recalculados. |

### Grade `dbproduto` — tabela IT_IMPORTACAO_PRODUTO

Itens importados. A sequência (`SEQ`) é gerada no NewRecord como `MAX(SEQ) + 1` dentro da importação. O NCM funciona como chave de existência da linha: se ficar em branco, o item é apagado logo após o post; se estiver preenchido, os demais campos passam a ser exigidos. Enter na descrição com o NCM vazio pula para a aba Previsão dos Gastos. Delete na grade pede confirmação e exclui o item.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(10) | 10 | Classificação fiscal (NCM) do produto importado. É o campo que dá existência à linha: em branco, o item é descartado no AfterPost; preenchido, torna obrigatórios descrição, unidade, quantidade e valor. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto. Convertida para maiúsculas na digitação. Obrigatória quando o NCM está preenchido. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade de medida do produto. Convertida para maiúsculas na digitação. Obrigatória quando o NCM está preenchido. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade importada, gravada com três decimais. Precisa ser maior que zero quando o NCM está preenchido. Ao ser digitada, recalcula o total da linha. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário na moeda estrangeira, com duas decimais. Precisa ser maior que zero quando o NCM está preenchido. Ao ser digitado, recalcula o total da linha. Ponto digitado vira vírgula nesta coluna e na de quantidade. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade multiplicada pelo valor, em moeda estrangeira. Calculado pela tela, não digitado. A soma dos totais dos itens alimenta o Total da Moeda Estrangeira do cabeçalho. |
| Custo Unitário R$ | `CUSTO_UNITARIO` | DOUBLE PRECISION |  | Custo unitário rateado em reais. Campo calculado, não gravado: é o valor unitário multiplicado pelo índice de rateio, que vale `(Total da Previsão dos Gastos menos Crédito Imposto) dividido pelo Total da Moeda Estrangeira`, com seis decimais. Fica zero enquanto o total da previsão dos gastos for zero ou menor ou igual ao crédito de imposto. O índice em vigor aparece no rótulo Indice no Cálculo do Custo Unitário, na própria aba (calculado na consulta). |

### Grade `dbprevisao_gasto` — tabela IT_IMPORTACAO_PREVISAO_GASTO

Despesas previstas do processo, em reais. A descrição é a chave de existência da linha: em branco, a despesa é apagada logo após o post. Excluir uma despesa apaga junto todos os pagamentos lançados para ela e devolve o valor ao total previsto.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência da despesa dentro da importação. Gerada pelo sistema no NewRecord como `MAX(SEQ) + 1`; não é digitada. |
| Descrição da Despesa | `DESCRICAO` | VARCHAR(50) | 50 | Descrição da despesa prevista (frete, armazenagem, despachante e afins). Convertida para maiúsculas na digitação. Em branco, a linha é descartada no AfterPost. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da despesa. Preenchida com a data de hoje no NewRecord. Obrigatória. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Vencimento da despesa. Obrigatório. Data anterior à Data do registro da importação é recusada e o campo volta em branco. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor previsto da despesa, em reais. Precisa ser maior que zero. Não pode ser alterado depois que a despesa já recebeu pagamentos: a tela avisa e cancela a edição. Alimenta o Total da Previsão dos Gastos. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Quanto ainda falta pagar da despesa. Preenchido pelo sistema com o próprio valor quando este é digitado, e abatido a cada pagamento lançado na aba Registro dos Gastos. Saldo menor que o valor é o que impede alterar o valor da despesa. |

### Grade `dbregistro_gasto` — tabela IT_IMPORTACAO_REGISTRO_GASTO

Pagamentos efetivos da despesa prevista selecionada na aba. A data de pagamento é a chave de existência da linha: em branco, o registro é apagado logo após o post. Cada pagamento gravado abate o saldo da despesa; excluir o pagamento devolve o valor ao saldo. O somatório destes lançamentos define se o processo fica Pendente ou Finalizado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Item **·chave** | `ITEM` | INTEGER |  | Sequência do pagamento dentro da despesa. Gerada pelo sistema, não digitada. |
| Data Pagto | `DATA_PAGAMENTO` | TIMESTAMP |  | Data em que a despesa foi paga. Dá existência à linha: em branco, o pagamento é descartado; preenchida, tornam-se obrigatórios o valor pago e o débito ou crédito. Data inválida é recusada. |
| Valor Pago | `VALOR_PAGO` | DOUBLE PRECISION |  | Valor efetivamente pago. Precisa ser maior que zero. Abate o saldo da despesa prevista correspondente. |
| (D) Débito / (C) Crédito | `OPERACAO_FINANCEIRA` | VARCHAR(10) | 10 | Sentido do lançamento. Gravado por extenso como `'Débito'` ou `'Crédito'`: digitar `C`, `CREDITO` ou `CRÉDITO` grava `'Crédito'`, qualquer outra coisa grava `'Débito'`. `'Débito'` é pagamento da despesa e `'Crédito'` é devolução ou estorno. O total pago considerado no fechamento é a soma dos débitos menos a soma dos créditos, e é ele que se compara ao Total da Previsão dos Gastos para o STATUS virar `'Finalizado'`. |

### Grade `dbcontrato_cambio` — tabela IT_IMPORTACAO_CONTRATO_CAMBIO

Contratos de câmbio fechados para pagar a importação. A data do contrato é a chave de existência da linha: em branco, o contrato é apagado logo após o post; preenchida, todos os demais campos passam a ser exigidos.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA_CONTRATO_CAMBIO` | DATE |  | Data de fechamento do contrato de câmbio. Dá existência à linha e precisa ser data válida. |
| Nº Contrato | `NUMERO_CONTRATO_CAMBIO` | VARCHAR(25) | 25 | Número do contrato de câmbio no banco. Obrigatório quando a data está preenchida. |
| Banco | `BANCO` | INTEGER |  | Código do banco onde o câmbio foi fechado. Obrigatório quando a data está preenchida. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido pelo código informado; não é digitado (calculado na consulta). |
| Moeda | `MOEDA` | INTEGER |  | Código da moeda do contrato. Obrigatório quando a data está preenchida. |
| Descrição da Moeda | `DESCRICAO_MOEDA` | VARCHAR(50) | 50 | Descrição da moeda, trazida pelo código informado; não é digitada (calculado na consulta). |
| Valor Moeda | `VALOR_MOEDA_ESTRANGEIRA` | DOUBLE PRECISION |  | Valor contratado na moeda estrangeira. Precisa ser maior que zero. |
| Taxa Câmbio | `TAXA_CAMBIO_MOEDA_ESTRANGEIRA` | DOUBLE PRECISION |  | Taxa de conversão fechada neste contrato. Precisa ser maior que zero. É a taxa efetiva da operação, ao lado da Taxa Câmbio informativa do cabeçalho. |

### Grade `dbdi` — tabela IT_IMPORTACAO_DI

Declarações de Importação do processo. O número da DI é a chave de existência da linha: em branco, a DI é apagada logo após o post; preenchido, as três datas, o canal e o valor passam a ser exigidos.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nº DI | `NUMERO_DI` | VARCHAR(25) | 25 | Número da Declaração de Importação. Convertido para maiúsculas na digitação. Dá existência à linha. |
| Data Registro | `DATA_REGISTRO` | DATE |  | Data de registro da DI na Receita. Obrigatória e precisa ser data válida quando o número da DI está preenchido. |
| Data Desemb. | `DATA_DESEMBARACO` | DATE |  | Data do desembaraço aduaneiro. Obrigatória e precisa ser data válida quando o número da DI está preenchido. |
| Data Emissão | `DATA_EMISSAO` | DATE |  | Data de emissão da DI. Obrigatória e precisa ser data válida quando o número da DI está preenchido. |
| Canal | `CANAL` | VARCHAR(25) | 25 | Canal de conferência aduaneira em que a DI foi parametrizada (verde, amarelo, vermelho, cinza). Texto livre, convertido para maiúsculas na digitação; obrigatório quando o número da DI está preenchido. |
| Valor Import. | `VALOR_IMPORTACAO_MOEDA_NACIONAL` | DOUBLE PRECISION |  | Valor da importação declarado na DI, em reais. Precisa ser maior que zero. |

---

# Módulo 3 — Vendas

44 telas.

<a id="ucad_produto_embalagem"></a>

## `ucad_produto_embalagem` — Cadastro da Embalagem dos Produtos...

Tela auxiliar chamada pelo F2 sobre o campo Cubagem de `ucad_produto`. Grava as embalagens (caixas) de um produto na tabela `PRODUTO_EMBALAGEM`, uma linha por volume, e mantém a soma dos volumes na coluna `CUBAGEM` de `MATERIA_PRIMA`. O produto vem preenchido pela tela chamadora e não é digitado aqui.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtcubagem` | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem total do produto, em MATERIA_PRIMA. Somente leitura (o controle está desabilitado): o sistema soma e subtrai automaticamente o Total de cada linha da grade a cada gravação e a cada exclusão de embalagem. |

### Grade `dbgembalagem` — tabela PRODUTO_EMBALAGEM

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Largura m | `LARGURA` | DOUBLE PRECISION |  | Largura da embalagem em metros. Digitada; o ponto é convertido em vírgula. Se a largura ficar zerada na primeira coluna, o foco pula para o botão Gravar. |
| Altura m | `ALTURA` | DOUBLE PRECISION |  | Altura da embalagem em metros. Digitada. |
| Comprimento m | `COMPRIMENTO` | DOUBLE PRECISION |  | Comprimento da embalagem em metros. Digitado. |
| Total m | `TOTAL` | DOUBLE PRECISION |  | Volume da embalagem. Não é digitado: o sistema calcula `LARGURA * ALTURA * COMPRIMENTO` ao sair de cada coluna e de novo antes de gravar. Linha que fica com Total menor ou igual a zero é excluída logo após o post. Delete na grade pede confirmação e exclui a embalagem, devolvendo o volume à cubagem do produto. |

<a id="umov_contas_receber_baixa_titulo"></a>

## `umov_contas_receber_baixa_titulo` — Baixa dos Títulos a Receber...

Tela que registra os recebimentos de um título. O cabeçalho mostra o título da tabela RECEBER
já selecionado na lista de contas a receber, todo em modo de exibição; os campos digitáveis
alimentam um registro novo de IT_RECEBER, que é a baixa propriamente dita. Cada post em
IT_RECEBER recalcula no RECEBER o SALDO, o SALDO_LIQUIDO, o VALOR_RECEBIDO, o JUROS_RECEBIDO,
o DESCONTO_CONCEDIDO, o JUROS_PENDENTES, a DATA_RECEBIMENTO e a CONTA, e o ModifySQL do
RECEBER grava exatamente essas colunas mais OBSERVACAO e TAXA_JUROS_MENSAL.

Abaixo há um PageControl com três abas: Pagamentos, que lista as baixas já feitas em
IT_RECEBER e é a única gravável; Cheques, que mostra os cheques recebidos amarrados ao título;
e Ocorrencias, que mostra os lançamentos de IT_RECEBER_OCORRENCIA_TITULO. As duas últimas são
consulta pura, sem SQL de gravação.

Quando a forma de pagamento é do tipo 'Financeiro' a baixa debita a conta corrente informada;
sendo 'Contábil', não movimenta conta. Baixas de títulos pagos com cheque, ou com comissão do
representante em situação 'Empenhado', 'Liquidado' ou 'Cancelado', são recusadas na alteração
e no estorno. F6 estorna a baixa selecionada, F10 grava e F2 abre o histórico do cliente.

O campo `edtobservacao` (Observação Titulo) é um TComboEdit sem DataSource: não aparece no TSV,
mas seu conteúdo é jogado em RECEBER.OBSERVACAO no Gravar e a cada baixa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente devedor, vindo do JOIN com CLIENTE. Somente leitura. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(103) | 103 |  | Endereço do cliente montado no SELECT. Somente leitura. |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(64) | 64 |  | Cidade, estado e CEP do cliente montados no SELECT. Somente leitura. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco em que o título está em cobrança. Somente leitura (calculado na consulta). |
| Situação do Título | `DESCRICAO_SITUACAO_TITULO` | VARCHAR(50) | 50 |  | Descrição da situação do título, vinda do JOIN com SITUACAO_TITULO. Somente leitura; quem altera a situação é a tela de ocorrências ou a de alteração. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do título. Somente leitura. Serve de piso para a data de pagamento. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Somente leitura. Base do cálculo de dias de atraso. |
| Dias Atraso | `DIAS_ATRAZO` | INTEGER |  |  | Campo calculado, não gravado. Dias entre hoje e o vencimento, ou entre hoje e a data do último recebimento quando esta é posterior. Fica vazio quando não há atraso. Somente leitura. |
| % Juros | `TAXA_JUROS_MENSAL` | DOUBLE PRECISION |  |  | Taxa de juros de mora ao mês. Editável e gravada. Quando o título vem com taxa zero, o FormCreate carrega o parâmetro JURO_ATRAZO_MENSAL do sistema. |
| Juros Atual | `JUROS_ATUAL` | DOUBLE PRECISION |  |  | Campo calculado, não gravado. Zero quando o saldo é zero ou o atraso não passa do parâmetro JUROS_DIAS_ATRAZO. Caso contrário SALDO vezes a taxa mensal proporcional aos dias de atraso. Se houver juros a cobrar maiores que os juros mais desconto lançados na baixa, a tela pergunta se deve cobrar os juros do cliente. |
| Saldo Atual | `SALDO_ATUAL` | DOUBLE PRECISION |  |  | Campo calculado, não gravado. SALDO mais Juros Atual quando há juros a cobrar, senão o próprio SALDO. |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 |  | Sigla do documento de origem, 'NF' ou 'CI'. Chave do título (PK1). Somente leitura. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do documento de origem (PK3). Somente leitura. |
| Parcela **·chave** | `SEQ` | INTEGER |  |  | Número da parcela (PK5). Somente leitura. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante vinculado ao título, que define a comissão da liquidação. Somente leitura (calculado na consulta). |
| Nº Bordero | `NUMERO_BORDERO` | INTEGER |  |  | Número do borderô de remessa em que o título foi ao banco. Preenchido pela tela de emissão de borderô. Somente leitura. |
| Nº Boleto Bancário | `BOLETO_NUMERO` | INTEGER |  |  | Número do boleto gerado para o título. Somente leitura nesta tela. |
| Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução passada ao banco, do tipo protestar ou não protestar. Somente leitura (calculado na consulta). |
| Cliente **·chave** | `CLIENTE` | INTEGER |  |  | Código do cliente devedor (PK2). Somente leitura. |
| Valor Título | `VALOR` | DOUBLE PRECISION |  |  | Valor original da parcela. Somente leitura. |
| Despesa | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas lançadas sobre o título pelas ocorrências. Entra na conta do que ainda falta receber. Somente leitura. |
| Recebido | `VALOR_RECEBIDO` | DOUBLE PRECISION |  |  | Soma do que já foi recebido. Somente leitura na tela: é recalculado a cada baixa e a cada estorno. |
| Juros Rec. | `JUROS_RECEBIDO` | DOUBLE PRECISION |  |  | Juros efetivamente cobrados nas baixas. Somente leitura, recalculado pelo sistema. |
| Juros Pend. | `JUROS_PENDENTES` | DOUBLE PRECISION |  |  | Diferença entre o que foi recebido mais saldo e o valor do título mais despesas, quando positiva. Somente leitura, recalculado pelo sistema. |
| Desc. Conc. | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  |  | Soma dos descontos concedidos nas baixas. Somente leitura, recalculado pelo sistema. |
| Saldo Título | `SALDO` | DOUBLE PRECISION |  |  | Saldo devedor gravado. Recalculado a cada baixa e estorno, nunca fica negativo. Somente leitura. |
| Data Pagto. | `DATA` | TIMESTAMP |  |  | Data do recebimento, na baixa nova de IT_RECEBER. Nasce com a data de hoje no NewRecord. Não pode ser maior que hoje, e menor que a emissão do título apenas avisa. Obrigatória no BeforePost. |
| Valor Pago | `VALOR` | DOUBLE PRECISION |  |  | Valor recebido nesta baixa. Ao entrar no campo vazio o sistema sugere o SALDO do título. Obrigatório e maior que zero no BeforePost. Valor acima do saldo devido vira automaticamente Juros. |
| Juros | `JUROS_RECEBIDO` | DOUBLE PRECISION |  |  | Juros cobrados nesta baixa. Nasce zero no NewRecord. Digitar juros aqui soma a diferença no Valor Pago automaticamente. |
| Desconto | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  |  | Desconto concedido nesta baixa. Nasce zero no NewRecord. Abate do saldo do título junto com o valor pago. |
| Conta | `CONTA` | INTEGER |  |  | Código da conta corrente creditada, chave do cadastro CONTA. Obrigatória e precisa existir no BeforePost. F4 consulta contas, F3 abre o cadastro. Só movimenta a conta corrente quando a forma de pagamento é 'Financeiro'; trocar a conta ou o valor de uma baixa já gravada dispara estorno e novo débito, com confirmação. |
| Descrição da Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente, buscada pelo código. Somente leitura e desabilitada, preenchida pelo sistema. |
| Forma Pgto. | `FORMA_PAGAMENTO` | INTEGER |  |  | Código da forma de pagamento, chave do cadastro FORMA_PAGAMENTO. Obrigatória e precisa existir no BeforePost. Do cadastro vêm três marcadores que mudam o comportamento: TIPO_BAIXA 'Financeiro' ou 'Contábil' decide se debita conta corrente, GERA_COMISSAO igual a '2' credita a comissão do representante na liquidação, e EMITE_RECIBO_PAGAMENTO ou EMITE_AVISO_LANCAMENTO_CONTABIL iguais a '2' oferecem a impressão do recibo e do aviso contábil ao gravar. |
| Descrição da Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição da forma de pagamento, buscada pelo código. Somente leitura e desabilitada, preenchida pelo sistema. |
| Observação Pagamento | `OBSERVACAO_RECEBIMENTO` | VARCHAR(70) | 70 |  | Observação livre da baixa. Sai impressa no recibo, depois dos valores de juros, desconto e despesas. |

### Grade `RxDBGrid1` — tabela IT_RECEBER

Aba Pagamentos. Lista as baixas já lançadas; a grade não tem `dgEditing`, a digitação é feita
nos campos acima. Delete não funciona; o estorno é pelo botão Estornar ou F6.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Item **·chave** | `ITEM` | INTEGER |  | Sequencial da baixa dentro do título (PK6), gerado no NewRecord como o maior ITEM existente mais um. |
| Data | `DATA` | TIMESTAMP |  | Data do recebimento. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor recebido nesta baixa. |
| Juros | `JUROS_RECEBIDO` | DOUBLE PRECISION |  | Juros cobrados nesta baixa. |
| Desconto | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  | Desconto concedido nesta baixa. |
| Conta | `CONTA` | INTEGER |  | Conta corrente creditada. |
| Descrição da Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 | Descrição da conta, vinda do JOIN com CONTA. |
| F.P. | `FORMA_PAGAMENTO` | INTEGER |  | Código da forma de pagamento usada. |
| Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 | Descrição da forma de pagamento, vinda do JOIN com FORMA_PAGAMENTO. |

### Grade `dbcheque_recebido` — tabela CHEQUE_RECEBIDO

Aba Cheques. Consulta pura: mostra os cheques recebidos amarrados às baixas deste título. A
existência de cheque impede alterar ou estornar a baixa correspondente.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  | Código do banco sacado do cheque. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, vindo do JOIN com BANCO (calculado na consulta). |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de bom para do cheque. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número do cheque. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque aplicado a este título. |
| Razão Social / Nome do Títular | `TITULAR` | VARCHAR(50) | 50 | Nome do titular da conta do cheque, que pode não ser o cliente. |
| Status | `STATUS` | VARCHAR(30) | 30 | Situação do cheque no fluxo de cobrança. Assume 'Pendente' na entrada, 'Depósito' quando enviado, 'Baixado' quando compensado, 'Devolvido' quando volta sem fundos, 'Devolv\Canc' quando devolvido e cancelado, e 'Renegociado' quando entra em renegociação de cheque sem fundo. |

### Grade `dbocorrencia_titulo` — tabela IT_RECEBER_OCORRENCIA_TITULO

Aba Ocorrencias. Consulta pura: o lançamento é feito na tela `umov_contas_receber_ocorrencia_titulo`.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Item **·chave** | `ITEM` | INTEGER |  | Sequencial da ocorrência dentro do título (PK6). |
| Data | `DATA` | TIMESTAMP |  | Data da ocorrência. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Despesa lançada pela ocorrência, que soma no VALOR_DESPESA do título. |
| Código | `OCORRENCIA_TITULO` | INTEGER |  | Código da ocorrência, chave do cadastro OCORRENCIA_TITULO. |
| Descrição da Ocorrência do Título | `DESCRICAO_OCORRENCIA_TITULO` | VARCHAR(50) | 50 | Descrição da ocorrência, vinda do JOIN com OCORRENCIA_TITULO. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 | Observação livre da ocorrência. |

<a id="umov_nota_fiscal_venda_carta_correcao"></a>

## `umov_nota_fiscal_venda_carta_correcao` — Carta de Correção Eletrônica (CC-e) da Nota Fiscal Eletrônica

Mostra uma carta de correção gravada em `IT_NOTA_CARTA_CORRECAO` (chave EMPRESA + SERIE + NUMERO + SEQ). A tela é aberta a partir da consulta de CC-e, que deixa número, série e sequência em variáveis globais; ela então lê o registro e carrega os dados da nota em `NOTA` por um segundo dataset para preencher cliente, nome, data de emissão, endereço e total em controles comuns, não ligados ao banco — por isso esses cinco não aparecem na lista abaixo. No estado atual do fonte todos os campos de dados estão com `ReadOnly = True` e os botões Gravar, Enviar SEF e Imprimir / E-mail estão com `Enabled = False`: a tela só exibe e imprime a CC-e.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da carta de correção, exibida sem rótulo em destaque. O `NewRecord` inicia em `Pendente`; a busca do lote de envio procura as cartas com `CCE Gerada`, que é o status posterior à geração do XML. Apenas exibição (TDBText). |
| Número NF-e **·chave** | `NUMERO` | INTEGER |  |  | Número da NF-e corrigida. Parte da chave primária (PK2). Somente leitura: vem da consulta que abriu a tela. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da NF-e, parte da chave primária (PK1). Preenchida com `PARSIS.NOTA_SERIE` no `NewRecord`. Somente leitura. |
| `mecorrecao` | `CORRECAO` | BLOB |  |  | Texto livre da correção, sem rótulo, no memo central da tela — é o conteúdo que vai no XML da CC-e e no relatório impresso. Somente leitura nesta versão. |
| Número CCE **·chave** | `SEQ` | INTEGER |  |  | Sequência da carta dentro da mesma nota, parte da chave primária (PK3). Gerado por `MAX(SEQ) + 1` da própria nota. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da carta de correção. Somente leitura. |

<a id="umov_nota_fiscal_venda_vencimento"></a>

## `umov_nota_fiscal_venda_vencimento` — Vencimento dos Títulos a Receber...

Tela auxiliar chamada durante o faturamento da nota fiscal: parcela o valor da nota em títulos na tabela `RECEBER` (grade) e, ao mesmo tempo, permite ajustar na `NOTA` os endereços de entrega e de cobrança e as três linhas de observação extra. Nota e títulos são identificados pelas variáveis globais recebidas da tela chamadora (empresa, documento, cliente, número, série), por isso não há campo de busca aqui.

Os campos da nota e a grade só ficam habilitados quando `NOTA.STATUS = 'Pendente'`; com a nota já faturada, tudo vira consulta. Ao fechar, a tela soma `VALOR` dos títulos e compara com o total da nota, oferecendo voltar quando não fecha. O Gravar copia os dias das oito primeiras parcelas para `NOTA.DIAS_01`…`DIAS_08`, que é o que sai impresso nas observações da nota.

#### Endereço de Entrega

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_ENTREGA` | VARCHAR(50) | 50 |  | Logradouro de entrega da mercadoria, gravado na própria nota. Editável só enquanto a nota está Pendente. |
| Bairro | `BAIRRO_ENTREGA` | VARCHAR(50) | 50 |  | Bairro do endereço de entrega. Editável só com a nota Pendente. |
| Cep | `CEP_ENTREGA` | VARCHAR(10) | 10 |  | CEP do endereço de entrega. Editável só com a nota Pendente. |
| Cidade | `CIDADE_ENTREGA` | VARCHAR(50) | 50 |  | Cidade do endereço de entrega. Editável só com a nota Pendente. |
| Estado | `ESTADO_ENTREGA` | VARCHAR(2) | 2 |  | Sigla da UF de entrega. Editável só com a nota Pendente. |
| Número | `NUMERO_ENDERECO_ENTREGA` | VARCHAR(10) | 10 |  | Número do imóvel de entrega. Editável só com a nota Pendente. |
| Complemento | `COMPLEMENTO_ENTREGA` | VARCHAR(40) | 40 |  | Complemento do endereço de entrega (sala, galpão, bloco). Editável só com a nota Pendente. |

#### Endereço de Cobrança

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_COBRANCA` | VARCHAR(50) | 50 |  | Logradouro para onde vai a cobrança dos títulos. Editável só com a nota Pendente. |
| Bairro | `BAIRRO_COBRANCA` | VARCHAR(50) | 50 |  | Bairro do endereço de cobrança. Editável só com a nota Pendente. |
| Cep | `CEP_COBRANCA` | VARCHAR(10) | 10 |  | CEP do endereço de cobrança. Editável só com a nota Pendente. |
| Cidade | `CIDADE_COBRANCA` | VARCHAR(50) | 50 |  | Cidade do endereço de cobrança. Editável só com a nota Pendente. |
| Estado | `ESTADO_COBRANCA` | VARCHAR(2) | 2 |  | Sigla da UF de cobrança. Editável só com a nota Pendente. |
| Número | `NUMERO_ENDERECO_COBRANCA` | VARCHAR(10) | 10 |  | Número do imóvel de cobrança. Editável só com a nota Pendente. |
| Complemento | `COMPLEMENTO_COBRANCA` | VARCHAR(40) | 40 |  | Complemento do endereço de cobrança. Editável só com a nota Pendente. |

#### Vencimento dos Títulos a Receber...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Observação Extra da Nota Fiscal | `OBSERVACAO_EXTRA_01` | VARCHAR(67) | 67 |  | Primeira das três linhas livres de observação impressas na nota. Habilitada apenas quando a nota está Pendente. |
| `edtobservacao_extra_02` | `OBSERVACAO_EXTRA_02` | VARCHAR(67) | 67 |  | Segunda linha de observação extra da nota, sem rótulo próprio; continua a linha anterior. Habilitada apenas quando a nota está Pendente. |
| `edtobservacao_extra_03` | `OBSERVACAO_EXTRA_03` | VARCHAR(67) | 67 |  | Terceira linha de observação extra da nota, sem rótulo próprio. Habilitada apenas quando a nota está Pendente. |

Controle do DFM sem linha no TSV: `melegislacao`, memo desabilitado sob o rótulo "Legislações", preenchido no FormShow com o `OBSERVACAO_LEGISLACAO` de cada item da nota. Não é campo de banco nesta tela.

### Grade `RxDBGrid1` — tabela RECEBER

Uma linha por parcela do título gerado pela nota. O NewRecord já preenche empresa, documento, cliente, número, série, sequencial, emissão, hora, `IMPRESSAO_DUPLICATA = '1'`, `SITUACAO_TITULO = 1` e a taxa de juros mensal dos parâmetros do sistema. O BeforePost recusa a gravação quando o título já tem `DATA_RECEBIMENTO` preenchida, quando falta vencimento ou quando o valor é zero ou negativo, e completa plano de contas, referência, saldo, saldo líquido, `ENTRADA = '1'`, `AVISTA = '1'`, vendedor, instrução de cobrança e a comissão da fatura (quando `NOTA.GERA_COMISSAO = '2'` e o tipo de comissão é `Fatura`, grava o valor e `STATUS_COMISSAO_FATURA = 'Creditado'`). Linhas já recebidas aparecem em cinza e não podem ser alteradas nem excluídas.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela. Gerado no NewRecord como o maior SEQ existente do título mais um. A navegação pula esta coluna, então não é digitada. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, preenchida com a emissão da nota. Data inválida é recusada e o campo fica em branco. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias. Digitar aqui calcula o vencimento como emissão mais os dias; valor não numérico devolve o vencimento para a data de emissão. Os dias das oito primeiras parcelas são copiados para DIAS_01 a DIAS_08 da nota ao gravar. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento da parcela. Não aceita data anterior à emissão. Ao ser digitada, recalcula os Dias. É obrigatória no BeforePost. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. Ao entrar na coluna com valor zerado, o sistema sugere a diferença entre o total da nota e a soma já lançada; se não houver diferença, encerra e grava. Precisa ser maior que zero. |

<a id="umov_registro_assistencia"></a>

## `umov_registro_assistencia` — Registro de Assistência Técnica...

Registra ocorrências de assistência técnica sobre um produto, na tabela `REGISTRO_ASSISTENCIA`, chave `EMPRESA` + `NUMERO`. Painel único no topo com o registro em edição e, embaixo, uma grade só de leitura com o histórico de todos os registros já lançados para a mesma referência de produto. A tela costuma ser chamada de outra já com a referência e o cliente definidos nas variáveis globais `vreferencia` e `vcliente`: nesse caso ela abre em inclusão, com a emissão na data de hoje e a referência preenchida, e o foco no cliente.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do registro, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REGISTRO_ASSISTENCIA` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta registros, F7 anterior, F8 próximo, F9 posiciona. |
| Descrição do Registro de Assistência | `DESCRICAO` | VARCHAR(240) | 240 |  | Relato da ocorrência de assistência. Único campo de conteúdo exigido no Gravar: vazio aborta com "Descrição do Registro". |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do registro. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. Ordena o histórico da grade, do mais recente para o mais antigo. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida do JOIN com `MATERIA_PRIMA` pela referência. Preenchida pelo Exit da referência e no NewRecord; não é digitada nem gravada (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 |  | Referência do produto sobre o qual é a assistência. Ao sair do campo, o sistema procura a referência em `MATERIA_PRIMA`: achando, traz a descrição do produto; não achando, apaga a referência digitada e a descrição. É por este valor que a grade de histórico é filtrada. Vem preenchida quando a tela é aberta a partir de outra. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor gasto no atendimento. Não é exigido no Gravar e não gera lançamento financeiro; serve como registro do custo da assistência. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente atendido. Preenchido pelo Exit do código do cliente e pela consulta F4, a partir de `CLIENTE.NOME`, mas é gravado como coluna própria de `REGISTRO_ASSISTENCIA` — fica congelado no registro mesmo que o cadastro do cliente mude depois. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente atendido. Não é exigido no Gravar. F4 abre a consulta de clientes, F3 abre o cadastro de cliente. Ao sair do campo, o sistema busca o cadastro e preenche o nome; se o código não existir, limpa código e nome. |

### Grade `dbregistro_assistencia` — tabela REGISTRO_ASSISTENCIA

Histórico somente-leitura dos registros de assistência da mesma referência de produto (`WHERE REFERENCIA = :REFERENCIA`, ordenado por emissão decrescente). Não é um detalhe do registro em edição: é a lista dos atendimentos anteriores daquele produto.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data do registro de assistência anterior. Ordena a grade, do mais recente para o mais antigo. |
| Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Cliente atendido naquele registro. |
| Descrição do Registro de Assistência | `DESCRICAO` | VARCHAR(240) | 240 | Relato da ocorrência daquele registro. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor gasto naquele atendimento. |

<a id="umov_servico_atendimento_cliente"></a>

## `umov_servico_atendimento_cliente` — SAC (Serviço de Atendimento ao Cliente)...

Registro de atendimentos ao cliente na tabela `SERVICO_ATENDIMENTO_CLIENTE`, chave `EMPRESA` + `NUMERO`. Painel único no topo com o atendimento em edição e, embaixo, uma grade só de leitura com o histórico de todos os atendimentos daquele cliente. A tela costuma ser chamada de outra já com cliente, referência, descrição, valor e tipo definidos nas variáveis globais: nesse caso ela abre em inclusão, com a emissão na data de hoje e o foco no nome do contato. Não gera lançamento financeiro nem movimenta estoque; é só o histórico do relacionamento.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do atendimento, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `SERVICO_ATENDIMENTO_CLIENTE` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta atendimentos, F7 anterior, F8 próximo, F9 posiciona. |
| Descrição do Agendamento | `DESCRICAO` | VARCHAR(150) | 150 |  | Relato do atendimento ou do que ficou agendado. Único campo de conteúdo exigido no Gravar: vazio aborta com "Descrição do S.A.C.". Vem preenchido quando a tela é aberta a partir de outra. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do atendimento. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. Ordena o histórico da grade, do mais recente para o mais antigo. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do JOIN com `CLIENTE`. Preenchido pelo Exit do código do cliente, pela consulta F4 e no NewRecord; não é digitado (calculado na consulta). |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente atendido. Não é exigido no Gravar. F4 abre a consulta de clientes, F3 abre o cadastro. Ao sair do campo, o sistema busca o cadastro e preenche o nome; código inexistente limpa código e nome. É por este valor que a grade de histórico é filtrada. |
| Nome do Contato | `NOME_CONTATO` | VARCHAR(50) | 50 |  | Nome da pessoa que fez ou recebeu o contato. Digitado, não vem do cadastro do cliente. Não é exigido no Gravar. |
| Agendamento | `DATA_AGENDAMENTO` | TIMESTAMP |  |  | Data marcada para o retorno ou para a próxima ação combinada no atendimento. Só é preenchida quando o atendimento deixa algo agendado; não é validada nem exigida no Gravar, e não aparece na grade de histórico. |
| Tipo | `TIPO_SAC` | VARCHAR(15) | 15 |  | Combo com os valores gravados por extenso: vazio (sem classificação, é o que o NewRecord grava), `'Financeiro'` (cobrança, títulos, pagamentos), `'Negociação'` (tratativa comercial em andamento) e `'Pós Venda'` (atendimento depois da venda concluída). Vem preenchido quando a tela é chamada por outra que já informa o tipo. Classifica o atendimento no histórico e é o segundo critério de ordenação da grade. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor envolvido no atendimento. Não é exigido no Gravar e não gera lançamento financeiro; é registro do montante em discussão ou do custo do atendimento. Vem preenchido quando a tela é aberta a partir de outra. |
| Referência do Produto | `REFERENCIA` | VARCHAR(20) | 20 |  | Referência do produto a que o atendimento se refere. Conferida contra o cadastro de referências no NewRecord e no Exit; vem preenchida quando a tela é chamada por outra. Não é exigida no Gravar. |

### Grade `dbsac` — tabela SERVICO_ATENDIMENTO_CLIENTE

Histórico somente-leitura dos atendimentos do mesmo cliente (`WHERE CLIENTE = :CLIENTE`, ordenado por emissão decrescente e depois por tipo). Não é um detalhe do atendimento em edição: é a lista dos contatos anteriores daquele cliente.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Tipo SAC | `TIPO_SAC` | VARCHAR(15) | 15 | Classificação daquele atendimento: vazio, `'Financeiro'`, `'Negociação'` ou `'Pós Venda'`. Segundo critério de ordenação da grade. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data do atendimento anterior. Ordena a grade, do mais recente para o mais antigo. |
| Nome do Contato | `NOME_CONTATO` | VARCHAR(50) | 50 | Pessoa que fez ou recebeu aquele contato. |
| Referência Produto | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto tratado naquele atendimento. |
| Descrição do Agendamento | `DESCRICAO` | VARCHAR(150) | 150 | Relato daquele atendimento. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor registrado naquele atendimento. |

<a id="umov_servico_atendimento_representante_venda"></a>

## `umov_servico_atendimento_representante_venda` — Serviço de Atendimento ao Representante de Venda

Registra os atendimentos e agendamentos feitos com um representante de venda, na tabela `ATENDIMENTO_REPRESENTANTE_VENDA` (chave `EMPRESA` + `NUMERO`). A tela tem um bloco único de campos no topo e, abaixo, uma grade somente-leitura com todos os atendimentos já gravados para o mesmo representante. O representante não é escolhido na tela: ele vem da sessão (`vrepresentante`), e toda a navegação (F7 anterior, F8 próximo, F9 procurar) filtra por ele.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do atendimento, calculado como MAX(NUMERO) + 1 da empresa e atribuído no Limpar e na gravação. Chave primária junto com EMPRESA. Digitar um número existente carrega o registro; número acima do último abre a pergunta de cadastro novo. F7 volta um registro, F8 avança, F9 procura, sempre dentro dos atendimentos do representante logado. |
| Descrição do Agendamento | `DESCRICAO` | VARCHAR(150) | 150 |  | Texto livre do que foi tratado ou do que ficou agendado. Obrigatório: sem ele o Gravar aborta com "Descrição do S.A.C.". É o texto que aparece no log do sistema como referência do registro. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do atendimento. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Validado no Gravar: data inválida aborta com "Emissão do S.A.C. não Informado ou Inválido". |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, trazido de `REPRESENTANTE_VENDA.NOME` no NewRecord. Controle com Enabled = False: não é digitado nem alterado na tela. (calculado na consulta) |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante. Preenchido pelo NewRecord com o representante da sessão (`vrepresentante`); controle com Enabled = False. Se o registro carregado pertencer a outro representante, a tela é limpa automaticamente. |
| Nome do Contato | `NOME_CONTATO` | VARCHAR(50) | 50 |  | Nome da pessoa com quem se falou. Texto livre, não obrigatório. |
| Agendamento | `DATA_AGENDAMENTO` | TIMESTAMP |  |  | Data marcada para o próximo contato. Texto livre, não validado na gravação. |

### Grade `dbsac` — tabela ATENDIMENTO_REPRESENTANTE_VENDA

Grade somente-leitura (ReadOnly = True) com todos os atendimentos do representante logado, ordenados por NUMERO decrescente e EMISSAO decrescente. Duplo clique em uma linha carrega aquele atendimento nos campos acima e posiciona o cursor na Emissão.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do atendimento listado. É por ele que o duplo clique recarrega o registro. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data do atendimento listado. |
| Nome do Contato | `NOME_CONTATO` | VARCHAR(50) | 50 | Contato registrado naquele atendimento. |
| Descrição do Agendamento | `DESCRICAO` | VARCHAR(150) | 150 | Descrição registrada naquele atendimento. |

<a id="ucad_cliente"></a>

## `ucad_cliente` — Cadastro dos Clientes...

Cadastro completo do cliente na tabela `CLIENTE` (chave `EMPRESA` + `CADASTRO`), com os anexos do cliente na grade `dbcliente_documentos`, tabela `IT_CLIENTE_DOCUMENTOS` (chave `EMPRESA` + `CADASTRO` + `SEQ`). O painel de cima concentra identificação, endereço principal e os vínculos comerciais (representante, CFOP, transportadora, ramo, plano de contas); abaixo dele um `TPageControl` divide o resto em seis abas: Informações Extras, Preferência dos Vencimentos, Endereços, Parâmetros, Documentos e Confirmação de Faturamento. Vários campos de descrição vêm de JOIN e são preenchidos pelo Exit do código ao lado, nunca digitados.

### Campos

#### Cadastro dos Clientes...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do cliente. A tela abre com o próximo número livre (maior `CADASTRO` da empresa mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta clientes. |
| Razão Social / Nome do Cliente | `NOME` | VARCHAR(70) | 70 |  | Razão social ou nome. Exigido no Gravar: vazio aborta com "Nome do Cliente". É o texto usado como referência no log do sistema. |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia da empresa ou sobrenome da pessoa física. O NewRecord grava um espaço em branco em vez de nulo, porque as consultas concatenam este campo e um nulo apagaria a linha inteira. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro do endereço principal. Exigido no Gravar: vazio aborta com "Endereço do Cliente". Inicia com espaço em branco no NewRecord. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro do endereço principal. Exigido no Gravar e ainda validado por tamanho: menos de 3 caracteres aborta com "O campo Bairro deve possuir mais de 3 caracteres". |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço principal. Inicia com espaço em branco no NewRecord. |
| Nome da Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Nome da cidade do endereço principal. Não é digitado: o Exit do campo Cidade copia `CIDADE.NOME` para cá. Exigido no Gravar: vazio aborta com "Cidade do Cliente" e joga o foco no código da cidade. |
| Fone 1 | `FONE` | VARCHAR(15) | 15 |  | Telefone principal. Inicia com espaço em branco no NewRecord. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual da pessoa jurídica ou RG da pessoa física. Não é exigido sempre: só quando o país é 1058 (Brasil) e o CNPJ digitado tem 14 posições formatadas, e aí a tela pergunta se o usuário quer informá-lo. Quando preenchido, é validado contra a UF por `valida_inscricao_estadual` e uma inscrição inválida impede a gravação. |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | CNPJ ou CPF. Exigido no Gravar apenas quando o país é 1058 (Brasil). Ao sair do campo o sistema conta os dígitos: 11 vira CPF formatado e validado, 14 vira CNPJ formatado e validado, qualquer outro tamanho é recusado com "C.N.P.J. ou C.P.F. inválido". O comprimento também define `TIPO_PESSOA` no BeforePost. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Telefone celular. Tem um botão ao lado que abre a conversa de WhatsApp com esse número. |
| Representante | `VENDEDOR` | INTEGER |  |  | Código do representante de venda do cliente, em `REPRESENTANTE_VENDA`. Exigido no Gravar: vazio aborta com "Representante do Cliente". F4 consulta, F3 abre o cadastro de representantes. Ao sair do campo o sistema busca e preenche o nome ao lado; se não achar, limpa os dois. |
| Razão Social / Nome do Representante | `NOME_VENDEDOR` | VARCHAR(50) | 50 |  | Nome do representante, trazido de `REPRESENTANTE_VENDA.NOME` pelo Exit do campo Representante. Não é digitado (calculado na consulta). |
| Fone 2 | `FONE_02` | VARCHAR(15) | 15 |  | Telefone alternativo. Inicia com espaço em branco no NewRecord. |
| Suframa | `SUFRAMA` | VARCHAR(25) | 25 |  | Inscrição SUFRAMA do cliente, usada nas operações com a Zona Franca. Inicia com espaço em branco no NewRecord. |
| CFOP Venda | `NATUREZA` | VARCHAR(10) | 10 |  | CFOP padrão de venda para este cliente. Exigido no Gravar: vazio aborta com "Natureza de Operação". O Exit não só busca a descrição como confere o primeiro dígito contra a UF do cliente: cliente na mesma UF da empresa só aceita CFOP começando por 1 ou 5; cliente em outra UF só aceita CFOP começando por 2, 3, 6 ou 7. Fora disso a tela avisa e limpa o CFOP e sua descrição. |
| Descrição CFOP Venda | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição do CFOP, trazida da tabela de naturezas pelo Exit do campo CFOP Venda. Não é digitada (calculado na consulta). |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora padrão do cliente. F4 consulta. Ao sair do campo o sistema busca o nome; se o código não existir, limpa código e nome. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, trazido pelo Exit do campo Transportadora. Não é digitado (calculado na consulta). |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete padrão (CIF, FOB e afins) na tabela de modalidades. F4 abre a consulta. O código é validado ao ser digitado e preenche a descrição ao lado; código inexistente limpa a descrição. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete, trazida da consulta ao validar o código. Não é digitada (calculado na consulta). |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho — busca na mesma tabela de transportadoras. Ao sair do campo o sistema preenche o nome; se o código não existir, limpa os dois. |
| Nome do Redespacho | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho, trazido pelo Exit do campo Redespacho. Não é digitado (calculado na consulta). |
| Ramo\Atividade | `RAMO_ATIVIDADE` | INTEGER |  |  | Código do ramo de atividade do cliente. Exigido no Gravar: vazio aborta com "Ramo de Atividade". Ao sair do campo o sistema busca e preenche a descrição; se não achar, limpa os dois. |
| Descrição Ramo\Atividade | `DESCRICAO_RAMO_ATIVIDADE` | VARCHAR(100) | 100 |  | Descrição do ramo de atividade. Não é digitada: vem pelo Exit do código. Coluna de `REPRESENTANTE_VENDA`, tabela do JOIN do mesmo dataset. |
| Associado | `ASSOCIADO` | INTEGER |  |  | Código de outro cliente ao qual este está associado (matriz, grupo, rede). Ao sair do campo o sistema busca esse cliente e preenche o nome; se o código não existir, limpa os dois. |
| Razão Social / Nome do Cliente Associado | `NOME_ASSOCIADO` | VARCHAR(70) | 70 |  | Nome do cliente associado, trazido pelo Exit do campo Associado. Não é digitado (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta contábil do cliente. Exigido no Gravar: vazio aborta com "Plano de Contas". Além disso o Gravar reconsulta o plano e recusa contas que não sejam do tipo `Analítico`, avisando o tipo encontrado. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta contábil, trazida pelo Exit do campo Plano Contas. Não é digitada (calculado na consulta). |
| Tabela | `TIPO_LISTA_TABELA_PRECO` | VARCHAR(1) | 1 |  | Letra que indica qual lista de preços vale para este cliente; é o que as telas de pedido usam para escolher a coluna de preço do produto. Digitado direto, sempre em caixa alta, uma posição. Esta tela não valida o conteúdo nem oferece lista de opções. |
| Número | `NUMERO_ENDERECO` | VARCHAR(10) | 10 |  | Número do endereço principal. Exigido no Gravar: vazio aborta com "Número do Endereço do Cliente". |
| Cidade | `CODIGO_CIDADE` | INTEGER |  |  | Código da cidade do endereço principal, em `CIDADE`. F4 consulta cidades, F3 abre o cadastro de cidades. Ao sair do campo o sistema preenche `CIDADE` e `ESTADO`; se o código não existir, limpa os três. |
| País | `PAIS` | INTEGER |  |  | Código do país do endereço principal. Exigido no Gravar: vazio aborta com "Pais do Cliente". O valor 1058 é o Brasil e o NewRecord já o grava por padrão; é esse valor que liga as exigências de CNPJ/CPF e inscrição estadual. F4 consulta países. |
| Nome do País | `NOME_PAIS` | VARCHAR(50) | 50 |  | Nome do país, trazido de `PAIS.NOME` pelo Exit do campo País e já preenchido no NewRecord junto com o 1058. Não é digitado (calculado na consulta). |
| Complemento | `COMPLEMENTO` | VARCHAR(40) | 40 |  | Complemento do endereço principal (sala, andar, bloco). |

#### Informações Extras

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| E-mail | `EMAIL` | VARCHAR(60) | 60 |  | E-mail geral do cliente. Inicia com espaço em branco no NewRecord. |
| Home Page | `HOME_PAGE` | VARCHAR(60) | 60 |  | Endereço do site do cliente. Inicia com espaço em branco no NewRecord. |
| Data Cadastro | `DATA_CADASTRO` | TIMESTAMP |  |  | Data de abertura do cadastro. Ao entrar no campo, se o conteúdo não for uma data válida, o sistema grava a data de hoje automaticamente. |
| Observação | `OBSERVACAO` | VARCHAR(240) | 240 |  | Observação livre sobre o cliente, em memo. Inicia com espaço em branco no NewRecord. |
| Contato Pessoal | `CONTATO` | VARCHAR(30) | 30 |  | Nome da pessoa de contato comercial. Inicia com espaço em branco no NewRecord. |
| Contato Financeiro | `CONTATO_FINANCEIRO` | VARCHAR(30) | 30 |  | Nome da pessoa de contato do financeiro. Inicia com espaço em branco no NewRecord. |
| E-mail NFe | `EMAIL_NFE` | VARCHAR(100) | 100 |  | E-mail para onde vai o XML e o DANFE da NF-e. Separado do e-mail geral de propósito. |
| Preferência de Produtos | `PREFERENCIA_PRODUTO_01` | VARCHAR(60) | 60 |  | Primeira das quatro anotações livres de produtos que o cliente costuma comprar. Texto solto, não é código de produto. |
| Preferência de Produtos | `PREFERENCIA_PRODUTO_02` | VARCHAR(60) | 60 |  | Segunda anotação de preferência de produto. |
| Preferência de Produtos | `PREFERENCIA_PRODUTO_03` | VARCHAR(60) | 60 |  | Terceira anotação de preferência de produto. |
| Preferência de Produtos | `PREFERENCIA_PRODUTO_04` | VARCHAR(60) | 60 |  | Quarta anotação de preferência de produto. |

#### Preferência dos Vencimentos no Pedido de Venda

Quadro de quinze caixas numéricas sem legenda individual — cada uma guarda a quantidade de dias entre a emissão do pedido e uma das parcelas. São sugeridas ao montar o parcelamento no pedido de venda deste cliente. A caixa vazia ou zerada significa parcela não usada. Atenção à ordem: na tela a décima primeira caixa vem antes da décima.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtdias_vencimento_01` | `DIAS_VENCIMENTO_01` | INTEGER |  |  | Dias até o vencimento da 1ª parcela sugerida no pedido de venda. |
| `edtdias_vencimento_02` | `DIAS_VENCIMENTO_02` | INTEGER |  |  | Dias até o vencimento da 2ª parcela. |
| `edtdias_vencimento_03` | `DIAS_VENCIMENTO_03` | INTEGER |  |  | Dias até o vencimento da 3ª parcela. |
| `edtdias_vencimento_04` | `DIAS_VENCIMENTO_04` | INTEGER |  |  | Dias até o vencimento da 4ª parcela. |
| `edtdias_vencimento_05` | `DIAS_VENCIMENTO_05` | INTEGER |  |  | Dias até o vencimento da 5ª parcela. |
| `edtdias_vencimento_06` | `DIAS_VENCIMENTO_06` | INTEGER |  |  | Dias até o vencimento da 6ª parcela. |
| `edtdias_vencimento_07` | `DIAS_VENCIMENTO_07` | INTEGER |  |  | Dias até o vencimento da 7ª parcela. |
| `edtdias_vencimento_08` | `DIAS_VENCIMENTO_08` | INTEGER |  |  | Dias até o vencimento da 8ª parcela. |
| `edtdias_vencimento_09` | `DIAS_VENCIMENTO_09` | INTEGER |  |  | Dias até o vencimento da 9ª parcela. |
| `edtdias_vencimento_11` | `DIAS_VENCIMENTO_11` | INTEGER |  |  | Dias até o vencimento da 11ª parcela. Na tela esta caixa aparece antes da décima. |
| `edtdias_vencimento_10` | `DIAS_VENCIMENTO_10` | INTEGER |  |  | Dias até o vencimento da 10ª parcela. |
| `edtdias_vencimento_12` | `DIAS_VENCIMENTO_12` | INTEGER |  |  | Dias até o vencimento da 12ª parcela. |
| `edtdias_vencimento_13` | `DIAS_VENCIMENTO_13` | INTEGER |  |  | Dias até o vencimento da 13ª parcela. |
| `edtdias_vencimento_14` | `DIAS_VENCIMENTO_14` | INTEGER |  |  | Dias até o vencimento da 14ª parcela. |
| `edtdias_vencimento_15` | `DIAS_VENCIMENTO_15` | INTEGER |  |  | Dias até o vencimento da 15ª parcela. |

#### Preferência dos Vencimentos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Limite de Crédito | `LIMITE_CREDITO` | DOUBLE PRECISION |  |  | Limite de crédito do cliente. Campo protegido por senha: ao sair, se o valor digitado for diferente do que já estava, a tela abre `frmsenha_prevencao` e só aceita a mudança se a senha de prevenção for validada; sem ela o valor anterior é restaurado e a gravação é abortada. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco de cobrança preferencial deste cliente, em `BANCO`. Ao sair do campo o sistema preenche o nome; se o código não existir, limpa os dois. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, trazido de `BANCO.NOME` pelo Exit do campo Banco. Não é digitado. A coluna não pertence a `CLIENTE`; o tipo é indicação tomada de `NOTA.NOME_BANCO`. (calculado na consulta) |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança padrão enviada ao banco nos títulos deste cliente. Ao sair do campo o sistema preenche a descrição; se o código não existir, limpa os dois. |
| Descrição da Instrução | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução de cobrança, trazida pelo Exit do código. Não é digitada. A coluna não pertence a `CLIENTE`; o tipo é indicação tomada de `NOTA.DESCRICAO_INSTRUCAO_COBRANCA`. (calculado na consulta) |

#### Endereço de Entrega

Endereço usado no campo de entrega da NF-e quando difere do endereço principal. Nenhum destes campos é exigido no Gravar. Todos iniciam com espaço em branco no NewRecord, para não quebrar a concatenação das consultas.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_ENTREGA` | VARCHAR(50) | 50 |  | Logradouro do endereço de entrega. |
| Bairro | `BAIRRO_ENTREGA` | VARCHAR(40) | 40 |  | Bairro do endereço de entrega. |
| Cep | `CEP_ENTREGA` | VARCHAR(10) | 10 |  | CEP do endereço de entrega. |
| Nome da Cidade | `CIDADE_ENTREGA` | VARCHAR(50) | 50 |  | Nome da cidade de entrega, preenchido a partir do código da cidade ao lado. |
| Estado | `ESTADO_ENTREGA` | VARCHAR(2) | 2 |  | Sigla da UF de entrega, preenchida junto com a cidade. |
| Número | `NUMERO_ENDERECO_ENTREGA` | VARCHAR(10) | 10 |  | Número do endereço de entrega. |
| Cidade | `CODIGO_CIDADE_ENTREGA` | INTEGER |  |  | Código da cidade de entrega em `CIDADE`. F4 consulta. Ao sair do campo preenche `CIDADE_ENTREGA` e `ESTADO_ENTREGA`; código inexistente limpa os três. |
| País | `PAIS_ENTREGA` | INTEGER |  |  | Código do país de entrega. F4 consulta países; o Exit preenche o nome ao lado. |
| Nome do País | `NOME_PAIS_ENTREGA` | VARCHAR(50) | 50 |  | Nome do país de entrega, trazido pelo Exit do código. Não é digitado (calculado na consulta). |
| Complemento | `COMPLEMENTO_ENTREGA` | VARCHAR(40) | 40 |  | Complemento do endereço de entrega. |

#### Endereço de Cobrança

Endereço para onde vai o boleto quando difere do endereço principal. Também não é exigido no Gravar; os campos de texto iniciam com espaço em branco no NewRecord.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_COBRANCA` | VARCHAR(50) | 50 |  | Logradouro do endereço de cobrança. |
| Bairro | `BAIRRO_COBRANCA` | VARCHAR(40) | 40 |  | Bairro do endereço de cobrança. |
| Cep | `CEP_COBRANCA` | VARCHAR(10) | 10 |  | CEP do endereço de cobrança. |
| Nome da Cidade | `CIDADE_COBRANCA` | VARCHAR(50) | 50 |  | Nome da cidade de cobrança, preenchido a partir do código da cidade ao lado. |
| Estado | `ESTADO_COBRANCA` | VARCHAR(2) | 2 |  | Sigla da UF de cobrança, preenchida junto com a cidade. |
| Número | `NUMERO_ENDERECO_COBRANCA` | VARCHAR(10) | 10 |  | Número do endereço de cobrança. |
| Cidade | `CODIGO_CIDADE_COBRANCA` | INTEGER |  |  | Código da cidade de cobrança em `CIDADE`. F4 consulta. Ao sair do campo preenche `CIDADE_COBRANCA` e `ESTADO_COBRANCA`; código inexistente limpa os três. |
| País | `PAIS_COBRANCA` | INTEGER |  |  | Código do país de cobrança. F4 consulta países; o Exit preenche o nome ao lado. |
| Nome do País | `NOME_PAIS_COBRANCA` | VARCHAR(50) | 50 |  | Nome do país de cobrança, trazido pelo Exit do código. Não é digitado. A coluna não pertence a `CLIENTE`; o tipo é indicação tomada de `NOTA.NOME_PAIS_COBRANCA`. (calculado na consulta) |
| Complemento | `COMPLEMENTO_COBRANCA` | VARCHAR(40) | 40 |  | Complemento do endereço de cobrança. |

#### Parâmetros

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de cliente desativado. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativo). |
| Recebe Mala Direta | `RECEBE_EMAIL_MALA_DIRETA` | VARCHAR(1) | 1 |  | Diz se o cliente entra nas listas de e-mail em massa. Grava `'2'` quando marcado e `'1'` quando desmarcado. É o único destes marcadores que já nasce marcado: o NewRecord inicia em `'2'`. |
| Bloquear Vendas a Prazo ( Emitindo uma Mensagem ao Bloquear ) | `BLOQUEAR_VENDA` | VARCHAR(1) | 1 |  | Bloqueia venda a prazo para o cliente. Grava `'2'` quando marcado e `'1'` quando desmarcado; o NewRecord inicia em `'1'` (liberado). Não fica só no campo: o BeforePost chama `bloquear_desbloquear_cliente_venda_prazo` com `'Bloquear'` quando marcado e `'Excluir'` quando desmarcado, ou seja, cria ou remove o bloqueio efetivo do cliente. |
| Venda a Consumidor Final | `VENDA_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marca o cliente como consumidor final, o que muda as alíquotas de ICMS aplicadas (as colunas de consumidor final de `ALIQUOTA_ESTADO`). Grava `'2'` quando marcado e `'1'` quando desmarcado; o NewRecord inicia em `'1'`. |
| `cbtipo_contribuinte_icms` | `TIPO_CONTRIBUINTE_ICMS` | VARCHAR(30) | 30 |  | Situação do cliente perante o ICMS, combo de lista fechada com três opções gravadas por extenso: `'1 - Contribuinte'`, `'2 - Não Contribuinte'` e `'3 - Contribuinte Isento'`. Exigido no Gravar: vazio faz a tela pular para a aba Parâmetros e abortar com "Tipo de Contribuinte do ICMS". Campo não listado n |

#### Confirmação de Faturamento

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Confirmar faturamento ao gerar o arquivo xml da NF-e | `GERA_ALERTA_FATURAMENTO` | VARCHAR(1) | 1 |  | Faz o sistema pedir confirmação, com a mensagem do campo abaixo, antes de gerar o XML da NF-e deste cliente. Grava `'2'` quando marcado e `'1'` quando desmarcado; o NewRecord inicia em `'1'` (sem alerta). |
| Texto a ser exibido: | `MENSAGEM_ALERTA_FATURAMENTO` | BLOB |  |  | Texto do alerta mostrado na confirmação de faturamento. Só faz sentido com o marcador acima ligado. Digitado em memo, convertido para maiúsculas a cada tecla. |

#### Cadastro dos Clientes... (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cód. SPED | `PARTICIPANTE_SPED_FISCAL` | INTEGER |  |  | Código do participante no SPED Fiscal, usado no registro 0150 do arquivo. Somente leitura: é atribuído pelo sistema, não pelo usuário desta tela. |
| WhatsApp | `CELULAR_02` | VARCHAR(15) | 15 |  | Segundo celular, tratado como o número de WhatsApp: o botão ao lado abre a conversa com esse número. |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF do endereço principal, combo de lista fechada com as unidades da federação. Não é digitado no dia a dia: vem preenchido pelo Exit do código da cidade. Exigido no Gravar: vazio aborta com "Estado do Cliente". É a UF usada na validação do CFOP e da inscrição estadual. Campo não listado n |
| `cbtipo_substituicao_tributaria` | `TIPO_SUBSTITUICAO_TRIBUTARIA` | VARCHAR(20) | 20 |  | Regime de substituição tributária do cliente, combo de lista fechada com três opções gravadas por extenso: `'Nenhuma'`, `'Normal'` e `'Regime Especial'`. O NewRecord já grava `'Normal'`. Exigido no Gravar: vazio aborta com "Tipo da Substituição Tributária". Campo não listado n |
| `cbenquadramento_tributario` | `ENQUADRAMENTO_TRIBUTARIO` | VARCHAR(25) | 25 |  | Regime tributário do cliente, combo de lista fechada com três opções gravadas por extenso: `'Lucro Presumido'`, `'Lucro Real'` e `'Simples Federal'`. Exigido no Gravar: vazio aborta com "Enquadramento Tributário". Campo não listado n |
| `cbextensao_cfop` | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 |  | Extensão do CFOP de venda: a lista é carregada dinamicamente ao abrir o combo, a partir do CFOP escolhido no campo CFOP Venda, e por isso não tem valores fixos no DFM. Campo não listado n |

### Grade `dbcliente_documentos` — tabela IT_CLIENTE_DOCUMENTOS

Anexos do cliente. Ao entrar na grade a tela grava o cabeçalho antes, porque a linha precisa do código do cliente já existente. O arquivo escolhido é copiado para `<servidor>\Arquivo\Clientes\<cadastro do cliente>` e é esse caminho de destino que fica gravado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** **·obrig** | `SEQ` | INTEGER |  | Sequencial do anexo dentro do cliente, obrigatório no banco (NOT NULL). Preenchido pelo sistema no NewRecord com o maior `SEQ` do mesmo cliente mais um; não é digitado. |
| Data | `DATA` | TIMESTAMP |  | Data do anexo. Preenchida pelo sistema no NewRecord com a data de hoje. |
| Descrição do Documento | `DESCRICAO` | VARCHAR(50) | 50 | Texto que identifica o documento. Convertido para maiúsculas preservando acentos assim que é digitado. |
| Caminho do Arquivo | `CAMINHO_ARQUIVO` | VARCHAR(250) | 250 | Caminho do arquivo anexado. O botão da coluna abre o diálogo de seleção; ao gravar, o arquivo é copiado para a pasta do cliente no servidor e o campo passa a guardar o caminho de destino, não o de origem. Linha com este campo vazio é cancelada no BeforePost. |
| (sem legenda) | `ABRIR` | VARCHAR(5) | 5 | Não guarda dado: a coluna é desenhada como um botão "Abrir" e o clique manda o Windows abrir o arquivo de `CAMINHO_ARQUIVO` no programa padrão (calculado na consulta). |

Campos sem controle na tela: `EMPRESA` (empresa logada, no NewRecord), `TIPO_PESSOA` (o BeforePost grava `'Física'` quando o CNPJ/CPF formatado tem 14 posições, `'Jurídica'` quando tem 18, e vazio nos demais casos) e vários campos de texto que o NewRecord inicia com um espaço em branco — `FAX`, `TIPO_REDESPACHO`, `TELE_VENDAS` entre eles — para não quebrar as concatenações do SQL.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |
| Tele - Vendas | `TELE_VENDAS` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Tele - Vendas”. Função não verificada no código. |
| Ente Governamental | `ENTE_GOVERNAMENTAL` | VARCHAR(20) | 20 | campo da tela | Rótulo na tela: “Ente Governamental”. Função não verificada no código. |

<a id="ucad_cliente_altera_dados_nfe"></a>

## `ucad_cliente_altera_dados_nfe` — Cadastro dos Clientes...

Tela de mutirão para corrigir os dados do cliente exigidos pela NF-e: grava na mesma tabela `CLIENTE` (chave `EMPRESA` + `CADASTRO`), mas expõe só o endereço do cliente, o endereço de entrega e os documentos. A tela abre já com a consulta de clientes; sem escolher um cliente ela se fecha sozinha. É uma tela de fila, guiada pela coluna `ATUALIZADO_DADOS_NFE`: F7, F8 e F9 só andam entre clientes com `ATUALIZADO_DADOS_NFE = '1'`, isto é, ainda não revisados, e o Gravar zera essa coluna ao final. Reabrir pelo código um cliente já com `'2'` avisa "Registro informado ja foi atualizado os dados da NF-e" e não deixa editar. Quando o cliente aberto tem `CLIENTE_DIGITO_VERIFICADOR = '999'`, a tela acende o aviso "Inscrição Estadual Inválida. Verifique.".

### Campos

#### Cadastro dos Clientes...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Cliente | `NOME` | VARCHAR(70) | 70 |  | Razão social ou nome do cliente. Somente leitura nesta tela: serve para identificar quem está sendo corrigido; a alteração do nome fica em `ucad_cliente`. |

#### Endereço de Entrega

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_ENTREGA` | VARCHAR(50) | 50 |  | Logradouro do endereço de entrega que vai no grupo de entrega da NF-e. Não é exigido no Gravar. |
| Bairro | `BAIRRO_ENTREGA` | VARCHAR(40) | 40 |  | Bairro do endereço de entrega. |
| Cep | `CEP_ENTREGA` | VARCHAR(10) | 10 |  | CEP do endereço de entrega. |
| Nome da Cidade | `CIDADE_ENTREGA` | VARCHAR(50) | 50 |  | Nome da cidade de entrega. Não é digitado: vem do Exit do código da cidade, que copia `CIDADE.NOME`. |
| Estado | `ESTADO_ENTREGA` | VARCHAR(2) | 2 |  | Sigla da UF de entrega, preenchida junto com a cidade pelo Exit do código. |
| Número | `NUMERO_ENDERECO_ENTREGA` | VARCHAR(10) | 10 |  | Número do endereço de entrega. |
| Cidade | `CODIGO_CIDADE_ENTREGA` | INTEGER |  |  | Código da cidade de entrega em `CIDADE`. F4 abre a consulta. Ao sair do campo preenche cidade e UF; código inexistente limpa os três. |
| País | `PAIS_ENTREGA` | INTEGER |  |  | Código do país de entrega. F4 abre a consulta de países; o Exit preenche o nome ao lado e limpa os dois quando o código não existe. |
| Nome do País | `NOME_PAIS_ENTREGA` | VARCHAR(50) | 50 |  | Nome do país de entrega, trazido de `PAIS.NOME` pelo Exit do código. Não é digitado (calculado na consulta). |

#### Endereço do Cliente

Bloco do endereço principal — é o que sai como endereço do destinatário na NF-e e a razão de ser desta tela.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro do endereço principal. Exigido no Gravar: vazio aborta com "Endereço do Cliente". |
| Número | `NUMERO_ENDERECO` | VARCHAR(10) | 10 |  | Número do endereço principal. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro do endereço principal. Exigido no Gravar: vazio aborta com "Bairro do Cliente". |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço principal. |
| Cidade | `CODIGO_CIDADE` | INTEGER |  |  | Código da cidade do endereço principal em `CIDADE`. Exigido no Gravar: vazio aborta com "Código da Cidade do Cliente". F4 consulta, F3 abre o cadastro de cidades. O Exit preenche nome da cidade e UF. |
| Nome da Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Nome da cidade, trazido de `CIDADE.NOME` pelo Exit do código. Não é digitado. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF, preenchida junto com a cidade pelo Exit do código. É a UF usada na validação da inscrição estadual. |
| País | `PAIS` | INTEGER |  |  | Código do país do endereço principal. Exigido no Gravar: vazio aborta com "Código do Pais do Cliente". O valor 1058 é o Brasil e é ele que liga as exigências de CNPJ/CPF e de inscrição estadual logo abaixo; para qualquer outro país esses dois campos deixam de ser cobrados. |
| Nome do País | `NOME_PAIS` | VARCHAR(50) | 50 |  | Nome do país, trazido de `PAIS.NOME` pelo Exit do código. Não é digitado (calculado na consulta). |

#### Cadastro dos Clientes... (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do cliente. Digitar um código aqui recarrega aquele cliente, mas só entra em edição se ele ainda estiver com `ATUALIZADO_DADOS_NFE = '1'`. F7, F8 e F9 pulam para o cliente anterior ou seguinte que ainda não foi revisado. |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente. Exigido no Gravar apenas quando o país é 1058 (Brasil). |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG. Só é cobrado quando o país é 1058 e o CNPJ/CPF formatado tem 14 posições: aí a tela pergunta se o usuário quer informá-lo. Preenchido, é validado contra a UF por `valida_inscricao_estadual` e uma inscrição inválida impede a gravação. É este o campo que a tela existe para consertar. |
| Fone 1 | `FONE` | VARCHAR(15) | 15 |  | Telefone principal do cliente. |

O Gravar não valida só; ele também marca o cliente como revisado, gravando `ATUALIZADO_DADOS_NFE` em branco antes do post, o que tira o registro da fila de F7/F8/F9.

<a id="umov_telemarketing"></a>

## `umov_telemarketing` — Telemarketing...

Fila de trabalho do telemarketing. A tela não tem tabela própria: monta um ClientDataSet em memória (`tbtemp`) varrendo `CLIENTE` e, para cada cliente, buscando a última nota autorizada e o último pedido de venda. Entram os clientes ativos (`INATIVO <> '2'`) cujo último contato com sucesso é anterior a hoje menos `PARSIS.TELEMARKETING_DIAS_CONTATO`, ou que nunca tiveram contato; e também os que já estão em atendimento ou agendados pelo próprio usuário logado. O topo tem dois campos de filtro que não são de banco — Ramo Atividade e sua descrição, com consulta pelo botão — e o botão Filtrar; sem ramo informado, o sistema pergunta se é para trazer todos.

A tela não grava na sua própria grade: os quatro botões de ação escrevem direto em `CLIENTE`, mudando `SITUACAO_CONTATO`, `USUARIO_CONTATO` e as três datas de contato, e depois refazem o filtro. "Efetuar Contato" toma o cliente para si (situação 1, tentativa = agora, usuário = o logado) e o botão passa a se chamar "Finalizar", que encerra com sucesso (situação 4, último contato = agora, agendamento e usuário limpos). "Cancelar" encerra sem sucesso (situação 5) ou devolve como não efetuado (situação 3). "Agendar" pede a data e grava situação 2. Um cliente já tomado por outro usuário é recusado com "O Registro selecionado está em uso".

### Grade `dbtelemarketing` — tabela temporária em memória (`tbtemp`, alimentada de CLIENTE)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cliente | `CLIENTE` | INTEGER |  | Código do cliente, copiado de `CLIENTE.CADASTRO`. É por ele que os botões S.A.C., Efetuar Contato, Cancelar e Agendar localizam o registro a atualizar. F2 abre o histórico do cliente e F3 o cadastro do cliente, ambos já posicionados nele. (calculado na consulta) |
| Rezão Social/Nome do Cliente | `NOME` | VARCHAR(70) | 70 | Razão social ou nome do cliente, copiado de `CLIENTE.NOME`. O rótulo tem erro de digitação no DFM. (calculado na consulta) |
| Fone 1 | `FONE_1` |  |  | Deveria mostrar o telefone principal do cliente, mas a coluna aponta para um campo inexistente: o ClientDataSet tem `FONE_01`, não `FONE_1`. Na prática a coluna fica vazia. |
| Fone 2 | `FONE_2` |  |  | Mesmo caso da coluna anterior: o campo do ClientDataSet chama-se `FONE_02`. A coluna fica vazia. |
| Celular | `CELULAR` | VARCHAR(15) | 15 | Celular do cliente, copiado de `CLIENTE.CELULAR`. (calculado na consulta) |
| Agendamento | `DATA_AGENDAMENTO_CONTATO` | TIMESTAMP |  | Data marcada para retornar o contato, copiada de `CLIENTE.DATA_AGENDAMENTO_CONTATO`. Gravada pelo botão Agendar junto com a situação 2, e apagada quando o contato é finalizado com sucesso ou cancelado. É o segundo critério de ordenação da fila. (calculado na consulta) |
| Ultima Tentativa | `DATA_ULTIMA_TENTATIVA_CONTATO` | TIMESTAMP |  | Data da última tentativa de contato, copiada de `CLIENTE.DATA_ULTIMA_TENTATIVA_CONTATO`. Gravada com a hora atual pelo botão Efetuar Contato. (calculado na consulta) |
| Ultimo Contato | `DATA_ULTIMO_CONTATO_SUCESSO` | TIMESTAMP |  | Data do último contato bem-sucedido, copiada de `CLIENTE.DATA_ULTIMO_CONTATO_SUCESSO`. Gravada pelo Finalizar. É o campo que decide quem entra na fila: cliente com esta data recente fica de fora. (calculado na consulta) |
| Ultima Nota | `DATA_ULTIMA_NOTA` | TIMESTAMP |  | Emissão da última nota do cliente com STATUS `'NFE Autorizada'`. Não vem do cadastro: é subconsulta em `NOTA`. Serve para não chamar quem comprou há pouco. (calculado na consulta) |
| Ultimo Pedido | `DATA_ULTIMO_PEDIDO` | TIMESTAMP |  | Emissão do último pedido do cliente em `PEDIDO_VENDA`. Subconsulta, mesma finalidade da coluna anterior. (calculado na consulta) |
| `SITUACAO_CONTATO` | `SITUACAO_CONTATO` | VARCHAR(1) | 1 | Situação do cliente na fila. Coluna sem título e com 20 pixels: não mostra texto, só um ícone desenhado pelo OnDrawColumnCell a partir do ImageList. Valores: `'1'` = Ativo, em atendimento por um usuário; `'2'` = Agendado; `'3'` = Não efetuado; `'4'` = Sucesso; `'5'` = Não houve contato. Cliente sem situação no cadastro entra na fila como `'3'`. Só na situação `'1'` os botões Cancelar e Agendar ficam habilitados e o botão principal vira "Finalizar". É o primeiro critério de ordenação da fila. (calculado na consulta) |

<a id="ucad_representante_venda"></a>

## `ucad_representante_venda` — Cadastro dos Representantes de Venda...

Cadastro do representante comercial na tabela `REPRESENTANTE_VENDA`, chave `EMPRESA` + `CADASTRO`. O painel principal traz identificação, endereço, documentos, comissão e dados bancários; duas abas guardam as informações complementares e a região de atuação, e uma grade somente-leitura mostra as cidades da região escolhida, lidas de `IT_REGIAO_REPRESENTANTE`.

### Campos

#### Cadastro dos Representantes de Venda...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do representante, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de representantes. |
| Razão Social / Nome do Representante | `NOME` | VARCHAR(50) | 50 |  | Razão social, se pessoa jurídica; nome, se pessoa física. Exigido no Gravar — vazio aborta com "Nome do Representante". |
| Fantasia / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Nome fantasia ou sobrenome. O NewRecord grava um espaço em branco de propósito: as consultas concatenam este campo no SQL e um valor nulo apagaria a linha inteira do resultado. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de representante fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativo). |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro e número. Digitado — o CEP não preenche este campo. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro. Digitado — o CEP não preenche este campo. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço. Ao sair do campo, busca no cadastro de CEP: achando, regrava o CEP no formato do cadastro e preenche Cidade e Estado. F3 abre o cadastro de CEP. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Cidade, preenchida pelo sistema a partir do CEP. Exigida no Gravar — vazia aborta com "Cidade do Representante". Como só o CEP a preenche, CEP inexistente no cadastro impede gravar. |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | Documento do representante. Ao sair, o campo é limpo de pontuação e medido: 11 dígitos vira CPF formatado, 14 vira CNPJ formatado, qualquer outro tamanho recusa a saída com "C.N.P.J. ou C.P.F. inválido". Feito o formato, os dígitos verificadores são conferidos e o erro é avisado. |
| Insc.Estadual / RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual, se pessoa jurídica; RG, se pessoa física. Não é validado. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone fixo. |
| Fax | `FAX` | VARCHAR(15) | 15 |  | Número de fax. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Telefone celular. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão padrão do representante, copiado para os documentos de venda. O NewRecord inicia em zero. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco para pagamento da comissão. Botão abre a consulta de bancos, F3 abre o cadastro. Ao sair, busca o banco: achando, regrava o código e preenche o Nome do Banco; não achando, limpa os dois. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo Banco. Não é digitado (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(10) | 10 |  | Agência bancária. O NewRecord grava um espaço em branco pelo mesmo motivo da Fantasia. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(15) | 15 |  | Número da conta corrente. O NewRecord grava um espaço em branco pelo mesmo motivo da Fantasia. |
| `cbtipo_comissao` | `TIPO_COMISSAO` | VARCHAR(10) | 10 |  | Define quando a comissão do representante é gerada. Valores literais: `Fatura` — a comissão nasce junto com o título, no faturamento ou no controle interno; `Liquidação` — a comissão só é gerada na baixa do título recebido, e depende da forma de pagamento ter `GERA_COMISSAO = '2'`. O NewRecord grava `Fatura`. |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | UF do endereço, preenchida pelo sistema a partir do CEP. A lista oferece as 27 UFs mais `EX` (exterior). Exigido no Gravar — vazio aborta com "Estado do Representante". |
| `cbregime_tributario` | `REGIME_TRIBUTACAO` | VARCHAR(50) | 50 |  | Regime de tributação do representante, usado no cálculo do imposto de renda sobre a comissão. Valores literais da lista: vazio, `Lucro Real ou Presumido` e `Simples Federal`. Só `Lucro Real ou Presumido` combinado com Calcular Imposto de Renda faz o empenho de comissão reter IR. |
| Chave PIX | `CHAVE_PIX` | VARCHAR(50) | 50 |  | Chave PIX para pagamento da comissão. |

#### Informações Complementares

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Ramo \ Atividade | `DESCRICAO_RAMO_ATIVIDADE` | VARCHAR(100) | 100 |  | Preenchido pelo sistema ao sair do campo Ramo \ Atividade, com a descrição lida do cadastro de ramos. Não é digitado. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Pessoa de contato no representante. O NewRecord grava um espaço em branco pelo mesmo motivo da Fantasia. |
| Data Cadastro | `DATA_CADASTRO` | TIMESTAMP |  |  | Data em que o representante foi cadastrado. Ao entrar no campo, se o conteúdo não for uma data válida, o sistema grava a data de hoje. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Cadastro de fornecedor vinculado ao representante — é por ele que a comissão vira título a pagar. Exigido no Gravar — vazio aborta com "Fornecedor". Botão abre a consulta de fornecedores, F3 abre o cadastro. Ao sair, busca o fornecedor: achando, preenche a razão social; não achando, limpa os dois. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Preenchido pelo sistema ao sair do campo Fornecedor. Não é digitado (calculado na consulta). |
| Email | `EMAIL` | VARCHAR(60) | 60 |  | Endereço de e-mail. É para cá que o relatório de comissão é enviado quando o envio por e-mail está marcado. |
| Home Page | `HOME_PAGE` | VARCHAR(60) | 60 |  | Endereço do site. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Texto livre. Enter dentro do memo pula linha; dois Enters seguidos saem do campo. |
| Enviar Relatório das Vendas do Representante por E-mail | `ENVIAR_RELATORIO_POR_EMAIL` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord já inicia em `'2'` (marcado). Só com `'2'` o mapa de comissão detalhado dispara o envio do relatório para o e-mail do representante. |
| Calcular Imposto de Renda sobre a Comissão do Representante | `CALCULA_IMPOSTO_RENDA_COMISSAO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord já inicia em `'2'` (marcado). O empenho de comissão só retém IR quando este campo é `'2'` **e** o regime de tributação é `Lucro Real ou Presumido`. |
| Ramo \ Atividade | `RAMO_ATIVIDADE` | INTEGER |  |  | Código do ramo de atividade. Exigido no Gravar — vazio aborta com "Ramo de Atividade". Botão abre a consulta de ramos, F3 abre o cadastro. Ao sair, preenche a descrição ou limpa os dois. |

#### Região do Representante

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Região | `REGIAO` | INTEGER |  |  | Código da região de atuação, vindo de `ucad_regiao_representante`. Botão abre a consulta de regiões, F3 abre o cadastro. Ao sair, preenche o Nome da Região e recarrega a grade de cidades daquela região; região inexistente limpa os dois campos. |
| Nome da Região | `NOME_REGIAO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo Região. Não é digitado (calculado na consulta). |

### Grade `dbcidade` — tabela IT_REGIAO_REPRESENTANTE

Grade de conferência: mostra as cidades da região escolhida. As cidades são mantidas em `ucad_regiao_representante`, não aqui.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cidade | `CIDADE` | INTEGER |  | Código da cidade que pertence à região selecionada. |
| Nome da Cidade | `NOME_CIDADE` |  |  | Nome da cidade, trazido pela consulta da região. |
| Estado | `ESTADO` | VARCHAR(2) | 2 | UF da cidade, vinda do cadastro de cidades. |

<a id="ucad_regiao_representante"></a>

## `ucad_regiao_representante` — Cadastro das Regiões dos Representantes...

Cadastro da região de atuação do representante em duas tabelas: o cabeçalho em `REGIAO_REPRESENTANTE` (chave `EMPRESA` + `CADASTRO`) e a lista de cidades que formam a região em `IT_REGIAO_REPRESENTANTE`. O cabeçalho tem só código e nome; toda a substância está na grade de cidades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da região, chave do registro. A tela abre já com o próximo número livre (maior `CADASTRO` da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 abre a consulta de regiões. |
| Nome da Região do Representante | `NOME` | VARCHAR(50) | 50 |  | Nome da região. Único campo exigido no Gravar — vazio aborta com "Nome da Região do Representante". |

### Grade `RxDBGrid1` — tabela IT_REGIAO_REPRESENTANTE

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cidade | `CIDADE` | INTEGER |  | Código da cidade que entra na região. Único campo digitável da grade. Ao confirmar o texto, busca a cidade no cadastro: achando, preenche Nome da Cidade e Estado; não achando, limpa os três. Depois de gravar, a linha ainda é conferida — se o código de cidade não existir, a linha é apagada. Delete na grade pede confirmação antes de excluir. |
| Nome da Cidade | `NOME_CIDADE` | VARCHAR(50) | 50 | Preenchido pelo sistema a partir do código da cidade. Não é digitado (calculado na consulta). |
| Estado | `ESTADO` | VARCHAR(2) | 2 | UF da cidade, trazida junto do cadastro de cidades. Não é digitada. |

A linha nova recebe `EMPRESA`, `REGIAO` (o `CADASTRO` do cabeçalho) e `SEQ` (maior sequência da região mais um) no NewRecord, sem passar pela tela.

<a id="ucad_produto"></a>

## `ucad_produto` — Cadastro de Produtos...

Cadastro central de produtos e materiais, gravado na tabela `MATERIA_PRIMA`. O cabeçalho traz identificação, unidade, grupo, subgrupo e referência; abaixo, um conjunto de abas guarda a composição técnica (tabelas `PRODUTO_SUBCONJUNTO_COMPOSICAO`, `PRODUTO_COMPOSICAO` e `PRODUTO_COMPOSICAO_EXCLUSAO`), as peças de reposição, os parâmetros de comportamento e a revisão de importação; à direita, outro conjunto de abas guarda preços, pesos, estoque, tributação, SPED, carga tributária de ST, FCI (tabela `FCI`) e documentos anexos (tabela `IT_MATERIA_PRIMA_DOCUMENTOS`).

Todos os marcadores (checkbox) desta tela usam a mesma convenção: `'2'` marcado, `'1'` desmarcado.

### Campos

#### Cadastro de Produtos...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do produto. Sugerido pelo sistema como `MAX(CADASTRO) + 1` da tabela MATERIA_PRIMA dentro da empresa corrente. Se o código digitado não existir, a tela pergunta se grava com ele ou com o próximo da sequência. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. F12 duplica o cadastro inteiro para um novo código, mediante confirmação. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição do produto. Obrigatória: o Gravar recusa a gravação com o campo vazio. |
| Unidade | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Unidade de medida de consumo. F4 abre a consulta de unidades e F3 o cadastro. Obrigatória no Gravar. Antes de gravar, se `UNIDADE_COMPRA` estiver vazia, o sistema copia esta unidade para ela. |
| Grupo | `GRUPO` | INTEGER |  |  | Código do grupo de produtos. F4 abre a consulta e F3 o cadastro; ao sair, código inexistente limpa código e descrição. Obrigatório no Gravar. Vale além da classificação: a aba Importação (Revisão) só aparece quando o grupo for 13. |
| Descrição do Grupo | `DESCRICAO_GRUPO` | VARCHAR(50) | 50 |  | Descrição do grupo. Não é digitada: copiada de GRUPO_PRODUTO.DESCRICAO ao informar o código. |
| SubGrupo | `SUBGRUPO` | INTEGER |  |  | Código do subgrupo dentro do grupo. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. Junto com o grupo, define a lista da aba Peças de Reposição. |
| Descrição do SubGrupo | `DESCRICAO_SUBGRUPO` | VARCHAR(50) | 50 |  | Descrição do subgrupo. Não é digitada: copiada do cadastro ao informar o código. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 |  | Referência do produto (código do fabricante ou da linha). F4 abre a consulta de referências já usadas. |
| Código de Barras | `CODIGO_BARRA` | VARCHAR(25) | 25 |  | Código de barras (GTIN/EAN) do produto, digitado. |

#### Parâmetros

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Gera Programação de Lote | `GERA_PROGRAMACAO_LOTE` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, o produto entra na programação de lotes da produção. Novo registro nasce com `'1'`. |
| Controla Lote | `CONTROLA_LOTE` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | `'2'` marcado (produto inativo), `'1'` desmarcado (ativo). Novo registro nasce com `'1'`. Alterar este campo é protegido: se o valor mudar, o Gravar abre a tela de senha de prevenção e só continua se a senha for aceita. Produto inativo é recusado nas grades de composição e de subconjuntos. |
| Controla Estoque | `CONTROLA_ESTOQUE` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. Aparece como a coluna CE nas grades de composição. |
| Item da Tabela de Preço | `ITEM_TABELA_PRECO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, o produto entra nas tabelas de preço. Novo registro nasce com `'1'`. |
| Utiliza Composição Técnica do Desenho | `UTILIZA_COMPOSICAO_DESENHO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, a composição vem do desenho e o sistema deixa de recalcular o Total das linhas da grade de composição. Novo registro nasce com `'1'`. |
| Utiliza Preço de Venda por Markup | `UTILIZA_PRECO_VENDA_MARKUP` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Comanda a aba Preços: só quando vale `'2'` o campo Markup fica visível e o preço de venda passa a ser calculado como custo vezes markup ao sair do Preço Custo. Novo registro nasce com `'1'`. |
| `cbgera_programacao_lote_automatico` | `GERA_PROGRAMACAO_LOTE_AUTO` | VARCHAR(1) | 1 |  | Campo sem rótulo casado no arranjo; a legenda do próprio checkbox é "Gera Programação de Lote Automaticamente ao Gerar Pedido de Venda". `'2'` marcado, `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Aliquota Reduzida DIFAL | `ALIQUOTA_REDUZIDA_DIFAL` | DOUBLE PRECISION |  |  | Percentual de alíquota reduzida a usar no cálculo do diferencial de alíquota. Digitado. |
| Não Imprimir Ordem de Produção do Lote Automático | `NAO_IMPRIME_LOTE_AUTOMATICO` | VARCHAR(1) | 1 |  | `'2'` marcado (não imprime), `'1'` desmarcado. Novo registro nasce com `'1'`. |
| Usa a Composição Técnica | `PROG_LOTE_USA_COMPOSICAO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Diz se a programação de lote explode a composição técnica do produto. Novo registro nasce com `'1'`. |
| Validar Estoque Mínimo | `VALIDAR_ESTOQUE_MINIMO` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, o sistema critica o estoque mínimo deste produto. Novo registro nasce com `'1'`. |

#### Importação (Revisão)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição | `DESCRICAO_REVISAO_IMPORTACAO` | BLOB |  |  | Texto livre da revisão de importação, em memo. A aba inteira só fica visível quando o `GRUPO` do produto for 13; para os demais grupos o campo não aparece na tela. |

#### Preços

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Preço Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  |  | Preço de custo do produto. Ao sair do campo, se `UTILIZA_PRECO_VENDA_MARKUP` for `'2'`, o sistema recalcula o Preço de Venda como custo vezes markup; em qualquer caso recalcula o preço ao consumidor. É o custo que as grades de composição copiam para a coluna Valor. |
| Revenda | `PRECO_VENDA` | DOUBLE PRECISION |  |  | Preço de venda ao revendedor. Digitado ou calculado: sai do custo vezes markup, ou do preço ao consumidor menos o percentual de desconto. Ao ser alterado, recalcula o preço ao consumidor, o markup e, se houver intervalo, os preços mínimo e máximo. |
| Markup | `LUCRO` | DOUBLE PRECISION |  |  | Multiplicador de markup sobre o custo. O campo e seu rótulo só aparecem quando `UTILIZA_PRECO_VENDA_MARKUP` for `'2'`. Quando o preço de venda é digitado, o sistema recalcula o markup como venda dividida pelo custo. |
| % Intervalo | `INTERVALO` | DOUBLE PRECISION |  |  | Percentual de tolerância em torno do preço de venda. Ao sair do campo, se for maior que zero, o sistema calcula Preço Mínimo e Preço Máximo. |
| Preço Mínimo | `PRECO_MINIMO` | DOUBLE PRECISION |  |  | Piso do preço de venda. Calculado pelo sistema como preço de venda menos o percentual de intervalo. |
| Preço Máximo | `PRECO_MAXIMO` | DOUBLE PRECISION |  |  | Teto do preço de venda. Calculado pelo sistema como preço de venda mais o percentual de intervalo. |
| Alteração Preço | `DATA_ALTERACAO_PRECO_VENDA` | TIMESTAMP |  |  | Data da última alteração do preço de venda. |
| Consumidor | `PRECO_VENDA_CONSUMIDOR` | DOUBLE PRECISION |  |  | Preço de venda ao consumidor final. Digitado ou calculado: sai do preço de revenda dividido pelo complemento do percentual de desconto. Se digitado com desconto informado, recalcula o preço de revenda no sentido inverso. |
| % Desconto | `PERCENTUAL_DESCONTO_REVENDEDOR` | DOUBLE PRECISION |  |  | Percentual de desconto do revendedor: é a diferença entre o preço ao consumidor e o preço de revenda. Ao ser alterado, recalcula o preço de revenda a partir do preço ao consumidor e refaz o markup. |

#### Pesos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Volume do produto. Digitado. |
| Cubagem (F2) | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem total das embalagens do produto. Somente leitura nesta tela: F2 sobre o campo grava o produto e abre `ucad_produto_embalagem`, onde as embalagens são lançadas; ao voltar, o sistema relê o valor de MATERIA_PRIMA.CUBAGEM. |
| Peso Liquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido do produto, usado nos documentos fiscais e no transporte. Digitado. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto do produto. Digitado. |

#### Estoque

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Saldo Físico | `SALDO` | DOUBLE PRECISION |  |  | Saldo em estoque do produto. É o saldo mantido pelos movimentos de estoque; a tela apenas mostra e permite corrigir o número. |
| Prateleira | `LOCALIZACAO` | VARCHAR(50) | 50 |  | Localização física do produto no almoxarifado (prateleira, endereço). Texto livre. |
| Estoq. Mínimo | `MINIMA_PRODUTO` | DOUBLE PRECISION |  |  | Quantidade mínima de estoque. Só é criticada quando `VALIDAR_ESTOQUE_MINIMO` estiver marcado. |

#### Informações Gerais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Especificações | `ESPECIFICACOES` | BLOB |  |  | Texto livre com as especificações técnicas do produto, em memo. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Código da conta do plano de contas em que o produto é apropriado. F4 abre a consulta e F3 o cadastro. |
| Descrição do Plano de Contas | `DESC_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta. Não é digitada: copiada de PLANO_CONTAS.DESCRICAO ao informar o código. |

#### Tributação

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| CST Icms | `TRIBUTO` | VARCHAR(8) | 8 |  | Código da situação tributária do ICMS (origem mais CST). F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. Comanda a crítica do CEST: quando os dois dígitos do CST forem 10, 30, 60 ou 70, o CEST passa a ser exigido; fora desses casos, com CST diferente de 90, um CEST preenchido faz o sistema pedir confirmação. |
| Descrição da Situação Tributaria do Icms | `DESCRICAO_TRIBUTO` | VARCHAR(50) | 50 |  | Descrição do CST de ICMS. Somente leitura: copiada de TRIBUTO.DESCRICAO ao informar o código. |
| Legislação | `LEGISLACAO` | INTEGER |  |  | Código da legislação ligada ao produto. F4 abre a consulta e F3 o cadastro. O Gravar recusa legislação de `TIPO_LANCAMENTO = 'Compra'`. |
| Descrição da Legislação | `DESCRICAO_LEGISLACAO` | VARCHAR(50) | 50 |  | Descrição da legislação. Somente leitura: copiada do cadastro ao informar o código. |
| Descrição da Classificação Fiscal do NCM | `DESCRICAO_CLASSIFICACAO_FISCAL` | VARCHAR(100) | 100 |  | Descrição do NCM. Somente leitura: copiada de CLASSIFICACAO_FISCAL.DESCRICAO ao informar o código. |
| Código NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(20) | 20 |  | Código NCM do produto. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar, que testa o valor já sem os caracteres de formatação. Ao informar um NCM ativo, o sistema traz de lá as alíquotas de IPI, PIS e COFINS; NCM inativo ou inexistente limpa o código, a descrição, as três alíquotas e o CEST. É o NCM que alimenta a grade da aba ST. |
| Descrição da Situação Tributaria do IPI | `DESCRICAO_TRIBUTO_IPI` | VARCHAR(120) | 120 |  | Descrição do CST de IPI. Somente leitura: copiada do cadastro ao informar o código. |
| CST IPI | `TRIBUTO_IPI` | VARCHAR(2) | 2 |  | Código da situação tributária do IPI. F4 abre a consulta e F3 o cadastro. |
| % IPI | `IPI` | DOUBLE PRECISION |  |  | Alíquota de IPI. Somente leitura: não é digitada, vem da tabela CLASSIFICACAO_FISCAL quando o NCM é informado. Entra no cálculo da carga tributária mostrada na aba ST. |
| % I.I. | `ALIQUOTA_IMPORTACAO` | DOUBLE PRECISION |  |  | Alíquota do imposto de importação do produto. |
| Red. 07% | `REDUCAO_ALIQUOTA_07` | DOUBLE PRECISION |  |  | Percentual de redução da base de cálculo do ICMS nas operações com alíquota de 7%. |
| Red. 12% | `REDUCAO_ALIQUOTA_12` | DOUBLE PRECISION |  |  | Percentual de redução da base de cálculo do ICMS nas operações com alíquota de 12%. |
| Red. 17% | `REDUCAO_ALIQUOTA_17` | DOUBLE PRECISION |  |  | Percentual de redução da base de cálculo do ICMS nas operações com alíquota de 17%. |
| CST Pis | `TRIBUTO_PIS` | VARCHAR(2) | 2 |  | Código da situação tributária do PIS. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. |
| Descrição da Situação Tributaria do PIS | `DESCRICAO_TRIBUTO_PIS` | VARCHAR(120) | 120 |  | Descrição do CST de PIS. Somente leitura: copiada do cadastro ao informar o código. |
| CST Cofins | `TRIBUTO_COFINS` | VARCHAR(2) | 2 |  | Código da situação tributária do COFINS. F4 abre a consulta e F3 o cadastro. Obrigatório no Gravar. |
| Descrição da Situação Tributaria do COFINS | `DESCRICAO_TRIBUTO_COFINS` | VARCHAR(120) | 120 |  | Descrição do CST de COFINS. Somente leitura: copiada do cadastro ao informar o código. |
| Descrição do Cadastro de Enquadramento do IPI | `DESCRICAO_CENQ_VARCHAR` | VARCHAR(100) | 100 |  | Descrição do enquadramento legal do IPI. Somente leitura. Campo calculado no Delphi, com os primeiros 100 caracteres de `DESCRICAO_CENQ`. |
| CENQ | `CENQ` | VARCHAR(3) | 3 |  | Código de enquadramento legal do IPI. F4 abre a consulta e F3 o cadastro. |
| Motivo Deson. | `MOTIVO_DESONERACAO_ICMS` | INTEGER |  |  | Código do motivo de desoneração do ICMS, exigido pela NF-e quando o imposto é desonerado. F4 abre a consulta e F3 o cadastro. |
| Descrição do Motivo de Desoneração do ICMS | `DESCRICAO_DESONERACAO_ICMS` | VARCHAR(150) | 150 |  | Descrição do motivo de desoneração. Somente leitura: copiada do cadastro ao informar o código. |
| % PIS | `PIS` | DOUBLE PRECISION |  |  | Alíquota de PIS. Somente leitura: vem da tabela CLASSIFICACAO_FISCAL (o NCM), não é digitada aqui. |
| % COFINS | `COFINS` | DOUBLE PRECISION |  |  | Alíquota de COFINS. Somente leitura: vem da tabela CLASSIFICACAO_FISCAL (o NCM), não é digitada aqui. |
| Descrição do CEST | `DESCRICAO_CEST_STRING` | VARCHAR(100) | 100 |  | Descrição do CEST. Somente leitura. Campo calculado no Delphi a partir de `DESCRICAO_CEST`. |
| CEST | `CEST` | VARCHAR(10) | 10 |  | Código Especificador da Substituição Tributária. F4 abre a consulta e F3 o cadastro. Exigido no Gravar quando o CST de ICMS for 10, 30, 60 ou 70; se estiver preenchido em produto sem ST (CST diferente desses e diferente de 90), o sistema avisa e pede confirmação antes de gravar. |
| Benefício Fiscal | `BENEFICIO_FISCAL` | VARCHAR(10) | 10 |  | Código do benefício fiscal (cBenef) do produto. F4 abre a consulta e F3 o cadastro. |
| Descrição do Benefício Fiscal | `DESC_BENEFICIO_FISCAL_STRING` | VARCHAR(100) | 100 |  | Descrição do benefício fiscal. Somente leitura. Campo calculado no Delphi a partir de `DESCRICAO_BENEFICIO_FISCAL`. |
| Tributo IBS/CBS | `TRIBUTO_IBS_CBS` | VARCHAR(6) | 6 |  | Código da classificação tributária de IBS/CBS (reforma tributária). F4 abre a consulta e F3 o cadastro. |
| Descrição do Tributo IBS/CBS | `NOME_TRIBUTO_IBS_CBS` | VARCHAR(200) | 200 |  | Nome da classificação IBS/CBS. Não é digitado: copiado de TRIBUTO_IBS_CBS.NOME ao informar o código. |
| Alíquota I.S. | `ALIQUOTA_IS` | DOUBLE PRECISION |  |  | Alíquota do Imposto Seletivo do produto. Digitada. |

#### SPED FISCAL

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Tipo Item | `TIPO_ITEM_PRODUTO` | INTEGER |  |  | Código do tipo do item da mercadoria para o registro 0200 do SPED. F4 abre a consulta e F3 o cadastro; código inexistente limpa código e descrição. É o valor que as grades de composição mostram na coluna TI. |
| Descrição do Tipo do Item da Mercadoria | `DESCRICAO_TIPO_ITEM_PRODUTO` | VARCHAR(50) | 50 |  | Descrição do tipo do item. Não é digitada: copiada do cadastro ao informar o código. |
| Gênero Item | `GENERO_ITEM_PRODUTO` | INTEGER |  |  | Código do gênero do item da mercadoria (capítulo da NCM). F4 abre a consulta e F3 o cadastro. |
| Descrição do Gênero do Item da Mercadoria | `DESC_GENERO_ITEM_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do gênero. Campo calculado no Delphi: o texto de `DESCRICAO_GENERO_ITEM_PRODUTO` (BLOB) sem os Enter, cortado em 150 caracteres. |
| Lista Serviço | `LISTA_SERVICO` | VARCHAR(5) | 5 |  | Código do item da lista de serviços (LC 116), usado quando o item é serviço. F4 abre a consulta e F3 o cadastro. |
| Descrição da Lista de Serviço | `DESC_LISTA_SERVICO` | VARCHAR(150) | 150 |  | Descrição do item da lista de serviços. Campo calculado no Delphi, a partir do BLOB `DESCRICAO_LISTA_SERVICO`. |
| Controla Bloco K | `CONTROLA_BLOCO_K` | VARCHAR(1) | 1 |  | `'2'` marcado, `'1'` desmarcado. Marcado, o produto entra no bloco K (controle de produção e estoque) do SPED. É o único marcador que nasce marcado: novo registro recebe `'2'`. Quando vale `'2'`, o Gravar passa a exigir o Tipo do Produto (SPED). Aparece como a coluna CEK nas grades de composição. |

#### Tipo

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Produto | `TIPO_PRODUTO` | VARCHAR(1) | 1 |  | `'2'` marcado (o item pode ser usado como produto acabado), `'1'` desmarcado. Novo registro nasce com `'2'`. Item com `'1'` é recusado na grade de subconjuntos e na tela de acerto de produtos, com a mensagem de que está configurado somente como Material. |
| Materiais | `TIPO_MATERIA_PRIMA` | VARCHAR(1) | 1 |  | `'2'` marcado (o item pode ser usado como material ou matéria-prima), `'1'` desmarcado. Novo registro nasce com `'1'`. Só item com `'2'` é aceito nas grades de composição; com `'1'` o sistema avisa que está configurado somente como Produto. |

### Grade `dbsubconjunto_composicao` — tabela PRODUTO_SUBCONJUNTO_COMPOSICAO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `SUBCONJUNTO` | INTEGER |  | Código do produto usado como subconjunto. Digitado ou escolhido pelo botão da coluna. Só é aceito se existir, tiver `TIPO_PRODUTO = '2'`, estiver ativo (`INATIVO = '1'`) e tiver controle de lote de produção diferente de 'Nenhum'; além disso, todos os subconjuntos do produto precisam ser do mesmo tipo de controle de lote — o sistema avisa e recusa quando o tipo diverge do já lançado. O SEQ é gerado como `MAX(SEQ) + 1`. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do subconjunto. Somente leitura: copiada de MATERIA_PRIMA.DESCRICAO quando o código é aceito. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade do subconjunto. Somente leitura: copiada da `UNIDADE_COMPRA` do produto quando o código é aceito. (calculado na consulta) |
| Preço Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  | Preço de custo do subconjunto. Não é gravado na tabela: a consulta devolve zero e a tela preenche com o `PRECO_CUSTO_MATERIAL` do produto ao aceitar o código. |
| Preço Venda | `PRECO_VENDA` | DOUBLE PRECISION |  | Preço de venda do subconjunto, trazido de MATERIA_PRIMA. Somente leitura. |

### Grade `dbbase_composicao` — tabela PRODUTO_COMPOSICAO

Materiais que somam na composição técnica do produto. O rodapé da aba mostra Total Comp. (soma dos subconjuntos mais esta composição, menos a composição de exclusão) e % Variação em relação ao preço de custo.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material consumido. Digitado ou escolhido pelo botão da coluna. Só é aceito se existir, tiver `TIPO_MATERIA_PRIMA = '2'` e estiver ativo (`INATIVO = '1'`); caso contrário o sistema avisa e limpa a linha. O SEQ é gerado como `MAX(SEQ) + 1` e o material não pode repetir dentro do mesmo produto. |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material. Somente leitura: copiada de MATERIA_PRIMA.DESCRICAO ao aceitar o código. (calculado na consulta) |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida de MATERIA_PRIMA. Somente leitura. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material consumida por unidade do produto. Digitada; linha com quantidade zerada não é considerada. |
| Valor | `CUSTO_PADRAO` | DOUBLE PRECISION |  | Custo unitário do material. Não é digitado: a consulta traz `MATERIA_PRIMA.PRECO_CUSTO` e a tela recopia esse valor ao aceitar o código. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Custo da linha. Calculado como quantidade vezes valor, tanto no SELECT quanto antes de gravar — exceto quando `UTILIZA_COMPOSICAO_DESENHO` está marcado, caso em que o sistema não recalcula e mantém o valor vindo do desenho. |
| % Perda | `PERCENTUAL_PERDA` | DOUBLE PRECISION |  | Percentual de perda do material no processo. Digitado. |
| TI | `TIPO_ITEM` | VARCHAR(1) | 1 | Tipo do item do material. Coluna de exibição: o SELECT traz `MATERIA_PRIMA.TIPO_ITEM_PRODUTO` com este apelido. Não é editável aqui, muda no cadastro do material. (calculado na consulta) |
| CE | `CONTROLA_ESTOQUE` | VARCHAR(1) | 1 | Controla Estoque do material, trazido de MATERIA_PRIMA. Coluna de exibição, desenhada como marca: mostra o ícone quando o valor é `'2'`. |
| EE | `EMPENHA_ESTOQUE` | VARCHAR(1) | 1 | Empenha Estoque: o SELECT traz `MATERIA_PRIMA.CONTROLA_ESTOQUE_POR_EMPENHO` com este apelido. Coluna de exibição, desenhada como marca quando vale `'2'`. |
| CEK | `CONTROLA_BLOCO_K` | VARCHAR(1) | 1 | Controla Bloco K do material, trazido de MATERIA_PRIMA. Coluna de exibição, desenhada como marca quando vale `'2'`. |
| Data Custo | `DATA_ALTERACAO_PRECO_CUSTO` | TIMESTAMP |  | Data da última alteração do preço de custo do material, trazida de MATERIA_PRIMA. Somente leitura, serve para ver se o custo da composição está velho. |

### Grade `dbbase_composicao_exclusao` — tabela PRODUTO_COMPOSICAO_EXCLUSAO

Materiais que são descontados da composição: o total desta grade é subtraído do Total Comp. do produto. As colunas repetem as da grade de inclusão.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material a descontar da composição. Mesmas críticas da grade de inclusão: precisa existir, ter `TIPO_MATERIA_PRIMA = '2'` e estar ativo. |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material. Somente leitura, copiada de MATERIA_PRIMA. (calculado na consulta) |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida de MATERIA_PRIMA. Somente leitura. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material a descontar. Digitada. |
| Valor | `CUSTO_PADRAO` | DOUBLE PRECISION |  | Custo unitário do material, trazido de MATERIA_PRIMA. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Custo da linha, quantidade vezes valor. Este total é subtraído do Total Comp. do produto. |
| TI | `TIPO_ITEM` | VARCHAR(1) | 1 | Tipo do item do material, trazido de MATERIA_PRIMA como coluna de exibição. (calculado na consulta) |
| CE | `CONTROLA_ESTOQUE` | VARCHAR(1) | 1 | Controla Estoque do material. Coluna de exibição, marcada quando vale `'2'`. |
| EE | `EMPENHA_ESTOQUE` | VARCHAR(1) | 1 | Empenha Estoque do material (`CONTROLA_ESTOQUE_POR_EMPENHO`). Coluna de exibição, marcada quando vale `'2'`. |
| CEK | `CONTROLA_BLOCO_K` | VARCHAR(1) | 1 | Controla Bloco K do material. Coluna de exibição, marcada quando vale `'2'`. |
| Data Custo | `DATA_ALTERACAO_PRECO_CUSTO` | TIMESTAMP |  | Data da última alteração do custo do material. Somente leitura. |

### Grade `dbpecas_reposicao` — tabela MATERIA_PRIMA

Listagem somente leitura (a grade não tem edição e seleciona a linha inteira): mostra os demais produtos do mesmo grupo e subgrupo, como sugestão de peças de reposição.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `CADASTRO` | INTEGER |  | Código do produto listado como peça de reposição. |
| Descrição da Matéria Prima | `DESCRICAO` | VARCHAR(150) | 150 | Descrição da peça. |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo da peça. |
| R$ Consum. | `PRECO_VENDA_CONSUMIDOR` | DOUBLE PRECISION |  | Preço da peça ao consumidor final. |
| % Desconto | `PERCENTUAL_DESCONTO_REVENDEDOR` | DOUBLE PRECISION |  | Percentual de desconto do revendedor sobre o preço ao consumidor. |
| R$ Revenda | `PRECO_VENDA` | DOUBLE PRECISION |  | Preço da peça ao revendedor. |

### Grade `RxDBGrid1` — sem tabela, dataset em memória (aba ST)

Simulação da carga tributária por estado. A grade é `ReadOnly` e o conteúdo é montado a cada abertura do produto, a partir de `IMPOSTOS_CLASSIFICACAO_FISCAL` do NCM do produto cruzada com `ALIQUOTA_ESTADO`; nada aqui é gravado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Estado | `ESTADO` | VARCHAR(2) | 2 | Sigla da UF de destino simulada. Somente leitura, uma linha por estado com imposto cadastrado para o NCM. (calculado na consulta) |
| Aliq. ICMS ST | `ICMS_ST` | DOUBLE PRECISION |  | Alíquota interna de ICMS-ST do estado para o NCM, lida de IMPOSTOS_CLASSIFICACAO_FISCAL. Somente leitura. (calculado na consulta) |
| `MVA` | `MVA` | DOUBLE PRECISION |  | Coluna sem título na grade. Margem de valor agregado do estado para o NCM, lida de IMPOSTOS_CLASSIFICACAO_FISCAL. Somente leitura. (calculado na consulta) |
| ICMS Destino | `ICMS_DESTINO_ESTADO` | DOUBLE PRECISION |  | Alíquota de ICMS de destino do estado, lida de ALIQUOTA_ESTADO. Somente leitura. (calculado na consulta) |
| % ST | `TOTAL_CARGA_TRIB` | DOUBLE PRECISION |  | Carga de substituição tributária do estado. Calculada na tela: sobre uma base de 100, com o IPI do produto, a rotina de cálculo de ST devolve o valor do ST e ele é copiado para esta coluna — ou seja, o percentual de ST embutido no preço. (calculado na consulta) |

### Grade `dbfci` — tabela FCI

Fichas de Conteúdo de Importação do produto. As fichas são geradas e mantidas na tela de FCI; duplo clique na linha abre essa tela com a ficha selecionada.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número FCI | `NUMERO_FCI` | VARCHAR(50) | 50 | Número da ficha devolvido pelo fisco (o identificador que vai na NF-e). Preenchido no processamento do arquivo de retorno, não digitado aqui. |
| Valor Médio de Venda | `VALOR_MEDIO_VENDA` | DOUBLE PRECISION |  | Valor médio de venda apurado para o período da ficha. |
| Valor Conteúdo Importação | `VALOR_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  | Parcela importada do valor do produto. |
| % Conteúdo Importação | `PERCENTUAL_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  | Percentual de conteúdo de importação, que define a origem da mercadoria na NF-e. |
| Data | `DATA` | TIMESTAMP |  | Data da ficha. |
| Status | `STATUS` | VARCHAR(20) | 20 | Situação da ficha, gravada pela tela de FCI: `'Gerada'` (ficha criada, ainda sem número do fisco), `'Mantido'` (recalculada e mantida a ficha anterior) e `'Atualizado'` (ficha substituída por uma nova apuração). |

### Grade `dbmateria_prima_documentos` — tabela IT_MATERIA_PRIMA_DOCUMENTOS

Anexos do produto (desenhos, laudos, catálogos). O arquivo escolhido é copiado para a pasta de anexos antes de gravar; linha sem caminho de arquivo é cancelada.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** **·obrig** | `SEQ` | INTEGER |  | Sequencial do anexo dentro do produto, obrigatório no banco (NOT NULL). Gerado no NewRecord como `MAX(SEQ) + 1`, não é digitado. |
| Data | `DATA` | TIMESTAMP |  | Data do anexo. O NewRecord já preenche com a data do dia. |
| Descrição do Documento | `DESCRICAO` | VARCHAR(50) | 50 | Descrição livre do documento anexado. |
| Caminho do Arquivo | `CAMINHO_ARQUIVO` | VARCHAR(250) | 250 | Caminho do arquivo anexado. Não é digitado: o botão da coluna abre a caixa de seleção de arquivo, e o nome escolhido também alimenta a coluna `NOME_ARQUIVO`. Linha com caminho vazio é descartada antes de gravar. |
| `ABRIR` | `ABRIR` | VARCHAR(5) | 5 | Coluna sem título, desenhada como um botão "Abrir". Não guarda dado do usuário: clicar nela executa o arquivo indicado em `CAMINHO_ARQUIVO` no programa padrão do Windows. (calculado na consulta) |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Tipo do Produto (SPED) | `TIPO_PRODUTO_SPED` | VARCHAR(25) | 25 | campo da tela | Rótulo na tela: “Tipo do Produto (SPED)”. Função não verificada no código. |

<a id="ucad_produto_acerto"></a>

## `ucad_produto_acerto` — Cadastro do Acerto dos Produtos

Tela de acerto do cadastro fiscal de um produto já existente: grava na mesma tabela `MATERIA_PRIMA` do cadastro completo, mas expõe só o conjunto mínimo exigido pelo SPED (tipo e gênero do item, lista de serviço e NCM). Não inclui produto novo — o código é buscado e o registro é sempre alterado. Ao gravar, o produto fica marcado como acertado (`ACERTO_CADASTRO = '2'`). Sem abas e sem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição do produto. Obrigatória: o Gravar recusa a gravação com o campo vazio. |
| Unidade | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Unidade de medida de consumo. F4 abre a consulta de unidades e F3 o cadastro; ao sair, se a unidade digitada não existir em UNIDADE_MEDIDA, o campo é limpo. Obrigatória no Gravar. Antes de gravar, se `UNIDADE_COMPRA` estiver vazia, o sistema copia esta unidade para ela. |
| Tipo Item | `TIPO_ITEM_PRODUTO` | INTEGER |  |  | Código do tipo do item da mercadoria para o SPED (registro 0200). F4 abre a consulta e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. Obrigatório no Gravar. |
| Descrição do Tipo do Item da Mercadoria | `DESCRICAO_TIPO_ITEM_PRODUTO` | VARCHAR(50) | 50 |  | Descrição do tipo do item. Não é digitada: copiada de TIPO_ITEM_PRODUTO.DESCRICAO ao sair do código ou ao escolher pela consulta. |
| Gênero Item | `GENERO_ITEM_PRODUTO` | INTEGER |  |  | Código do gênero do item da mercadoria (capítulo da NCM) para o SPED. F4 abre a consulta e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. |
| Descrição do Gênero do Item da Mercadoria | `DESC_GENERO_ITEM_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do gênero. Campo calculado no Delphi: o OnCalcFields tira os Enter de `DESCRICAO_GENERO_ITEM_PRODUTO` (que é BLOB) e corta em 150 caracteres para caber no edit. |
| Lista Serviço | `LISTA_SERVICO` | VARCHAR(5) | 5 |  | Código do item da lista de serviços (LC 116), usado quando o item é serviço. F4 abre a consulta e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. |
| Descrição da Lista de Serviço | `DESC_LISTA_SERVICO` | VARCHAR(150) | 150 |  | Descrição do item da lista de serviços. Campo calculado no Delphi, a partir de `DESCRICAO_LISTA_SERVICO` (BLOB), sem os Enter e cortado em 150 caracteres. |
| Descrição da Classificação Fiscal do NCM | `DESCRICAO_CLASSIFICACAO_FISCAL` | VARCHAR(100) | 100 |  | Descrição do NCM. Não é digitada: copiada de CLASSIFICACAO_FISCAL.DESCRICAO ao sair do código ou ao escolher pela consulta. |
| Código NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(20) | 20 |  | Código NCM do produto. F4 abre a consulta de classificações fiscais e F3 o cadastro; ao sair, se o código não existir, código e descrição são limpos. Obrigatório no Gravar, que testa o valor já sem os caracteres de formatação (pontos). |

<a id="ucad_base_conversao_produto"></a>

## `ucad_base_conversao_produto` — Cadastro de Base de Conversão dos Produtos

Cadastro da receita de conversão de um produto em outro, em `BASE_CONVERSAO_PRODUTO` (cabeçalho, chave `EMPRESA` + `CADASTRO`). O cabeçalho tem dois quadros: Estornado (o produto que sai do estoque) e Produzido (o produto que entra). Abaixo há duas grades de materiais: `IT_BASE_CONVERSAO_PROD_ENTRADA` para os materiais que entram e `IT_BASE_CONVERSAO_PROD_SAIDA` para os que saem, ambas com chave `EMPRESA` + `CADASTRO` + `SEQ`.

### Campos

#### Cabeçalho

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** **·obrig** | `CADASTRO` | INTEGER |  | sim | Número da base de conversão. A tela abre com o próximo livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. Ao sair do campo as duas grades são recarregadas para o número escolhido. |

#### Estornado

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Produto | `PRODUTO_ESTORNO` | INTEGER |  |  | Código do produto que será estornado (baixado) na conversão. Obrigatório no Gravar quando o botão está com o foco: vazio aborta com "Produto a Estornar". F4 abre a consulta de produtos. O código digitado é validado contra o cadastro de produto: se não existir, o próprio código e os dois campos ao lado são limpos. |
| Descrição do Produto | `DESCRICAO_PRODUTO_ESTORNO` | VARCHAR(150) | 150 |  | Descrição do produto estornado, trazida de `PRODUTO.DESCRICAO`. Não é digitada: é preenchida ao validar o código (calculado na consulta). |
| Referência | `REFERENCIA_PRODUTO_ESTORNO` | VARCHAR(20) | 20 |  | Referência do produto estornado, trazida de `PRODUTO.REFERENCIA`. Não é digitada: é preenchida ao validar o código (calculado na consulta). |

#### Produzido

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Produto | `PRODUTO_NOVO` | INTEGER |  |  | Código do produto gerado pela conversão. Obrigatório no Gravar quando o botão está com o foco: vazio aborta com "Produto Novo". F4 abre a consulta de produtos. É este produto que identifica o registro no log do sistema. |
| Descrição do Produto | `DESCRICAO_PRODUTO_NOVO` | VARCHAR(150) | 150 |  | Descrição do produto gerado, trazida de `PRODUTO.DESCRICAO` ao validar o código. Não é digitada (calculado na consulta). |
| Referência | `REFERENCIA_PRODUTO_NOVO` | VARCHAR(20) | 20 |  | Referência do produto gerado, trazida de `PRODUTO.REFERENCIA` ao validar o código. Não é digitada (calculado na consulta). |

### Grade `dbit_base_conversao_prod_entrada` — tabela IT_BASE_CONVERSAO_PROD_ENTRADA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  | Código do material que entra na conversão. F4 abre a consulta de produtos. O código é validado ao ser digitado; se não existir no cadastro de produto a linha é descartada no BeforePost. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, trazida de `PRODUTO.DESCRICAO` ao validar o código. Não é digitada. A coluna não pertence a `IT_BASE_CONVERSAO_PROD_ENTRADA`; o tipo é indicação tomada de `IT_FCI.DESCRICAO_MATERIA_PRIMA` (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material consumida na conversão. Exigida: quantidade menor ou igual a zero é recusada no BeforePost com "Quantidade não informada" e o cursor volta para a coluna. |

`EMPRESA`, `CADASTRO` e `SEQ` são preenchidos pelo sistema no NewRecord da grade — `SEQ` recebe o maior `SEQ` do mesmo cadastro mais um — e não têm coluna visível.

### Grade `dbit_base_conversao_prod_saida` — tabela IT_BASE_CONVERSAO_PROD_SAIDA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  | Código do material que sai na conversão. F4 abre a consulta de produtos. Código inexistente no cadastro de produto faz a linha ser descartada no BeforePost. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, trazida de `PRODUTO.DESCRICAO` ao validar o código. Não é digitada. A coluna não pertence a `IT_BASE_CONVERSAO_PROD_SAIDA`; o tipo é indicação tomada de `IT_FCI.DESCRICAO_MATERIA_PRIMA` (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material gerada pela conversão. Exigida: quantidade menor ou igual a zero é recusada no BeforePost com "Quantidade não informada". |

`EMPRESA`, `CADASTRO` e `SEQ` também são preenchidos no NewRecord desta grade, com `SEQ` seguindo o maior do mesmo cadastro mais um.

<a id="umov_ficha_conteudo_importacao_produto"></a>

## `umov_ficha_conteudo_importacao_produto` — Planilha do Conteúdo de Importação  (FCI)...

Monta a Ficha de Conteúdo de Importação de um produto: quanto do preço de venda vem de material importado. O cabeçalho grava em `FCI` (chave `EMPRESA` + `NUMERO`) e os materiais importados em `IT_FCI` (chave `EMPRESA` + `NUMERO` + `SEQ`). A tela é uma folha só: cabeçalho com o produto, a data e os três valores da ficha, e a grade `RxDBGrid1` com os materiais importados que compõem o produto. O botão Materiais Importados varre a composição do produto (`PRODUTO_COMPOSICAO` e `PRODUTO_SUBCONJUNTO_COMPOSICAO`) e traz sozinho todo material com `ESTOQUE_IMPORTADO > 0` — mas só quando a grade ainda está vazia.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(20) | 20 |  | Situação da ficha, exibida no canto superior direito. Somente leitura, é um rótulo sem digitação. Valores: `'Gerada'` quando a ficha é criada nesta tela ou no gerenciamento; `'Mantido'` quando a geração do arquivo constata que o percentual não subiu mais de 5 pontos em relação à FCI anterior do mesmo produto e reaproveita o número anterior, sem mandar o produto no arquivo; `'Atualizado'` depois que o arquivo de retorno da SEFAZ é lido e o número oficial é gravado. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno da ficha. Sugerido como `MAX(NUMERO)` da empresa mais um. O botão do campo abre a consulta de fichas; F7 volta para a anterior, F8 avança, F9 e o botão localizam a mais próxima abaixo. Digitar um número livre oferece criar com o número seguinte ou com o número digitado. |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto acabado da ficha. Obrigatório: o Gravar recusa em branco com aviso e devolve o foco. O botão abre a consulta de produtos com filtro `'Produto'`, F3 abre o cadastro. Só entra cadastro ativo `INATIVO = '1'`; inativo é recusado com "está inativo" e limpa o produto, a descrição e a referência. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, copiada de `MATERIA_PRIMA.DESCRICAO` pelo Exit do campo Produto. O controle está desabilitado na tela, não se digita nele. |
| Data | `DATA` | TIMESTAMP |  |  | Mês de referência da ficha. Vem com a data do dia no NewRecord e o Enter repõe a data do dia se o conteúdo estiver inválido. Obrigatória: o Gravar recusa data inválida. Ao sair do campo o sistema recalcula o Valor Médio Venda, que depende do mês desta data. |
| Valor Médio Venda | `VALOR_MEDIO_VENDA` | DOUBLE PRECISION |  |  | Preço médio de venda interestadual do produto no mês anterior ao da Data. Calculado, não digitado: soma de `IT_NOTA.TOTAL` menos `DESCONTO_ICMS` dividida pela quantidade, considerando só notas de saída com `STATUS = 'Faturada'` ou `'NFE Autorizada'`, natureza com `GERA_FATURAMENTO_OPERACIONAL = '2'` e cliente de estado diferente do da empresa. É o denominador do percentual. |
| Valor Conteúdo Import. | `VALOR_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  |  | Valor da parcela importada do produto. Vem somado dos itens: cada gravação de item soma a diferença do Custo Total, e cada exclusão devolve o valor. Pode ser digitado por cima, e nesse caso o percentual é recalculado na hora. |
| % Conteúdo Import. | `PERCENTUAL_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  |  | Percentual de conteúdo importado. Calculado como Valor Conteúdo Import. dividido pelo Valor Médio Venda vezes 100, e zerado quando o valor de importação é zero. É o número que define a faixa de tributação do produto no gerenciamento: até 40 por cento gera origem `'5'`, acima de 40 até 70 gera `'3'`, acima de 70 gera `'8'`. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 |  | Referência comercial do produto, trazida de `MATERIA_PRIMA.REFERENCIA` pelo Exit do campo Produto. O controle está desabilitado na tela, não se digita nele. |
| FCI | `NUMERO_FCI` | VARCHAR(50) | 50 |  | Número oficial da FCI, o código devolvido pela SEFAZ. O controle está desabilitado nesta tela: quem grava é o gerenciamento, ao ler o arquivo de retorno (status vira `'Atualizado'`) ou ao reaproveitar o número da ficha anterior do mesmo produto (status vira `'Mantido'`). |

### Grade `RxDBGrid1` — tabela IT_FCI

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  | Código do material importado que compõe o produto. F4 ou o botão da célula abrem a consulta de materiais com filtro `'Material'`. Só entra cadastro com `TIPO_MATERIA_PRIMA = '2'` (material) e `INATIVO = '1'` (ativo). `TIPO_MATERIA_PRIMA = '1'` é recusado com "está configurado somente como Produto"; inativo é recusado com "está inativo". Em qualquer recusa a linha é limpa. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, copiada de `MATERIA_PRIMA.DESCRICAO`. Não é digitada. |
| UN | `UNIDADE_MATERIA_PRIMA` | VARCHAR(3) | 3 | Unidade de consumo do material, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Não é digitada (calculado na consulta). |
| NCM | `CLASSIFICACAO_FISCAL` | VARCHAR(20) | 20 | Classificação fiscal do material, copiada de `MATERIA_PRIMA.CLASSIFICACAO_FISCAL` ao aceitar o código e reconfirmada na gravação do item. Não é digitada. |
| Qtde | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material que entra em uma unidade do produto. Ao aceitar o material o sistema já sugere 1 quando está zerada; na busca automática vem de `PRODUTO_COMPOSICAO.QUANTIDADE`. Obrigatória na prática: o AfterPost apaga a linha e avisa "Quantidade do Produto não informado" se for menor ou igual a zero. O ponto digitado aqui vira vírgula. |
| Custo Unit. | `ULTIMO_CUSTO_UNITARIO` | DOUBLE PRECISION |  | Último custo de compra do material, com três casas. Calculado: o sistema busca a entrada mais recente até o fim do mês de dois meses antes da Data, com `TRIBUTO_ICMS` começando em `'1'`, `'2'`, `'3'` ou `'8'` (origem importada), e usa valor mais IPI e substituição rateados, mais frete, menos despesas e descontos rateados. Sem entrada nessa condição, cai para `MATERIA_PRIMA.COMPRA_ULTIMO_CUSTO`. |
| Custo Total | `ULTIMO_CUSTO_TOTAL` | DOUBLE PRECISION |  | Quantidade vezes o custo unitário. Calculado na gravação do item; a soma dessas linhas é o Valor Conteúdo Import. do cabeçalho. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada e `SEQ` do item recebe o maior `SEQ` da ficha mais um, ambos no NewRecord. `LAST_QUANTIDADE` e `LAST_ULTIMO_CUSTO_TOTAL` guardam os valores já somados ao cabeçalho, para que a regravação some só a diferença e a exclusão devolva o valor certo.

<a id="umov_ficha_conteudo_importacao_produto_gerenciar"></a>

## `umov_ficha_conteudo_importacao_produto_gerenciar` — Gerenciamento da Ficha do Conteúdo de Importação dos Produtos...

Gera em lote as fichas FCI de um mês, exporta o arquivo para a SEFAZ e importa o arquivo de retorno. Não tem cabeçalho de digitação: só dois combos de período e a grade `DBGrid1`, que lista `FCI` do mês escolhido com `MATERIA_PRIMA` e `UNIDADE_FCI` no JOIN. A gravação em `FCI` e `IT_FCI` é toda feita por código, sem edição direta na grade.

Os dois combos não são ligados a dataset e por isso não aparecem no TSV:

- **Ano** (`cbano`) — lista de `'1990'` em diante, posicionada no ano corrente ao abrir a tela.
- **Mês** (`cbmes`) — `'Janeiro'` a `'Dezembro'`, posicionado no mês corrente ao abrir a tela.

Gerar Planilha monta o período do primeiro ao último dia do mês escolhido. Se ainda não existir nenhuma FCI nesse período, ele gera as fichas: percorre os produtos com `TIPO_PRODUTO = '2'`, `INATIVO <> '2'` e grupo com `GERA_FCI = '2'`, monta os itens a partir da composição com material de `ESTOQUE_IMPORTADO > 0`, e grava a ficha só quando existe composição importada e preço médio de venda maior que zero. Depois de calcular o percentual, ele reescreve o primeiro dígito de `MATERIA_PRIMA.TRIBUTO` do produto: `'5'` até 40 por cento, `'3'` acima de 40 até 70, `'8'` acima de 70. Gerar Arquivo FCI grava o arquivo de blocos com os registros 5020; Ler Arquivo Retorno FCI lê o arquivo devolvido e grava `NUMERO_FCI` e `STATUS` de cada produto.

### Grade `DBGrid1` — tabela FCI

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número interno da ficha. Gerado no NewRecord como `MAX(NUMERO)` da empresa mais um. Não é digitado. Duplo clique na linha abre a ficha na tela de manutenção. |
| Emissão | `DATA` | TIMESTAMP |  | Mês de referência da ficha. Recebe sempre o primeiro dia do mês escolhido nos combos. Não é digitada. |
| Produto | `PRODUTO` | INTEGER |  | Código do produto acabado. Vem de `MATERIA_PRIMA.CADASTRO` na varredura. Não é digitado. |
| Descrição Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, copiada de `MATERIA_PRIMA.DESCRICAO`. Não é digitada. |
| Valor Médio Venda | `VALOR_MEDIO_VENDA` | DOUBLE PRECISION |  | Preço médio de venda interestadual do produto no mês anterior. Calculado: soma de `IT_NOTA.TOTAL` menos `DESCONTO_ICMS` dividida pela quantidade, só de notas de saída com `STATUS = 'Faturada'` ou `'NFE Autorizada'`, natureza com `GERA_FATURAMENTO_OPERACIONAL = '2'` e cliente de outro estado. Produto sem venda nessas condições não gera ficha. |
| Valor Cont.Import. | `VALOR_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  | Soma do custo total dos materiais importados da composição. Calculado item a item na geração. |
| % Import. | `PERCENTUAL_CONTEUDO_IMPORTACAO` | DOUBLE PRECISION |  | Valor Cont.Import. dividido pelo Valor Médio Venda vezes 100. Define a origem gravada em `MATERIA_PRIMA.TRIBUTO` e decide o que vai no arquivo: o produto só entra no registro 5020 quando não existe FCI anterior ou quando o percentual subiu mais de 5 pontos em relação à anterior. |
| Status | `STATUS` | VARCHAR(20) | 20 | Situação da ficha. `'Gerada'` ao criar o registro, e é o estado de quem ainda vai para o arquivo; `'Mantido'` quando o percentual ficou dentro dos 5 pontos da FCI anterior — o produto não entra no arquivo e a ficha herda o `NUMERO_FCI` da anterior; `'Atualizado'` depois que o arquivo de retorno é lido e o número oficial da SEFAZ é gravado. |

A consulta da grade traz ainda `NUMERO_FCI` (número oficial da SEFAZ, gravado pelo retorno), `CODIGO_NCM` (de `MATERIA_PRIMA.CLASSIFICACAO_FISCAL`), `UNIDADE` (a abreviatura de `UNIDADE_FCI` correspondente à unidade de consumo) e `REFERENCIA`, todos usados no arquivo e no relatório, sem coluna visível na grade.

<a id="umov_emissao_etiqueta_produto"></a>

## `umov_emissao_etiqueta_produto` — Emissão de Etiquetas dos Produtos...

Tela só de impressão: monta uma lista de produtos e manda imprimir as etiquetas de cada um. Nada é gravado no banco — a grade é alimentada por um ClientDataSet em memória (`tbtemp`), criado vazio a cada Limpar e descartado ao fechar. Toda a tela é a grade `dbproduto` mais os botões Limpar, Imprimir e Sair. F10 imprime, F5 limpa, F4 (ou o botão da célula) abre a consulta de produtos, Delete apaga a linha depois de confirmar.

### Grade `dbproduto` — lista em memória, sem tabela

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Produto | `PRODUTO` | INTEGER |  | Código do produto a etiquetar, digitado ou escolhido na consulta (F4). Ao informar, o programa confere se o produto existe: existindo, traz a descrição e já põe Quantidade em 1; não existindo, limpa as três células da linha. Não é coluna de tabela — a lista só existe em memória (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição trazida do cadastro de produtos junto com o código. Coluna somente-leitura na grade. Não é coluna de tabela (calculado na consulta). |
| Quantidade | `QUANTIDADE` | INTEGER |  | Quantas etiquetas imprimir daquele produto. Nasce em 1 quando o produto é aceito. Zero ou negativo faz o programa avisar Quantidade de Etiquetas não Informado e apagar a linha logo após o post. Não é coluna de tabela (calculado na consulta). |

### Observações

- O botão Imprimir percorre a lista e chama a rotina de impressão de etiquetas uma vez por linha, passando produto e quantidade. Com a lista vazia, avisa que não existem itens selecionados e limpa a tela.

<a id="ucad_referencia"></a>

## `ucad_referencia` — Cadastro Mestre dos Produtos...

Cadastro da referência de produto na tabela `REFERENCIA`, chave `EMPRESA` + `REFERENCIA` (a chave é o próprio código alfanumérico digitado, não há sequencial). Painel único, sem abas nem grade. Agrupa a identificação da referência, os controles de numeração de lote de produção, os dados usados na etiqueta e no lote padrão, e a amarração com Produto, Grupo e SubGrupo — cada um com o código digitável e a descrição preenchida pelo sistema ao lado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Referência **·chave** | `REFERENCIA` | VARCHAR(18) | 18 |  | Código da referência, chave do registro. Ao sair do campo a tela refaz a consulta por este código: se existir, abre em edição; se não existir, entra em inclusão com o código digitado. Exigido no Gravar — vazio aborta com "Referência". F4 abre a consulta de referências. |
| Descrição da Referência | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da referência. Exigido no Gravar — vazio aborta com "Descrição da Referência". |
| Último Lote | `ULTIMO_LOTE` | INTEGER |  |  | Número do último lote de produção aberto para esta referência. Não é digitado no dia a dia: a Programação de Lote regrava este campo quando gera um lote com número maior que o guardado aqui. |
| Último Número | `ULTIMO_NUMERO` | INTEGER |  |  | Número final (última peça) do último lote gravado. Atualizado junto com Último Lote pela Programação de Lote; serve de ponto de partida para a numeração do lote seguinte. |
| % Lucro | `MARGEM_LUCRO` | DOUBLE PRECISION |  |  | Margem de lucro percentual da referência. |
| Referência Peças | `REFERENCIA_PECAS` | VARCHAR(18) | 18 |  | Código da referência das peças que compõem esta referência. Lido pela consulta de produtos para venda. |
| `cbtipo_custo` | `TIPO_CUSTO` | VARCHAR(10) | 10 |  | Tipo do custo da referência. Valores literais da lista: `Estimado` e `Orçado`. O NewRecord já grava `Estimado`. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de referência fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Peso Médio | `PESO_MEDIO` | DOUBLE PRECISION |  |  | Peso médio unitário da referência. Sai impresso na etiqueta de lote. |
| Capacidade | `CAPACIDADE` | VARCHAR(50) | 50 |  | Capacidade da referência, texto livre. |
| Características Descritivas | `OBSERVACAO` | BLOB |  |  | Texto descritivo livre da referência. Enter dentro do memo pula linha; dois Enters seguidos saem do campo. |
| Quantidade Padrão Lote | `QUANTIDADE_PADRAO_PRODUCAO_LOTE` | DOUBLE PRECISION |  |  | Quantidade padrão de um lote de produção desta referência. O NewRecord inicia em 1. É o valor que a consulta de produção por lote padrão carrega como quantidade sugerida. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Preenchido pelo sistema ao sair do campo Produto, com a descrição lida do cadastro de produtos. Não é digitado (calculado na consulta). |
| Produto | `PRODUTO` | INTEGER |  |  | Produto ao qual a referência pertence. Exigido no Gravar — vazio aborta com "Produto". O botão do campo abre a consulta de produtos e F3 abre o cadastro de produtos. Ao sair, busca o produto: achando, preenche a Descrição do Produto; não achando, limpa código e descrição. |
| Descrição do Grupo de Produto | `DESCRICAO_GRUPO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo Grupo. Não é digitado (calculado na consulta). |
| Grupo | `GRUPO` | INTEGER |  |  | Grupo de produto. Botão abre a consulta de grupos, F3 abre o cadastro de grupos. Ao sair, preenche a descrição do grupo e, em seguida, dispara a validação do SubGrupo — trocar o grupo revalida o subgrupo automaticamente. |
| SubGrupo | `SUBGRUPO` | INTEGER |  |  | SubGrupo dentro do grupo escolhido. Botão abre a consulta de subgrupos, F3 abre o cadastro. Ao sair, busca pelo par grupo mais subgrupo: achando, regrava o código e preenche a descrição; não achando, limpa os dois. |
| Descrição do SubGrupo | `DESCRICAO_SUBGRUPO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo SubGrupo. Não é digitado (calculado na consulta). |

<a id="ucad_grupo_produto"></a>

## `ucad_grupo_produto` — Cadastro dos Grupos dos Produtos...

Grava os grupos de produto na tabela GRUPO_PRODUTO, por empresa. Além da descrição, o grupo carrega três marcadores que valem para todos os produtos ligados a ele: a origem do produto (comercial ou de produção própria), se ele entra na FCI e se o pedido exige número de série. Tela de bloco único, sem abas nem grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do grupo. Proposto como MAX(CADASTRO)+1 da empresa; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Grupo | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Serve de referência no log do sistema. |
| Gera FCI | `GERA_FCI` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (produtos do grupo entram na Ficha de Conteúdo de Importação), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| Obrigar Número de Série no Pedido | `PREENCHER_NUMERO_SERIE_PEDIDO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` e passa a exigir o número de série no pedido para os produtos do grupo; desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| `cbtipo` | `TIPO` | VARCHAR(20) | 20 |  | Combo Tipo do Grupo. Grava o texto escolhido, sem tradução: `'Comercial'` ou `'Produção Propria'` (grafado assim, sem acento, no DFM e no NewRecord; o EnableValues está desligado, então a lista Values do DFM é ignorada). NewRecord inicia em `'Produção Propria'`. Campo não presente n |

<a id="ucad_subgrupo_produto"></a>

## `ucad_subgrupo_produto` — Cadastro do SubGrupo dos Produtos...

Cadastro do subgrupo de produto na tabela `SUBGRUPO_PRODUTO`, chave `EMPRESA` + `GRUPO` + `CADASTRO`. Painel único com quatro campos. Como no subgrupo de matéria-prima, o código do subgrupo é sequencial **dentro do grupo**: o Grupo precisa ser preenchido antes, senão não há número a sugerir.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do subgrupo, chave do registro junto com o grupo. A tela sugere o próximo número livre daquele grupo (maior `CADASTRO` da empresa naquele `GRUPO` mais um); com o grupo em branco o sugerido é zero. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de subgrupos. |
| Descrição do Grupo de Produto | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do **subgrupo** — o rótulo da tela repete por engano o texto do campo de grupo logo abaixo. Exigido no Gravar — vazio aborta com "Descrição do SubGrupo". |
| Descrição do Grupo de Produto | `DESCRICAO_GRUPO` | VARCHAR(50) | 50 |  | Descrição do grupo, preenchida pelo sistema ao sair do campo Grupo. Não é digitada (calculado na consulta). |
| Grupo **·chave** | `GRUPO` | INTEGER |  |  | Grupo de produto ao qual o subgrupo pertence. Exigido no Gravar — vazio aborta com "Grupo do Produto". Botão abre a consulta de grupos, F3 abre o cadastro. Ao sair, busca o grupo: achando, regrava o código e preenche a descrição; não achando, limpa os dois. É este campo que define a faixa de numeração do Cadastro. |

<a id="umov_servico_atendimento_produto"></a>

## `umov_servico_atendimento_produto` — Ordem de Serviço - Assistência Técnica

Ordem de serviço de assistência técnica sobre um produto, gravada na tabela `SERVICO_ATENDIMENTO_PRODUTO`, chave `EMPRESA` + `NUMERO`. Tela de painel único, sem grade, dividida em cinco blocos: Informações do Consumidor (quem usa o produto), Informações do Revendedor (o cliente que vendeu), Informações do Produto (o que apresentou defeito), Informações do Técnico (quem atende) e Orçamento (o custo do atendimento). Não há itens: os valores do orçamento são digitados diretamente. Botões próprios finalizam e estornam a ordem, mudando o STATUS.

### Campos

#### Ordem de Serviço - Assistência Técnica

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(15) | 15 |  | Situação da ordem de serviço, exibida como texto no cabeçalho, sem rótulo e sem digitação. Assume `'Pendente'` (padrão do NewRecord, atendimento em aberto) e `'Finalizado'` (gravado pelo botão Finalizar). Finalizar uma ordem já finalizada é recusado; se o total geral estiver zerado, a tela pergunta antes se o usuário quer informar um valor. O botão Estornar devolve para `'Pendente'` e só funciona sobre ordem `'Finalizado'`. Somente leitura. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da ordem de serviço, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `SERVICO_ATENDIMENTO_PRODUTO` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta ordens, F7 anterior, F8 próximo, F9 posiciona. |

#### Informações do Consumidor

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Consumidor | `NOME_CONSUMIDOR` | VARCHAR(70) | 70 |  | Nome do consumidor final, dono do produto. Digitado, não vem de cadastro: o consumidor não é cliente do sistema. Primeira validação do Gravar, é obrigatório. |
| Endereço | `ENDERECO_CONSUMIDOR` | VARCHAR(50) | 50 |  | Logradouro do consumidor, para o técnico ir até o local. Digitado. |
| Número | `NUMERO_ENDERECO_CONSUMIDOR` | VARCHAR(10) | 10 |  | Número do endereço do consumidor. Digitado. |
| Complemento | `COMPLEMENTO_CONSUMIDOR` | VARCHAR(40) | 40 |  | Complemento do endereço do consumidor. Digitado. |
| Bairro | `BAIRRO_CONSUMIDOR` | VARCHAR(40) | 40 |  | Bairro do consumidor. Digitado. |
| Nome da Cidade | `NOME_CIDADE_CONSUMIDOR` | VARCHAR(50) | 50 |  | Nome da cidade, trazido de `CIDADE` pelo Exit do código; não é digitado (calculado na consulta). |
| Cidade | `CIDADE_CONSUMIDOR` | INTEGER |  |  | Código da cidade do consumidor. Exigido no Gravar. Ao sair do campo, o sistema busca a cidade e preenche o nome e a sigla do estado; código inexistente limpa os três campos. F4 abre a consulta de cidades, F3 abre o cadastro. |
| Fone | `FONE_CONSUMIDOR` | VARCHAR(15) | 15 |  | Telefone do consumidor. Digitado. |
| Fax | `FAX_CONSUMIDOR` | VARCHAR(15) | 15 |  | Fax do consumidor. Digitado. |
| Celular | `CELULAR_CONSUMIDOR` | VARCHAR(15) | 15 |  | Celular do consumidor. Digitado. |
| CNPJ / CPF | `CNPJ_CPF_CONSUMIDOR` | VARCHAR(18) | 18 |  | CNPJ ou CPF do consumidor, no mesmo campo. Ao sair, o sistema conta os dígitos: só aceita 11 (CPF) ou 14 (CNPJ) e formata com a pontuação correspondente; qualquer outra quantidade é recusada, salvo quando o usuário está saindo pelo Sair ou pelo Limpar. Pode ficar vazio. |
| IE / RG | `IE_RG_CONSUMIDOR` | VARCHAR(18) | 18 |  | Inscrição estadual (pessoa jurídica) ou RG (pessoa física), no mesmo campo. Só é validado quando o documento acima tem 14 dígitos, ou seja, quando o consumidor é pessoa jurídica: nesse caso a inscrição é conferida contra o estado do consumidor e uma inscrição inválida aborta o Gravar. |
| Estado | `ESTADO_CONSUMIDOR` | VARCHAR(2) | 2 |  | Sigla do estado do consumidor, preenchida pelo Exit da cidade a partir do cadastro; não é digitada. É o estado usado na validação da inscrição estadual. (calculado na consulta) |

#### Informações do Revendedor

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Revendedor | `CLIENTE` | INTEGER |  |  | Código do cliente que revendeu o produto ao consumidor. Exigido no Gravar. Ao sair do campo, traz nome do revendedor e nome do contato do cadastro de cliente; código inexistente limpa os três. F4 abre a consulta de clientes, F3 abre o cadastro. |
| Nome do Contato | `NOME_CONTATO` | VARCHAR(50) | 50 |  | Contato no revendedor, preenchido pelo Exit do código do cliente a partir do campo `CONTATO` do cadastro. Pode ser sobrescrito. |
| Razão Social / Nome do Revendedor | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do revendedor, trazido do JOIN com `CLIENTE`; não é digitado (calculado na consulta). |

#### Informações do Produto

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de abertura da ordem de serviço. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. |
| Descrição da Referência | `DESCRICAO_REFERENCIA` | VARCHAR(50) | 50 |  | Descrição da referência do produto, trazida do cadastro de referências pelo Exit e pela consulta F4; não é digitada (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência do produto com defeito. Exigida no Gravar. Conferida contra o cadastro de referências: não existindo, referência e descrição são limpas. F4 abre a consulta de referências, F3 abre o cadastro. |
| Defeito(s) Reclamado(s) | `DESCRICAO` | VARCHAR(150) | 150 |  | Relato do defeito, em memo. Exigido no Gravar. A tela avisa e corta o texto ao chegar em 150 caracteres, para não estourar o tamanho da coluna. Vira a referência do log do sistema. |
| Número de Série | `NUMERO_SERIE` | INTEGER |  |  | Número de série da peça atendida, digitado. Não é exigido no Gravar nem conferido contra cadastro. |

#### Informações do Técnico

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nome do Assistente Técnico | `NOME_TECNICO` | VARCHAR(70) | 70 |  | Nome do assistente técnico, trazido do JOIN pelo Exit do código; não é digitado (calculado na consulta). |
| Técnico | `TECNICO` | INTEGER |  |  | Código do assistente técnico que atende o chamado. É buscado no cadastro de fornecedores: o técnico é cadastrado como fornecedor, não como funcionário. Exigido no Gravar, é a última validação. Ao sair do campo, traz o nome; código inexistente limpa código e nome. F4 abre a consulta, F3 abre o cadastro. |
| Observações | `OBSERVACAO` | BLOB |  |  | Observações do atendimento, em memo. Coluna BLOB, sem limite prático de tamanho, ao contrário do campo de defeito. Não é exigida no Gravar. |

#### Orçamento

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| R$ Deslocamento | `VALOR_DESLOCAMENTO` | DOUBLE PRECISION |  |  | Valor cobrado pelo deslocamento do técnico até o consumidor. Digitado; ao sair do campo, o total geral é recalculado. |
| Total Peças | `TOTAL_PECAS` | DOUBLE PRECISION |  |  | Valor das peças usadas no conserto. Digitado como um montante único — a tela não tem grade de peças. Ao sair do campo, o total geral é recalculado. |
| Total Mão Obra | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  |  | Valor da mão de obra do serviço. Digitado; ao sair do campo, o total geral é recalculado. |
| Total Geral | `TOTAL_GERAL` | DOUBLE PRECISION |  |  | Soma de deslocamento mais peças mais mão de obra. Calculado pela tela a cada saída dos três campos acima, não digitado. Total geral zerado faz o botão Finalizar perguntar se o usuário quer informar um valor antes de encerrar. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Forma de Cobrança | `FORMA_COBRANCA` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Forma de Cobrança”. Função não verificada no código. |

<a id="umov_pedido_venda"></a>

## `umov_pedido_venda` — Pedido de Clientes...

Tela central de venda: grava o cabeçalho em `PEDIDO_VENDA` e os itens em `IT_PEDIDO_VENDA`, com os dados de produto vindos de `MATERIA_PRIMA`, a alíquota de IPI de `CLASSIFICACAO_FISCAL`, o CST de IPI alternativo de `NATUREZA_OPERACAO` e o lote gerado de `LOTE`. O cabeçalho fica na moldura de cima; abaixo, um PageControl com as abas Produtos (a grade de itens e os totais de imposto), Financeiro, Transportadora e Instruções Produção \ Observações. Cliente, natureza, representante, transportadora, banco, instrução de cobrança, modalidade de frete e atendente são códigos com busca por F4 e cadastro por F3; o Exit de cada um traz os dados descritivos e limpa tudo quando o código não existe.

**A tela é multifunção.** O marcador `ORCAMENTO` divide o comportamento em dois: com `'2'` (Orçamento) some a previsão de entrega, somem as colunas Lote, Faturada e Status da grade, aparece a coluna Entrega, some o bloco de motor e de instrução de montagem, a aba Financeiro do pedido é trocada pela aba Financeiro do orçamento (Validade, Prazo de Entrega e Condições de Pagamento) e os botões Liberar e Estornar ficam desligados. Com `'1'` (pedido normal) vale o inverso. As obrigatoriedades também mudam: no orçamento só cliente, emissão e natureza são exigidos; no pedido exigem-se ainda representante, indicador de pagamento, transportadora, modalidade de frete e volume.

O `STATUS` do cabeçalho — que não tem campo próprio na tela, só aparece dentro de `STATUS_RESUMO` — percorre `Pendente` (recém-lançado, alterável), `Liberado` (liberado para faturamento, com data prevista) e `Faturado` (todos os itens faturados; o BeforePost recusa qualquer alteração com "Impossivel alterar pedidos de venda Faturados"). O `STATUS_PRODUCAO` é uma segunda trilha, independente: vazio, `Encaminhado` (botão Encaminhar) e `Finalizado` (gravado pela tela `umov_pedido_venda_finalizar`).

### Campos

#### Pedido de Clientes...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus_producao` | `STATUS_RESUMO` | VARCHAR(100) | 100 |  | Faixa de status no alto da tela, sem legenda (TDBText, nunca digitável). Campo calculado no Delphi: junta `STATUS` + (quando Liberado e com data) `" p/ " + DATA_PREVISTA_FATURAMENTO` + (quando houver) `" e " + STATUS_PRODUCAO`. Lê-se por exemplo "Liberado p/ 10/03/2026 e Encaminhado" (calculado na consulta). |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do pedido, chave do registro junto com `EMPRESA`. Ao sair do campo a tela recarrega aquele pedido; se não existir e o número for maior que o último gravado, abre a escolha entre gerar o próximo número ou usar o digitado. Em inclusão pelo próximo número, o Gravar substitui o conteúdo por `MAX(NUMERO) + 1` da empresa. F4 abre a consulta de pedidos. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente, aponta para `CLIENTE.CADASTRO`. Obrigatório no Gravar, tanto em pedido quanto em orçamento. O Exit é o mais pesado da tela: abre a consulta de contas a receber em atraso do cliente, traz nome, endereço, CNPJ, IE, fone e contato, copia o marcador de consumidor final e, só em registro novo, ainda traz representante, comissão, transportadora, redespacho, banco, instrução de cobrança, natureza de operação e os quinze dias de vencimento do cadastro do cliente. Também define a alíquota de ICMS do pedido a partir de `ALIQUOTA_ESTADO` do estado do cliente. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido de `CLIENTE.NOME` (calculado na consulta). |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | CFOP do pedido, aponta para `NATUREZA_OPERACAO.CADASTRO`. Obrigatório no Gravar. Validado contra o estado do cliente: cliente do mesmo estado da empresa só aceita CFOP começando em 1 ou 5; cliente de fora só aceita 2, 6 ou 7 — fora disso a natureza é limpa com aviso. Depois de gravada não pode mais ser trocada ("Impossível alterar a Natureza de Operação"), porque o valor fica travado em `LAST_NATUREZA_OPERACAO`. É esta natureza que decide se o pedido gera duplicata, gera comissão, controla estoque e se usa preço de custo. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição do CFOP, trazida de `NATUREZA_OPERACAO.DESCRICAO` pelo Exit da natureza. Não é digitada. (calculado na consulta) |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do pedido. O NewRecord já grava a data de hoje. Obrigatória no Gravar: data inválida aborta com "Data da Emissão não Informada ou Inválida". |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante, aponta para `REPRESENTANTE.CADASTRO`. Obrigatório no Gravar de pedido; em orçamento não é exigido. Em registro novo vem do vendedor do cadastro do cliente. Se o representante estiver com `INATIVO = '2'`, a tela avisa mas deixa seguir. Trocar o representante puxa a comissão dele. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, trazido de `REPRESENTANTE.NOME` pelo Exit. Não é digitado. (calculado na consulta) |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete cobrado no pedido. Entra no `TOTAL` e, salvo quando a natureza tem desconto de ICMS Suframa, também soma na `BASE_ICMS` do cabeçalho. O BeforePost trabalha por diferença, guardando o valor anterior em `LAST_VALOR_FRETE` para não somar duas vezes. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Mesmo tratamento do frete: soma no total e na base de ICMS por diferença sobre `LAST_VALOR_SEGURO`. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas acessórias. Mesmo tratamento do frete, por diferença sobre `LAST_VALOR_DESPESA`. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto do pedido. Não é digitado de fato: a cada item gravado ou excluído a tela regrava a soma dos pesos dos itens. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido do pedido, somado dos itens da mesma forma que o peso bruto. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos totais dos itens, sem frete, seguro, despesas e impostos. Recalculado a cada item gravado ou excluído. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total geral do pedido: produtos mais frete, seguro e despesas, menos o desconto. Recalculado pelos itens e ajustado por diferença no BeforePost do cabeçalho. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Nome do contato no cliente. Quando está vazio, o Exit do cliente traz o contato do cadastro; se já houver algo digitado, é preservado. |
| Ordem de Compra | `NUMERO_PEDIDO` | VARCHAR(15) | 15 |  | Número da ordem de compra do cliente — o pedido no papel dele. Apesar do nome da coluna, não tem relação com o `NUMERO` do pedido de venda. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante. Vem do cadastro do cliente ou do representante, mas é zerado sempre que a natureza de operação não gera comissão (`GERA_COMISSAO <> '2'`) ou o cliente não gera. Só é repuxado quando o representante muda. |
| Previsão Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  |  | Data prevista de entrega do pedido. O campo e o rótulo são desabilitados quando o registro é orçamento. |
| Tipo de Venda | `TIPO_VENDA` | VARCHAR(25) | 25 |  | Radiogroup de três opções, gravadas por extenso: `Direta`, `Representante` e `Tele - Marketing`. O NewRecord marca `Direta`. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes do pedido. Obrigatório no Gravar de pedido (zero aborta com "Volume do Pedido"); em orçamento não é exigido. Também é regravado pela soma dos itens. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente, trazido de `CLIENTE.CNPJ_CPF` (calculado na consulta). |
| Insc.Estad. / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do cliente, de `CLIENTE.IE_RG`. Pesa no imposto: cliente de fora do estado sem inscrição estadual é tratado como consumidor final no cálculo do ICMS (calculado na consulta). |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço do cliente montado no SELECT como `ENDERECO - BAIRRO - CIDADE - ESTADO`. Somente leitura (calculado na consulta). |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente, de `CLIENTE.FONE` (calculado na consulta). |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem do pedido, somada dos itens a cada gravação ou exclusão de item. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marcador `'2'` = sim, `'1'` = não. O NewRecord grava `'1'` e o Exit do cliente sobrescreve com o `VENDA_CONSUMIDOR_FINAL` do cadastro — por isso o controle está com `ReadOnly`, é informativo. É a chave do cálculo interestadual: define qual alíquota de `ALIQUOTA_ESTADO` entra, se há partilha e FCP de destino, e faz o SELECT dos itens buscar o CST de IPI na natureza em vez de no produto. |
| Pedidos: | `REFERENCIA` | VARCHAR(20) | 20 |  | Faixa somente-informativa no rodapé, ligada ao item corrente da grade: mostra a referência do produto da linha (de `MATERIA_PRIMA`). Ela e os dois campos vizinhos ficam vermelhos quando o estoque do produto é menor que a quantidade já pedida, e somem quando o registro é orçamento. |

#### Produtos

Totais de imposto do pedido, ao lado da grade de itens. Nenhum é digitado: o AfterPost e o AfterDelete dos itens varrem `IT_PEDIDO_VENDA` e regravam todos de uma vez.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Soma das bases de ICMS dos itens, mais frete, seguro e despesas quando a natureza não tem desconto de ICMS Suframa. Calculado. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Soma do ICMS dos itens. Calculado. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Soma das bases de IPI dos itens. Calculado. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Soma do IPI dos itens. Calculado. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Soma do desconto de ICMS dos itens — o valor dispensado por redução de base ou Suframa. Calculado. |
| Base S.T. | `BASE_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Soma das bases de substituição tributária dos itens. Calculado. |
| Valor S.T. | `VALOR_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Soma do ICMS de substituição tributária dos itens. Calculado. |

#### Financeiro

As três últimas linhas (`VALIDADE`, `PRAZO_ENTREGA`, `CONDICAO_PAGAMENTO`) não ficam na mesma aba das demais: elas estão na aba Financeiro do orçamento, que só aparece quando `ORCAMENTO = '2'`. As demais estão na aba Financeiro do pedido, que só aparece quando `ORCAMENTO = '1'`. As duas abas têm a mesma legenda, e nunca são visíveis ao mesmo tempo.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  |  | Código do banco de cobrança, aponta para `BANCO`. Em registro novo vem do cadastro do cliente. O Exit traz o nome; código inexistente limpa os dois. F3 abre o cadastro de bancos. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, trazido de `BANCO.NOME` pelo Exit. Não é digitado. (calculado na consulta) |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução de cobrança, trazida de `INSTRUCAO_COBRANCA.DESCRICAO` pelo Exit do código. Não é digitada. (calculado na consulta) |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança do boleto, aponta para `INSTRUCAO_COBRANCA`. Em registro novo vem do cadastro do cliente. Código inexistente limpa o campo e a descrição. |
| Indicador Pagto | `INDICADOR_FORMA_PAGAMENTO` | INTEGER |  |  | Indicador da forma de pagamento da NF-e (à vista, a prazo, etc.), aponta para o cadastro de indicadores. O NewRecord já grava o cadastro `1`. Obrigatório no Gravar de pedido: vazio aborta e leva o foco para a aba Financeiro. O `OnSetText` valida contra a tabela e limpa o par código/descrição quando não encontra. |
| Descrição do Indicador da Forma de Pagamento | `DESCRICAO_INDICADOR_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição do indicador, gravada junto pelo `OnSetText` e pelo NewRecord (calculado na consulta). |
| Vencimentos | `DIAS_01` | INTEGER |  |  | Primeiro prazo de vencimento, em dias corridos a contar da emissão. É o único da série com legenda na tela — "Vencimentos" encabeça as quinze caixas. Em registro novo vem de `CLIENTE.DIAS_VENCIMENTO_01`. Obrigatório quando a natureza de operação gera duplicata (`GERA_DUPLICATA = '2'`): zero aborta o Gravar com "Dia de Vencimento do Pedido". |
| `edtdias_02` | `DIAS_02` | INTEGER |  |  | Segundo prazo de vencimento, em dias. Caixa sem legenda própria, na sequência de "Vencimentos". Em registro novo vem de `CLIENTE.DIAS_VENCIMENTO_02`. |
| `edtdias_03` | `DIAS_03` | INTEGER |  |  | Terceiro prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_03` em registro novo. |
| `edtdias_04` | `DIAS_04` | INTEGER |  |  | Quarto prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_04` em registro novo. |
| `edtdias_05` | `DIAS_05` | INTEGER |  |  | Quinto prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_05` em registro novo. |
| `edtdias_06` | `DIAS_06` | INTEGER |  |  | Sexto prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_06` em registro novo. |
| `edtdias_07` | `DIAS_07` | INTEGER |  |  | Sétimo prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_07` em registro novo. |
| `edtdias_08` | `DIAS_08` | INTEGER |  |  | Oitavo prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_08` em registro novo. |
| `edtdias_09` | `DIAS_09` | INTEGER |  |  | Nono prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_09` em registro novo. |
| `edtdias_10` | `DIAS_10` | INTEGER |  |  | Décimo prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_10` em registro novo. |
| `edtdias_11` | `DIAS_11` | INTEGER |  |  | Décimo primeiro prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_11` em registro novo. |
| `edtdias_12` | `DIAS_12` | INTEGER |  |  | Décimo segundo prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_12` em registro novo. |
| `edtdias_13` | `DIAS_13` | INTEGER |  |  | Décimo terceiro prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_13` em registro novo. |
| `edtdias_14` | `DIAS_14` | INTEGER |  |  | Décimo quarto prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_14` em registro novo. |
| `edtdias_15` | `DIAS_15` | INTEGER |  |  | Décimo quinto e último prazo de vencimento, em dias. Vem de `CLIENTE.DIAS_VENCIMENTO_15` em registro novo. |
| Validade | `VALIDADE` | VARCHAR(50) | 50 |  | Prazo de validade da proposta, em texto livre. Só existe na aba Financeiro do orçamento, portanto só é alcançável com `ORCAMENTO = '2'`. |
| Prazo de Entrega | `PRAZO_ENTREGA` | VARCHAR(50) | 50 |  | Prazo de entrega prometido, em texto livre. Campo exclusivo do orçamento. |
| Condições de Pagamento | `CONDICAO_PAGAMENTO` | VARCHAR(50) | 50 |  | Condições de pagamento por extenso, para sair impresso na proposta. Campo exclusivo do orçamento — no pedido quem manda são os quinze campos de dias. |

#### Transportadora

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora, aponta para `TRANSPORTADORA.CADASTRO`. Obrigatório no Gravar de pedido; em orçamento não é exigido. Em registro novo vem do cadastro do cliente. O Exit traz nome, CNPJ, fone e endereço e, quando a transportadora informada difere da do cadastro do cliente, oferece atualizar o cadastro do cliente por UPDATE direto. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, de `TRANSPORTADORA.NOME`. Somente leitura (calculado na consulta). |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da segunda transportadora, a de redespacho; usa o mesmo cadastro `TRANSPORTADORA`. Opcional, mas preenchê-lo torna o tipo de redespacho obrigatório. O Exit também oferece atualizar o redespacho do cadastro do cliente. |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho (o rótulo da tela é o mesmo da transportadora principal, repetido). Somente leitura (calculado na consulta). |
| Frete Comb. | `VALOR_FRETE_COMBINADO` | DOUBLE PRECISION |  |  | Valor do frete combinado à parte com a transportadora. Só cobrado quando `MODALIDADE_FRETE = 0`: nesse caso o Gravar pergunta se deseja informar, e o botão Liberar aborta de vez se o valor estiver zerado. |
| Nome do Contato | `NOME_CONTATO_FRETE_COMBINADO` | VARCHAR(25) | 25 |  | Nome do contato na transportadora para o frete combinado. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete da NF-e, aponta para o cadastro `MODALIDADE_FRETE`. Obrigatório no Gravar de pedido. O `OnSetText` valida contra a tabela e limpa código e descrição quando não encontra. O valor `0` é o que dispara a exigência do frete combinado. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade, gravada junto pelo `OnSetText`. Somente leitura (calculado na consulta). |
| CNPJ / CPF | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF da transportadora, trazido pelo Exit do código. Somente leitura (calculado na consulta). |
| CNPJ / CPF | `CNPJ_CPF_REDESPACHO` | VARCHAR(18) | 18 |  | CNPJ ou CPF da transportadora de redespacho. Somente leitura (calculado na consulta). |
| Endereço | `ENDERECO_COMPLETO_TRANSP` | VARCHAR(164) | 164 |  | Endereço completo da transportadora, trazido pelo Exit do código. Somente leitura (calculado na consulta). |
| Endereço | `ENDERECO_COMPLETO_REDESPACHO` | VARCHAR(164) | 164 |  | Endereço completo da transportadora de redespacho. Somente leitura (calculado na consulta). |
| Fone | `TELEFONE_TRANSPORTADORA` | VARCHAR(15) | 15 |  | Telefone da transportadora. Somente leitura (calculado na consulta). |
| Fone | `TELEFONE_REDESPACHO` | VARCHAR(15) | 15 |  | Telefone da transportadora de redespacho. Somente leitura (calculado na consulta). |

#### Instruções Produção \ Observações

O memo e as quatro marcas de produção só aparecem em pedido; com `ORCAMENTO = '2'` todos ficam invisíveis, junto com os quatro combos de motor.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Observações | `OBSERVACAO_01` | VARCHAR(67) | 67 |  | Primeira das três linhas de observação livre do pedido; a legenda "Observações" vale para as três. Sai impressa no pedido e na proposta. |
| `edtobservacao_02` | `OBSERVACAO_02` | VARCHAR(67) | 67 |  | Segunda linha de observação livre, sem legenda própria. |
| `edtobservacao_03` | `OBSERVACAO_03` | VARCHAR(67) | 67 |  | Terceira linha de observação livre, sem legenda própria. |
| Instrução de Montagem | `OBSERVACAO_PRODUCAO` | VARCHAR(240) | 240 |  | Instruções de montagem que acompanham o pedido na fábrica. Quando está vazio, o Exit do cliente o preenche com as quatro preferências de produto do cadastro do cliente (`PREFERENCIA_PRODUTO_01` a `04`), uma por linha. O Gravar acrescenta ao final `" Lote(s) Gerado(s): "` com os números dos lotes criados automaticamente. O mesmo texto é editável pela janela `umov_pedido_venda_instrucao_montagem`. |
| Ligar Motor até na Chave | `LIGAR_MOTOR_CHAVE` | VARCHAR(1) | 1 |  | Marca de instrução de produção: `'2'` = marcado, `'1'` = desmarcado. O NewRecord grava `'1'`. |
| Embalagem Exportação | `EMBALAGEM_EXPORTACAO` | VARCHAR(1) | 1 |  | Marca de instrução de produção: `'2'` = marcado, `'1'` = desmarcado. O NewRecord grava `'1'`. |
| Equipamento Montado | `EQUIPAMENTO_MONTADO` | VARCHAR(1) | 1 |  | Marca de instrução de produção: `'2'` = marcado, `'1'` = desmarcado. O NewRecord grava `'1'`. |
| Chave Elétrica de Segurança 24V | `OUTROS` | VARCHAR(1) | 1 |  | Apesar do nome genérico da coluna, é a marca de chave elétrica de segurança 24V: `'2'` = marcado, `'1'` = desmarcado. O NewRecord grava `'1'`. |

#### Pedido de Clientes... (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Orçamento | `ORCAMENTO` | VARCHAR(1) | 1 |  | Marca que decide se o registro é orçamento ou pedido: `'2'` = orçamento, `'1'` = pedido de venda. O NewRecord grava `'1'`. É o campo que reconfigura a tela inteira — abas, colunas da grade, campos visíveis, botões de liberação e lista de obrigatórios. Também é filtrado no cálculo de `QUANTIDADE_PEDIDO`, que ignora orçamentos. |
| Pedidos: | `QUANTIDADE_PEDIDO` | DOUBLE PRECISION |  |  | Faixa informativa do rodapé: quanto do produto da linha corrente já está pedido — subconsulta que soma `QUANTIDADE` de todos os itens de pedidos não-orçamento com `STATUS` em (`Pendente`, `Liberado`). Não é digitado; fica vermelho quando maior que o estoque. Some quando o registro é orçamento (calculado na consulta). |
| Estoque: | `SALDO` | DOUBLE PRECISION |  |  | Faixa informativa do rodapé: saldo em estoque do produto da linha corrente, de `MATERIA_PRIMA.SALDO`. Não é digitado; fica vermelho quando menor que o já pedido. Some quando o registro é orçamento. |
| Atendente | `FUNCIONARIO` | INTEGER |  |  | Código do funcionário que atendeu, aponta para `FUNCIONARIO.CADASTRO`. É a **primeira** validação do Gravar e vale para pedido e orçamento: vazio aborta com "Atendente do Pedido". O Exit traz o nome; código inexistente limpa os dois. |
| Nome do Atendente | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 |  | Nome do atendente, trazido de `FUNCIONARIO.NOME` pelo Exit. Não é digitado (calculado na consulta). |

### Grade `dbpedido_venda` — tabela IT_PEDIDO_VENDA

Da coluna CST ICMS em diante nada é digitável: toda a parte fiscal é recalculada no BeforePost do item, a partir do produto, da natureza de operação, do estado do cliente e da marca de consumidor final. O cursor só passa por Código, Natureza, Ext., Complemento, Lote, Quantidade e Valor; ao sair de Valor (ou de Faturada, conforme as colunas visíveis) a grade já abre uma linha nova. `SEQ` é sequencial por pedido, gerado no NewRecord como `MAX(SEQ) + 1`.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto, aponta para `MATERIA_PRIMA.CADASTRO`; F4 (reticências) abre a consulta de produtos. O `OnSetText` só aceita produto com `TIPO_PRODUTO = '2'` (produto, não material), `INATIVO = '1'` e classificação fiscal preenchida — cada recusa tem seu aviso próprio. Aceito o produto, ele preenche descrição, unidade, referência, classificação fiscal, CST de ICMS e de IPI, quantidade 1, saldo e quantidade pedida, e o preço (preço de custo quando a natureza usa custo, senão preço de venda). Ainda avisa quando o produto incide substituição tributária ou está cadastrado como mercadoria para revenda. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, de `MATERIA_PRIMA.REFERENCIA`. Não é digitada; é usada para conferir se o lote informado é da mesma referência do produto. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, de `MATERIA_PRIMA.DESCRICAO` (calculado na consulta). Não é digitada. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade de medida do produto, vinda de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Não é digitada. (calculado na consulta) |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | CFOP do item. O NewRecord copia a natureza do cabeçalho, mas ela pode ser trocada linha a linha. É validada contra o tipo do produto ("CFOP Incompatível com o tipo do Produto" cancela o item) e contra a existência em `NATUREZA_OPERACAO`. Um pedido não pode ter mais de três legislações diferentes somadas entre os itens. |
| Ext. | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 | Extensão do CFOP (desdobramento cadastrado para aquela natureza). O `OnSetText` valida o par natureza + extensão no cadastro de extensões e limpa quando não existe. O NewRecord copia a extensão do cabeçalho. |
| Complemento | `COMPLEMENTO_PRODUTO` | VARCHAR(50) | 50 | Texto acrescentado à descrição do produto na nota. É aqui que a tela de finalização concatena o número de série do equipamento. |
| Lote | `LOTE` | INTEGER |  | Número do lote de produção que atende o item, aponta para `LOTE.NUMERO`; F4 abre a consulta de lotes. Só aceita lote com `TIPO_LOTE = 'Lote'` (pré-lote é recusado), só para produto com `CONTROLA_LOTE = '2'`, e só se a referência do lote for igual à do produto. Gravar o item mexe em `LOTE.EMPENHADA`: soma a quantidade no lote novo e devolve ao lote anterior quando o número muda; passar do saldo do lote aborta a gravação. A coluna some quando o registro é orçamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade pedida do item. O `OnSetText` só aceita fração quando o produto tem `PERMITE_QUANTIDADE_FRACIONADO = '2'`; senão zera com aviso. Multiplicada pelo valor forma o Total, e é o que empenha o lote e dispara a geração de lote automático. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário. Vem preenchido do cadastro do produto (custo ou venda, conforme a natureza) e pode ser alterado, mas o `OnSetText` compara com `PRECO_MINIMO` e `PRECO_MAXIMO` do produto: fora da faixa pede confirmação e, se negada, devolve o preço de venda de cadastro. |
| Total | `TOTAL` | DOUBLE PRECISION |  | `QUANTIDADE x VALOR`, gravado pelo BeforePost. Total zerado faz o item ser excluído no AfterPost com "Total do Produto não informado". Não é digitado. |
| Faturada | `QUANTIDADE_FATURADA` | DOUBLE PRECISION |  | Quantidade do item já faturada em nota. Zerada no NewRecord e atualizada pelo faturamento, não por esta tela. É ela que define o status do item e do pedido: quando a soma de `QUANTIDADE - QUANTIDADE_FATURADA` de todos os itens chega a zero, o cabeçalho vira `Faturado`. A coluna some quando o registro é orçamento. |
| ` ` | `STATUS` | VARCHAR(10) | 10 | Coluna sem título, desenhada como ícone (semáforo do ImageList). Campo calculado no Delphi a cada linha: `Pendente` quando nada foi faturado, `Parcial` quando a faturada é menor que a pedida, `Integral` quando alcançou a pedida. Somente leitura; some quando o registro é orçamento. |
| Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  | Previsão de entrega do item, distinta da previsão do cabeçalho. Ao contrário das demais, esta coluna só fica visível quando o registro **é** orçamento. |
| CST ICMS | `TRIBUTO` | VARCHAR(8) | 8 | Código da situação tributária do ICMS do item, aponta para o cadastro `TRIBUTO`. Somente leitura: o BeforePost o escolhe entre o CST da natureza de operação (quando preenchido e diferente de `000`) e o do produto e, em venda interestadual de produto importado (CST começando em 1, 2, 6 ou 7), troca os dois últimos dígitos pelo CST de `ALIQUOTA_ESTADO`. |
| % ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS aplicada ao item. Somente leitura: o NewRecord copia a do cabeçalho e o BeforePost a substitui pela alíquota de `ALIQUOTA_ESTADO` correspondente ao estado do cliente, ao tipo de destinatário e à condição de consumidor final. |
| Base Icms | `BASE_ICMS` | DOUBLE PRECISION |  | Base de cálculo do ICMS do item, apurada no BeforePost (zerada antes e recomposta com as reduções da natureza). Somente leitura. |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  | ICMS do item, apurado no BeforePost. Somente leitura. |
| % Subst. | `PERCENTUAL_ICMS_SUBSTITUICAO` | DOUBLE PRECISION |  | Alíquota interna usada no cálculo da substituição tributária. Zerada no NewRecord e recalculada no BeforePost. Somente leitura. |
| % MVA Subst. | `MVA_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | Margem de valor agregado da substituição tributária, vinda de `IMPOSTOS_CLASSIFICACAO_FISCAL.MVA` pelo NCM do produto e pelo estado do cliente. Produto com ST e estado sem MVA cadastrado gera aviso na gravação. Somente leitura. |
| Base Subst. | `BASE_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | Base de cálculo da substituição tributária do item. Calculada no BeforePost. Somente leitura. |
| Valor Subst. | `VALOR_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | ICMS de substituição tributária do item. Calculado no BeforePost. Somente leitura. |
| CST IPI | `TRIBUTO_IPI` | VARCHAR(2) | 2 | Código da situação tributária do IPI. Não vem de coluna fixa: o SELECT escolhe entre `NATUREZA_OPERACAO.TRIBUTO_IPI` (quando o pedido é venda a consumidor final) e `MATERIA_PRIMA.TRIBUTO_IPI` (nos demais casos). CST menor que 50 gera aviso na gravação do item. Somente leitura. |
| % IPI | `ALIQUOTA_IPI` | DOUBLE PRECISION |  | Alíquota de IPI do NCM do produto, vinda de `CLASSIFICACAO_FISCAL.IPI` pelo join (calculado na consulta). Somente leitura. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  | Base de cálculo do IPI do item, apurada no BeforePost. Somente leitura. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  | IPI do item, apurado no BeforePost. Somente leitura. |
| % ICMS Dest. | `ALIQUOTA_ICMS_CALCULADO_DESTINO` | DOUBLE PRECISION |  | Alíquota efetiva do ICMS de destino, reconstituída pelo campo calculado do Delphi a partir do valor de ICMS de destino, da base de destino e do percentual de partilha; fica zero quando não há partilha. Faz parte do bloco de partilha interestadual, que a tela só mostra quando o estado do cliente é diferente do estado da empresa e o pedido está marcado como venda a consumidor final. Somente leitura (calculado na consulta). |
| % Partilha | `PERCENTUAL_PARTILHA` | DOUBLE PRECISION |  | Percentual da partilha do DIFAL entre origem e destino, devolvido pela rotina `interestadual_percentual_partilha`. Do bloco interestadual. Somente leitura. |
| Valor ICMS Dest. | `VALOR_ICMS_INTER_DESTINO` | DOUBLE PRECISION |  | Parcela do DIFAL devida ao estado de destino. Somado nos itens e regravado no cabeçalho pelo BeforePost do pedido. Do bloco interestadual. Somente leitura. |
| % FCP Destino | `ALIQUOTA_FCP_DESTINO` | DOUBLE PRECISION |  | Alíquota do Fundo de Combate à Pobreza do estado de destino, devolvida por `interestadual_aliquota_fcp_destino`. Do bloco interestadual. Somente leitura. |
| Valor FCP Dest. | `VALOR_FCP_DESTINO` | DOUBLE PRECISION |  | Valor do FCP devido ao estado de destino. Também é somado e regravado no cabeçalho. Do bloco interestadual. Somente leitura. |
| % Lucro | `PERCENTUAL_LUCRO` | DOUBLE PRECISION |  | Margem sobre o último custo: `(TOTAL / ULTIMO_CUSTO - 1) x 100`, zero quando falta um dos dois. Campo calculado no Delphi, recalculado a cada linha exibida (calculado na consulta). |
| Lote Gerado | `LOTE_AUTOMATICO` | INTEGER |  | Número do lote de programação criado automaticamente para o item, trazido pelo join com `LOTE` por `NUMERO_PEDIDO_VENDA` + `SEQ_IT_PEDIDO_VENDA`. Só existe para produto com `GERA_PROGRAMACAO_LOTE_AUTO = '2'` e natureza que controla estoque; o lote é gerado no Gravar e refeito quando a quantidade muda, desde que ainda não tenha havido baixa. Somente leitura (calculado na consulta). |

Fluxo de liberação: o botão Liberar só age sobre pedido `Pendente`, confere saldo de todos os produtos que controlam estoque, exige que os lotes automáticos já estejam baixados, recusa pedido com faturamento parcial, pede a data prevista de faturamento e então grava `STATUS = 'Liberado'` com `DATA_PREVISTA_FATURAMENTO`. O Estornar faz o caminho de volta, só para pedido `Liberado`. O Encaminhar grava `STATUS_PRODUCAO = 'Encaminhado'` com `DATA_STATUS_ENCAMINHAMENTO`, e o estorno de encaminhamento limpa os dois.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |
| Motor Fase | `MOTOR_FASE` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Motor Fase”. Função não verificada no código. |
| Motor Voltagem (V) | `MOTOR_VOLTAGEM` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Motor Voltagem (V)”. Função não verificada no código. |
| Motor Potência (Cv) | `MOTOR_POTENCIA` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Motor Potência (Cv)”. Função não verificada no código. |
| Motor Ciclos (Hz) | `MOTOR_CICLOS` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Motor Ciclos (Hz)”. Função não verificada no código. |
| Extensão da CFOP | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Extensão da CFOP”. Função não verificada no código. |

<a id="umov_orcamento"></a>

## `umov_orcamento` — Orçamento de Vendas...

Grava o orçamento de venda: cabeçalho com cliente, natureza de operação e endereço na tabela `ORCAMENTO`, itens na grade em `IT_ORCAMENTO` (descrição e referência vêm do JOIN com `MATERIA_PRIMA`). Os totais, impostos, pesos, volume e cubagem do cabeçalho não são digitados: são recalculados a cada item gravado. A tela tem duas abas — Produtos, com a grade e os quadros de impostos, e Vencimentos, com as condições comerciais e a observação.

O número é sequencial por empresa (`MAX(NUMERO) + 1`). Ao gravar, exige cliente, data de emissão válida, cidade do cliente e natureza de operação, recusa a troca da natureza depois que o orçamento já foi gravado com uma (compara com `LAST_NATUREZA_OPERACAO`), e em seguida chama a impressão.

#### Orçamento de Vendas...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do orçamento. Ao sair do campo, se o número não existir a tela pergunta se é cadastro novo e assume o próximo sequencial (maior número da empresa mais um) ou o número digitado. F4 abre a consulta de orçamentos; F7, F8 e F9 navegam. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente. Ao sair do campo, traz do cadastro nome, endereço, bairro, CEP, cidade, estado, CNPJ/CPF, IE/RG, fone, contato e o marcador de consumidor final, e define a alíquota de ICMS pela tabela de alíquotas do estado. Se o código não existir, limpa todos esses campos. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | CFOP da operação. Ao sair, valida contra o estado do cliente: cliente dentro do estado só aceita natureza iniciada em `1` ou `5`; fora do estado, só `2` ou `6`. Reprovando, limpa o campo e a descrição. Em orçamento novo já vem com a natureza padrão do cliente. Não pode ser trocada depois de gravada. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição do CFOP, buscada da natureza ao sair do campo Natureza. Não é digitada. (calculado na consulta) |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS do orçamento. Preenchida pelo Exit do cliente a partir da tabela de alíquotas por estado: `ICMS_ORIGEM_ESTADO_CONS_FINAL` quando é venda a consumidor final, `ICMS_DESTINO_ESTADO` quando o cliente é jurídico de fora do estado e com IE, senão `ICMS_ORIGEM_ESTADO`. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Soma do peso bruto dos itens. Recalculado a cada item gravado. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Soma do peso líquido dos itens. Recalculado a cada item gravado. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos produtos, sem impostos nem acessórios. Recalculado a cada item gravado. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total geral do orçamento. Recalculado a cada item gravado. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Soma dos volumes dos itens. Recalculado a cada item gravado. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Soma da cubagem dos itens. Recalculada a cada item gravado. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, copiado do cadastro no Exit do código. É a validação de "cliente informado" na gravação. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão. O NewRecord já traz a data do dia. Data inválida impede gravar. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Pessoa de contato no cliente, trazida do cadastro e editável aqui. |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente, trazido do cadastro e editável aqui. |
| Bairro | `BAIRRO_CLIENTE` | VARCHAR(50) | 50 |  | Bairro do cliente, trazido do cadastro. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(50) | 50 |  | Logradouro do cliente, trazido do cadastro. |
| Cep | `CEP_CLIENTE` | VARCHAR(50) | 50 |  | CEP do cliente. Ao sair do campo ou escolher na consulta de CEP (botão), preenche automaticamente cidade e estado. F3 abre o cadastro de CEP. |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(50) | 50 |  | Cidade do cliente, preenchida pelo CEP. Obrigatória na gravação. |
| Estado | `ESTADO_CLIENTE` | VARCHAR(50) | 50 |  | UF do cliente, preenchida pelo CEP. É o que decide dentro ou fora do estado na validação da natureza e no cálculo do ICMS. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente. Ao sair, exige 11 ou 14 dígitos e reformata com máscara. O comprimento define pessoa física ou jurídica no cálculo do ICMS dos itens. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG. Ter IE preenchida, com cliente jurídico de fora do estado, muda a alíquota de ICMS para a de destino. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marcador: `'2'` = venda a consumidor final, `'1'` = não. Somente leitura na tela; vem do cadastro do cliente no Exit do código e o NewRecord assume `'1'`. Quando vale `'2'`, o ICMS usa a alíquota de consumidor final do estado. |

#### Produtos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Total de IPI do orçamento, somado dos itens. Só é apurado quando a natureza tem `INCIDE_IPI = '2'`. Não digitado. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI, somada dos itens. Não digitada. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Total do desconto sobre a base de ICMS (redução de base), somado dos itens. Não digitado. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Total de ICMS, somado dos itens. Não digitado. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS, somada dos itens. Não digitada. |
| Base S.T. | `BASE_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Base da substituição tributária, somada dos itens. Só é apurada quando a natureza tem `INCIDE_SUBSTITUICAO_TRIBUTARIA = '2'`. Não digitada. |
| Valor S.T. | `VALOR_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Valor da substituição tributária, somado dos itens. Não digitado. |

#### Vencimentos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Validade | `VALIDADE` | VARCHAR(50) | 50 |  | Texto livre com o prazo de validade da proposta, impresso no orçamento. |
| Prazo de Entrega | `PRAZO_ENTREGA` | VARCHAR(50) | 50 |  | Texto livre com o prazo de entrega combinado, impresso no orçamento. |
| Frete | `FRETE` | VARCHAR(50) | 50 |  | Texto livre com a condição de frete (por conta de quem, transportadora), impresso no orçamento. |
| Condições de Pagamento | `CONDICAO_PAGAMENTO` | VARCHAR(50) | 50 |  | Texto livre com a forma e o prazo de pagamento propostos. |
| Observações | `OBSERVACAO` | VARCHAR(500) | 500 |  | Observação livre do orçamento. Digitação convertida para maiúsculas e limitada a 500 caracteres, com aviso ao passar. |

### Grade `dborcamento` — tabela IT_ORCAMENTO

Itens do orçamento. Ao gravar cada item, o sistema recusa produto inexistente, quantidade, valor ou total zerados e CFOP incompatível com os demais itens, apagando a linha; em seguida recalcula todos os totais do cabeçalho. As colunas Descrição, UN, Referência e Total não são digitadas: a navegação pula direto do Código para a Natureza e delas para Quantidade.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto. O botão da célula abre a consulta de produtos. Só aceita cadastro com `TIPO_PRODUTO = '2'` (produto) e `INATIVO = '1'`; material ou item inativo é recusado com aviso. Aceito, preenche descrição, unidade e referência, e sugere quantidade 1 e o preço de venda. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, copiada do cadastro. Não digitada. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida, copiada do cadastro do produto. Não digitada (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, copiada do cadastro. Não digitada. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | CFOP do item. O NewRecord copia a natureza do cabeçalho. Digitada aqui, recusa CFOP de entrada (iniciado em `1`, `2` ou `3`) e valida dentro ou fora do estado do cliente: dentro só `1` ou `5`, fora só `2`, `3`, `6` ou `7`. É ela que aciona o cálculo da substituição tributária do item. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do produto, com três casas. Só aceita fração quando o cadastro do produto tem `PERMITE_QUANTIDADE_FRACIONADO = '2'`; senão zera com aviso. Precisa ser maior que zero. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário. Sugerido do preço de venda do produto. Abaixo do preço mínimo ou acima do preço máximo, a tela pede confirmação e, se recusada, volta para o preço de venda. Precisa ser maior que zero. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade x valor, calculado ao sair das colunas Quantidade e Valor e reconfirmado no BeforePost. Não digitado. |
| Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  | Previsão de entrega do item. Data inválida é recusada e a célula fica em branco. |

<a id="umov_nota_fiscal_venda_faturamento_pedidos_liberados"></a>

## `umov_nota_fiscal_venda_faturamento_pedidos_liberados` — Emissão da Nota Fiscal com Pedidos Liberados

Faturamento em lote. A tela só lê: a grade lista os pedidos de `PEDIDO_VENDA` com `STATUS = 'Liberado'` (LEFT JOIN em `CLIENTE` para o nome e em `TIPO_FRETE` para a descrição da modalidade), ordenados pela previsão de faturamento. O checkbox F2 - Filtrar Somente os Pedidos Liberados até acrescenta `DATA_PREVISTA_FATURAMENTO <= CURRENT_DATE`. O botão Faturar liga esse filtro à força, confere se todo pedido com tipo de frete `CIF` tem valor de frete combinado maior que zero e, passando na conferência, gera para cada pedido a nota em `NOTA` com número `MAX(NUMERO) + 1` da série, os itens em `IT_NOTA` e as parcelas em `RECEBER`. A nota nasce `Pendente` e termina `Faturada` ou, com NF-e, `NFE Gerada`; o pedido passa a `Faturado` e tem a previsão de faturamento apagada. Além das colunas visíveis, a consulta traz modalidade de frete, descrição do tipo de frete e valor do frete combinado, usados só nessa validação.

### Grade `dbpedido_venda` — tabela PEDIDO_VENDA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do pedido de venda a faturar. Chave primária da tabela (PK1). Duplo clique abre o pedido. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do pedido. |
| Cliente | `CLIENTE` | INTEGER |  | Código do cliente do pedido. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente, trazido por LEFT JOIN em `CLIENTE.NOME`; não pertence ao pedido. |
| Contato | `CONTATO` | VARCHAR(25) | 25 | Contato do cliente registrado no pedido; é copiado para a nota no faturamento. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Valor total do pedido. |
| Prev. Fatur. | `DATA_PREVISTA_FATURAMENTO` | TIMESTAMP |  | Data prevista para faturar o pedido. Comanda a ordenação da grade, o filtro do checkbox F2 e a cor da linha: preta quando a data já chegou, azul quando ainda é futura. No faturamento a coluna é limpa junto com a virada do status para `Faturado`. |

<a id="umov_nota_fiscal_venda_emissao_duplicata_boleto"></a>

## `umov_nota_fiscal_venda_emissao_duplicata_boleto` — Emissão das Duplicatas / Boletos Bancários

Imprime as duplicatas ou os boletos das parcelas geradas pelo faturamento, lidas de `RECEBER` (LEFT JOIN em `CLIENTE` só para o nome). O filtro é fixo em `DOCUMENTO = 'NF'` e na série de `PARSIS.NOTA_SERIE`; informar o número da nota restringe a uma nota, deixar em branco lista todas as parcelas da série. O checkbox Listar os Documentos já Impressos, desmarcado por padrão, acrescenta ao filtro `IMPRESSAO_DUPLICATA = '1'`, ou seja, mostra só o que ainda não foi impresso. O radiogroup Tipo do Documento tem `Boletos` (índice 0) e `Duplicatas` (índice 1) e abre em Duplicatas. Ao imprimir a duplicata, a linha recebe `IMPRESSAO_DUPLICATA = '2'`. O `ModifySQL` grava apenas `IMPRESSAO_DUPLICATA` e `NUMERO_BOLETO`, então a grade é de leitura com uma exceção: o número do boleto, que é digitável.

### Grade `RxDBGrid1` — tabela RECEBER

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número da nota fiscal que originou o título. Parte da chave primária (PK3). |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela dentro da nota. Parte da chave primária (PK5). |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, herdada da nota fiscal. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias da parcela, contado da emissão; é o que define o vencimento na geração. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento da parcela, impressa na duplicata e no boleto. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do sacado, trazido por LEFT JOIN em `CLIENTE.NOME`; não é digitado. |
| Nr. Boleto | `NUMERO_BOLETO` | VARCHAR(20) | 20 | Nosso número / identificação do boleto no banco. Única coluna digitável da grade; o texto é convertido para maiúsculas na saída do campo. |

<a id="umov_ebct"></a>

## `umov_ebct` — Emissão do EBCT...

Emite o EBCT (etiqueta de encomenda dos Correios) para uma remessa. O cabeçalho vai para a tabela `EBCT` (chave `EMPRESA` + `NUMERO`) e os itens remetidos para `IT_EBCT`, na grade `RxDBGrid1`, limitada a oito itens. Apesar de todos os campos de endereço se chamarem `*_CLIENTE`, o destinatário pode ser cliente, fornecedor, transportadora ou representante — quem decide é o radiogroup Tipo de Pessoa, que também troca os rótulos Cliente e Razão Social na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do EBCT dentro da empresa, gerado na gravação. O botão do campo abre a consulta de EBCTs. Parte da chave primária (PK1). Chave duplicada é tratada com o aviso de que outro usuário está usando o registro. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do destinatário. O que ele significa depende do Tipo de Pessoa: código de cliente, de fornecedor, de transportadora ou de representante. Ao sair do campo o programa busca no cadastro correspondente e preenche sozinho nome, fone, endereço, bairro, CEP, cidade, estado, CNPJ/CPF e inscrição/RG; código inexistente limpa todos eles. O rótulo do campo muda junto com o tipo escolhido. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do destinatário, trazido do cadastro escolhido. É o campo que a gravação exige preenchido — a crítica é feita sobre o nome, não sobre o código. O rótulo muda conforme o Tipo de Pessoa. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do EBCT. Preenchida com a data de hoje no NewRecord. A gravação recusa data inválida. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos totais dos itens da grade, recalculada pelo programa a cada item incluído, alterado ou excluído. Campo desabilitado, não digitável. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Pessoa de contato no destinatário. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Texto livre impresso no EBCT. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(50) | 50 |  | CNPJ ou CPF do destinatário, trazido do cadastro mas editável. Ao sair do campo o programa valida: aceita só 11 dígitos (CPF) ou 14 (CNPJ), confere os dígitos verificadores e formata; qualquer outro tamanho ou dígito errado devolve o foco ao campo. Sair pelos botões Sair ou Limpar escapa da crítica. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(50) | 50 |  | Inscrição estadual ou RG do destinatário, trazido do cadastro. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(50) | 50 |  | Logradouro do destinatário. Montado pelo programa juntando o logradouro do cadastro com o número e, havendo, o complemento, separados por vírgula. |
| Bairro | `BAIRRO_CLIENTE` | VARCHAR(50) | 50 |  | Bairro do destinatário, trazido do cadastro. |
| Cep | `CEP_CLIENTE` | VARCHAR(50) | 50 |  | CEP do destinatário, trazido do cadastro. |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(50) | 50 |  | Cidade do destinatário, trazida do cadastro. |
| Estado | `ESTADO_CLIENTE` | VARCHAR(50) | 50 |  | Unidade federativa do destinatário, trazida do cadastro. |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do destinatário, trazido do cadastro. |
| Nota Fiscal | `NUMERO_NOTA_FISCAL` | INTEGER |  |  | Número da nota fiscal que acompanha a remessa. Só amarra o EBCT à nota; não busca nem valida a nota. |
| Número do EBCT | `NUMERO_EBCT` | VARCHAR(30) | 30 |  | Código de rastreio da encomenda fornecido pelos Correios, digitado à mão. Não confundir com o campo Número, que é o sequencial interno. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes da remessa. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data em que a encomenda saiu, normalmente posterior à emissão. |
| Selecione o Tipo de Pessoa | `TIPO` | VARCHAR(15) | 15 |  | Radiogroup que define de qual cadastro vem o destinatário. Grava o próprio texto da opção: `'Cliente'`, `'Fornecedor'`, `'Transportadora'` ou `'Representante'`. Ao mudar, troca os rótulos Cliente e Razão Social e passa a buscar o código no cadastro correspondente. Nasce em Cliente. |

### Grade `RxDBGrid1` — tabela IT_EBCT

Máximo de oito itens por EBCT: a tentativa de incluir o nono é recusada com aviso e o foco vai para Gravar. A sequência (`SEQ`) é gerada pelo programa por MAX(SEQ)+1.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto remetido; o botão da célula abre a consulta de produtos. Só aceita cadastro com TIPO_PRODUTO = `'2'`, ou seja, item configurado como Produto; item marcado apenas como Material é recusado com o aviso para reconfigurá-lo, e item inativo também é recusado. Ao aceitar, traz descrição, unidade e referência, põe Quantidade em 1 e Valor no preço de venda do cadastro. Produto inexistente faz a linha ser apagada. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, trazida do cadastro e convertida para maiúsculas se editada. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida, trazida do cadastro do produto. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do produto, trazida do cadastro. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade remetida. Nasce em 1 ao escolher o produto. Zero ou negativo faz o programa avisar Quantidade do Produto não informado e apagar a linha. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário declarado. Nasce com o preço de venda do cadastro do produto e pode ser alterado. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes Valor, calculado pelo programa. A diferença em relação ao total anterior da linha é somada ao R$ Total do cabeçalho. |

### Observações

- O combo de tipo de Sedex, na coluna `TIPO_SEDEX`, oferece `'Encomenda Normal'`, `'Encomenda Registrada'`, `'Sedex a Cobrar Postagem + Pecas'`, `'Sedex a Cobrar Somente Pecas'`, `'Sedex a Cobrar Somente Postagem'` e `'Sedex Pago'`. O combo tem uma lista de valores herdada de outra tela (`PR`, `RS`, `SC`, `SP`, `RJ`), mas ela está desligada, então o que se grava é o próprio texto da opção.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Tipo de Sedex | `TIPO_SEDEX` | VARCHAR(35) | 35 | campo da tela | Rótulo na tela: “Tipo de Sedex”. Função não verificada no código. |

<a id="umov_lista_tabela_preco"></a>

## `umov_lista_tabela_preco` — Lista da Tabela de Preços...

Monta a lista de preços que vai impressa para o cliente ou representante. O cabeçalho grava em `LISTA_TABELA_PRECO` (chave `EMPRESA` + `NUMERO`) e os produtos em `IT_LISTA_TABELA_PRECO` (chave `EMPRESA` + `NUMERO` + `SEQ`). A tela tem a identificação da lista no topo, o quadro Condições Gerais de Venda com catorze linhas de texto livre, e a grade `RxDBGrid1` com os produtos e seus preços. O botão Novo copia a lista inteira para um número novo e inativa a atual.

#### Lista da Tabela de Preços...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno da lista. Sugerido como `MAX(NUMERO)` da empresa mais um. F7 volta à anterior, F8 avança, F9 e o botão localizam a mais próxima abaixo. Não é o número que sai impresso — esse é o Número da Lista. |
| Data Vigência | `DATA_INICIO_VIGENCIA` | TIMESTAMP |  |  | Data em que a lista passa a valer, impressa como "Em vigor a partir de". Obrigatória: o Gravar recusa data inválida com "Data Início da Vigência não Informada ou Inválida". |
| Número da Lista | `NUMERO_LISTA` | VARCHAR(20) | 20 |  | Identificação da lista para o cliente, o que sai impresso como Nº Lista. Texto livre, não é o sequencial interno. |
| Descrição da Lista da Tabela de Preço | `DESCRICAO_LISTA` | VARCHAR(80) | 80 |  | Nome da lista. Obrigatório: o Gravar recusa em branco e devolve o foco ao campo. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marca a lista como fora de uso. Caixa de marcação: marcada grava `'2'`, desmarcada grava `'1'`. Nasce desmarcada, com `'1'`, no NewRecord. O botão Novo marca `'2'` na lista de origem depois de copiá-la, para que só a nova fique valendo. |
| Tipo | `TIPO` | VARCHAR(1) | 1 |  | Código de uma letra que classifica a lista, digitado em maiúsculas. Obrigatório: o Gravar recusa em branco com "Tipo da Lista da Tabela de Preço". O código não tem lista de valores no programa; ele sai impresso ao lado do Número da Lista no cabeçalho do relatório. |
| Ramo Atividade | `RAMO_ATIVIDADE` | INTEGER |  |  | Ramo de atividade a que a lista se destina. Obrigatório: o Gravar recusa em branco. F4 ou o botão abrem a consulta de ramos de atividade, F3 abre o cadastro. |
| Descrição do Ramo de Atividade | `DESCRICAO_RAMO_ATIVIDADE` | VARCHAR(100) | 100 |  | Descrição do ramo, trazida de `RAMO_ATIVIDADE.DESCRICAO` pelo Exit do código. Não é digitada; código inexistente limpa os dois campos (calculado na consulta). |

#### Condições Gerais de Venda

Catorze linhas de texto livre de 120 caracteres que saem impressas, na ordem numérica, no quadro Condições Gerais de Venda do relatório da lista. Na tela elas ficam em duas colunas, e é por isso que a ordem dos controles se alterna; o rótulo visível na primeira é `DESCRICAO DO CAMPO`, sobra de gabarito, não o nome do campo. Nenhuma delas é obrigatória ou validada.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtobservacao_01` | `OBSERVACAO_01` | VARCHAR(120) | 120 |  | Primeira linha das condições gerais de venda impressas. |
| `edtobservacao_08` | `OBSERVACAO_08` | VARCHAR(120) | 120 |  | Oitava linha das condições gerais de venda impressas. |
| `edtobservacao_09` | `OBSERVACAO_09` | VARCHAR(120) | 120 |  | Nona linha das condições gerais de venda impressas. |
| `edtobservacao_02` | `OBSERVACAO_02` | VARCHAR(120) | 120 |  | Segunda linha das condições gerais de venda impressas. |
| `edtobservacao_03` | `OBSERVACAO_03` | VARCHAR(120) | 120 |  | Terceira linha das condições gerais de venda impressas. |
| `edtobservacao_10` | `OBSERVACAO_10` | VARCHAR(120) | 120 |  | Décima linha das condições gerais de venda impressas. |
| `edtobservacao_04` | `OBSERVACAO_04` | VARCHAR(120) | 120 |  | Quarta linha das condições gerais de venda impressas. |
| `edtobservacao_11` | `OBSERVACAO_11` | VARCHAR(120) | 120 |  | Décima primeira linha das condições gerais de venda impressas. |
| `edtobservacao_05` | `OBSERVACAO_05` | VARCHAR(120) | 120 |  | Quinta linha das condições gerais de venda impressas. |
| `edtobservacao_12` | `OBSERVACAO_12` | VARCHAR(120) | 120 |  | Décima segunda linha das condições gerais de venda impressas. |
| `edtobservacao_06` | `OBSERVACAO_06` | VARCHAR(120) | 120 |  | Sexta linha das condições gerais de venda impressas. |
| `edtobservacao_13` | `OBSERVACAO_13` | VARCHAR(120) | 120 |  | Décima terceira linha das condições gerais de venda impressas. |
| `edtobservacao_14` | `OBSERVACAO_14` | VARCHAR(120) | 120 |  | Décima quarta e última linha das condições gerais de venda impressas. |
| `edtobservacao_07` | `OBSERVACAO_07` | VARCHAR(120) | 120 |  | Sétima linha das condições gerais de venda impressas. |

### Grade `RxDBGrid1` — tabela IT_LISTA_TABELA_PRECO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto da lista. F4 ou o botão da célula abrem a consulta de produtos, F3 abre o cadastro. Só entra cadastro com `TIPO_PRODUTO = '2'` (produto) e `INATIVO = '1'` (ativo). Ao aceitar um código diferente do que já estava na linha, o sistema traz do cadastro descrição, unidade, referência, preço de venda, peso e IPI de uma vez. Produto inexistente faz a linha ser apagada depois da gravação. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto como sai na lista impressa. Vem do cadastro, mas pode ser alterada aqui; o texto digitado é convertido para maiúsculas. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida do produto, trazida do cadastro. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência comercial do produto. Vem do cadastro e pode ser alterada aqui; o texto digitado é convertido para maiúsculas. |
| V | `VERSAO` | INTEGER |  | Versão do produto na lista, digitada. Não é preenchida nem validada pelo programa; sai impressa junto da referência para distinguir versões do mesmo item. |
| Preço | `PRECO_VENDA` | DOUBLE PRECISION |  | Preço de venda praticado nesta lista. Vem sugerido de `PRODUTO.PRECO_VENDA` e pode ser digitado por cima. Obrigatório na prática: o AfterPost apaga a linha e avisa "Preço de Venda do Produto não informado" se for menor ou igual a zero. |
| Peso | `PESO_LIQUIDO` | DOUBLE PRECISION |  | Peso líquido do produto, trazido do cadastro. |
| % IPI | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do produto, trazida do cadastro. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada e `SEQ` da linha recebe o maior `SEQ` da lista mais um, ambos no NewRecord. `ORDEM_IMPRESSAO` define a posição do produto na lista impressa — ao gravar, uma linha inserida no meio empurra as seguintes com um `UPDATE` de mais um, e uma linha sem ordem recebe a maior ordem existente mais um; a grade é lida nessa ordem. `LAST_PRODUTO` guarda o produto anterior da linha, e é o que faz o sistema só recarregar os dados do cadastro quando o código realmente muda, preservando descrição e preço editados à mão. O botão Novo copia campo a campo o cabeçalho e todos os itens para um número novo, trocando apenas `EMPRESA` e `NUMERO`.

<a id="umov_emissao_etiqueta_envelope"></a>

## `umov_emissao_etiqueta_envelope` — Emissão de Etiquetas de Envelope...

Tela só de impressão: monta uma lista de endereços e imprime as etiquetas de envelope correspondentes. Nada é gravado no banco — a grade `RxDBGrid1` vive num ClientDataSet em memória (`tbtemp`). A lista é carregada em bloco pelo botão Filtrar, a partir de um radiogroup que escolhe a origem do endereço — `'Cliente'`, `'Funcionário'`, `'Fornecedor'`, `'Transportadora'` ou `'Representante Venda'` — mais uma faixa de cadastro inicial e final, cujos rótulos mudam conforme a origem escolhida. Depois de carregada, toda célula da grade pode ser corrigida à mão, e o botão Incluir permite acrescentar um endereço avulso. Delete apaga a linha depois de confirmar.

### Grade `RxDBGrid1` — lista em memória, sem tabela

Nenhuma destas colunas é coluna de tabela: são campos do ClientDataSet, alimentados pelo Filtrar a partir de `CLIENTE`, `FUNCIONARIO`, `FORNECEDOR`, `TRANSPORTADORA` ou do cadastro de representantes, conforme a origem escolhida.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Nome | `nome` | VARCHAR(70) | 70 | Razão social ou nome do destinatário. É o campo que define se a linha vale: linha gravada com nome em branco é apagada logo após o post. Convertido para maiúsculas na digitação (calculado na consulta). |
| Endereço | `endereco` | VARCHAR(50) | 50 | Logradouro do destinatário. Para cliente e fornecedor, o Filtrar monta a célula juntando o endereço e o número do endereço separados por vírgula; para as demais origens, traz só o logradouro. Convertido para maiúsculas na digitação (calculado na consulta). |
| Bairro | `bairro` | VARCHAR(50) | 50 | Bairro do destinatário. Convertido para maiúsculas na digitação (calculado na consulta). |
| Complemento | `complemento` | VARCHAR(40) | 40 | Complemento do endereço. Só vem preenchido quando a origem é Cliente; nas outras quatro origens o Filtrar grava vazio, e o usuário digita se precisar (calculado na consulta). |
| Cep | `cep` | VARCHAR(10) | 10 | CEP do destinatário. Convertido para maiúsculas na digitação (calculado na consulta). |
| Cidade | `cidade` | VARCHAR(50) | 50 | Cidade do destinatário. Na origem Fornecedor vem do campo de nome da cidade do cadastro, e não do código. Convertido para maiúsculas na digitação (calculado na consulta). |
| Estado | `estado` | VARCHAR(2) | 2 | Sigla da unidade federativa. Convertido para maiúsculas na digitação (calculado na consulta). |
| A/C | `contato` | VARCHAR(30) | 30 | Pessoa aos cuidados de quem o envelope vai. Vem do contato do cadastro para Cliente, Fornecedor (contato de venda), Transportadora e Representante; na origem Funcionário fica vazio (calculado na consulta). |

### Observações

- O Imprimir confirma mostrando quantas etiquetas serão emitidas e só age com a lista carregada.
- Os controles de filtro — o radiogroup de origem e os quatro campos de cadastro inicial e final com seus nomes — não gravam nada e por isso não aparecem no catálogo de campos. Ao trocar a origem, o programa reabre a consulta correspondente e já sugere o primeiro e o último cadastro daquele tipo na faixa.

<a id="umov_nota_fiscal_venda_emissao_aviso_embarque"></a>

## `umov_nota_fiscal_venda_emissao_aviso_embarque` — Emissão de Aviso de Embarque/Entrega

Tela de impressão, não de cadastro: não grava nada no banco. O usuário informa a nota inicial e a nota final (controles comuns, fora do banco), e o botão Filtrar carrega em memória, num `TClientDataSet` chamado `tbtemp`, as notas da série corrente cujo `STATUS` seja `Faturada` ou `NFE Autorizada` dentro da faixa. A grade única da tela mostra essa lista temporária e permite acrescentar ou remover linhas antes de imprimir; a impressão monta o relatório relendo `NOTA`, `IT_NOTA`, `CLIENTE`, `TRANSPORTADORA` e `PEDIDO_VENDA` pelos números que sobraram na grade. O radiogroup Tipo, com as opções `Embarque` e `Entrega`, só troca o título do documento entre RECIBO DE EMBARQUE e RECIBO DE ENTREGA. A série usada no filtro vem de `PARSIS.NOTA_SERIE`.

### Grade `RxDBGrid1` — conjunto temporário em memória `tbtemp` (sem tabela no banco)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número | `numero` | INTEGER |  | Número da nota fiscal a incluir no aviso, copiado de `NOTA.NUMERO` pelo filtro. É a lista final desses números que comanda a impressão. (calculado na consulta) |
| Cliente | `cliente` | INTEGER |  | Código do cliente da nota, copiado de `NOTA.CLIENTE`. Serve para conferir a linha antes de imprimir. (calculado na consulta) |
| Razão Social / Nome do Cliente | `nome_cliente` | VARCHAR(50) | 50 | Nome do cliente, copiado de `CLIENTE.NOME` no filtro. (calculado na consulta) |

<a id="umov_nota_fiscal_venda_embarque"></a>

## `umov_nota_fiscal_venda_embarque` — Lançamento das Notas Fiscais de Embarque

Registra os dados de embarque de uma nota de venda já emitida, na própria tabela `NOTA` (chave EMPRESA + SERIE + NUMERO); o dataset traz também `CLIENTE.EMAIL` e a descrição da modalidade de frete por LEFT JOIN. O `ModifySQL` grava apenas o bloco de embarque: data e hora de saída, transportadora e todo o seu endereço, placa e UF, cartão ponto e nome do funcionário do embarque, data do comunicado, nome e documento do recebedor e responsável. Número, cliente, total, série e modalidade de frete aparecem só para conferência. A série vem de `PARSIS.NOTA_SERIE`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida sem rótulo em destaque. Valores do sistema: `Pendente`, `NFE Gerada`, `NFE Enviada`, `NFE Autorizada`, `NFE Denegada`, `NFE Inutilizada`, `Cancelada`, `Faturada`. Aqui vale como trava: gravar em nota `Cancelada` é recusado, e o comunicado de embarque por e-mail só é montado para `NFE Autorizada`. Apenas exibição (TDBText). |
| O Cliente foi Comunicado no Dia | `DATA_ENVIO_COMUNICADO_EMBARQUE` | TIMESTAMP |  |  | Data em que o e-mail de comunicação de embarque foi enviado ao cliente. Preenchida pela rotina de envio, nunca digitada. O rótulo e o valor só ficam visíveis quando a coluna tem conteúdo. Apenas exibição (TDBText). |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número da nota a lançar. Parte da chave primária (PK2). O botão do campo abre a consulta de notas de embarque; F7 e F8 navegam para a nota anterior e a próxima da série. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da nota, trazido pela consulta. Conferência. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente gravado na nota. Conferência. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora do embarque. Obrigatório na gravação. Ao sair do campo, busca em `TRANSPORTADORA` e copia para a nota nome, endereço, bairro, CEP, cidade, estado, CNPJ/CPF e IE/RG; código inexistente limpa todos esses campos. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, preenchido pelo Exit do código acima. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota. Conferência. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Vem de `PARSIS.NOTA_SERIE`. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data efetiva da saída da mercadoria. Obrigatória e validada na gravação: não pode ser inválida, nem anterior à emissão da nota, nem posterior à data do computador. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora da saída no formato HH:MM. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo que levou a carga. |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF da placa do veículo. |
| Nome do Recebedor | `NOME_RECEBEDOR` | VARCHAR(50) | 50 |  | Nome de quem recebeu a mercadoria, anotado no canhoto. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código na tabela `MODALIDADE_FRETE`. Exibido para conferência: não está no `ModifySQL`, então alteração aqui não chega ao banco. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição trazida por LEFT JOIN em `MODALIDADE_FRETE.DESCRICAO`; não é digitada nem gravada. |
| Documento Recebedor | `DOCUMENTO_RECEBEDOR` | VARCHAR(20) | 20 |  | Documento (RG/CPF) de quem recebeu a mercadoria. |
| Nº Cartão Ponto | `CARTAO_PONTO_FUNCION_EMBARQUE` | INTEGER |  |  | Cartão ponto do funcionário que fez o embarque. Ao digitar, busca em `FUNCIONARIO` por `NUMERO_CARTAO_PONTO` e grava o nome encontrado em `NOTA.NOME_FUNCIONARIO_EMBARQUE`; cartão inexistente gera aviso, limpa os dois campos e cancela a digitação. |
| Nome do Responsável | `RESPONSAVEL` | VARCHAR(50) | 50 |  | Nome do responsável pelo embarque dentro da empresa. |

<a id="umov_nota_fiscal_venda_emissao_etiqueta_embarque_embalagem"></a>

## `umov_nota_fiscal_venda_emissao_etiqueta_embarque_embalagem` — Emissão do Recibo de Embarque / Etiqueta de Embalagem

Tela de impressão de etiquetas; não grava nada no banco. O usuário informa a nota inicial e a final em controles comuns, fora do banco, e o botão Filtrar lê `NOTA` na série corrente com `STATUS IN ('Faturada', 'NFE Autorizada')` dentro da faixa, montando em memória o `TClientDataSet` `tbtemp` que alimenta a grade. Além das três colunas visíveis, `tbtemp` guarda série, número do pedido, cidade, estado, endereço completo, nome da transportadora e volume, usados no leiaute da etiqueta. O radiogroup Etiqueta escolhe entre `Embarque` (índice 0) e `Embalagem`; na etiqueta de embalagem a consulta é refeita com `FILTRA_VOLUME = '2'`, o que faz a procedure `PRO_LISTA_NUMEROS(N.VOLUME)` gerar uma linha por volume e montar a numeração no formato 01/05. A impressão sai por arquivo de leiaute `.gjb` na pasta `docs_cliente`. A série vem de `PARSIS.NOTA_SERIE`.

### Grade `RxDBGrid1` — conjunto temporário em memória `tbtemp` (sem tabela no banco)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número | `numero` | INTEGER |  | Número da nota fiscal cuja etiqueta será impressa, copiado de `NOTA.NUMERO` pelo filtro. (calculado na consulta) |
| Cliente | `cliente` | INTEGER |  | Código do cliente da nota, copiado de `NOTA.CLIENTE`. (calculado na consulta) |
| Razão Social / Nome do Cliente | `nome_cliente` | VARCHAR(50) | 50 | Nome do cliente, copiado de `NOTA.NOME_CLIENTE`; é o texto que vai no destinatário da etiqueta. (calculado na consulta) |

<a id="umov_termo_garantia"></a>

## `umov_termo_garantia` — Termo de Garantia...

Emite e mantém o termo de garantia de um produto vendido, na tabela `TERMO_GARANTIA`, cuja chave é `EMPRESA` mais `REFERENCIA` e `NUMERO_SERIE` — ou seja, o registro é identificado pela referência do produto junto com o número de série, não por um sequencial. A grade de baixo grava as ocorrências e recalls daquele termo em `IT_TERMO_GARANTIA`, com `SEQ` gerado por MAX(SEQ) + 1. O bloco de campos é único, dividido visualmente em dados da revendedora, dados do produto e dados do consumidor final. Ao gravar, a tela imprime o termo e limpa para o próximo.

O preenchimento tem dois caminhos. Informando a Nota Fiscal, o sistema busca em `NOTA` e traz revendedora, nome, endereço, cidade e data de emissão, e desabilita os campos Revendedora e Data Emissão. Sem nota fiscal, a revendedora passa a ser obrigatória e é escolhida na consulta de clientes.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número Série **·chave** | `NUMERO_SERIE` | INTEGER |  |  | Número de série da peça. Faz parte da chave primária, na segunda posição, junto com a Referência. Não é sequencial gerado: o Limpar deixa referência e série em branco para serem digitadas. Obrigatório, o Gravar aborta se estiver vazio. Ao sair do campo o sistema tenta carregar o termo daquela referência e série; não achando, abre um registro novo. F7 volta, F8 avança, F9 procura. |
| Revendedora | `REVENDEDORA` | INTEGER |  |  | Código da revendedora que vendeu a peça, em `CLIENTE`. Obrigatório apenas quando não há Nota Fiscal informada. O botão abre a consulta de clientes e F3 o cadastro. Quando a nota fiscal é encontrada, o campo é preenchido pela nota e fica desabilitado. |
| Razão Social / Nome da Revendedora | `NOME_REVENDEDORA` | VARCHAR(70) | 70 |  | Nome da revendedora, trazido de `CLIENTE.NOME` pelo Exit do código ou de `NOTA` quando há nota fiscal. Controle com Enabled = False: não é digitado. É o texto gravado como observação no log. (calculado na consulta) |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do termo, ou a emissão da nota fiscal quando ela é informada. Ao entrar no campo, se estiver vazio ou inválido, recebe a data de hoje. Ao sair, recalcula a Data Garantia. Fica desabilitado quando a nota fiscal foi encontrada. |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto garantido, em `MATERIA_PRIMA`. Obrigatório: sem ele o Gravar aborta com "Produto do Termo de Garantia". O botão muda de comportamento: com nota fiscal informada, abre a lista de produtos daquela nota; sem nota, abre a consulta geral filtrada por Produto. O Exit valida em duas frentes — com nota, o produto precisa constar dela; sem nota, precisa ter `TIPO_PRODUTO = '2'` (produto, não material) e estar ativo, senão o campo é limpo com aviso. No Gravar há ainda a checagem de que `MATERIA_PRIMA.REFERENCIA` bate com a Referência digitada. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de `MATERIA_PRIMA.DESCRICAO` ou do item da nota fiscal. Controle com Enabled = False: não é digitada. (calculado na consulta) |
| Endereço | `ENDERECO_REVENDEDORA` | VARCHAR(92) | 92 |  | Endereço da revendedora, montado na consulta com endereço e número. Preenchido pelo Exit da Revendedora ou pela nota fiscal. Controle com Enabled = False. (calculado na consulta) |
| Referência **·chave** | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência do produto e primeira parte da chave primária. Obrigatória: o Gravar aborta com "Referência do Termo de Garantia". O botão abre a consulta de referências; o Exit confere a existência em `REFERENCIA` e limpa o campo se não achar. F3 abre o cadastro de referências. Tem de coincidir com a referência do produto escolhido. |
| Data Fabricação | `FABRICACAO` | TIMESTAMP |  |  | Data de fabricação da peça. Obrigatória: data inválida ou vazia aborta o Gravar com "Data da Fabricação não Informada ou Inválida". |
| Nota Fiscal | `NUMERO_NOTA_FISCAL` | INTEGER |  |  | Número da nota fiscal de venda da fábrica para a revendedora, na série corrente (`vserie`). O botão abre a consulta de notas. Ao sair do campo, se a nota existir, ela preenche revendedora, nome, endereço, cidade e emissão e trava esses campos; se não existir, o número é apagado e Revendedora e Data Emissão voltam a ser editáveis. É este campo que decide se a Revendedora é obrigatória. |
| Cidade | `CIDADE_REVENDEDORA` | VARCHAR(66) | 66 |  | Cidade da revendedora, trazida de `CLIENTE` ou da nota fiscal. Controle com Enabled = False. (calculado na consulta) |
| N.F. Revenda | `NOTA_FISCAL_REVENDA` | INTEGER |  |  | Número da nota fiscal com que a revendedora vendeu ao consumidor final. Digitado livremente, não validado contra o banco. |
| Emissão Revenda | `EMISSAO_REVENDA` | TIMESTAMP |  |  | Data da venda ao consumidor final. Quando preenchida, é ela que passa a valer como início da garantia: a Data Garantia é calculada a partir dela, e não da emissão do termo. |
| Nome do Consumidor | `NOME_CONSUMIDOR` | VARCHAR(50) | 50 |  | Nome do consumidor final. Texto livre, não obrigatório na gravação. |
| Endereço do Consumidor | `ENDERECO_CONSUMIDOR` | VARCHAR(50) | 50 |  | Endereço do consumidor final. Texto livre. |
| Cep | `CEP_CONSUMIDOR` | VARCHAR(10) | 10 |  | CEP do consumidor, com máscara `##.###-###`. O botão abre a consulta de CEP e F3 o cadastro. Ao sair do campo, o sistema busca em `CEP` e preenche Cidade e Estado do consumidor. |
| Cidade | `CIDADE_CONSUMIDOR` | VARCHAR(50) | 50 |  | Cidade do consumidor. Normalmente não é digitada: vem de `CEP.CIDADE` pelo Exit ou pela consulta de CEP. |
| Estado | `ESTADO_CONSUMIDOR` | VARCHAR(2) | 2 |  | Sigla da UF do consumidor. Vem de `CEP.ESTADO` junto com a cidade. |
| Insc. Est. / RG | `IE_RG_CONSUMIDOR` | VARCHAR(18) | 18 |  | Inscrição estadual do consumidor, quando pessoa jurídica, ou RG quando pessoa física. Texto livre, sem validação. |
| CNPJ / CPF | `CNPJ_CPF_CONSUMIDOR` | VARCHAR(18) | 18 |  | CNPJ ou CPF do consumidor. Ao sair do campo o sistema tira a pontuação e decide pelo tamanho: 11 dígitos é CPF, 14 é CNPJ; formata o número e valida o dígito verificador, avisando quando é inválido. Quantidade de dígitos diferente de 11 ou 14 aborta a saída do campo. |
| Fone | `FONE_CONSUMIDOR` | VARCHAR(15) | 15 |  | Telefone do consumidor, com máscara `(###)####-####`. Texto livre. |
| Data Garantia | `DATA_GARANTIA` | TIMESTAMP |  |  | Fim da garantia. Nunca é digitada — o controle tem Enabled = False. O sistema calcula um ano sobre a Emissão Revenda, e só usa a Data Emissão do termo quando não há data de revenda. É recalculada ao sair da Data Emissão e outra vez no Gravar. |

### Grade `RxDBGrid1` — tabela IT_TERMO_GARANTIA

Ocorrências e recalls do termo, ordenados por `SEQ`. O DataSource chama-se `dsit_pedido_venda`, nome herdado de outra tela. `SEQ` não aparece como coluna: é gerado no NewRecord como MAX(SEQ) + 1 dentro da mesma referência e número de série. Delete pede confirmação e apaga a linha; a gravação é comitada a cada item.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data da ocorrência, com máscara `##/##/####`. Preenchida com a data de hoje no NewRecord e também ao entrar na primeira coluna de uma linha ainda sem data. Data inválida é recusada no BeforePost com "Data de Emissão não Informado ou Inválido" e cancela a linha. |
| Recall | `RECALL` | INTEGER |  | Número do recall associado à ocorrência. É o campo que decide se a linha sobrevive: depois de gravada, se o recall estiver vazio a linha é apagada automaticamente no AfterPost. Ou seja, ocorrência sem recall não fica registrada. |
| Descrição da Ocorrência | `DESCRICAO` | VARCHAR(50) | 50 | Relato da ocorrência. Convertido para maiúsculas na digitação. Obrigatório: o BeforePost recusa a linha com "Descrição da Ocorrência não Informado" e cancela a edição. |

<a id="umov_nota_fiscal_venda"></a>

## `umov_nota_fiscal_venda` — Emissão da Nota Fiscal...

Tela de emissão da nota fiscal de venda. O cabeçalho grava em `NOTA` (chave EMPRESA + SERIE + NUMERO) e os itens em `IT_NOTA`; as parcelas ficam em `IT_NOTA_VENCIMENTO`, as notas/CT-e referenciados em `IT_NOTA_REFERENCIADA` e os títulos já gerados aparecem em uma grade somente-leitura sobre `RECEBER`. O painel superior concentra cliente, natureza, datas e os totais; o restante fica em abas (Produtos, Vencimentos, Transportadora, Nota Fiscal Referênciada, Dados Adicionais, Dados da Importação, Dados da Exportação, Nota Fiscal Complementar, Endereço de Cobrança / Entrega e NFE), várias delas mostradas ou escondidas conforme a natureza de operação e a finalidade da NF-e.

Seis controles do cabeçalho e da aba de importação não entraram no TSV (combos `TRxDBComboBox`): estão documentados abaixo com o tipo lido da declaração do `TField` no DFM e marcados na coluna Função.

### Campos

#### Emissão da Nota Fiscal...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida como texto e nunca digitada. O NewRecord grava `'Pendente'`; vira `'NFE Gerada'` ao gerar o XML, `'NFE Autorizada'` depois da autorização, `'Faturada'` quando a empresa não usa NF-e e a nota é impressa, e `'Cancelada'` pelo cancelamento. Só `'Pendente'` e `'NFE Gerada'` permitem gravar; só `'Pendente'` permite excluir; `'Cancelada'` bloqueia imprimir e visualizar. |
| Nº Nota Fiscal **·chave** | `NUMERO` | INTEGER |  |  | Número da nota, parte da chave primária (PK2). Em inclusão é gerado na gravação por MAX(NUMERO) + 1 dentro da empresa e da série. F4 abre a consulta de notas fiscais para localizar uma já gravada; F7 e F8 navegam. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente; F4 abre a consulta. Obrigatório no Gravar. No Exit puxa do cadastro nome, endereço, CNPJ/CPF, IE/RG, fone, cidade, país, os endereços de entrega e de cobrança e o indicador de consumidor final; em inclusão puxa também representante, comissão, transportadora, redespacho, modalidade de frete, banco, instrução de cobrança, natureza e contato. Cliente com BLOQUEAR_VENDA = `'2'` exige senha e, sem ela, o campo é limpo. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do cadastro no Exit do código. Não é digitado. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 |  | CFOP da nota. Obrigatória. F4 consulta o cadastro. No Exit valida contra o estado do cliente: cliente dentro do estado só aceita CFOP iniciada por `1` ou `5`; fora do estado, só por `2`, `3`, `6` ou `7`. A natureza define `NOTA_ENTRADA`, o uso de preço de custo e liga as abas de importação e exportação. Depois de gravada não pode ser trocada. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da CFOP, copiada do cadastro no Exit da natureza. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão. O NewRecord grava a data atual. Não pode ser anterior à data de hoje, exceto quando a nota já está `'NFE Autorizada'`. |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS da nota, calculada pelo sistema e não digitada. Vem do cadastro de alíquota por estado: consumidor final usa ICMS_ORIGEM_ESTADO_CONS_FINAL; cliente jurídico de outro estado com IE usa ICMS_DESTINO_ESTADO; os demais usam ICMS_ORIGEM_ESTADO. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante; F4 consulta. Obrigatório no Gravar. Em inclusão vem do cadastro do cliente. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, preenchido junto com o código. |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete da nota. Entra no Total no BeforePost e, na gravação, é rateado entre os itens em VALOR_FRETE_RATEADO na proporção do total de cada item. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Soma no Total e é rateado entre os itens em VALOR_SEGURO_RATEADO. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas acessórias. Soma no Total e é rateada entre os itens em VALOR_DESPESA_RATEADO. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto do volume transportado, digitado. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido do volume transportado, digitado. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Somatório da base de ICMS dos itens, recalculado a cada item gravado ou excluído. Não é digitado. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Somatório do ICMS dos itens, recalculado junto com a base. Não é digitado. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos totais dos itens. Serve de divisor no rateio de frete, seguro, despesas e desconto. Não é digitado. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota. O BeforePost recompõe: total dos produtos mais frete, seguro e despesas, menos o desconto. Quando a natureza gera duplicata, a soma das parcelas precisa bater exatamente com este valor, e o valor é confrontado com o limite de crédito do cliente. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante, herdado do cliente na inclusão. Zerado automaticamente quando a natureza não gera comissão (GERA_COMISSAO diferente de `'2'`). |
| Banco | `BANCO` | INTEGER |  |  | Banco de cobrança; F4 consulta. Vem do cadastro do cliente na inclusão. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, preenchido junto com o código. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança; F4 consulta. Vem do cadastro do cliente na inclusão. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução, preenchida junto com o código. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Somatório da base de IPI dos itens, recalculado pelo sistema. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Somatório do IPI dos itens, recalculado pelo sistema. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes. Quando a nota veio de um pedido, o Gravar avisa se divergir do volume do pedido e oferece voltar ao campo. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Somatório do desconto de ICMS dos itens (redução concedida), recalculado pelo sistema. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do destinatário, copiado do cadastro do cliente. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do destinatário, copiada do cadastro. Ter IE e ser pessoa jurídica muda a alíquota de ICMS aplicada. |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço do destinatário montado em uma linha só, copiado do cadastro do cliente. (calculado na consulta) |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do destinatário, copiado do cadastro. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga, digitada. |
| Nota Fiscal de Entrada | `NOTA_ENTRADA` | VARCHAR(1) | 1 |  | Caixa de marcação: `'2'` marcado (nota de entrada), `'1'` desmarcado (nota de saída). O NewRecord grava `'1'` e o Exit da natureza acerta conforme o TIPO da CFOP. Quando `'2'`, a Data Saída passa a ser obrigatória e a CFOP precisa ser de Entrada. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Vem da configuração da estação e o controle fica desabilitado. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data de saída da mercadoria. Obrigatória quando a nota é de entrada. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora de saída da mercadoria, no formato HH:MM. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Nome do contato no cliente, herdado do cadastro na inclusão. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Caixa de marcação somente leitura: `'2'` marcado, `'1'` desmarcado. O NewRecord grava `'1'` e o valor vem do cadastro do cliente. Define qual alíquota de ICMS é aplicada e, em venda interestadual, faz aparecerem as colunas de ICMS de destino na grade de produtos. |
| N.S.U. Nota | `NSU_NOTA_FISCAL` | DOUBLE PRECISION |  |  | Número sequencial único da nota, somente leitura. Gerado por MAX(NSU_NOTA_FISCAL) + 1 na empresa e usado apenas quando a empresa não emite NF-e. |
| Nr. Pedido | `NUMERO_PEDIDO` | INTEGER |  |  | Pedido de venda faturado por esta nota. F4 lista pedidos com status `'Liberado'` (pedido `'Pendente'` é recusado) e importa cliente, endereços, representante, comissão, forma de pagamento, modalidade de frete, observações e os itens. |
| Indicador Pagto | `INDICADOR_FORMA_PAGAMENTO` | INTEGER |  |  | Código do indicador da forma de pagamento (cadastro próprio); F4 consulta. Obrigatório no Gravar. |
| Descrição do Indicador da Forma de Pagamento | `DESCRICAO_INDICADOR_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição do indicador, preenchida junto com o código. (calculado na consulta) |
| Finalidade NF-e | `FINALIDADE_EMISSAO_NFE` | VARCHAR(15) | 15 |  | Combo com `'Ajuste'`, `'Complementar'`, `'Devolução'` e `'Normal'`. O NewRecord grava `'Normal'` quando a empresa usa NF-e, e a natureza marcada como devolução de venda força `'Devolução'`. `'Complementar'` esconde a aba de nota referenciada, mostra a de nota complementar, exige a chave da NF-e complementar e grava SITUACAO_DOCUMENTO_FISCAL = 6; só na finalidade `'Normal'` o item exige quantidade e valor. Campo não extraído para o TSV; tipo lido do TField no DFM. |
| Forma Emissão NFE | `FORMA_EMISSAO_NFE` | VARCHAR(20) | 20 |  | Combo com `'Normal'`, `'FSDA'`, `'SVC-AN'`, `'SVC-RS'` e `'SVC-SP'`. Não é escolhido na prática: NewRecord e BeforePost sempre regravam o valor do parâmetro do sistema. Qualquer variante SVC caracteriza contingência e o Gravar passa a exigir data e justificativa de entrada em contingência. Campo não extraído para o TSV; tipo lido do TField no DFM. |
| Extensão da CFOP | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 |  | Extensão da CFOP do cabeçalho. A lista do combo é carregada na abertura a partir das extensões cadastradas para aquela natureza (os itens `'Sim'` e `'Não'` gravados no DFM são apenas resíduo de projeto). Campo não extraído para o TSV; tipo lido do TField no DFM. |

#### Transportadora

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora; F4 consulta. Obrigatória no Gravar. Vem do cadastro do cliente na inclusão. |
| Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, preenchido junto com o código. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete, do cadastro próprio; F4 consulta. Obrigatória no Gravar. Modalidade `0` obriga informar o Frete Comb. maior que zero. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade, preenchida junto com o código. (calculado na consulta) |
| Frete Comb. | `VALOR_FRETE_COMBINADO` | DOUBLE PRECISION |  |  | Valor do frete combinado com a transportadora. Exigido maior que zero quando a modalidade de frete é `0`. Não entra no total da nota. |
| Nome do Contato | `NOME_CONTATO_FRETE_COMBINADO` | VARCHAR(25) | 25 |  | Contato na transportadora para o frete combinado. |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho; F4 consulta. Vem do cadastro do cliente na inclusão. |
| Nome do Redespacho | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho, preenchido junto com o código. |
| Marca | `MARCA` | VARCHAR(20) | 20 |  | Marca dos volumes. O NewRecord traz o padrão do parâmetro do sistema (NOTA_MARCA). |
| Espécie | `ESPECIE` | VARCHAR(20) | 20 |  | Espécie dos volumes. O NewRecord traz o padrão do parâmetro do sistema (NOTA_ESPECIE). |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF de emplacamento do veículo. Passa a ser obrigatória quando a Placa está preenchida. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 |  | Nome do motorista do veículo. |
| Número | `NUMERO_NOTA` | VARCHAR(20) | 20 |  | Número do documento de transporte informado manualmente pelo embarque. |
| Nome Funcionário Embarque | `NOME_FUNCIONARIO_EMBARQUE` | VARCHAR(50) | 50 |  | Nome do funcionário responsável pelo embarque. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo. Preenchê-la torna a UF obrigatória. |

#### Nota Fiscal Referênciada

Aba escondida quando a finalidade da NF-e é `'Complementar'`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição do Modelo da Nota Fiscal Referenciada | `DESCRICAO_NOTA_REFERENCIADA` | VARCHAR(100) | 100 |  | Descrição do modelo de documento fiscal, preenchida a partir do código. (calculado na consulta) |
| Modelo | `MODELO_NOTA_REFERENCIADA` | VARCHAR(2) | 2 |  | Modelo do documento referenciado: `'01'` nota fiscal modelo 1, `'04'` nota fiscal de produtor, `'55'` NF-e e `'57'` CT-e. Precisa estar preenchido antes de lançar qualquer linha na grade e é ele que define quais colunas da grade são exigidas em cada caso. |

#### Dados Adicionais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Observação Extra da Nota Fiscal | `OBSERVACAO_EXTRA_01` | VARCHAR(67) | 67 |  | Primeira linha da observação livre impressa na nota. Quando a nota vem de um pedido, recebe a OBSERVACAO_01 do pedido. |
| `edtobservacao_extra_02` | `OBSERVACAO_EXTRA_02` | VARCHAR(67) | 67 |  | Segunda linha da mesma observação, sem rótulo próprio. Recebe a OBSERVACAO_02 do pedido de origem. |
| `edtobservacao_extra_03` | `OBSERVACAO_EXTRA_03` | VARCHAR(67) | 67 |  | Terceira linha da mesma observação, sem rótulo próprio. Recebe a OBSERVACAO_03 do pedido de origem. |

#### Dados da Importação

Aba visível só quando a natureza marca a nota como de importação (NOTA_FISCAL_IMPORTACAO = `'2'`). Nesse caso todos os campos abaixo são exigidos no Gravar.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nº Documento (DI/DSI/DA) | `NUMERO_DOCUMENTO_IMPORTACAO` | VARCHAR(10) | 10 |  | Número da declaração de importação. Obrigatório em nota de importação. |
| Data (DI/DSI/DA) | `DATA_REGISTRO_IMPORTACAO` | TIMESTAMP |  |  | Data de registro da declaração. Obrigatória e validada como data em nota de importação. |
| Local de Desembaraço | `LOCAL_DESEMBARACO_IMPORTACAO` | VARCHAR(60) | 60 |  | Local do desembaraço aduaneiro. Obrigatório em nota de importação. |
| Desembaraço | `DATA_DESEMBARACO_IMPORTACAO` | TIMESTAMP |  |  | Data do desembaraço aduaneiro. Obrigatória e validada como data em nota de importação. |
| Total Invoice | `TOTAL_IMPORTACAO_INVOICE` | DOUBLE PRECISION |  |  | Total da invoice na moeda estrangeira. Exigido maior que zero em nota de importação. |
| Total Imp. R$ | `TOTAL_IMPORTACAO_REAL` | DOUBLE PRECISION |  |  | Total da importação convertido em reais. Exigido maior que zero em nota de importação. |
| UF | `UF_DESEMBARACO_IMPORTACAO` | VARCHAR(2) | 2 |  | UF do desembaraço, escolhida em combo com as 27 unidades federativas mais `'EX'` (exterior) e o valor em branco. Obrigatória em nota de importação. Campo não extraído para o TSV; tipo lido do TField no DFM. |
| Forma de Importação | `FORMA_IMPORTACAO` | VARCHAR(25) | 25 |  | Combo com `'01 - Por Conta Própria'`, `'02 - Por Conta e Ordem'` e `'03 - Por Encomenda'`. Campo não extraído para o TSV; tipo lido do TField no DFM. |
| Via de Transporte | `VIA_TRANSPORTE` | VARCHAR(35) | 35 |  | Combo com as vias da importação: `'01 - Marítima'`, `'02 - Fluvial'`, `'03 - Lacustre'`, `'04 - Aérea'`, `'05 - Postal'`, `'06 - Ferroviária'`, `'07 - Rodoviária'`, `'08 - Conduto / Rede Transmissão'`, `'09 - Meios Próprios'`, `'10 - Entrada / Saída ficta'`, `'11 - Courier'` e `'12 - Handcarry'`. Campo não extraído para o TSV; tipo lido do TField no DFM. |

#### Dados da Exportação

Aba visível só quando a natureza marca a nota como de exportação (NOTA_FISCAL_EXPORTACAO = `'2'`).

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| UF Embarque | `UF_EMBARQUE` | VARCHAR(2) | 2 |  | UF de embarque da mercadoria; F4 consulta os estados. Obrigatória quando a CFOP começa por `7`. |
| Nome da UF de Embarque | `NOME_UF_EMBARQUE` | VARCHAR(50) | 50 |  | Nome do estado de embarque, preenchido junto com a sigla. (calculado na consulta) |
| Local de Embarque | `LOCAL_EMBARQUE` | VARCHAR(60) | 60 |  | Local de embarque. Obrigatório quando a CFOP começa por `7`. |
| Nome do Navio | `NOME_NAVIO_EXPORTACAO` | VARCHAR(50) | 50 |  | Nome do navio, informativo para a exportação. |
| Nome do Porto de Embarque | `NOME_PORTO_EMBARQUE_EXPORTACAO` | VARCHAR(50) | 50 |  | Porto de embarque da carga. |
| Nome do Porto de Destino | `NOME_PORTO_DESTINO_EXPORTACAO` | VARCHAR(50) | 50 |  | Porto de destino da carga. |
| Nº Contrato | `CONTRATO_EXPORTACAO` | VARCHAR(30) | 30 |  | Número do contrato de exportação. |
| Pallets | `PALLETS_EXPORTACAO` | INTEGER |  |  | Quantidade de pallets embarcados. |
| Marks | `MARKS_NUMBERS_EXPORTACAO` | VARCHAR(50) | 50 |  | Marcas e números dos volumes exportados. |

#### Nota Fiscal Complementar

Aba visível só quando a finalidade da NF-e é `'Complementar'`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Chave da NF-e Referenciada | `IDENTIFICACAO_XML_COMPLEMENTAR` | VARCHAR(60) | 60 |  | Chave de acesso da NF-e que está sendo complementada. Obrigatória na finalidade `'Complementar'`, precisa ter 44 dígitos depois de retirados os separadores, precisa existir em `NOTA` e a nota encontrada precisa estar com STATUS `'NFE Autorizada'`. |

#### Informações dos Dados da Cobrança

Bloco copiado do cadastro do cliente no Exit do código do cliente (ou do pedido, quando a nota é faturada de um pedido); é o endereço impresso na cobrança.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Bairro | `BAIRRO_COBRANCA` | VARCHAR(50) | 50 |  | Bairro do endereço de cobrança, trazido do cadastro do cliente. |
| Endereço | `ENDERECO_COBRANCA` | VARCHAR(50) | 50 |  | Logradouro de cobrança, trazido do cadastro do cliente. |
| Número | `NUMERO_ENDERECO_COBRANCA` | VARCHAR(10) | 10 |  | Número do endereço de cobrança, trazido do cadastro. |
| Complemento | `COMPLEMENTO_COBRANCA` | VARCHAR(40) | 40 |  | Complemento do endereço de cobrança, trazido do cadastro. |
| Cep | `CEP_COBRANCA` | VARCHAR(10) | 10 |  | CEP de cobrança, trazido do cadastro. |
| Estado | `ESTADO_COBRANCA` | VARCHAR(2) | 2 |  | Sigla da UF de cobrança, trazida do cadastro. |
| Nome da Cidade | `CIDADE_COBRANCA` | VARCHAR(50) | 50 |  | Nome da cidade de cobrança, trazido do cadastro. |
| Cidade | `CODIGO_CIDADE_COBRANCA` | INTEGER |  |  | Código IBGE da cidade de cobrança, trazido do cadastro. É o que vai para o XML. |

#### Informações dos Dados da Entrega

Bloco copiado do cadastro do cliente (ou do pedido) no Exit do código do cliente; é o endereço de entrega da mercadoria quando difere do endereço principal.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Bairro | `BAIRRO_ENTREGA` | VARCHAR(50) | 50 |  | Bairro do endereço de entrega, trazido do cadastro do cliente. |
| Endereço | `ENDERECO_ENTREGA` | VARCHAR(50) | 50 |  | Logradouro de entrega, trazido do cadastro do cliente. |
| Número | `NUMERO_ENDERECO_ENTREGA` | VARCHAR(10) | 10 |  | Número do endereço de entrega, trazido do cadastro. |
| Complemento | `COMPLEMENTO_ENTREGA` | VARCHAR(40) | 40 |  | Complemento do endereço de entrega, trazido do cadastro. |
| Cep | `CEP_ENTREGA` | VARCHAR(10) | 10 |  | CEP de entrega, trazido do cadastro. |
| Estado | `ESTADO_ENTREGA` | VARCHAR(2) | 2 |  | Sigla da UF de entrega, trazida do cadastro. |
| Nome da Cidade | `CIDADE_ENTREGA` | VARCHAR(50) | 50 |  | Nome da cidade de entrega, trazido do cadastro. |
| Cidade | `CODIGO_CIDADE_ENTREGA` | INTEGER |  |  | Código IBGE da cidade de entrega, trazido do cadastro. É o que vai para o XML. |

#### NFE

Aba de retorno da NF-e. Os três campos são somente leitura e preenchidos pelo processo de geração e autorização.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Identificação do XML | `IDENTIFICACAO_XML` | VARCHAR(60) | 60 |  | Chave de acesso da NF-e gerada. Somente leitura. É a chave procurada quando outra nota informa esta como complementar. |
| Nº Lote NFE | `LOTE_NFE` | INTEGER |  |  | Número do lote enviado à SEFAZ. Somente leitura. |
| Protocolo de Autorização da NFE | `PROTOCOLO_ENVIO_NFE` | VARCHAR(25) | 25 |  | Protocolo devolvido na autorização. Somente leitura. |

#### Emissão da Nota Fiscal... (continuação)

Totais fiscais no rodapé do painel principal.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Valor I. I. | `VALOR_IMPOSTO_IMPORTACAO` | DOUBLE PRECISION |  |  | Somatório do imposto de importação dos itens, calculado pelo sistema. Só faz sentido em nota de importação. |
| B.C. I. I. | `BASE_CALCULO_IMPORTACAO` | DOUBLE PRECISION |  |  | Somatório da base de cálculo do imposto de importação dos itens, calculado pelo sistema. |
| Base S.T. | `BASE_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Somatório da base de substituição tributária dos itens, calculado pelo sistema. |
| Valor S.T. | `VALOR_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  |  | Somatório do ICMS de substituição tributária dos itens, calculado pelo sistema. |
| `edtnumero_fci` | `NUMERO_FCI` | VARCHAR(50) | 50 |  | Sem rótulo e com fundo de campo desabilitado: mostra o número da FCI do item corrente da grade de produtos (vem de `IT_NOTA`, não do cabeçalho). É preenchido sozinho por consulta à tabela FCI quando o estado do cliente difere do da empresa, no mês da emissão. |

### Grade `dbproduto` — tabela IT_NOTA

Itens da nota. Cada linha ganha SEQ por MAX(SEQ) + 1 dentro de EMPRESA + SERIE + NUMERO e herda a CFOP do cabeçalho. As colunas de importação (Valor Invoice, Nº Adição, Complemento, Seq. Adição, % I. I., B.C. I. I., Valor I. I., Desp. Aduaneira e Valor Oper. Financ.) só aparecem em nota de importação; as duas últimas, só em nota de exportação.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto; o botão da célula abre a consulta. Só aceita item ativo (INATIVO = `'1'`), classificado como produto (TIPO_PRODUTO = `'2'`) e com NCM preenchido — nos demais casos avisa o motivo e limpa a linha. Ao aceitar, traz descrição, unidade, referência, unidade de medida da NF-e e código de barras, sugere quantidade 1 e o preço, e recalcula IPI, I.I. e ICMS. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, copiada do cadastro. Não é digitada. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, copiada do cadastro. Não é digitada. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida, copiada do cadastro do produto. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 | CFOP do item. O NewRecord copia a CFOP do cabeçalho; precisa existir no cadastro, senão o item não grava. |
| Ext. | `NATUREZA_OPERACAO_EXTENSAO` | VARCHAR(3) | 3 | Extensão da CFOP do item. Só aceita extensão cadastrada para aquela CFOP; qualquer outro texto é descartado. |
| Lote | `LOTE` | INTEGER |  | Lote de produção de onde sai a mercadoria. Validado contra o cadastro de lotes e contra a referência do produto. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade faturada. Exigida maior que zero quando a finalidade da NF-e é `'Normal'`. Movimenta empenho e faturado do lote. |
| Valor Invoice | `VALOR_UNITARIO_INVOICE` | DOUBLE PRECISION |  | Valor unitário na moeda da invoice. Coluna visível só em nota de importação. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário. Sugerido do cadastro: preço de custo quando a natureza usa preço de custo, senão preço de venda. Avisa quando abaixo do preço mínimo do produto. Exigido maior que zero na finalidade `'Normal'`. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes valor, recalculado no BeforePost do item. Exigido maior que zero na finalidade `'Normal'`. Serve de base ao rateio de frete, seguro, despesa e desconto. |
| Nº Adição | `NUMERO_ADICAO_IMPORTACAO` | INTEGER |  | Número da adição na declaração de importação. Coluna visível só em nota de importação. |
| Complemento | `COMPLEMENTO_PRODUTO` | VARCHAR(150) | 150 | Texto complementar à descrição do produto na nota. Coluna visível só em nota de importação. |
| Seq. Adição | `SEQ_ADICAO_IMPORTACAO` | INTEGER |  | Sequência do item dentro da adição. Coluna visível só em nota de importação. |
| % I. I. | `ALIQUOTA_IMPORTACAO` | DOUBLE PRECISION |  | Alíquota do imposto de importação do item. Coluna visível só em nota de importação. |
| B.C. I. I. | `BASE_CALCULO_IMPORTACAO` | DOUBLE PRECISION |  | Base de cálculo do imposto de importação do item. Coluna visível só em nota de importação. |
| Valor I. I. | `VALOR_IMPOSTO_IMPORTACAO` | DOUBLE PRECISION |  | Valor do imposto de importação do item, calculado pela rotina de I.I. Coluna visível só em nota de importação. |
| Desp. Aduaneira | `VALOR_DESPESA_ADUANEIRA` | DOUBLE PRECISION |  | Despesas aduaneiras rateadas no item. Coluna visível só em nota de importação. |
| Valor Oper. Financ. | `VALOR_OPERACAO_FINANCEIRA` | DOUBLE PRECISION |  | IOF ou outras despesas financeiras da importação. Coluna visível só em nota de importação. |
| CST Icms | `TRIBUTO` | VARCHAR(8) | 8 | Código da situação tributária do ICMS. Só aceita código existente no cadastro de tributos; qualquer outro é apagado. Quando os dígitos 2 e 3 não são `'00'` nem `'60'` e a alíquota é menor que 17, o produto precisa ter código de benefício fiscal, senão o Gravar reclama. |
| % Icms | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item, calculada pela rotina de ICMS a partir do estado e do CST. |
| Base Icms | `BASE_ICMS` | DOUBLE PRECISION |  | Base de cálculo do ICMS do item, calculada pelo sistema. Soma no cabeçalho. |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  | ICMS do item, calculado pelo sistema. Soma no cabeçalho. |
| % Subst. | `PERCENTUAL_ICMS_SUBSTITUICAO` | DOUBLE PRECISION |  | Alíquota interna usada no cálculo da substituição tributária. Zerada no NewRecord. |
| % MVA Subst. | `MVA_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | Margem de valor agregado da substituição tributária. Zerada no NewRecord. |
| Base Subst. | `BASE_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | Base da substituição tributária do item. Zerada no NewRecord e calculada pela rotina de ICMS. |
| Valor Subst. | `VALOR_SUBSTITUICAO_TRIBUTARIA` | DOUBLE PRECISION |  | ICMS de substituição tributária do item. Zerado no NewRecord e calculado pela rotina de ICMS. |
| CST Ipi | `TRIBUTO_IPI` | VARCHAR(2) | 2 | Código da situação tributária do IPI. Só aceita código existente no cadastro de tributos de IPI; qualquer outro é apagado. Na finalidade `'Complementar'`, informar IPI sem CST aborta a gravação do item. |
| % IPI | `ALIQUOTA_IPI` | DOUBLE PRECISION |  | Alíquota de IPI do item, calculada pela rotina de IPI. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  | Base de cálculo do IPI do item. Soma no cabeçalho. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  | IPI do item. Zerado no NewRecord e calculado pela rotina de IPI. Soma no cabeçalho. |
| Desc.ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  | Redução da base de ICMS concedida no item. Zerado no NewRecord. Coluna mantida sempre invisível pela rotina que atualiza a tela. |
| CST PIS | `TRIBUTO_PIS` | VARCHAR(2) | 2 | Código da situação tributária do PIS. Coluna mantida sempre invisível pela rotina que atualiza a tela. |
| % PIS | `ALIQUOTA_PIS` | DOUBLE PRECISION |  | Alíquota de PIS do item. Coluna mantida sempre invisível. |
| Base PIS | `BASE_PIS` | DOUBLE PRECISION |  | Base de cálculo do PIS do item. Coluna mantida sempre invisível. |
| Valor PIS | `VALOR_PIS` | DOUBLE PRECISION |  | PIS do item. Coluna mantida sempre invisível. |
| CST COFINS | `TRIBUTO_COFINS` | VARCHAR(2) | 2 | Código da situação tributária da COFINS. Coluna aparece só em venda interestadual a consumidor final. |
| % COFINS | `ALIQUOTA_COFINS` | DOUBLE PRECISION |  | Alíquota de COFINS do item. Coluna aparece só em venda interestadual a consumidor final. |
| Base COFINS | `BASE_COFINS` | DOUBLE PRECISION |  | Base de cálculo da COFINS do item. Coluna aparece só em venda interestadual a consumidor final. |
| Valor COFINS | `VALOR_COFINS` | DOUBLE PRECISION |  | COFINS do item. Coluna aparece só em venda interestadual a consumidor final. |
| % ICMS Dest. | `ALIQUOTA_ICMS_CALCULADO_DESTINO` | DOUBLE PRECISION |  | Campo calculado do Delphi, não gravado: valor do ICMS de destino dividido pela base de destino vezes o percentual de partilha, em porcentagem. Fica zero quando não há partilha. Coluna aparece só em venda interestadual a consumidor final. |
| % Partilha | `PERCENTUAL_PARTILHA` | DOUBLE PRECISION |  | Percentual da partilha do ICMS devido ao estado de destino no ano vigente. Maior que zero é uma das condições para a nota entrar na partilha de ICMS. |
| Valor ICMS Dest. | `VALOR_ICMS_INTER_DESTINO` | DOUBLE PRECISION |  | ICMS devido ao estado de destino no item. Somado no cabeçalho pelo BeforePost. |
| % FCP Dest. | `ALIQUOTA_FCP_DESTINO` | DOUBLE PRECISION |  | Alíquota do Fundo de Combate à Pobreza do estado de destino. |
| Valor FCP Dest. | `VALOR_FCP_DESTINO` | DOUBLE PRECISION |  | Valor do Fundo de Combate à Pobreza do item. Somado no cabeçalho pelo BeforePost. |
| Nº Regsitro Exportação | `NUMERO_REGISTRO_EXPORTACAO` | VARCHAR(15) | 15 | Número do registro de exportação do item. Coluna visível só em nota de exportação. |
| Chave de acesso da NFe de Registro de Exportação | `NFE_REGISTRO_EXPORTACAO` | VARCHAR(44) | 44 | Chave da NF-e de remessa que originou a exportação. Coluna visível só em nota de exportação. |

### Grade `dbvencimentos_historico` — tabela RECEBER

Grade somente leitura, na aba Vencimentos, com os títulos que já existem no contas a receber para esta série e número (DOCUMENTO = NF). Serve para conferir o que foi efetivamente gerado; nada é digitado aqui.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela no contas a receber (PK5). Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Somente leitura. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias entre emissão e vencimento do título. Somente leitura. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. Somente leitura. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do título. Somente leitura. |

### Grade `dbvencimentos` — tabela IT_NOTA_VENCIMENTO

Parcelas da nota, digitadas na aba Vencimentos. Só entram em jogo quando a natureza gera duplicata: nesse caso a soma das parcelas precisa bater centavo a centavo com o total da nota, senão o Gravar aborta e volta para esta aba.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela (PK3), gerado por MAX(SEQ) + 1 dentro da nota. Não é digitado. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. O NewRecord copia a emissão da nota. Vazia aborta a gravação da parcela. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias. Digitar os dias recalcula o vencimento a partir da emissão. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento. Digitar a data recalcula os dias. Vazia aborta a gravação da parcela. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. O NewRecord já sugere o que falta para fechar o total da nota. Exigido maior que zero. |

### Grade `dbnota_fiscal_referenciada` — tabela IT_NOTA_REFERENCIADA

Documentos fiscais referenciados pela nota. Exige que o Modelo esteja preenchido antes da primeira linha; SEQ é gerado por MAX(SEQ) + 1 dentro da nota. Nos modelos `'55'` e `'57'` o lançamento é feito pela chave de acesso; no modelo `'04'` (produtor) e no `'01'`, pelos dados do documento.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Chave da NF-e | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 | Chave de acesso do documento referenciado, usada nos modelos `'55'` (NF-e) e `'57'` (CT-e). A nota apontada precisa existir e estar com STATUS `'NFE Autorizada'` ou `'Faturada'`. |
| Número | `NUMERO_NOTA_FISCAL` | INTEGER |  | Número do documento referenciado. Ao ser digitado, procura a nota de saída correspondente e recusa documento cujo status não seja `'NFE Autorizada'` ou `'Faturada'`. |
| Série | `SERIE_NOTA_FISCAL` | VARCHAR(5) | 5 | Série do documento referenciado, com a mesma validação de status do número. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do documento referenciado. |
| CNPJ / CPF | `CNPJ_CPF` | VARCHAR(18) | 18 | CNPJ ou CPF do emitente do documento referenciado. Usado principalmente na nota de produtor. |
| Insc. Estadual | `INSCRICAO_ESTADUAL` | VARCHAR(18) | 18 | Inscrição estadual do emitente do documento referenciado. |
| Estado | `ESTADO` | VARCHAR(2) | 2 | Sigla da UF do emitente do documento referenciado, validada contra o cadastro de estados. |
| Nome do Estado | `NOME_ESTADO` | VARCHAR(50) | 50 | Nome do estado, preenchido junto com a sigla. (calculado na consulta) |

### Grade `dbeventos_nfe` — tabela IT_NOTA_CARTA_CORRECAO

Grade somente de consulta, na aba NFE, alimentada por uma UNION de três origens: cartas de correção em `IT_NOTA_CARTA_CORRECAO`, conhecimentos de frete em `IT_NOTA_REFERENCIADA` ligados a `ENTRADA` e notas de devolução em `IT_NOTA_REFERENCIADA` ligadas a `NOTA`. Duplo clique abre o evento correspondente.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número | `NUMERO_NF` |  |  | Número do evento ou do documento ligado à nota: a sequência da carta de correção, o número do CT-e ou o número da nota de devolução, conforme a origem da linha. Expressão da consulta, não é coluna direta. |
| Tipo | `TIPO` |  |  | Origem da linha, gravada como literal pela consulta: `'CCE'` carta de correção, `'CTE'` conhecimento de frete lançado como referenciado e `'NFD'` nota de devolução que referencia esta nota. Expressão da consulta, não é coluna direta. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do evento ou do documento correspondente. É por ela que a grade é ordenada. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |

<a id="umov_nota_fiscal_venda_alteracao"></a>

## `umov_nota_fiscal_venda_alteracao` — Alteração dos Dados da Emissão da Nota Fiscal...

Tela de manutenção de notas fiscais **já emitidas**: grava em `NOTA` (chave EMPRESA + SERIE + NUMERO) e mostra os itens de `IT_NOTA` em uma grade. É o contrário da tela de emissão — só aceita nota com STATUS `'Faturada'` ou `'NFE Autorizada'`; nota `'Pendente'`, `'NFE Gerada'` ou `'Cancelada'` é recusada no Gravar. Painel único, sem abas. A maioria dos campos vem desabilitada e serve só de conferência; o que se altera de fato é transportadora, representante, comissão, redespacho, banco, instrução de cobrança, os dados do veículo e do motorista, o frete combinado e o lote de cada item. O botão Vencto reprocessa os títulos em `RECEBER` e recalcula a comissão do representante.

Um combo do painel não entrou no TSV (`TRxDBComboBox` do tipo de redespacho): está documentado abaixo com o tipo lido da declaração do `TField` no DFM.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida como texto e nunca digitada. Aqui funciona como porteiro: só `'Faturada'` e `'NFE Autorizada'` deixam gravar; `'Pendente'`, `'NFE Gerada'` e `'Cancelada'` abortam com aviso e devolvem o foco ao número. |
| Nº Nota Fiscal **·chave** | `NUMERO` | INTEGER |  |  | Número da nota a alterar, parte da chave primária (PK2). Não é gerado nesta tela. F4 abre a consulta de notas, F7 e F8 navegam entre elas. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da nota. Campo desabilitado: aqui o destinatário não se troca. Serve de chave na busca dos títulos em RECEBER. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente. Campo desabilitado, só exibição. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 |  | CFOP da nota. Campo desabilitado: a natureza não muda depois de emitida. É consultada no botão Vencto para saber se a nota gera duplicata e comissão. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da CFOP. Campo desabilitado, só exibição. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora; F4 consulta, F3 abre o cadastro. Obrigatória no Gravar. É um dos campos que a tela existe para corrigir. O Exit traz nome, endereço, bairro, CEP, cidade, estado, CNPJ e IE da transportadora. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora. Campo desabilitado, preenchido pelo Exit do código. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota. Campo desabilitado. É reaproveitada como emissão dos títulos ao reprocessar os vencimentos. |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS da nota. Campo desabilitado, só conferência. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante; F4 consulta, F3 abre o cadastro. Obrigatório no Gravar. Trocá-lo é bloqueado quando já existe título empenhado do representante em RECEBER — comissão por Fatura com STATUS_COMISSAO_FATURA diferente de `'Creditado'`, ou comissão por Liquidação com COMISSAO_REAL maior que zero. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante. Campo desabilitado, preenchido pelo Exit do código. |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete da nota. Campo desabilitado, só conferência. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro da nota. Campo desabilitado, só conferência. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas acessórias da nota. Campo desabilitado, só conferência. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto transportado. Campo desabilitado, só conferência. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido transportado. Campo desabilitado, só conferência. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da nota. Campo desabilitado, só conferência. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | ICMS da nota. Campo desabilitado, só conferência. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos itens. Campo desabilitado, só conferência. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota. Campo desabilitado, só conferência. É a base de rateio ao redistribuir a comissão pelos títulos. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante. Editável, mas alterá-lo é bloqueado quando já existe título empenhado desse representante. Quando muda, o botão Vencto recalcula a comissão de cada título em RECEBER. |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho; F4 consulta, F3 abre o cadastro. O Exit traz nome, endereço, bairro, CEP, cidade e estado do redespacho; código inexistente limpa todos eles. |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho — o rótulo repete o da transportadora principal, mas o campo é o do redespacho. Desabilitado, preenchido pelo Exit do código. |
| Modalidade Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete. Campo desabilitado: nesta tela a modalidade só é exibida, não trocada. (calculado na consulta) |
| Banco | `BANCO` | INTEGER |  |  | Banco de cobrança; F4 consulta, F3 abre o cadastro. Editável — é o campo usado para redirecionar a cobrança de uma nota já emitida. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco. Campo desabilitado, preenchido pelo Exit do código. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança; F4 consulta, F3 abre o cadastro. Editável. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução. Campo desabilitado, preenchido pelo Exit do código. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI da nota. Campo desabilitado, só conferência. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | IPI da nota. Campo desabilitado, só conferência. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes. Campo desabilitado, só conferência. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Redução da base de ICMS da nota. Campo desabilitado, só conferência. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do destinatário. Campo desabilitado, só exibição. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do destinatário. Campo desabilitado, só exibição. |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço do destinatário em uma linha só. Campo desabilitado, só exibição. (calculado na consulta) |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do destinatário. Campo desabilitado, só exibição. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga. Campo desabilitado, só conferência. |
| Nota Fiscal de Entrada | `NOTA_ENTRADA` | VARCHAR(1) | 1 |  | Caixa de marcação: `'2'` marcado (nota de entrada), `'1'` desmarcado (nota de saída). Aqui fica habilitada, sem nenhuma validação amarrando ao tipo da CFOP — ao contrário da tela de emissão, onde a natureza é quem define o valor. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Campo desabilitado. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data de saída da mercadoria. Campo desabilitado. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora de saída da mercadoria. Campo desabilitado. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo. Editável — é um dos dados de embarque que esta tela existe para corrigir. |
| Marca | `MARCA` | VARCHAR(20) | 20 |  | Marca dos volumes. Editável. |
| Espécie | `ESPECIE` | VARCHAR(20) | 20 |  | Espécie dos volumes. Editável. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Nome do contato no cliente. Editável. |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF de emplacamento do veículo. Editável. Diferente da tela de emissão, aqui não é exigida quando a placa está preenchida. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 |  | Nome do motorista. Editável. |
| Número | `NUMERO_NOTA` | VARCHAR(20) | 20 |  | Número do documento de transporte informado pelo embarque. Editável. |
| N.S.U. Nota | `NSU_NOTA_FISCAL` | DOUBLE PRECISION |  |  | Número sequencial único da nota. Somente leitura; usado apenas quando a empresa não emite NF-e. |
| Frete Comb. | `VALOR_FRETE_COMBINADO` | DOUBLE PRECISION |  |  | Valor do frete combinado com a transportadora. Editável e sem exigência de valor mínimo nesta tela. Não entra no total da nota. |
| Nome do Contato | `NOME_CONTATO_FRETE_COMBINADO` | VARCHAR(25) | 25 |  | Contato na transportadora para o frete combinado. Editável. |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 |  | Combo com branco, `'CIF'` e `'FOB'` — quem paga o redespacho. O DFM ainda carrega uma lista de valores `'PR'`, `'RS'`, `'SC'`, `'SP'` e `'RJ'`, resíduo de outra versão do campo, mas ela está desligada (EnableValues = False) e o que é gravado é o próprio texto CIF ou FOB. Campo não extraído para o TSV; tipo lido do TField no DFM. |

### Grade `dbproduto` — tabela IT_NOTA

Itens da nota. Só o Lote é realmente editável: o OnColEnter empurra o cursor para a coluna seguinte em todas as outras, de modo que Código, Descrição, UN, Quantidade, Valor e Total ficam de conferência. Trocar o lote de um item devolve a quantidade ao lote antigo e a lança no novo, atualizando EMPENHADA e FATURADO do cadastro de lotes.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto do item. A célula tem botão de reticências, mas o cursor é empurrado para a coluna seguinte: na prática não se troca o produto aqui. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto. Coluna de conferência, o cursor não para nela. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida do produto. Coluna de conferência, o cursor não para nela. |
| Lote | `LOTE` | INTEGER |  | Lote de produção do item — a única coluna editável. Só aceita registro do tipo `'Lote'` (um `'Pré-Lote'` é recusado com aviso), só quando o produto controla lote (CONTROLA_LOTE = `'2'`) e só quando a referência do lote é igual à do produto. Ao mudar, subtrai a quantidade anterior de EMPENHADA e FATURADO do lote antigo e soma no novo; o empenho só é mexido quando o item não veio de pedido. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade faturada do item. Coluna de conferência, o cursor não para nela. É o valor movimentado no empenho e no faturado do lote. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário do item. Coluna de conferência, o cursor não para nela. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total do item. Coluna de conferência, o cursor não para nela. |

<a id="umov_manifesto_documento_fiscal"></a>

## `umov_manifesto_documento_fiscal` — Emissão do Manifesto Eletrônico de Documentos Fiscais...

Monta o MDF-e que acoberta uma viagem. O cabeçalho grava em `MANIFESTO_DOC_ELETRONICO` (chave `EMPRESA` + `SERIE` + `NUMERO`) e cada aba tem sua tabela filha, todas com a mesma chave mais `SEQ`: `IT_MANIFESTO_DOCUMENTO` (documentos fiscais), `IT_MANIFESTO_CONDUTOR` (condutores), `IT_MANIFESTO_CID_CARREGA` (cidades de carregamento) e `IT_MANIFESTO_PEDAGIO` (vale pedágio). Fora das abas ficam ainda os quadros Seguro, Produto Predominante e Observações. Depois de gravar, a tela chama o `MDFe.exe` externo com o comando `Gerar_XML` para produzir o arquivo eletrônico.

#### Emissão do Manifesto Eletrônico de Documentos Fiscais...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(20) | 20 |  | Situação do manifesto, exibida como rótulo. Somente leitura, sem digitação, e é ela que libera ou trava a tela. Valores conhecidos: `'MDFE Pendente'`, atribuído no NewRecord, é o único estado em que o registro pode ser excluído e o único em que o Gravar oferece gerar o XML pela primeira vez; `'MDFE Gerado'`, com o XML já produzido, ainda aceita alteração e oferece gerar o XML de novo. Em qualquer outro status a tela recusa alteração e exclusão com "Manifesto Eletrônico de Documentos com Status ... Impossível Alterar o Registro". |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do manifesto dentro da série. Sugerido como o maior número da série mais um, e recalculado quando a série muda. F7 volta ao anterior, F8 avança, F9 e o botão localizam o mais próximo abaixo. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série do manifesto. Vem preenchida com a série corrente do sistema no NewRecord; ao ser alterada o número é resugerido para a nova série. |
| Rota | `ROTA` | INTEGER |  |  | Rota da viagem. F4 ou o botão abrem a consulta de rotas. Código inexistente limpa o código e a descrição. |
| Descrição da Rota | `DESCRICAO_ROTA` | VARCHAR(50) | 50 |  | Descrição da rota, trazida do cadastro pelo Exit do código. Não é digitada (calculado na consulta). |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do manifesto. Vem com a data do dia no NewRecord. Obrigatória: o Gravar recusa data inválida com "Data da Emissão não Informado ou Inválido". |
| Hora | `HORA` | VARCHAR(5) | 5 |  | Hora de emissão do manifesto. Vem preenchida com a hora do momento no NewRecord. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Transportadora responsável pela viagem. Obrigatória: o Gravar recusa em branco e devolve o foco. F4 ou o botão abrem a consulta de transportadoras. É ela que define a lista de veículos e de motoristas oferecidos nos campos de veículo e na aba de condutores. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, trazido do cadastro pelo Exit do código. Não é digitado (calculado na consulta). |
| Peso Carga | `PESO_TOTAL_MERCADORIA` | DOUBLE PRECISION |  |  | Peso total da carga manifestada. Não precisa ser digitado: cada documento fiscal acrescentado soma o peso bruto da nota, e cada documento excluído o subtrai. Obrigatório e maior que zero no Gravar feito pelo botão. |
| Valor Carga | `VALOR_TOTAL_MERCADORIA` | DOUBLE PRECISION |  |  | Valor total da carga manifestada. Também é somado e subtraído a cada documento fiscal da aba, a partir do total da nota. Obrigatório e maior que zero no Gravar feito pelo botão. |
| Veículo Tração | `VEICULO_TRACAO` | INTEGER |  |  | Veículo que traciona a carga, escolhido entre os veículos da transportadora. Obrigatório: o Gravar recusa em branco. Só aceita veículo com `TIPO = 'Tração'` no cadastro da transportadora; outro tipo é recusado com "O Veículo Selecionado é do Tipo ..." e limpa código, descrição, placa e tara. |
| Descrição do Veículo Tracionado | `NOME_VEICULO_TRACAO` | VARCHAR(21) | 21 |  | Descrição do veículo de tração, trazida do cadastro da transportadora junto com a placa e a tara. Não é digitada (calculado na consulta). |
| Reboque 01 | `VEICULO_REBOQUE_01` | INTEGER |  |  | Primeiro reboque da composição. Só aceita veículo com `TIPO = 'Reboque'`; outro tipo é recusado e limpa código, descrição, placa e tara. Opcional. |
| Descrição do Reboque 01 | `NOME_VEICULO_REBOQUE_01` | VARCHAR(21) | 21 |  | Descrição do primeiro reboque, trazida do cadastro da transportadora. Não é digitada (calculado na consulta). |
| Reboque 02 | `VEICULO_REBOQUE_02` | INTEGER |  |  | Segundo reboque da composição, com a mesma crítica de `TIPO = 'Reboque'`. Opcional. |
| Descrição do Reboque 02 | `NOME_VEICULO_REBOQUE_02` | VARCHAR(21) | 21 |  | Descrição do segundo reboque, trazida do cadastro da transportadora. Não é digitada (calculado na consulta). |
| Retorno de Transporte | `TRANSPORTE_PROPRIO` | VARCHAR(1) | 1 |  | Marca o manifesto como retorno de transporte próprio. Caixa de marcação: marcada grava `'2'`, desmarcada grava `'1'`. Nasce desmarcada, com `'1'`, no NewRecord. Muda o destino usado em cada documento: marcada, a cidade de descarregamento passa a ser a da própria empresa em `PARSIS`, em vez da cidade do cliente da nota. Não pode ser trocada depois que existem documentos lançados — a tela avisa "Impossível alterar o tipo do Manifesto após informar os documentos". |
| Tomador | `TOMADOR` | INTEGER |  |  | Cliente tomador do serviço de transporte. F4 ou o botão abrem a consulta de clientes. Opcional. |
| Razão Social / Nome do Tomador | `NOME_TOMADOR` | VARCHAR(70) | 70 |  | Nome do tomador, trazido do cadastro de clientes pelo Exit do código. Não é digitado (calculado na consulta). |

Sete controles deste bloco não foram captados no TSV, todos combos ligados ao mesmo dataset:

- **Forma Emissão** (`cbforma_emissao`, coluna `FORMA_EMISSAO`) — `'Normal'` ou `'Contingência'`. Nasce `'Normal'` no NewRecord.
- **Doc.** (`cbtipo_documento`, coluna `TIPO_DOCUMENTO`) — hoje só oferece `'NFe'`, e é assim que nasce no NewRecord. O programa ainda reconhece `'CTe'` na crítica dos documentos, mas o trecho que trata o modelo 57 está comentado no código.
- **Modalidade** (`cbmodalidade_transporte`, coluna `MODALIDADE_TRANSPORTE`) — `'Aéreo'`, `'Aquaviário'`, `'Ferroviário'` ou `'Rodoviário'`. Nasce `'Rodoviário'`.
- **UN Peso Carga** (`cbunidade_medida_carga`, coluna `UNIDADE_MEDIDA_CARGA`) — `'KG'`, `'LT'`, `'M3'`, `'TON'` ou `'UN'`. Obrigatória no Gravar pelo botão.
- **UF Final Descar.** (`cbuf_final_descarregamento`, coluna `UF_FINAL_DESCARREGAMENTO`) — sigla do estado de descarregamento final, das 27 unidades da federação mais `'EX'` para exterior. Obrigatória no Gravar pelo botão.
- **Tipo de Transportador** (`RxDBComboBox1`, coluna `TIPO_TRANSPORTADOR`) — mostra a descrição e grava o código: vazio, `'ETC'` (empresa de transporte de cargas), `'TAC'` (transportador autônomo) ou `'CTC'` (cooperativa).
- **Tipo de Carga** (`cbtipo_carga_produto_predominante`, coluna `PROD_PRED_TIPO_CARGA`, na aba Produto Predominante) — mostra a descrição e grava o código de dois dígitos: `'01'` granel sólido, `'02'` granel líquido, `'03'` frigorificada, `'04'` conteinerizada, `'05'` carga geral, `'06'` neogranel, `'07'` perigosa granel sólido, `'08'` perigosa granel líquido, `'09'` perigosa frigorificada, `'10'` perigosa conteinerizada, `'11'` perigosa carga geral.

#### Documento(s)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número CIOT | `NUMERO_CIOT` | VARCHAR(30) | 30 |  | Código Identificador da Operação de Transporte, exigido quando o frete é contratado de transportador autônomo. Digitado. |

#### Seguro

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Seguradora | `SEGURADORA` | INTEGER |  |  | Código da seguradora da carga, buscado no cadastro de fornecedores. F4 ou o botão abrem a consulta, F3 abre o cadastro de fornecedor. |
| Razão Social / Nome da Seguradora | `NOME_SEGURADORA` | VARCHAR(70) | 70 |  | Nome da seguradora, trazido do cadastro de fornecedores pelo Exit do código. Não é digitado (calculado na consulta). |
| Responsável | `RESPONSAVEL` | INTEGER |  |  | Código do responsável pelo seguro, buscado no cadastro de clientes. F4 ou o botão abrem a consulta. |
| Razão Social / Nome do Responsável | `NOME_RESPONSAVEL` | VARCHAR(70) | 70 |  | Nome do responsável, trazido do cadastro de clientes pelo Exit do código. Não é digitado (calculado na consulta). |
| Número da Apólice | `NUMERO_APOLICE` | VARCHAR(20) | 20 |  | Número da apólice de seguro da carga. Digitado. |
| Número da Averbação | `NUMERO_AVERBACAO` | VARCHAR(40) | 40 |  | Número da averbação do seguro. Digitado. |

O quadro tem ainda o combo **Responsável** (`cbtipo_responsavel_seguro`, coluna `TIPO_RESPONSAVEL_SEGURO`), fora do TSV, com dois valores gravados por extenso: `'Emitente do MDF-e'` ou `'Contratante'`. Ele diz quem responde pelo seguro; os campos Responsável e Nome do Responsável identificam quem é, quando não é o próprio emitente.

#### Produto Predominante

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição | `PROD_PRED_DESCRICAO` | VARCHAR(120) | 120 |  | Descrição do produto predominante da carga, informação exigida no MDF-e. Digitada. |
| Código de Barras (EAN) | `PROD_PRED_CODIGO_BARRA` | VARCHAR(14) | 14 |  | Código de barras EAN do produto predominante. Digitado. |
| NCM | `PROD_PRED_NCM` | VARCHAR(10) | 10 |  | Classificação fiscal NCM do produto predominante. Digitada. |

#### Observações

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Observações | `OBSERVACAO` | BLOB |  |  | Observações gerais do manifesto, em texto livre de várias linhas. Tudo o que se digita aqui é convertido para maiúsculas, e o Enter quebra linha em vez de pular de campo. |

### Grade `dbdocumentos` — tabela IT_MANIFESTO_DOCUMENTO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Identificação do Arquivo XML do Documento | `IDENTIFICACAO_ARQUIVO_XML` | VARCHAR(60) | 60 | Chave de acesso de 44 dígitos do documento fiscal manifestado, formatada automaticamente ao digitar. É o único campo digitado da grade: dela o sistema extrai o modelo (posições 21 e 22), a série e o número, e busca o documento em `NOTA` — ou, se não achar, na `ENTRADA` pelo CNPJ do fornecedor lido da própria chave. Chave que o sistema não emitiu é recusada com "A Chave de Acesso do Documento XML não foi emitida pelo Sistema" e a célula é limpa. Modelo `'55'` é NFe e `'57'` é CTe: misturar os dois no mesmo manifesto é recusado. Ao aceitar, o peso e o valor da nota são somados aos totais do cabeçalho, e a cidade de descarregamento é preenchida a partir do cliente da nota — ou da cidade da empresa, quando Retorno de Transporte está marcado. Excluir a linha subtrai peso e valor dos totais. |
| Série NFe | `SERIE_NFE` | INTEGER |  | Série da nota fiscal manifestada. Não é digitada: sai das posições 23 a 25 da chave de acesso, quando o modelo é `'55'`. |
| Número NFe | `NUMERO_NFE` | INTEGER |  | Número da nota fiscal manifestada. Não é digitado: sai das posições 26 a 34 da chave de acesso, quando o modelo é `'55'`. |
| Série CTe | `SERIE_CTE` | INTEGER |  | Série do conhecimento de transporte manifestado, para o modelo `'57'`. Não é digitada. O trecho que preenche esta coluna está comentado no programa: na prática a tela hoje só trabalha com NFe. |
| Número CTe | `NUMERO_CTE` | INTEGER |  | Número do conhecimento de transporte manifestado, para o modelo `'57'`. Não é digitado, e vale a mesma ressalva da série. |

A grade grava ainda `CIDADE_DESCARREGAMENTO` e `NOME_CIDADE_DESCARREGAMENTO`, preenchidas pelo sistema a partir do documento, sem coluna visível. O Gravar pelo botão exige pelo menos um documento: sem nenhum, avisa "Documentos Fiscais do Manifesto não Informado ou Inválido" e leva o foco para esta aba.

### Grade `dbcondutor` — tabela IT_MANIFESTO_CONDUTOR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Condutor | `CONDUTOR` | INTEGER |  | Sequência do motorista dentro do cadastro da transportadora escolhida no cabeçalho. F4 ou o botão da célula abrem a consulta de motoristas daquela transportadora; código sem correspondência limpa as três colunas. |
| Nome Condutor | `NOME_CONDUTOR` | VARCHAR(50) | 50 | Nome do motorista, copiado do cadastro da transportadora. Não é digitado (calculado na consulta). |
| CPF Condutor | `CPF_CONDUTOR` | VARCHAR(18) | 18 | CPF do motorista, copiado do cadastro da transportadora. Não é digitado (calculado na consulta). |

O Gravar pelo botão exige pelo menos um condutor: sem nenhum, avisa "Condutores do Manifesto não Informado ou Inválido" e leva o foco para esta aba.

### Grade `dbcidade` — tabela IT_MANIFESTO_CID_CARREGA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cidade | `CIDADE` | INTEGER |  | Código da cidade onde a carga foi embarcada. F4 ou o botão da célula abrem a consulta de cidades. |
| Nome Cidade Carregamento | `NOME_CIDADE` | VARCHAR(50) | 50 | Nome da cidade, copiado do cadastro ao aceitar o código. Não é digitado (calculado na consulta). |
| Estado | `ESTADO` | VARCHAR(2) | 2 | Sigla do estado da cidade, vinda de `CIDADE` pelo JOIN. Não é digitada. |

O Gravar pelo botão exige pelo menos uma cidade de carregamento: sem nenhuma, avisa "Cidades de Carregamento não Informado ou Inválido" e leva o foco para esta aba.

### Grade `dbpedagio` — tabela IT_MANIFESTO_PEDAGIO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| CNPJ do Fornecedor | `CNPJ_FORNECEDOR` | VARCHAR(18) | 18 | CNPJ da empresa fornecedora do vale pedágio. Digitado. |
| CNPJ do Pagador | `CNPJ_PAGADOR` | VARCHAR(18) | 18 | CNPJ de quem pagou o vale pedágio. Vem preenchido com o CNPJ da própria empresa, lido de `PARSIS`, no NewRecord; pode ser trocado quando quem paga é outro. |
| Nº Comprovante | `COMPROVANTE` | VARCHAR(20) | 20 | Número do comprovante de compra do vale pedágio. Digitado. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do vale pedágio. Digitado. |
| Tipo | `TIPO` | VARCHAR(20) | 20 | Forma do vale pedágio. Lista fechada na célula, com o valor gravado por extenso: vazio, `'TAG'`, `'Cupom'` ou `'Cartão'`. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada e `CODIGO_NUMERICO` recebe o código numérico aleatório do documento eletrônico, ambos no NewRecord do cabeçalho. Em todas as quatro tabelas filhas, `EMPRESA`, `SERIE` e `NUMERO` repetem a chave do manifesto e `SEQ` recebe o maior `SEQ` daquela tabela dentro do manifesto mais um. Os campos `PLACA_VEICULO_TRACAO`, `TARA_VEICULO_TRACAO` e os equivalentes dos dois reboques também são gravados a partir do cadastro de veículos da transportadora, sem aparecer na tela.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Forma Emissão | `FORMA_EMISSAO` | VARCHAR(20) | 20 | campo da tela | Rótulo na tela: “Forma Emissão”. Função não verificada no código. |
| UN Peso Carga | `UNIDADE_MEDIDA_CARGA` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “UN Peso Carga”. Função não verificada no código. |
| Responsável | `TIPO_RESPONSAVEL_SEGURO` | VARCHAR(20) | 20 | campo da tela | Rótulo na tela: “Responsável”. Função não verificada no código. |
| Tipo de Carga | `PROD_PRED_TIPO_CARGA` | VARCHAR(2) | 2 | campo da tela | Rótulo na tela: “Tipo de Carga”. Função não verificada no código. |
| Modalidade | `MODALIDADE_TRANSPORTE` | VARCHAR(20) | 20 | campo da tela | Rótulo na tela: “Modalidade”. Função não verificada no código. |
| Doc. | `TIPO_DOCUMENTO` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Doc.”. Função não verificada no código. |
| UF Final Descar. | `UF_FINAL_DESCARREGAMENTO` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “UF Final Descar.”. Função não verificada no código. |
| Tipo de Transportador | `TIPO_TRANSPORTADOR` | VARCHAR(3) | 3 | campo da tela | Rótulo na tela: “Tipo de Transportador”. Função não verificada no código. |

<a id="umov_nota_fiscal_venda_registro_operacao_mercadoria"></a>

## `umov_nota_fiscal_venda_registro_operacao_mercadoria` — Registro da Operação das Mercadorias da Nota Fiscal de Saída...

Tela de leitura da nota fiscal de saída (tabela `NOTA`, com a descrição da modalidade de frete vinda do LEFT JOIN em `MODALIDADE_FRETE`) usada apenas para disparar o registro das mercadorias: o botão Registrar percorre os itens da grade (`IT_NOTA`) e grava uma linha em `CONTROLE_OPERACAO_MERCADORIA` para cada item, com `SALDO` igual à quantidade. Praticamente todos os campos do cabeçalho são somente leitura — a tela não altera a nota, só a consulta e a usa como origem do registro. O Excluir (F6) desfaz o registro e devolve o saldo das mercadorias baixadas.

Duas travas condicionam tudo: o `STATUS` da nota precisa ser `Faturada` ou `NFE Autorizada`, e a natureza de operação precisa ter `TIPO_OPERACAO_MERCADORIA = '2'` (registrar), senão a tela recusa com aviso.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida em destaque no canto superior direito. Valores usados no sistema: `Pendente` (nota digitada), `Faturada`, `NFE Gerada`, `NFE Autorizada` e `Cancelada`. Só `Faturada` e `NFE Autorizada` permitem registrar ou excluir o registro das mercadorias; qualquer outro valor gera o aviso "Impossível alterar a referida Nota Fiscal". Somente leitura. |
| Nº Nota Fiscal **·chave** | `NUMERO` | INTEGER |  |  | Número da nota a consultar. É o único campo digitável do cabeçalho. Enter recarrega a nota; o botão ou F4 abre a consulta de notas fiscais; F7 volta uma, F8 avança uma, F9 posiciona na anterior ou igual. Ao abrir a tela vem preenchido com a última nota da série. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da nota. Somente leitura. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Razão social ou nome do cliente. Somente leitura. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 |  | Código da natureza de operação da nota. Somente leitura. É por ela que a tela decide se pode registrar: busca `TIPO_OPERACAO_MERCADORIA` na natureza e só prossegue quando vale `'2'`. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da natureza de operação. Somente leitura. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora. Somente leitura. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota. Somente leitura. |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS aplicada na nota. Somente leitura. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante. Somente leitura. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante. Somente leitura. |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete da nota. Somente leitura. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Somente leitura. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas acessórias. Somente leitura. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto do transporte. Somente leitura. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido do transporte. Somente leitura. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS. Somente leitura. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS. Somente leitura. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos produtos da nota. Somente leitura. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total geral da nota. Somente leitura. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante na nota. Somente leitura. |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho. Somente leitura. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete. Somente leitura. É a única coluna que o ModifySQL do dataset atualizaria, mas a tela nunca grava a nota. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete, trazida do JOIN com MODALIDADE_FRETE. Somente leitura (calculado na consulta). |
| Banco | `BANCO` | INTEGER |  |  | Código do banco de cobrança dos títulos. Somente leitura. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco de cobrança. Somente leitura. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança do boleto. Somente leitura. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Texto da instrução de cobrança. Somente leitura. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI. Somente leitura. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI. Somente leitura. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes transportados. Somente leitura. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Desconto sobre a base de ICMS. Somente leitura. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente. Somente leitura. É a chave usada para localizar as mercadorias em `CONTROLE_OPERACAO_MERCADORIA` na exclusão. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do cliente. Somente leitura. |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço do cliente montado na consulta pela concatenação de endereço, bairro, CEP, cidade e estado. Somente leitura (calculado na consulta). |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente. Somente leitura. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga. Somente leitura. |
| Nota Fiscal de Entrada | `NOTA_ENTRADA` | VARCHAR(1) | 1 |  | Marcador: `'2'` = nota de venda com entrada de mercadoria, `'1'` = nota de saída normal. Decide o `TIPO_NOTA_FISCAL` gravado no registro: `Venda/Entrada` quando vale `'2'`, `Venda/Saida` caso contrário. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota. Vem de `NOTA_SERIE` dos parâmetros do sistema e o controle está desabilitado — não é digitável. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data de saída da mercadoria. Somente leitura. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora de saída, no formato HH:MM. Somente leitura. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo. Somente leitura. |
| Marca | `MARCA` | VARCHAR(20) | 20 |  | Marca dos volumes. Somente leitura. |
| Espécie | `ESPECIE` | VARCHAR(20) | 20 |  | Espécie dos volumes (caixa, fardo etc.). Somente leitura. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Contato no cliente. Somente leitura. |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF da placa do veículo. Somente leitura. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 |  | Nome do motorista. Somente leitura. |
| Número | `NUMERO_NOTA` | VARCHAR(20) | 20 |  | Número da nota em texto, usado quando o número impresso difere do sequencial interno. Somente leitura. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marcador: `'2'` = venda a consumidor final, `'1'` = não. Apenas exibido; a tela não regrava a nota. |
| N.S.U. Nota | `NSU_NOTA_FISCAL` | DOUBLE PRECISION |  |  | Número sequencial único da nota gerado pela SEFAZ. Somente leitura. |

Campo do DFM sem linha no TSV: `cbredespacho` (TRxDBComboBox ligado a `TIPO_REDESPACHO`, somente leitura), que mostra o tipo de frete do redespacho com as opções em branco, `CIF` e `FOB`.

### Grade `RxDBGrid1` — tabela IT_NOTA

Grade somente leitura: lista os itens da nota que serão registrados. É a origem de `PRODUTO`, `QUANTIDADE` e `SEQ` gravados em `CONTROLE_OPERACAO_MERCADORIA`.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto do item. Copiado para o registro da operação de mercadoria. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto gravada no item da nota. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida do item. |
| Lote | `LOTE` | INTEGER |  | Lote do produto no item. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do item. Vai para o registro tanto em `QUANTIDADE` quanto em `SALDO`, e é o valor devolvido ao saldo quando o registro é excluído. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário do item. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total do item (quantidade x valor). |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |

<a id="umov_nota_fiscal_venda_baixa_manual_registro_mercadoria"></a>

## `umov_nota_fiscal_venda_baixa_manual_registro_mercadoria` — Baixa Manual do Registro da Operação das Mercadorias da Nota Fiscal de Saída

Tela de apoio ao controle de mercadorias de terceiros. Localiza uma nota de venda já emitida em `NOTA` (chave EMPRESA + SERIE + NUMERO) e, pelo botão Baixar, dá baixa no saldo de `CONTROLE_OPERACAO_MERCADORIA` correspondente; o botão Excluir estorna essa baixa. O cabeçalho é praticamente todo espelho da nota: o `ModifySQL` do dataset grava uma única coluna, `MODALIDADE_FRETE`, de modo que os demais campos não somente-leitura também não chegam ao banco por esta tela. A grade lista os itens em `IT_NOTA`. A série vem do parâmetro do sistema `PARSIS.NOTA_SERIE`, não é escolhida aqui.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida sem rótulo em destaque no alto. Valores usados no sistema: `Pendente`, `NFE Gerada`, `NFE Enviada`, `NFE Autorizada`, `NFE Denegada`, `NFE Inutilizada`, `Cancelada` e `Faturada`. Nesta tela só `Faturada` e `NFE Autorizada` permitem Baixar ou Excluir; qualquer outro status aborta a operação com aviso. Apenas exibição (TDBText). |
| Nº Nota Fiscal **·chave** | `NUMERO` | INTEGER |  |  | Número da nota a localizar. Parte da chave primária (PK2). F7 volta para a nota anterior, F8 avança, F9 posiciona na nota igual ou anterior ao número digitado. O botão do campo abre a consulta de notas fiscais. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da nota. Somente leitura. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente gravado na nota. Somente leitura. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 |  | CFOP da nota. Comanda a baixa: só é aceita quando a natureza tem `TIPO_OPERACAO_MERCADORIA = '3'` (baixa de mercadoria dada como entrada na compra); caso contrário a tela recusa com a mensagem de natureza não habilitada. Somente leitura. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da natureza, gravada na própria nota. Somente leitura. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora. Somente leitura. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota. Somente leitura. |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS aplicada na nota. Somente leitura. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante. Somente leitura. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante. Somente leitura. |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete da nota. Somente leitura. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Somente leitura. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas acessórias. Somente leitura. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto do transporte. Somente leitura. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido do transporte. Somente leitura. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS somada dos itens. Somente leitura. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | ICMS total da nota. Somente leitura. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos itens sem frete, seguro e despesas. Somente leitura. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total geral da nota. Somente leitura. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante na nota. Somente leitura. |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho. Somente leitura. |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho (o rótulo repete o da transportadora principal). Somente leitura. |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código na tabela `MODALIDADE_FRETE`. É o único campo que esta tela grava de volta em `NOTA`. Somente leitura no controle. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição trazida por LEFT JOIN em `MODALIDADE_FRETE.DESCRICAO`; não é digitada. Somente leitura. |
| Banco | `BANCO` | INTEGER |  |  | Banco de cobrança indicado na nota. Somente leitura. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco de cobrança. Somente leitura. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança enviada ao banco. Somente leitura. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Texto da instrução de cobrança. Somente leitura. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI. Somente leitura. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | IPI total da nota. Somente leitura. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes do transporte. Somente leitura. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Desconto de ICMS (usado nos casos de Suframa). |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente. É a chave usada para achar as mercadorias pendentes: sem CNPJ preenchido a baixa é recusada com aviso. Somente leitura. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do cliente. Somente leitura. |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço, bairro, CEP, cidade e UF do cliente concatenados no SELECT. Somente leitura. (calculado na consulta) |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente. Somente leitura. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga. Somente leitura. |
| Nota Fiscal de Entrada | `NOTA_ENTRADA` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`. Com `'2'` a movimentação é registrada como `TIPO_NOTA_FISCAL = 'Venda/Entrada'`; com `'1'`, como `'Venda/Saida'`. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Vem de `PARSIS.NOTA_SERIE` e não é digitada aqui. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data de saída da mercadoria. Somente leitura. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora de saída no formato HH:MM. Somente leitura. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo. Somente leitura. |
| Marca | `MARCA` | VARCHAR(20) | 20 |  | Marca dos volumes. Somente leitura. |
| Espécie | `ESPECIE` | VARCHAR(20) | 20 |  | Espécie dos volumes. Somente leitura. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Contato do cliente registrado na nota. Somente leitura. |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF da placa do veículo. Somente leitura. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 |  | Nome do motorista. Somente leitura. |
| Número | `NUMERO_NOTA` | VARCHAR(20) | 20 |  | Número da nota em texto, no bloco de transporte, ao lado do motorista e da UF. Somente leitura. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`. Indica venda a consumidor final, o que muda a alíquota de ICMS aplicada na emissão. |
| N.S.U. Nota | `NSU_NOTA_FISCAL` | DOUBLE PRECISION |  |  | Número sequencial único da nota, gerado pelo sistema na emissão. Somente leitura. |

### Grade `RxDBGrid1` — tabela IT_NOTA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto do item. Grade com `ReadOnly = True`: só consulta. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto copiada para o item na emissão. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida do item. |
| Lote | `LOTE` | INTEGER |  | Número do lote de produção usado no faturamento do item. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade faturada do item; é ela que é baixada ou devolvida ao saldo. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário do item. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade multiplicada pelo valor unitário. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |

<a id="umov_mala_direta"></a>

## `umov_mala_direta` — Emissão da Mala Direta...

Monta e dispara uma mala direta por e-mail. O cabeçalho grava em `MALA_DIRETA` (chave `EMPRESA` + `NUMERO`) e a lista de destinatários em `IT_MALA_DIRETA` (chave `EMPRESA` + `NUMERO` + `SEQ`). A tela tem o cabeçalho com a identificação, o filtro e o conteúdo do e-mail, e a grade `dbmala_direta` com os destinatários. O botão Filtrar carrega os destinatários a partir do ramo de atividade; o botão E-mail entrega o número da mala direta a uma thread de envio, que é quem marca cada linha como enviada e encerra a mala.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da mala direta, exibida como rótulo. Somente leitura, sem digitação. Valores: `'Pendente'`, atribuído no NewRecord e mantido enquanto ela não foi disparada; `'Enviado'`, gravado pela thread de envio ao terminar o disparo. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número da mala direta. Sugerido como o maior número da empresa mais um. F7 volta à anterior, F8 avança, F9 e o botão localizam a mais próxima abaixo. |
| Descrição da Mala Direta | `DESCRICAO` | VARCHAR(100) | 100 |  | Nome interno da mala direta, para identificá-la na consulta e no relatório. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da mala direta, impressa no cabeçalho do relatório. |
| Ramo / Atividade | `RAMO_ATIVIDADE` | INTEGER |  |  | Ramo de atividade que define quem entra na lista. É o filtro que o botão Filtrar usa para varrer clientes ou representantes. F4 ou o botão abrem a consulta de ramos, F3 abre o cadastro. |
| Descrição Ramo / Atividade dos Clientes | `DESCRICAO_RAMO_ATIVIDADE` | VARCHAR(100) | 100 |  | Descrição do ramo, trazida do cadastro pelo Exit do código. Não é digitada (calculado na consulta). |
| Arquivo a ser vinculado à Mala Direta | `ARQUIVO_ANEXO` | VARCHAR(100) | 100 |  | Caminho do arquivo anexado ao e-mail, escolhido em uma caixa de seleção de arquivo. O conteúdo da caixa é copiado para a coluna no BeforePost, e recarregado nela quando o registro é aberto. |
| Texto exibido no Corpo do Email da Mala Direta | `TEXTO_CORPO_EMAIL` | BLOB |  |  | Corpo da mensagem enviada, em texto livre de várias linhas. É o memo da tela; dentro dele o Enter quebra linha em vez de pular de campo. |
| Assunto do Email da Mala Direta | `ASSUNTO` | VARCHAR(50) | 50 |  | Assunto do e-mail enviado a cada destinatário. |

O tipo de destinatário fica em `cbfiltro`, um combo ligado a `TIPO` que não foi captado no TSV. É lista fechada com dois valores gravados por extenso: `'Cliente'` e `'Representante'`. Nasce como `'Cliente'` no NewRecord, e decide de onde o Filtrar puxa a lista e qual consulta o F4 da grade abre. O combo é desabilitado assim que existe alguma linha na grade, e volta a ficar disponível quando a grade fica vazia — o tipo não pode mudar com destinatários já carregados.

### Grade `dbmala_direta` — tabela IT_MALA_DIRETA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** | `SEQ` | INTEGER |  | Sequência do destinatário dentro da mala direta. Gerada no NewRecord como o maior `SEQ` da mala mais um, e também na carga do Filtrar. Não é digitada. |
| Cliente | `CLIENTE` | INTEGER |  | Código do destinatário. Guarda o cliente ou o representante conforme o tipo escolhido. F4 ou o botão da célula abrem a consulta correspondente — a de clientes já filtrada por `RECEBE_EMAIL_MALA_DIRETA = '2'`, ou a de representantes; F3 abre o cadastro. Código que não existe no cadastro do tipo corrente faz a linha ser apagada depois da gravação. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do destinatário, copiado do cadastro ao aceitar o código. Não é digitado. |
| Fone do Cliente | `FONE_CLIENTE` | VARCHAR(15) | 15 | Telefone do destinatário, copiado do cadastro. Não é digitado. |
| Email do Cliente | `EMAIL_CLIENTE` | VARCHAR(100) | 100 | Endereço para onde a mensagem vai, copiado do cadastro. Não é digitado. É o campo que determina quem entra na carga: o Filtrar só traz quem tem e-mail preenchido (calculado na consulta). |
| Enviado | `EMAIL_ENVIADO` | VARCHAR(3) | 3 | Marca se a mensagem já saiu para este destinatário. Valores: `'Não'`, gravado no NewRecord e na carga do Filtrar; `'Sim'`, gravado pela thread de envio depois de despachar o e-mail daquela linha. Não é digitado. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada no NewRecord do cabeçalho e do item. O botão Filtrar grava a mala direta, confirma o ramo com o usuário e acrescenta as linhas a partir do último `SEQ`: com tipo `'Cliente'`, varre `CLIENTE` com o ramo escolhido, `RECEBE_EMAIL_MALA_DIRETA = '2'`, `INATIVO = '1'` e e-mail preenchido; com tipo `'Representante'`, varre `REPRESENTANTE_VENDA` com o ramo, `INATIVO = '1'` e e-mail preenchido. O botão E-mail só dispara com destinatários na grade e a porta de saída de e-mail configurada em `PARSIS`; sem isso avisa "Não existem destinatários válidos ou as Configurações do Email estão incorretas".



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Filtro | `TIPO` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Filtro”. Função não verificada no código. |

<a id="ucad_televendas_canal"></a>

## `ucad_televendas_canal` — Cadastro do Canal de Contato (Tele-Vendas)

Tabela de apoio `TELEVENDAS_CANAL`, chave `EMPRESA` + `CADASTRO`. Três campos. Registra por onde o contato de tele-vendas chegou (telefone, e-mail, visita e assim por diante), para depois classificar os atendimentos.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** **·obrig** | `CADASTRO` | INTEGER |  | sim | Código do canal, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um) e o campo aceita no máximo 2 dígitos. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. Exigido no Gravar — vazio aborta com "Cadastro do Canal". F4 abre a consulta de canais. |
| Descrição do Canal de Contato | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do canal. Exigido no Gravar — vazio aborta com "Descrição do Canal". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de canal fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativo). |

<a id="ucad_televendas_finalizacao"></a>

## `ucad_televendas_finalizacao` — Cadastro da Finalização (Tele-Vendas)

Tabela de apoio `TELEVENDAS_FINALIZACAO`, chave `EMPRESA` + `CADASTRO`. Painel único. Cada finalização é um desfecho possível de um atendimento de tele-vendas (venda fechada, não atendeu, retornar depois) e os três marcadores decidem o que o sistema exige e o que registra quando o operador escolhe aquele desfecho.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** **·obrig** | `CADASTRO` | INTEGER |  | sim | Código da finalização, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um) e o campo aceita no máximo 2 dígitos. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. Exigido no Gravar — vazio aborta com "Cadastro da Finalização". F4 abre a consulta de finalizações. |
| Descrição da Finalização | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do desfecho. Exigido no Gravar — vazio aborta com "Descrição da Finalização". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de finalização fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Gravar Movimentação | `GRAVAR_MOVIMENTACAO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord já inicia em `'2'` (marcado) — é o único marcador desta tela que nasce ligado. Só as finalizações com `'2'` entram no gerenciamento de tele-vendas como movimentação registrada; as demais encerram o atendimento sem deixar histórico. |
| Exige Motivo Finalização | `EXIGE_MOTIVO_FINALIZACAO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'`. Com `'2'`, o atendimento que terminar nesta finalização passa a exigir o motivo preenchido. |
| Exige Data de Agendamento | `EXIGE_DATA_AGENDAMENTO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'`. Com `'2'`, o atendimento que terminar nesta finalização passa a exigir a data do próximo contato — é o que sustenta os desfechos do tipo "retornar depois". |

<a id="umov_televendas"></a>

## `umov_televendas` — Tele-Vendas

Registra um contato de televendas na tabela `TELEVENDAS` (chave `EMPRESA` + `NUMERO`). Bloco único de campos e, ao lado, uma grade com o histórico de todos os contatos já feitos com o mesmo cliente — que também sai de `TELEVENDAS`, filtrada por cliente. Os dados de endereço e telefone do cliente não são digitados: vêm de `CLIENTE` no Exit do código e ficam somente-leitura na tela. A tela pode ser aberta a partir do Gerenciamento das Televendas, e nesse caso atendente, cliente, texto e valor já chegam preenchidos pelas variáveis globais `vatendente_televendas`, `vcliente_televendas`, `vtexto_televendas` e `vvalor_televendas`.

O que é exigido na gravação depende do cadastro da finalização escolhida: `MOTIVO_FINALIZACAO` só é cobrado quando `TELEVENDAS_FINALIZACAO.EXIGE_MOTIVO_FINALIZACAO = '2'`, e `AGENDAMENTO` só quando `EXIGE_DATA_AGENDAMENTO = '2'`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** **·obrig** | `NUMERO` | INTEGER |  | sim | Sequencial do contato, MAX(NUMERO) + 1 da empresa, atribuído no Limpar e na gravação. Chave primária junto com EMPRESA. Obrigatório: sem ele o Gravar aborta com "Número do Registro". Digitar um número existente carrega o registro; inexistente abre um novo. F7 volta, F8 avança, F9 procura. |
| Origem | `ORIGEM` | VARCHAR(10) | 10 |  | Quem originou o contato. Combo de lista fechada com dois valores: `'Cliente'` e `'Possamai'`. O NewRecord já entra com `'Possamai'`. Obrigatório: sem ele o Gravar aborta com "Origem do Registro". Aparece também como coluna da grade de histórico. Campo não listado n |
| Canal | `CANAL` | INTEGER |  |  | Código do canal de atendimento, em `TELEVENDAS_CANAL`. Obrigatório: sem ele o Gravar aborta com "Canal do Registro". O botão abre a consulta de canais e F3 abre o cadastro. Canal com `INATIVO = '2'` é recusado com aviso e o campo é limpo. |
| Descrição do Canal | `DESCRICAO_CANAL` | VARCHAR(50) | 50 |  | Descrição do canal, trazida de `TELEVENDAS_CANAL.DESCRICAO` pelo Exit do código ou pela consulta. Somente leitura. (calculado na consulta) |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente atendido. Obrigatório: sem ele o Gravar aborta com "Cliente do Registro". O botão abre a consulta de clientes e F3 o cadastro. Cliente com `INATIVO = '2'` é recusado com aviso e os campos derivados são limpos. Ao mudar, recarrega a grade de histórico daquele cliente. |
| Razão Social/Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Razão social ou nome, copiado de `CLIENTE.NOME` pelo Exit do código do cliente. Somente leitura. É o texto usado como referência no log do sistema. (calculado na consulta) |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(62) | 62 |  | Endereço do cliente, montado na consulta como `CLIENTE.ENDERECO` mais o número. Somente leitura, preenchido pelo Exit do código do cliente. (calculado na consulta) |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(50) | 50 |  | Cidade do cliente, copiada de `CLIENTE.CIDADE`. Somente leitura. (calculado na consulta) |
| Estado | `ESTADO_CLIENTE` | VARCHAR(2) | 2 |  | Sigla da UF do cliente, copiada de `CLIENTE.ESTADO`. Somente leitura. (calculado na consulta) |
| Fone 1 | `FONE_01_CLIENTE` | VARCHAR(15) | 15 |  | Telefone principal, copiado de `CLIENTE.FONE`. Somente leitura. (calculado na consulta) |
| Fone 2 | `FONE_02_CLIENTE` | VARCHAR(15) | 15 |  | Telefone alternativo, copiado de `CLIENTE.FONE_02`. Somente leitura. (calculado na consulta) |
| Contato | `CONTATO_CLIENTE` | VARCHAR(30) | 30 |  | Nome da pessoa com quem se falou. Vem preenchido de `CLIENTE.CONTATO` pelo Exit do código do cliente, mas é editável e gravado em `TELEVENDAS`. |
| Texto | `TEXTO` | BLOB |  |  | Relato do contato, em memo de várias linhas. Tudo o que é digitado é convertido para maiúsculas. Enter duas vezes seguidas sai do campo. Quando a tela é aberta pelo Gerenciamento, já chega com o texto preparado lá. |
| Agendamento | `AGENDAMENTO` | TIMESTAMP |  |  | Data marcada para o próximo contato. Só é exigida quando a finalização escolhida tem `EXIGE_DATA_AGENDAMENTO = '2'`; nesse caso data inválida aborta a gravação. É esta data que o Gerenciamento das Televendas mostra como agendamento em aberto. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor negociado no contato. Quando a tela vem do Gerenciamento, já chega preenchido com `vvalor_televendas`. |
| Finalização | `FINALIZACAO` | INTEGER |  |  | Código do desfecho do contato, em `TELEVENDAS_FINALIZACAO`. Obrigatório: sem ele o Gravar aborta com "Finalização do Registro". O botão abre a consulta e F3 o cadastro; finalização com `INATIVO = '2'` é recusada. O cadastro escolhido é que decide se motivo e agendamento passam a ser obrigatórios, e se o contato conta como movimentação para o Gerenciamento (`GRAVAR_MOVIMENTACAO = '2'`). |
| Descrição da Finalização | `DESCRICAO_FINALIZACAO` | VARCHAR(50) | 50 |  | Descrição do desfecho, trazida de `TELEVENDAS_FINALIZACAO.DESCRICAO` pelo Exit do código ou pela consulta. Somente leitura. (calculado na consulta) |
| Motivo da Finalização | `MOTIVO_FINALIZACAO` | VARCHAR(50) | 50 |  | Motivo em texto livre. Só é obrigatório quando a finalização escolhida tem `EXIGE_MOTIVO_FINALIZACAO = '2'`; aí o Gravar aborta com "Motivo da Finalização do Registro". |
| Atendente | `ATENDENTE` | INTEGER |  |  | Código do funcionário que atendeu, em `FUNCIONARIO`. O botão abre a consulta de funcionários e F3 o cadastro; funcionário com `INATIVO = '2'` é recusado e o campo é limpo. Quando a tela vem do Gerenciamento, já chega com o atendente informado lá. |
| Nome do Atendente | `NOME_ATENDENTE` | VARCHAR(50) | 50 |  | Nome do atendente, copiado de `FUNCIONARIO.NOME` pelo Exit do código. Somente leitura. (calculado na consulta) |

### Grade `RxDBGrid1` — tabela TELEVENDAS

Histórico de todos os contatos já registrados com o cliente da tela, ordenado por número decrescente. É recarregada sempre que o cliente muda. Duplo clique em uma linha traz aquele contato para os campos acima.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data e hora do contato listado. Na consulta da grade o valor é recortado para os 16 primeiros caracteres, ou seja, chega como texto no formato data mais hora e minuto. A coluna `DATA` da tabela não aparece nos campos da tela: é gravada pelo NewRecord com a data e hora do momento. |
| Atend. | `ATENDENTE` | INTEGER |  | Código do atendente que registrou aquele contato. A grade mostra o código, não o nome. |
| Origem | `ORIGEM` | VARCHAR(10) | 10 | Origem daquele contato, `'Cliente'` ou `'Possamai'`. |
| Finalizacao | `FINALIZACAO` | INTEGER |  | Desfecho daquele contato. Apesar do nome da coluna, a grade não mostra o código: a consulta usa `TELEVENDAS_FINALIZACAO.DESCRICAO` com o apelido `FINALIZACAO`, então o que aparece é a descrição por extenso. |
| Texto | `TEXTO_STRING` | VARCHAR(250) | 250 | Relato daquele contato. É o BLOB `TEXTO` cortado nos 250 primeiros caracteres e convertido para VARCHAR na consulta, para caber na grade. (calculado na consulta) |

<a id="umov_televendas_gerenciamento"></a>

## `umov_televendas_gerenciamento` — Gerenciamento das Televendas...

Monta a carteira de clientes a serem trabalhados pelo televendas. Não tem tabela própria: varre `CLIENTE` e, por cliente, busca em subconsultas a última nota autorizada, o último pedido, o último contato de televendas cuja finalização tem `GRAVAR_MOVIMENTACAO = '2'` e o último agendamento ainda em aberto; o resultado é montado num ClientDataSet em memória (`tbtemp`). A tela é só de leitura sobre esses dados — quem grava é a tela `umov_televendas`, aberta pelo botão Novo ou por duplo clique na grade, já com atendente e cliente preenchidos.

Os filtros do topo não são campos de banco: Atendente e seu nome, Ramo Atividade e sua descrição, Data, Agendamento, Ciclo de Contato (inicializado com `PARSIS.TELEMARKETING_DIAS_CONTATO`), um radiogroup com `'Manutenção'` e `'Sem Movimento'`, e o quadro "Tipo de Tele-Vendas (Cliente)" com três caixas que filtram `CLIENTE.TELE_VENDAS` pelos valores `'Especial'`, `'Não Habil.'` e `'Normal'` — só Normal vem marcada no Limpar. Em Manutenção entram os clientes cujo último contato está entre 360 dias atrás e o ciclo informado; em Sem Movimento, os anteriores a 360 dias. Clientes inativos (`INATIVO = '2'`) ficam sempre de fora.

### Grade `dbtelemarketing` — tabela temporária em memória (`tbtemp`, alimentada de CLIENTE)

As linhas mudam de cor pelo agendamento: azul quando a data agendada é futura, vermelho quando já passou.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq | `SEQUENCIAL` | INTEGER |  | Ordem de trabalho da carteira, de 1 em diante. Não vem do banco: depois de filtrar, a lista é reordenada pelo índice de Dias e então numerada de cima para baixo. Diz por qual cliente começar. (calculado na consulta) |
| Cliente | `CLIENTE` | INTEGER |  | Código do cliente, copiado de `CLIENTE.CADASTRO`. É o que o botão Novo passa para a tela de Tele-Vendas, e o que F2 (histórico) e F3 (cadastro do cliente) usam para se posicionar. (calculado na consulta) |
| Razão Social/Nome do Cliente | `NOME` | VARCHAR(70) | 70 | Razão social ou nome do cliente, copiado de `CLIENTE.NOME`. (calculado na consulta) |
| Cidade | `CIDADE` | VARCHAR(50) | 50 | Cidade do cliente, copiada de `CLIENTE.CIDADE`. (calculado na consulta) |
| Estado | `ESTADO` | VARCHAR(2) | 2 | Sigla da UF do cliente, copiada de `CLIENTE.ESTADO`. (calculado na consulta) |
| Fone 1 | `FONE_01` | VARCHAR(15) | 15 | Telefone principal, copiado de `CLIENTE.FONE`. (calculado na consulta) |
| Fone 2 | `FONE_02` | VARCHAR(15) | 15 | Telefone alternativo, copiado de `CLIENTE.FONE_02`. (calculado na consulta) |
| Celular | `CELULAR` | VARCHAR(15) | 15 | Celular do cliente, copiado de `CLIENTE.CELULAR`. (calculado na consulta) |
| Ultimo Contato | `DATA_ULTIMO_CONTATO` | TIMESTAMP |  | Data do movimento mais recente do cliente, calculada como a maior entre três: emissão da última nota com STATUS `'NFE Autorizada'`, emissão do último pedido de venda e data do último televendas cuja finalização tem `GRAVAR_MOVIMENTACAO = '2'`. É esta data que decide se o cliente entra em Manutenção ou em Sem Movimento. (calculado na consulta) |
| Agendamento | `DATA_AGENDAMENTO` | TIMESTAMP |  | Data do último agendamento de televendas ainda em aberto, ou seja, sem nenhum contato posterior registrado para o cliente. Só é preenchida no filtro Manutenção. Vazia quando o agendamento já foi atendido. É o que pinta a linha de azul ou vermelho. (calculado na consulta) |
| Dias | `DIAS` | INTEGER |  | Dias decorridos desde o último contato. Quando há agendamento vencido, é substituído pelos dias de atraso com sinal negativo, o que joga o cliente para o topo da fila. Não vem do banco: é calculado com DaysBetween contra a data de hoje. É a chave de ordenação de toda a carteira. (calculado na consulta) |

<a id="umov_requisicao_pecas"></a>

## `umov_requisicao_pecas` — Requisição de Peças...

Requisição de peças de reposição para um cliente, em venda ou em garantia. O cabeçalho fica em `REQUISICAO_PECAS`, chave `EMPRESA` + `NUMERO`, e os itens em `IT_REQUISICAO_PECAS`, na grade `dbprodutos`. O cabeçalho reúne os dados do cliente e da entrega, o rodapé traz os totais somados dos itens, e a tela tem um botão Baixar que encerra a requisição: ele percorre os itens, baixa o estoque e muda o status para `'Baixado'`. Peça classificada como produto produzido baixa a composição dela, matéria por matéria; peça classificada como material baixa o próprio item.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `lblstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da requisição, exibida como texto no cabeçalho, sem rótulo e sem digitação. Assume `'Pendente'` (padrão no NewRecord, ainda editável) e `'Baixado'` (gravado pelo botão Baixar depois de dar baixa no estoque dos itens). Fora de `'Pendente'`, o Gravar é recusado com o aviso de que é impossível alterar. Somente leitura. |
| Número **·chave** **·obrig** | `NUMERO` | INTEGER |  | sim | Sequencial da requisição, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REQUISICAO_PECAS` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta requisições, F7 anterior, F8 próximo, F9 posiciona. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente que recebe as peças. Exigido no Gravar. F4 abre a consulta de clientes, F3 abre o cadastro. Ao sair do campo, preenche de uma vez nome, fone, endereço, bairro, CEP, cidade e estado a partir do cadastro; código inexistente limpa os sete campos. |
| Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do cadastro pelo Exit do código; não é digitado (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da requisição. Preenchida com a data de hoje no NewRecord. Precisa ser data válida no Gravar. É a data gravada como última movimentação de estoque na baixa, com o documento `'RP'`. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Nome da pessoa de contato no cliente. Digitado, não vem do cadastro. Não é exigido no Gravar. |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente, copiado do cadastro pelo Exit do código (calculado na consulta). |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(62) | 62 |  | Endereço de entrega. Montado pelo Exit do cliente como logradouro mais número, separados por vírgula (calculado na consulta). |
| Bairro | `BAIRRO_CLIENTE` | VARCHAR(40) | 40 |  | Bairro do cliente, copiado do cadastro (calculado na consulta). |
| Cep | `CEP_CLIENTE` | VARCHAR(10) | 10 |  | CEP do cliente, copiado do cadastro (calculado na consulta). |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(50) | 50 |  | Cidade do cliente, copiada do cadastro (calculado na consulta). |
| Estado | `ESTADO_CLIENTE` | VARCHAR(2) | 2 |  | Sigla do estado do cliente, copiada do cadastro (calculado na consulta). |
| Atendente | `ATENDENTE` | INTEGER |  |  | Código do funcionário que atendeu a requisição, buscado em `FUNCIONARIO`. Exigido no Gravar. F4 abre a consulta de funcionários. |
| Nome do Atendente | `NOME_ATENDENTE` | VARCHAR(50) | 50 |  | Nome do atendente, trazido de `FUNCIONARIO` pelo Exit do código; não é digitado (calculado na consulta). |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora que leva as peças. Exigido no Gravar. F4 abre a consulta de transportadoras. |
| Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, trazido do cadastro pelo Exit do código; não é digitado (calculado na consulta). |
| Modalidade Frete | `MODALIDADE_FRETE` | INTEGER |  |  | Código da modalidade de frete, buscado em `MODALIDADE_FRETE` (quem paga o frete: CIF, FOB e demais modalidades cadastradas). Exigido no Gravar. F4 abre a consulta de modalidades. |
| Descrição da Modalidade do Frete | `DESCRICAO_MODALIDADE_FRETE` | VARCHAR(60) | 60 |  | Descrição da modalidade de frete, trazida do cadastro pelo Exit do código; não é digitada (calculado na consulta). |
| Condições de Pagamento | `CONDICAO_PAGAMENTO` | VARCHAR(50) | 50 |  | Condição de pagamento combinada. Texto livre, não é código nem tem consulta; não é exigida no Gravar. Faz sentido na operação Venda; em Garantia costuma ficar vazia. |
| Operação | `TIPO_OPERACAO` | VARCHAR(1) | 1 |  | Radiogroup de duas opções: `'1'` = Venda (a peça é cobrada do cliente) e `'2'` = Garantia (a peça é fornecida sem cobrança). Preenchido com `'1'` no NewRecord. Não altera o cálculo dos totais nem a baixa de estoque; determina o texto Venda ou Garantia impresso na requisição. |
| Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos totais dos itens da grade. Zerado no NewRecord e mantido pelo sistema a cada item gravado ou excluído — não é digitado. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Soma das quantidades dos itens da grade. Zerada no NewRecord e mantida pelo sistema a cada item gravado ou excluído — não é digitada. |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Observações da requisição, em memo. Livre, não exigida no Gravar. |

### Grade `dbprodutos` — tabela IT_REQUISICAO_PECAS

Peças requisitadas. Delete na grade pede confirmação e exclui o item; se a requisição já estiver baixada, a exclusão estorna a baixa de estoque correspondente. Cada item gravado atualiza a quantidade e o total do cabeçalho pela diferença em relação ao valor anterior da linha.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código da peça, buscado no cadastro de matéria-prima. Só aceita item com `INATIVO = '1'` (ativo); com `'2'` a tela avisa que está inativo e limpa a linha inteira. Aceito o código, traz descrição, unidade, classifica o tipo do item e busca o preço; se a quantidade estiver zerada, preenche com 1. Item cujo cadastro não existir é apagado no AfterPost. F4 consulta peças e F3 abre o cadastro — de produto ou de matéria-prima, conforme o tipo do item. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição da peça, trazida do cadastro quando o código é aceito. Não é digitada. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo da peça, vinda do cadastro. Não é digitada. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade requisitada da peça. Precisa ser maior que zero: quantidade zerada faz o item ser apagado logo após o post, com aviso. É a quantidade baixada do estoque quando a requisição é encerrada. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário da peça, trazido do cadastro conforme o tipo do item: para produto produzido usa o `PRECO_VENDA`; para material usa o `PRECO_VENDA_CONSUMIDOR` e, se este for zero, cai no `PRECO_VENDA`. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade multiplicada pelo valor unitário. Calculado pela tela, não digitado. Alimenta o Total do cabeçalho. |
| Tipo | `TIPO_ITEM` | VARCHAR(1) | 1 | Classificação da peça, definida pelo sistema a partir do `TIPO_PRODUTO_SPED` do cadastro, não digitada: `'P'` quando o cadastro é `'Produto Produzido'` e `'M'` nos demais casos. Decide duas coisas: qual preço é usado no item e como a baixa é feita no encerramento — `'M'` baixa o próprio item do estoque, `'P'` baixa cada matéria-prima da composição do produto, multiplicada pela quantidade requisitada. Também escolhe qual cadastro o F3 abre. |

---

# Módulo 4 — Financeiro

41 telas.

<a id="umov_cheque_recebido_liberacao_deposito_baixa_titulo"></a>

## `umov_cheque_recebido_liberacao_deposito_baixa_titulo` — Baixa das Duplicatas Vinculadas ao Cheque do Cliente

Tela auxiliar, aberta em modo modal por `umov_cheque_recebido_liberacao_deposito` e por `umov_cheque_recebido_devolucao`. Serve para distribuir o valor de um cheque entre as duplicatas em aberto do cliente. Não grava nada no banco: monta uma tabela em memória (`ClientDataSet`) com os títulos, deixa o usuário digitar quanto baixar em cada um, e ao Gravar clona esse cursor na variável global que a tela chamadora consome — é lá que os itens de `IT_RECEBER` e a atualização de `RECEBER` acontecem. Sair fecha sem confirmar.

Os dois painéis de cima são só exibição, todos os campos somente-leitura: Informações do Cliente vem de `CLIENTE` com LEFT JOIN em `CIDADE`; Informações do Cheque Recebido vem de `CHEQUE_RECEBIDO` com LEFT JOIN em `BANCO`, `IT_BORDERO_CHEQUE_RECEBIDO` e `BORDERO_CHEQUE_RECEBIDO`. A grade lista `RECEBER` do cliente com saldo maior que zero, montada por consulta própria e copiada para a tabela em memória. O marcador Listar Todas as Duplicatas do Cliente, embaixo, comanda o filtro: desmarcado (estado inicial) só traz títulos cuja situação tem `ABREVIACAO = 'CH'`, ou seja, em cobrança com cheque; marcado traz todos os títulos com saldo do cliente.

Ao abrir, a tela avisa se o cheque não tem borderô — e nesse caso se fecha sozinha — e avisa quando o total das duplicatas listadas é menor que o valor do cheque. Gravar exige que a soma de Valor à Baixar seja exatamente igual ao valor do cheque; qualquer diferença é recusada com a comparação na tela. A grade colore a linha: azul quando o título é do mesmo borderô do cheque, vermelho quando está vencido, preto no resto.

#### Informações do Cliente

Todos somente-leitura, com os controles desabilitados; vêm de `CLIENTE` pelo código do cliente que a tela chamadora deixou na variável global.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cliente **·chave** | `CADASTRO` | INTEGER |  |  | Código do cliente dono das duplicatas e do cheque. Somente leitura: vem da linha selecionada na tela chamadora. |
| Nome do Cliente | `NOME` | VARCHAR(70) | 70 |  | Razão social ou nome do cliente. Somente leitura. |
| CNPJ/CPF | `CNPJ_CPF` | VARCHAR(18) | 18 |  | Inscrição no CNPJ ou CPF do cliente. Somente leitura, só para conferência. |
| IE/RG | `IE_RG` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do cliente. Somente leitura, só para conferência. |
| Cidade | `NOME_CIDADE` |  |  |  | Nome da cidade do cliente, trazido de `CIDADE.NOME` pelo LEFT JOIN por `CLIENTE.CODIGO_CIDADE`. Somente leitura. Não é coluna de `CLIENTE`, por isso tipo e tamanho ficam em branco (calculado na consulta). |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF, lida de `CIDADE.ESTADO` pelo LEFT JOIN. Somente leitura. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone do cliente. Somente leitura, só para conferência. |

#### Informações do Cheque Recebido

Todos somente-leitura; vêm de `CHEQUE_RECEBIDO` pelo número do lançamento que a tela chamadora deixou na variável global.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  |  | Código do banco sacado do cheque. Somente leitura. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN. Somente leitura. Não é coluna de `CHEQUE_RECEBIDO` (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 |  | Agência do emitente do cheque. Somente leitura. |
| Nº da Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 |  | Conta corrente do emitente do cheque. Somente leitura. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  |  | Número impresso na folha do cheque. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do cheque. Somente leitura. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data do bom para do cheque. Somente leitura. |
| Nome do Títular | `TITULAR` | VARCHAR(50) | 50 |  | Nome de quem assinou o cheque. Somente leitura. |
| Nº do Bordero | `NUMERO_BORDERO` | INTEGER |  |  | Número do borderô em que o cheque foi entregue, trazido de `IT_BORDERO_CHEQUE_RECEBIDO.NUMERO` pelo LEFT JOIN. Somente leitura, mas decisivo: valendo zero, a tela avisa que o cheque não tem borderô e se fecha sozinha, abortando a liberação. É também o número comparado com o borderô de cada duplicata para pintar a linha de azul (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor de face do cheque. Somente leitura. É o total que precisa ser distribuído: a soma de Valor à Baixar tem que bater exatamente com ele para o Gravar passar, e é dele que sai o Saldo Disponível. |

#### Baixa das Duplicatas Vinculadas ao Cheque do Cliente

Quatro caixas de totais no rodapé, todas somente-leitura.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Saldo Disponível ==> | `SALDO_DISPONIVEL` | DOUBLE PRECISION |  |  | Quanto do cheque ainda falta distribuir. Campo calculado da tabela em memória, recalculado a cada linha: valor do cheque menos a soma de Valor à Baixar. Somente leitura. Chega a zero quando a distribuição fecha (calculado na consulta). |
| Juros Negociado ==> | `SALDO_JUROS_NEGOCIADO` | DOUBLE PRECISION |  |  | Saldo de juros negociado no borderô, lido de `BORDERO_CHEQUE_RECEBIDO` pelo LEFT JOIN. Somente leitura. Só aparece na tela quando ele ou o desconto negociado for maior que zero, e nesse caso a tela ainda exibe um aviso informando o valor ao abrir. |
| Desconto Negociado ==> | `SALDO_DESCONTO_NEGOCIADO` | DOUBLE PRECISION |  |  | Saldo de desconto negociado no borderô, lido de `BORDERO_CHEQUE_RECEBIDO` pelo LEFT JOIN. Somente leitura. Mesma regra de visibilidade e mesmo aviso de abertura do juros negociado. |
| Total das Duplicatas ==> | `TOTAL_SALDO_ATUAL` | TAggregateField |  |  | Soma da coluna Saldo Título de todas as linhas da grade. Campo agregado da tabela em memória, não é coluna de tabela. Somente leitura. Se for menor que o valor do cheque, a tela avisa na abertura e sugere marcar Listar Todas as Duplicatas do Cliente (calculado na consulta). |

### Grade `dbcontas_receber` — tabela temporária em memória, alimentada de RECEBER

Uma linha por parcela em aberto do cliente. Só duas colunas aceitam digitação — Valor à Baixar e Desconto — e o cursor entra na grade já posicionado em Valor à Baixar; todas as outras são puladas. Nada aqui é gravado direto: as colunas correspondem às de `RECEBER` que a tela chamadora vai atualizar.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla de duas letras do tipo de documento da duplicata, cópia de `RECEBER.DOCUMENTO`. Primeira parte da chave usada para casar a linha com o título na hora da baixa. Não é digitável (calculado na consulta). |
| Série | `SERIE` | INTEGER |  | Série do documento, cópia de `RECEBER.SERIE`. Parte da chave do título. Não é digitável (calculado na consulta). |
| Número | `NUMERO` | INTEGER |  | Número do documento, cópia de `RECEBER.NUMERO`. Parte da chave do título. Não é digitável (calculado na consulta). |
| Parcela | `PARCELA` | INTEGER |  | Número da parcela, cópia de `RECEBER.SEQ` — o nome muda de `SEQ` para `PARCELA` na tabela em memória. Fecha a chave do título. Não é digitável (calculado na consulta). |
| Emissão | `EMISSAO` | DATE |  | Data de emissão da duplicata, cópia de `RECEBER.EMISSAO`. Não é digitável (calculado na consulta). |
| Vencimento | `VENCIMENTO` | DATE |  | Data de vencimento da duplicata, cópia de `RECEBER.VENCIMENTO`. Título vencido e de outro borderô é desenhado em vermelho. Não é digitável (calculado na consulta). |
| Valor Título | `VALOR` | DOUBLE PRECISION |  | Valor original da duplicata, cópia de `RECEBER.VALOR`. Referência, não entra em cálculo. Não é digitável (calculado na consulta). |
| Saldo Título | `SALDO_ATUAL` | DOUBLE PRECISION |  | Saldo líquido em aberto da duplicata, cópia de `RECEBER.SALDO_LIQUIDO`. É o que a caixa Total das Duplicatas soma. Não confundir com a coluna interna `SALDO`, cópia de `RECEBER.SALDO`, que não tem coluna na grade e é a base do cálculo automático de juros. Não é digitável (calculado na consulta). |
| Valor à Baixar | `VALOR_PAGO` | DOUBLE PRECISION |  | Quanto do cheque é aplicado nesta parcela. É a coluna principal, e o cursor entra na grade direto nela. Valor inválido é recusado e zerado. Se valor mais desconto menos juros passar do saldo, o excedente vira juros automaticamente quando a tela foi aberta com cobrança de juros e desconto ligada; sem isso, o excesso é recusado com "O Valor Pago não pode ser superior ao valor da parcela". Zerar o campo zera também juros e desconto da linha. A soma de todas as linhas tem que igualar o valor do cheque para o Gravar passar (calculado na consulta). |
| Juros Pago | `JUROS_PAGO` | DOUBLE PRECISION |  | Juros cobrados do cliente nesta parcela. Não é digitado — a grade pula esta coluna: o sistema calcula como o quanto Valor à Baixar mais Desconto ultrapassa o saldo da parcela, e zera quando não há excedente (calculado na consulta). |
| Desconto | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  | Desconto concedido ao cliente nesta parcela. Digitável, mas só quando a tela foi aberta com cobrança de juros e desconto ligada — as duas telas chamadoras deste lote ligam essa opção; com ela desligada a coluna fica somente-leitura. Valor inválido é recusado e zerado. Alterar o desconto recalcula o Juros Pago da linha (calculado na consulta). |

Colunas da tabela em memória sem coluna na grade: `CLIENTE`, preenchida com o cliente da tela; `SALDO`, cópia de `RECEBER.SALDO`, base do cálculo de juros; `JUROS_PENDENTE`, sempre zerada na carga e repassada como `JUROS_PENDENTES` ao item de `IT_RECEBER`; `BORDERO`, o número do borderô mais recente da duplicata, buscado em `IT_BORDERO_CHEQUE_DUPLICATA` e usado só para colorir a linha; e `TOTAL_VALOR_PAGO`, campo agregado que soma Valor à Baixar e alimenta tanto o Saldo Disponível quanto a validação do Gravar. A grade tem ainda uma coluna vazia entre Saldo Título e Valor à Baixar, sem campo, que serve de separador visual.

<a id="umov_contas_pagar_alteracao"></a>

## `umov_contas_pagar_alteracao` — Alteração do Título do Fornecedor...

Tela auxiliar, aberta em modo modal por `umov_contas_pagar` para editar um único título de `PAGAR`. A chave completa — documento, fornecedor, número, série e parcela — chega pelas variáveis globais e não é digitável: os campos que a mostram estão desabilitados e marcados como somente-leitura. Só seis colunas podem mudar, e o UPDATE da tela grava exatamente elas: emissão, vencimento, valor, saldo, saldo líquido, plano de contas, referência e observação. Endereço e cidade do fornecedor são expressões do SELECT, montadas por concatenação, com LEFT JOIN em `FORNECEDOR` e `CIDADE`; a descrição da conta contábil vem de `PLANO_CONTAS`.

Gravar exige emissão e vencimento válidos, valor maior que zero e plano de contas preenchido, e então fecha a tela. Título que já teve pagamento fica com o Valor bloqueado — o campo é desabilitado na abertura quando `VALOR_PAGO` é maior que zero — e nesse caso o saldo líquido também não é recalculado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do título. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. É o principal motivo de existir esta tela — prorrogar ou antecipar o vencimento de um título já lançado. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 |  | Texto livre que identifica o título nas listagens e no extrato da conta corrente. Vem preenchido pela tela que originou o título e pode ser reescrito aqui. Não é validado no Gravar. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta do plano de contas em que a despesa é escriturada. Obrigatória: Gravar aborta com "Plano de Contas" em branco. F4 abre a consulta do plano de contas e F3 abre o cadastro. Ao sair do campo o sistema valida contra `PLANO_CONTAS`, regrava o código no formato do cadastro e preenche a descrição ao lado; não achando, limpa os dois. Diferente da tela de conhecimento de frete, aqui não há exigência de conta analítica. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta contábil, trazida de `PLANO_CONTAS.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Controle desabilitado, não é digitado, e não entra no UPDATE (calculado na consulta). |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Observação livre sobre o título. Não é validada no Gravar. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor, trazido de `FORNECEDOR.NOME` pelo LEFT JOIN. Somente leitura, com o controle desabilitado (calculado na consulta). |
| Endereço | `ENDERECO_FORNECEDOR` | VARCHAR(50) | 50 |  | Endereço do fornecedor. Somente leitura, com o controle desabilitado. Não é coluna de tabela: é a concatenação de `FORNECEDOR.ENDERECO`, um espaço e `FORNECEDOR.BAIRRO`, feita no SELECT (calculado na consulta). |
| Cidade | `CIDADE_FORNECEDOR` | VARCHAR(50) | 50 |  | Cidade e UF do fornecedor. Somente leitura, com o controle desabilitado. Não é coluna de tabela: é a concatenação de `CIDADE.NOME`, um espaço e `CIDADE.ESTADO`, pelo LEFT JOIN por `FORNECEDOR.CIDADE` (calculado na consulta). |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 |  | Sigla de duas letras do tipo de documento que originou o título, primeira parte da chave primária. Somente leitura, com o controle desabilitado: chega pela tela chamadora e não pode ser trocada aqui. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do documento de origem, parte da chave primária. Somente leitura, com o controle desabilitado. |
| Parc. **·chave** | `SEQ` | INTEGER |  |  | Número da parcela, parte da chave primária. Somente leitura, com o controle desabilitado. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor da parcela. Obrigatório e maior que zero: Gravar aborta com "Valor do Título" zerado. Ao sair do campo o sistema copia o valor para o Saldo — ou seja, alterar o valor reescreve o saldo por inteiro, sem descontar o que já foi pago. Por isso o campo é desabilitado na abertura quando o título já teve pagamento. |
| Saldo | `SALDO` | DOUBLE PRECISION |  |  | Quanto falta pagar da parcela. Controle desabilitado, não é digitado: é reescrito pela saída do campo Valor. No Gravar, se o título ainda não teve pagamento, o saldo é copiado também para `SALDO_LIQUIDO`. |

Colunas do dataset sem controle na tela: `EMPRESA`, `FORNECEDOR` e `SERIE`, o restante da chave primária, todas fixadas pela tela chamadora; `DATA_PAGAMENTO`; `VALOR_PAGO`, que decide se o campo Valor fica habilitado e se o saldo líquido é recalculado; e `SALDO_LIQUIDO`, gravado pelo sistema no Gravar como cópia do saldo, apenas em título sem pagamento.

<a id="umov_contas_pagar_baixa_titulo"></a>

## `umov_contas_pagar_baixa_titulo` — Baixa dos Títulos a Pagar...

Tela auxiliar, aberta em modo modal por `umov_contas_pagar` para pagar um título. A chave completa — documento, fornecedor, número, série e parcela — chega pelas variáveis globais. A tela mistura dois datasets no mesmo painel: os campos do título vêm de `PAGAR` (com LEFT JOIN em `FORNECEDOR` e `CIDADE`) e são todos somente-leitura, menos a Observação; os campos do pagamento vêm de `IT_PAGAR` (com LEFT JOIN em `CONTA`, `FORMA_PAGAMENTO` e `CHEQUE_EMITIDO`) e são os digitáveis. A grade embaixo lista os pagamentos já feitos nesta parcela, um por linha, e serve só para escolher qual editar — é de seleção de linha inteira, sem célula digitável. Ao abrir, a tela já entra em uma linha nova de pagamento.

Gravar um pagamento recalcula o título inteiro no AfterPost: abate valor e desconto do saldo líquido, copia o resultado para o saldo (nunca negativo), acumula juros, desconto e valor pago, e grava a data e a conta do pagamento em `PAGAR`. Quando a forma de pagamento é do tipo `'Financeiro'`, lança ainda o crédito na conta corrente pela rotina `atualiza_conta`. Trocar conta, valor ou tipo de baixa em um pagamento já gravado dispara confirmação e o estorno correspondente na conta corrente antiga. Pagamento feito com cheque emitido não pode ser alterado aqui. Estornar apaga o item, com confirmação.

### Campos

Bloco superior — dados do título, lidos de `PAGAR`, todos somente-leitura exceto a Observação no rodapé.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` |  |  |  | Nome do fornecedor a quem se paga, trazido de `FORNECEDOR.NOME` pelo LEFT JOIN. Somente leitura. Entra na referência do lançamento na conta corrente. Não constava com tipo n ficam em branco. |
| Endereço | `ENDERECO_FORNECEDOR` | VARCHAR(50) | 50 |  | Endereço do fornecedor. Somente leitura. Não é coluna de tabela: é concatenação de campos de `FORNECEDOR` feita no SELECT (calculado na consulta). |
| Cidade | `CIDADE_FORNECEDOR` | VARCHAR(50) | 50 |  | Cidade e UF do fornecedor. Somente leitura. Não é coluna de tabela: é concatenação de campos de `CIDADE` feita no SELECT pelo LEFT JOIN (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do título. Somente leitura. Serve de referência para a data do pagamento: informar data anterior à emissão só gera um aviso, não bloqueia. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Somente leitura. |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 |  | Sigla de duas letras do tipo de documento que originou o título, primeira parte da chave primária. Somente leitura: chega pela tela chamadora. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do documento de origem, parte da chave primária. Somente leitura. |
| Parcela **·chave** | `SEQ` | INTEGER |  |  | Número da parcela, parte da chave primária. Somente leitura. |
| Valor Título | `VALOR` | DOUBLE PRECISION |  |  | Valor original da parcela. Somente leitura. Entra no cálculo do saldo disponível quando um pagamento já gravado é alterado. |
| Valor Pago | `VALOR_PAGO` | DOUBLE PRECISION |  |  | Total já pago da parcela, somando todos os itens. Somente leitura: o sistema acumula a cada pagamento gravado, somando a diferença entre o valor novo e o anterior do item. |
| Saldo Título | `SALDO` | DOUBLE PRECISION |  |  | Quanto ainda falta pagar. Somente leitura: no AfterPost recebe o saldo líquido recalculado, e nunca fica negativo — abaixo de zero é forçado a zero. É a base dos cálculos de juros e de desconto por percentual, e do juros automático quando o valor pago supera o saldo. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 |  | Texto de identificação do título, vindo da tela que o originou. Somente leitura aqui. É o texto usado no histórico da conta corrente, como "Pagamento referência Parc. N", e na observação do log. |
| Fornecedor **·chave** | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor, parte da chave primária. Somente leitura. |

Bloco inferior — dados do pagamento, gravados em `IT_PAGAR`. `EMPRESA`, `DOCUMENTO`, `FORNECEDOR`, `NUMERO`, `SERIE` e `SEQ` do item são copiados do título pelo NewRecord, e `ITEM` recebe `MAX(ITEM) + 1` da parcela.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Data Pagto | `DATA` | TIMESTAMP |  |  | Data do pagamento. O NewRecord já preenche com a data de hoje. Obrigatória: o BeforePost aborta com "Data do Título não Informado" quando vazia. Ao sair do campo, data futura é recusada e apagada; data anterior à emissão do título só gera aviso. É copiada para `DATA_PAGAMENTO` do título e é a data do lançamento na conta corrente. |
| Valor Pago | `VALOR` | DOUBLE PRECISION |  |  | Valor deste pagamento. Obrigatório e maior que zero: o BeforePost aborta com "Valor do Título não Informado". Ao sair do campo, o que passar do saldo vira juros automaticamente — em item novo compara com o saldo do título, em item já gravado com o saldo recalculado sem a contribuição do próprio item; não havendo excedente, o juros é zerado. Valor negativo é recusado e o campo volta a zero. Alterar o valor de um pagamento já gravado com forma de pagamento financeira exige confirmação e estorna o valor antigo na conta corrente. |
| Descrição Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente do pagamento, trazida de `CONTA.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código. Controle desabilitado e somente-leitura, não é digitado, e não entra no INSERT nem no UPDATE do item (calculado na consulta). |
| Juros | `JURO` | DOUBLE PRECISION |  |  | Juros pagos ao fornecedor neste pagamento. Somente leitura no campo: é calculado pela saída do Valor Pago, como o quanto ele ultrapassa o saldo. Também pode ser preenchido pelo campo de percentual de juros, que não tem controle visível na tela. Acumula em `JURO` do título. |
| Desconto | `DESCONTO` | DOUBLE PRECISION |  |  | Desconto obtido do fornecedor neste pagamento. Digitável. Entra no abatimento do saldo líquido do título junto com o valor pago, e acumula em `DESCONTO` do título. |
| `edtdescricao_forma_pagamento` | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição da forma de pagamento, trazida de `FORMA_PAGAMENTO.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código. Controle desabilitado e somente-leitura, sem rótulo próprio ao lado — o rótulo Descrição da Forma de Pagamento fica sobre ele. Não entra no INSERT nem no UPDATE do item (calculado na consulta). |
| Observação Pagamento | `OBSERVACAO_PAGAMENTO` | VARCHAR(70) | 70 |  | Observação livre sobre este pagamento. Digitável. Não é validada. É coluna de `IT_PAGAR`, distinta da Observação do título. |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente de onde sai o dinheiro, do cadastro `CONTA`. Obrigatória e existente: o BeforePost aborta com "Conta não Informado ou Inexistente". F4 abre a consulta de contas correntes. Ao sair do campo o sistema busca a conta e preenche a descrição; não achando, limpa as duas. É copiada para `CONTA` do título e é a conta creditada quando a forma de pagamento é financeira. Trocá-la em pagamento já gravado exige confirmação e estorna o valor na conta antiga. |
| Forma de Pagto | `FORMA_PAGAMENTO` | INTEGER |  |  | Forma de pagamento, do cadastro `FORMA_PAGAMENTO`. Obrigatória e existente: o BeforePost aborta com "Forma de Pagamento não Informado ou Inexistente". F4 abre a consulta de formas de pagamento. Ao sair do campo o sistema busca e preenche a descrição; não achando, limpa as duas. O que importa nela é o `TIPO_BAIXA`: com `'Financeiro'` o pagamento movimenta a conta corrente, com `'Contábil'` não movimenta. Trocar de `'Financeiro'` para `'Contábil'` em pagamento já gravado pede confirmação e estorna o valor na conta; trocar de `'Contábil'` para `'Financeiro'` pede confirmação e credita. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Observação livre do título, coluna de `PAGAR` e não do pagamento. Único campo do bloco do título que aceita digitação. Não é validada. |

### Grade `RxDBGrid1` — tabela IT_PAGAR

Lista dos pagamentos já feitos nesta parcela. Grade de seleção de linha inteira, sem digitação: clicar em uma linha devolve o foco para o campo Data Pagto do bloco de edição, que passa a mostrar aquele pagamento.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Item **·chave** | `ITEM` | INTEGER |  | Sequencial do pagamento dentro da parcela, última parte da chave primária de `IT_PAGAR`. Preenchido pelo NewRecord como `MAX(ITEM) + 1` do título; não é digitado. |
| Data | `DATA` | TIMESTAMP |  | Data do pagamento, a mesma do campo Data Pagto acima. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do pagamento, o mesmo do campo Valor Pago acima. |
| Juros | `JURO` | DOUBLE PRECISION |  | Juros deste pagamento, calculados pelo sistema. |
| Desconto | `DESCONTO` | DOUBLE PRECISION |  | Desconto deste pagamento. |
| Conta | `CONTA` | INTEGER |  | Código da conta corrente usada no pagamento. |
| Descrição da Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 | Descrição da conta, trazida de `CONTA.DESCRICAO` pelo LEFT JOIN. Coluna marcada como somente-leitura (calculado na consulta). |
| F.P. | `FORMA_PAGAMENTO` | INTEGER |  | Código da forma de pagamento usada. |
| Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 | Descrição da forma de pagamento, trazida de `FORMA_PAGAMENTO.DESCRICAO` pelo LEFT JOIN. Coluna marcada como somente-leitura (calculado na consulta). |

Colunas do item que o SELECT traz e não têm coluna na grade: `HORA`, preenchida pelo NewRecord com a hora do sistema; `PERCENTUAL_JUROS` e `PERCENTUAL_DESCONTO`, que aceitam um percentual e o convertem em valor — o percentual de juros calcula o juros sobre o saldo e refaz o valor pago, o percentual de desconto faz o mesmo com o desconto, e ambos se limpam depois de aplicados, mas nenhum dos dois tem controle visível nesta tela; `CHEQUE_EMITIDO` mais `NUMERO_CHEQUE`, `EMISSAO_CHEQUE`, `VENCIMENTO_CHEQUE`, `VALOR_CHEQUE` e `OBSERVACAO_CHEQUE`, vindos de `CHEQUE_EMITIDO` pelo LEFT JOIN — havendo cheque, o BeforePost recusa qualquer alteração e mostra conta, número e valor do cheque; e `LAST_VALOR`, `LAST_JURO` e `LAST_DESCONTO`, cópias das próprias colunas no SELECT, usadas para o sistema saber os valores anteriores ao recalcular o título.

<a id="umov_contas_receber_alteracao"></a>

## `umov_contas_receber_alteracao` — Alteração do Título do Cliente...

Tela de manutenção de um único título já existente da tabela RECEBER, aberta a partir da lista
de contas a receber com o título corrente nas variáveis globais (documento, cliente, número,
série e parcela). O dataset traz RECEBER com LEFT JOIN em CLIENTE, REPRESENTANTE_VENDA,
SITUACAO_TITULO, BANCO, PLANO_CONTAS e INSTRUCAO_COBRANCA, mas o ModifySQL grava apenas onze
colunas: EMISSAO, VENCIMENTO, VENDEDOR, SITUACAO_TITULO, BANCO, NUMERO_BOLETO, PLANO_CONTAS,
REFERENCIA, OBSERVACAO, TAXA_JUROS_MENSAL e INSTRUCAO_COBRANCA. Todo o resto é exibição.

O primeiro bloco reúne os dados do título e do cliente; o GroupBox à direita é um quadro de
valores, inteiramente somente leitura. F10 grava, F2 abre o histórico do cliente e F3 sobre um
campo de código abre o cadastro correspondente.

### Campos

#### Alteração do Título do Cliente... — dados do título e do cliente

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do título. Editável e gravada. O BeforePost do botão Gravar recusa data inválida; ao entrar no campo vazio o sistema preenche com a data de hoje. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Editável e gravada, com a mesma validação e o mesmo preenchimento automático da emissão. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 |  | Texto livre que identifica a origem do título, do tipo 'NF 1234'. Editável e gravado. |
| Situação | `SITUACAO_TITULO` | INTEGER |  |  | Código da situação do título, chave do cadastro SITUACAO_TITULO. Obrigatório no Gravar. F4 abre a consulta de situações e traz junto a descrição; sair do campo com código inexistente limpa código e descrição. Títulos gerados por outras telas nascem com 1. |
| Descrição da Situação do Título | `DESCRICAO_SITUACAO_TITULO` | VARCHAR(50) | 50 |  | Descrição da situação, vinda do JOIN com SITUACAO_TITULO. Campo desabilitado, preenchido pelo sistema junto com o código. |
| Representante | `VENDEDOR` | INTEGER |  |  | Código do representante de venda a quem o título é vinculado, para efeito de comissão. Obrigatório no Gravar. F4 consulta representantes, F3 abre o cadastro. |
| Razão Social / Nome do Representante | `NOME_VENDEDOR` | VARCHAR(50) | 50 |  | Nome do representante, vindo do JOIN com REPRESENTANTE_VENDA. Campo desabilitado, preenchido junto com o código. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta do plano de contas em que o recebimento será classificado, com máscara ##.##.##.##.###. Obrigatório no Gravar. F4 consulta o plano de contas. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta, vinda do JOIN com PLANO_CONTAS. Campo desabilitado, preenchido junto com o código. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Observação livre do título. Editável e gravada. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente devedor, vindo do JOIN com CLIENTE. Somente leitura e desabilitado. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(91) | 91 |  | Endereço mais bairro do cliente, concatenados no SELECT. Somente leitura e desabilitado. |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(64) | 64 |  | CEP, cidade e estado do cliente, concatenados no SELECT. Somente leitura e desabilitado. |
| Dias Atraso | `DIAS_ATRAZO` | INTEGER |  |  | Campo calculado, não gravado. Título quitado: diferença entre a data de recebimento e o vencimento. Título em aberto: dias entre hoje e o vencimento, ou entre hoje e a última data de recebimento se houver baixa parcial. Fica em branco quando o resultado é zero ou negativo. Somente leitura. |
| % Juros | `TAXA_JUROS_MENSAL` | DOUBLE PRECISION |  |  | Taxa de juros de mora ao mês aplicada a este título. Editável e gravada. É a base do cálculo de Juros Atual. |
| Juros Atual | `JUROS_ATUAL` | DOUBLE PRECISION |  |  | Campo calculado, não gravado. Zero se o saldo for zero ou se o atraso não passar do parâmetro JUROS_DIAS_ATRAZO. Caso contrário, SALDO vezes a taxa mensal proporcional aos dias de atraso. Somente leitura. |
| Saldo Atual | `SALDO_ATUAL` | DOUBLE PRECISION |  |  | Campo calculado, não gravado. Igual a SALDO quando não há juros a cobrar, e SALDO mais Juros Atual quando há. Somente leitura. |

#### GroupBox1 — quadro de valores do título

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Valor Título ==> | `VALOR` | DOUBLE PRECISION |  |  | Valor original da parcela. Somente leitura: quem altera é a tela que gerou o título. |
| Valor Recebido ==> | `VALOR_RECEBIDO` | DOUBLE PRECISION |  |  | Total já recebido, somado pelas baixas em IT_RECEBER. Somente leitura. |
| Juros Recebidos ==> | `JUROS_RECEBIDO` | DOUBLE PRECISION |  |  | Juros efetivamente cobrados nas baixas. Somente leitura. |
| Juros Pendentes ==> | `JUROS_PENDENTES` | DOUBLE PRECISION |  |  | Juros apurados mas ainda não recebidos, recalculados a cada baixa. Somente leitura. |
| Desconto Concedido ==> | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  |  | Total de descontos dados nas baixas. Somente leitura. |
| Saldo Título ==> | `SALDO` | DOUBLE PRECISION |  |  | Saldo devedor gravado, atualizado pelas baixas e pelas ocorrências. Nunca fica negativo. Somente leitura. |
| Valor Despesa ==> | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas lançadas sobre o título pelas ocorrências, do tipo protesto e cartório. Somente leitura. |

#### Alteração do Título do Cliente... — identificação, banco e cobrança

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 |  | Sigla do documento de origem, 'NF' ou 'CI'. Chave do título (PK1), somente leitura e desabilitado. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do documento de origem. Chave do título (PK3), somente leitura e desabilitado. |
| Parcela **·chave** | `SEQ` | INTEGER |  |  | Número da parcela. Chave do título (PK5), somente leitura e desabilitado. |
| Nº Bordero | `NUMERO_BORDERO` | INTEGER |  |  | Número do borderô de remessa em que o título foi enviado ao banco. Preenchido pela tela de emissão de borderô e zerado quando o borderô é excluído. Somente leitura e desabilitado; não está no ModifySQL. |
| Nº Boleto Bancário | `NUMERO_BOLETO` | VARCHAR(20) | 20 |  | Nosso número do boleto emitido para o título. Editável e gravado. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco em que o título está em cobrança, chave do cadastro BANCO. Editável e gravado. F4 consulta bancos, F3 abre o cadastro. Fica em branco quando uma ocorrência retira o título do banco. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, buscado pelo código. Campo desabilitado, preenchido pelo sistema. (calculado na consulta) |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente, vindo do JOIN com CLIENTE. Somente leitura e desabilitado. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança enviada ao banco, chave do cadastro INSTRUCAO_COBRANCA, do tipo protestar ou não protestar. Editável e gravado. F4 consulta, F3 abre o cadastro. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução, buscada pelo código. Campo desabilitado, preenchido pelo sistema. (calculado na consulta) |

<a id="umov_contas_receber_ocorrencia_titulo"></a>

## `umov_contas_receber_ocorrencia_titulo` — Ocorrências do Título do Cliente...

Tela que registra os eventos de cobrança de um título: protesto, cartório, devolução e
assemelhados. O cabeçalho exibe o título da tabela RECEBER já selecionado na lista de contas a
receber, todo somente leitura; a grade grava IT_RECEBER_OCORRENCIA_TITULO, uma linha por
ocorrência. O valor de cada ocorrência é uma despesa: o AfterPost soma esse valor no
VALOR_DESPESA e no SALDO_LIQUIDO do título e reescreve o SALDO; excluir a ocorrência desfaz a
soma. O ModifySQL do RECEBER grava apenas SALDO, SALDO_LIQUIDO, OBSERVACAO, VALOR_DESPESA,
SITUACAO_TITULO e BANCO.

O cadastro OCORRENCIA_TITULO carrega dois efeitos colaterais. Se a ocorrência tiver
SITUACAO_TITULO preenchida, a tela pergunta se deve mudar a situação do título para aquela
descrição. Se tiver RETIRA_TITULO_BANCO igual a '2' e o título estiver em um banco, pergunta se
deve retirar o título do banco, limpando BANCO e NOME_BANCO.

O campo `edtobservacao` (rótulo Obs.:) é um edit sem DataSource, fora do TSV: seu conteúdo é
gravado em RECEBER.OBSERVACAO ao gravar e a cada ocorrência lançada.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente devedor, vindo do JOIN com CLIENTE. Somente leitura. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(103) | 103 |  | Endereço do cliente montado no SELECT. Somente leitura. |
| Cidade | `CIDADE_CLIENTE` | VARCHAR(64) | 64 |  | Cidade, estado e CEP do cliente montados no SELECT. Somente leitura. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco em que o título está em cobrança. Somente leitura; fica em branco se uma ocorrência retirar o título do banco (calculado na consulta). |
| Situação do Título | `DESCRICAO_SITUACAO_TITULO` | VARCHAR(50) | 50 |  | Descrição da situação do título. Somente leitura na tela, mas trocada pelo sistema quando a ocorrência lançada tem situação própria e o usuário confirma. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do título. Somente leitura. É o piso da data da ocorrência. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Somente leitura. |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 |  | Sigla do documento de origem, 'NF' ou 'CI'. Chave do título (PK1). Somente leitura. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do documento de origem (PK3). Somente leitura. |
| Parcela **·chave** | `SEQ` | INTEGER |  |  | Número da parcela (PK5). Somente leitura. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante vinculado ao título. Somente leitura (calculado na consulta). |
| Valor Título | `VALOR` | DOUBLE PRECISION |  |  | Valor original da parcela. Somente leitura. |
| Despesa | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Soma das despesas lançadas pelas ocorrências desta tela. Somente leitura: quem a movimenta é o AfterPost e o BeforeDelete da grade. |
| Saldo Título | `SALDO` | DOUBLE PRECISION |  |  | Saldo devedor gravado, igual ao SALDO_LIQUIDO e nunca negativo. Cresce quando entra uma despesa de ocorrência. Somente leitura. |
| Valor Recto | `VALOR_RECEBIDO` | DOUBLE PRECISION |  |  | Total já recebido do título, mantido pela tela de baixa. Somente leitura. |

### Grade `RxDBGrid1` — tabela IT_RECEBER_OCORRENCIA_TITULO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Item **·chave** | `ITEM` | INTEGER |  | Sequencial da ocorrência dentro do título (PK6), gerado no NewRecord como o maior ITEM existente mais um. Não digitável. |
| Data | `DATA` | TIMESTAMP |  | Data da ocorrência. Nasce com a data de hoje no NewRecord. Recusa data menor que a emissão do título e é obrigatória no BeforePost. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da despesa da ocorrência, do tipo custas de protesto. Soma no VALOR_DESPESA e no saldo do título. |
| Código | `OCORRENCIA_TITULO` | INTEGER |  | Código da ocorrência, chave do cadastro OCORRENCIA_TITULO. Obrigatório e precisa existir no BeforePost. F4 na célula abre a consulta de ocorrências e traz a descrição junto. |
| Descrição da Ocorrência do Título | `DESCRICAO_OCORRENCIA_TITULO` | VARCHAR(50) | 50 | Descrição da ocorrência, vinda do JOIN com OCORRENCIA_TITULO. Coluna somente leitura, preenchida pelo sistema ao informar o código. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 | Observação livre da ocorrência, gravada em maiúsculas. |

<a id="umov_orcamento_gasto_fixo_mensal_detalhamento"></a>

## `umov_orcamento_gasto_fixo_mensal_detalhamento` — Detalhamento do Gasto Fixo Mensal...

Tela auxiliar aberta a partir do orçamento dos gastos fixos mensais, sobre a célula de um mês. Não grava nada no banco: mostra, na grade, de onde veio o valor realizado daquele gasto naquele mês — os títulos de `PAGAR` do ano e mês do vencimento, somados por fornecedor e plano de contas, filtrados pelos planos de contas ligados ao gasto fixo escolhido — e recolhe um texto livre de justificativa. O botão Gravar apenas devolve o texto digitado à tela chamadora pela variável global; o Sair descarta.

O cabeçalho não tem campos de banco: são quatro caixas somente leitura preenchidas no FormShow com valores recebidos da tela chamadora — Descrição do Gasto Fixo Mensal, Mês de Referência (mês por extenso e ano), Previsto (o valor orçado) e Realizado (a soma da coluna Valor da grade). Abaixo, o memo `medetalhamento`, sob o rótulo "Informe o Detalhamento do Gasto Fixo Mensal Previsto", recebe o texto em maiúsculas; é ele que o Gravar devolve.

### Grade `dbposicao_global` — tabela PAGAR

Consulta agrupada por fornecedor e plano de contas, com `FORNECEDOR` vindo de `PAGAR`, o nome do JOIN com `FORNECEDOR`, a descrição do JOIN com `PLANO_CONTAS` e o valor somado. Somente consulta — nenhuma coluna é digitável.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `FORNECEDOR` | INTEGER |  | Código do fornecedor dos títulos a pagar que compõem o realizado do mês. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido do cadastro pelo JOIN (calculado na consulta). |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 | Conta do plano de contas usada no título. É o elo com o gasto fixo: só entram planos cujo `GASTO_FIXO_MENSAL` é o gasto sendo detalhado. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 | Descrição da conta, trazida do plano de contas pelo JOIN (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Soma dos valores dos títulos a pagar do fornecedor e da conta, no mês e ano informados. A soma de todas as linhas é o Realizado exibido no cabeçalho. |

<a id="ucad_banco"></a>

## `ucad_banco` — Cadastro de Banco...

Cadastro de bancos na tabela `BANCO`, chave `CADASTRO`. Tela de painel único, sem abas nem grade: identificação do banco e as três taxas usadas no desconto de duplicatas e na montagem do borderô.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do banco, chave do registro. A tela já abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta bancos, F7/F8/F9 navegam. |
| Nome do Banco | `NOME` | VARCHAR(50) | 50 |  | Nome do banco. Único campo exigido no Gravar: vazio aborta com "Nome do Banco". |
| Taxa Bordero | `TAXA_BORDERO` | DOUBLE PRECISION |  |  | Taxa cobrada pelo banco por borderô enviado. |
| Taxa Duplicata | `TAXA_DUPLICATA` | DOUBLE PRECISION |  |  | Taxa cobrada por duplicata (título) incluída no borderô. |
| Taxa IOF | `TAXA_IOF` | DOUBLE PRECISION |  |  | Percentual de IOF aplicado nas operações com este banco. |

<a id="ucad_conta_corrente"></a>

## `ucad_conta_corrente` — Cadastro da Conta Corrente...

Cadastro das contas bancárias e caixas da empresa, gravado na tabela `CONTA`. Fora das abas ficam o código, o tipo da conta e o marcador de inativo. A aba Informações da Conta traz os dados bancários e a amarração contábil; as duas abas de boleto só existem quando a conta é do tipo Boleto e está marcada para gerar boleto, e reúnem toda a parametrização de emissão e de encargos. Descrições de carteira, plano de contas, banco, conta de baixa e intermediador vêm por LEFT JOIN com `CARTEIRA_PAGTO_CONTABILIDADE`, `PLANO_CONTAS`, `BANCO`, a própria `CONTA` e `CLIENTE`.

#### Cadastro da Conta Corrente...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da conta, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(CADASTRO) + 1` da empresa, e na gravação de registro novo o código é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; código inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de contas; F7, F8 e F9 navegam entre os códigos. Se ficar vazio ou zerado, o botão Gravar apenas limpa a tela e não grava nada. |
| Tipo da Conta | `TIPO_CONTA` | VARCHAR(15) | 15 |  | Classifica a conta e comanda a visibilidade das abas de boleto. Combo com quatro valores, gravados como texto literal: `'Aplicação'`, `'Boleto'`, `'Disponível'` e `'Indisponível'`. Só com `'Boleto'`, e ainda assim junto com Gera Boleto Bancário marcado, as abas Informações do Boleto (Geral) e (Financeiro) aparecem, e com elas o campo Banco. Atenção: o NewRecord grava primeiro `'Disponível'` e logo em seguida sobrescreve com `'Conta Corrente'`, que não está na lista do combo — conta nova nasce com um tipo que o combo não exibe. Campo do controle `cbtipo_conta`, ficam em branco; o TField no DFM declara texto de 15 posições. |

#### Informações da Conta

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Descrição da Conta Corrente | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da conta, como aparece nas listas do financeiro. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. É o texto usado no log do sistema. |
| Agência | `AGENCIA` | VARCHAR(20) | 20 |  | Número da agência bancária, em texto livre. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. Não é o mesmo campo usado no boleto, que tem Código Agência e Dígito Agência próprios. |
| Nr. Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 |  | Número da conta no banco, em texto livre. Obrigatório na gravação: o botão Gravar aborta com "Nº Conta" se estiver vazio. Também é distinto do Número Conta usado no boleto. |
| Contato | `CONTATO` | VARCHAR(30) | 30 |  | Nome da pessoa de contato na agência. Não é validado na gravação. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone da agência ou do contato. Não é validado na gravação. |
| Fax | `FAX` | VARCHAR(15) | 15 |  | Fax da agência. Não é validado na gravação. |
| Carteira | `CARTEIRA_PAGTO_CONTABILIDADE` | INTEGER |  |  | Código da carteira de pagamento usada pela contabilidade, do cadastro `CARTEIRA_PAGTO_CONTABILIDADE`. F4 abre a consulta de carteiras e F3 abre o cadastro para incluir uma nova. Ao sair do campo o sistema busca a carteira e preenche a descrição ao lado; se o código não existir, limpa os dois. Não é validado na gravação. |
| Descrição da Carteira de Pagamento da Contabilidade | `DESCRICAO_CARTEIRA_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição da carteira, trazida pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada e não é atualizada no UPDATE da tela (calculado na consulta). |
| Conta Contábil | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta do plano de contas em que esta conta bancária é escriturada. F4 abre a consulta do plano de contas e F3 abre o cadastro. Ao sair do campo o sistema valida contra `PLANO_CONTAS`, regrava o código no formato do cadastro e preenche a descrição ao lado; se não achar, limpa os dois. Não é validado na gravação. |
| Descrição da Conta Contábil | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição da conta contábil, trazida pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada e não é atualizada no UPDATE da tela (calculado na consulta). |
| Consulta Razão Conta Corrente | `CONSULTA_RAZAO_CONTA_CORRENTE` | VARCHAR(1) | 1 |  | Diz se a conta aparece na consulta de razão de conta corrente. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. |
| Gera Boleto Bancário | `GERA_BOLETO_BANCARIO` | VARCHAR(1) | 1 |  | Diz se a conta emite boleto. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. É o segundo interruptor das abas de boleto: elas só aparecem com este marcador em `'2'` e o Tipo da Conta em `'Boleto'`. Com um dos dois fora dessa combinação, as abas somem, e somem também o marcador Gera Lote de Cobrança e o campo Banco. |
| Gera Lote de Cobrança | `GERA_LOTE_COBRANCA_BOLETO` | VARCHAR(1) | 1 |  | Diz se os boletos desta conta entram na geração do arquivo de remessa em lote. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. Só fica visível quando a conta é do tipo Boleto e gera boleto bancário. |
| Banco | `BANCO_BOLETO` | INTEGER |  |  | Código do banco emissor do boleto, do cadastro `BANCO` — na prática o código FEBRABAN. F4 abre a consulta de bancos e F3 abre o cadastro. Ao sair do campo o sistema busca o nome do banco; se não achar, limpa este campo e o nome. Determina o campo Layout do Arquivo: só com `'104'` (Caixa Econômica) ou `'85'` (cooperativa) o layout fica habilitado, e a lista de opções é remontada conforme o banco. Só fica visível quando a conta é do tipo Boleto e gera boleto bancário. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN e regravado pelo sistema ao informar o código ao lado. Não é digitado e não é atualizado no UPDATE da tela. Só fica visível junto com o campo Banco (calculado na consulta). |
| Conta de Transferência Eletrônica | `FORMA_PAGAMENTO_ELETRONICA` | VARCHAR(1) | 1 |  | Marca a conta como destino de transferência eletrônica, com intermediador informado na NF-e. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. É o interruptor dos dois campos seguintes: com `'2'` o intermediador e a razão social aparecem, com `'1'` somem da tela. |
| Intermediador | `INTERMEDIADOR_PAGTO_ELETRONICO` | INTEGER |  |  | Código do cliente que faz a intermediação do pagamento eletrônico. Só aparece com a conta marcada como de transferência eletrônica, e nesse caso é obrigatório: o Gravar aborta com "Intermediador da Forma de Pagamento Eletrônica" em branco. F4 abre a consulta de clientes e F3 abre o cadastro de cliente. Ao sair do campo o sistema busca o cliente; se não achar, limpa este campo e a razão social ao lado. |
| Razão Social do Intermediador da Transf. Eletrônica | `NOME_INTERMEDIADOR` | VARCHAR(70) | 70 |  | Razão social do intermediador, trazida de `CLIENTE.NOME` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada e não é atualizada no UPDATE da tela. Só aparece junto com o campo Intermediador (calculado na consulta). |

#### Informações do Boleto (Geral)

Aba visível apenas quando o Tipo da Conta é `'Boleto'` e Gera Boleto Bancário está marcado.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Local de Pagamento | `LOCAL_BOLETO` | VARCHAR(100) | 100 |  | Texto impresso no campo Local de Pagamento do boleto. O NewRecord já preenche com "PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO". |
| Título Aceito | `TITULO_ACEITO_BOLETO` | VARCHAR(3) | 3 |  | Campo Aceite do boleto. Combo com dois valores, gravados como texto literal: `'Sim'` e `'Não'`. O NewRecord grava `'Não'`. Campo do controle `cbtitulo_aceito_boleto`, ficam em branco; o TField no DFM declara texto de 3 posições. |
| Cedente | `CEDENTE_BOLETO` | VARCHAR(240) | 240 |  | Nome do cedente impresso no boleto, normalmente a razão social da empresa. Caixa alta. |
| Tipo de Inscrição | `INSCRICAO_BOLETO` | VARCHAR(20) | 20 |  | Natureza da inscrição do cedente, para o registro do boleto. Combo com dois valores, gravados como texto literal: `'Pessoa Fisica'` e `'Pessoa Juridica'`, ambos sem acento no literal. O NewRecord grava `'Pessoa Juridica'`. Campo do controle `cbtipo_inscricao_boleto`, ficam em branco. |
| CNPJ/CPF | `CNPJ_CPF_BOLETO` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cedente impresso no boleto. Diferente do campo Tipo de Inscrição ao lado, aqui não há validação de dígito verificador na tela. |
| Endereço | `ENDERECO_BOLETO` | VARCHAR(50) | 50 |  | Logradouro do cedente impresso no boleto. |
| Numero | `NUMERO_ENDERECO_BOLETO` | VARCHAR(10) | 10 |  | Número do imóvel do cedente impresso no boleto. |
| Cidade | `CIDADE_BOLETO` | VARCHAR(40) | 40 |  | Cidade do cedente impressa no boleto, em texto livre — não é código do cadastro de cidades. |
| Instruções | `INSTRUCOES_BOLETO` | VARCHAR(100) | 100 |  | Linha de instruções impressa no boleto, aquela dirigida ao caixa do banco. |
| Cod. Produto | `CODIGO_PRODUTO_BOLETO` | VARCHAR(4) | 4 |  | Código do produto de cobrança junto ao banco. O NewRecord grava `'0014'`. |
| Carteira | `CARTEIRA_BOLETO` | INTEGER |  |  | Número da carteira de cobrança contratada com o banco. Não confundir com a Carteira da aba Informações da Conta, que é da contabilidade. |
| Variação | `VARIACAO_BOLETO` | VARCHAR(5) | 5 |  | Variação da carteira de cobrança. O NewRecord grava `'019'`. |
| Código Agência | `CODIGO_AGENCIA_BOLETO` | INTEGER |  |  | Número da agência usado na composição do código de barras, separado do campo Agência da outra aba, que é texto livre. |
| Dígito Agência | `DIGITO_AGENCIA_BOLETO` | INTEGER |  |  | Dígito verificador da agência no boleto. |
| Número Conta | `NUMERO_CONTA_BOLETO` | INTEGER |  |  | Número da conta usado na composição do código de barras, separado do campo Nr. Conta da outra aba. |
| Dígito Conta | `DIGITO_CONTA_BOLETO` | VARCHAR(11) | 11 |  | Dígito verificador da conta no boleto. É texto, não número, porque alguns bancos usam letra. |
| Convênio | `CONVENIO_BOLETO` | INTEGER |  |  | Número do convênio de cobrança com o banco. |
| Dígito Convênio | `DIGITO_CONVENIO_BOLETO` | INTEGER |  |  | Dígito verificador do convênio. |
| Tipo de Documento | `TIPO_DOCUMENTO_BOLETO` | VARCHAR(50) | 50 |  | Espécie do título impressa no boleto. Combo com a lista da FEBRABAN, gravada como texto literal: APÓLICE DE SEGURO, CHEQUE, DUPLICATA MERCANTIL, DUPLICATA MERCANTIL POR INDICAÇÃO, DUPLICATA RURAL, DUPLICATA DE SERVIÇO, DUPLICATA DE SERVIÇO POR INDICAÇÃO, FATURA, LETRA DE CÂMBIO, MENSALIDADE ESCOLAR, NOTA DE CREDITO COMERCIAL, NOTA DE CREDITO DE EXPORTAÇÃO, NOTA DE CREDITO INDUSTRIAL, NOTA DE CREDITO RURAL, NOTA DE DÉBITO, NOTA PROMISSÓRIA, NOTA PROMISSÓRIA RURAL, NOTA DE SEGURO, PARCELA CONSÓRCIO, RECIBO, TRIPLICATA MERCANTIL, TRIPLICATA DE SERVIÇO e OUTRO. O NewRecord grava `'DUPLICATA MERCANTIL'`. Campo do controle `edttipo_documento_boleto`, ficam em branco; o TField no DFM declara texto de 50 posições. |
| Diretório para Envio dos Boletos | `DIRETORIO_BOLETO` | | | | Pasta do disco onde os arquivos de boleto e de remessa são gravados. Único campo da tela que não é ligado ao dataset: é um seletor de diretório comum, carregado do registro no AfterOpen e copiado de volta para a coluna no BeforePost. Não constava no TSV extraído por isso; o TField no DFM declara texto de 100 posições. |
| Conta Baixa | `CONTA_BAIXA` | INTEGER |  |  | Código de outra conta do mesmo cadastro, aquela em que os títulos pagos por este boleto são baixados. É autorreferência: o SELECT faz LEFT JOIN da própria `CONTA` consigo mesma. F4 abre a consulta de contas. Ao sair do campo o sistema busca a conta e preenche a descrição ao lado; se não achar, limpa as duas. |
| Descrição da Conta Utilizada na Baixa dos Títulos | `DESCRICAO_CONTA_BAIXA` | VARCHAR(50) | 50 |  | Descrição da conta de baixa, trazida pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada e não é atualizada no UPDATE da tela (calculado na consulta). |
| Email para Envio de Cópia dos Boletos | `EMAIL_BANCO_BOLETO` | VARCHAR(60) | 60 |  | Endereço de e-mail que recebe cópia dos boletos emitidos, normalmente o do banco. |
| Não Listar Agência no Lote | `NAO_LISTAR_AGENCIA_LOTE` | VARCHAR(1) | 1 |  | Suprime a agência no arquivo de lote de cobrança, exigência de alguns bancos. Valores `'2'` = sim, não lista (caixa marcada) e `'1'` = lista normalmente (caixa desmarcada). O NewRecord grava `'1'`. |
| Layout do Arquivo | `LAYOUT_ARQUIVO` | VARCHAR(10) | 10 |  | Layout do arquivo de remessa, quando o banco tem mais de um. Só fica habilitado quando o Banco é `'104'` ou `'85'`, e a lista muda conforme o banco: com `'104'` as opções são `'SICOB'` e `'SIGCB'`, com `'85'` são `'VIACREDI'` e `'CECRED'`. A lista original do DFM traz ainda `'CRED CREA'` e um valor em branco, substituídos em tempo de execução. O NewRecord grava vazio. Campo do controle `cblayout_arquivo`, ficam em branco; o TField no DFM declara texto de 10 posições. |
| Tipo de Cobrança | `TIPO_COBRANCA` | VARCHAR(15) | 15 |  | Modalidade da cobrança contratada. Combo com dois valores, gravados como texto literal: `'Simples'` e `'Vinculada'`. O NewRecord não define valor, então nasce vazio. Campo do controle `cbtipo_cobranca`, ficam em branco; o TField no DFM declara texto de 15 posições. |

#### Informações do Boleto (Financeiro)

Aba visível apenas quando o Tipo da Conta é `'Boleto'` e Gera Boleto Bancário está marcado. Os campos formam frases junto com os rótulos ao redor; nenhum deles é validado na gravação, e zero significa que a regra não se aplica.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Protestar no | `PROTESTAR_DIAS_BOLETO` | INTEGER |  |  | Número de dias úteis após o vencimento para instrução de protesto — a frase na tela é "Protestar no N º dia útil após o vencimento". Sem casas decimais. |
| Conceder abatimento de R$ | `ABATIMENTO_VALOR_BOLETO` | DOUBLE PRECISION |  |  | Valor em reais do abatimento concedido no boleto, com duas casas decimais. Trabalha em par com o campo seguinte. |
| para pagamento em até | `ABATIMENTO_DIAS_BOLETO` | INTEGER |  |  | Prazo em dias para que o abatimento acima valha — a frase é "Conceder abatimento de R$ X para pagamento em até N dias". Sem casas decimais. |
| Conceder desconto de R$ | `DESCONTO_VALOR_BOLETO` | DOUBLE PRECISION |  |  | Valor em reais do desconto por dia de antecipação, com duas casas decimais. Trabalha em par com o campo seguinte. |
| por dia de antecipação do pagamento em até | `DESCONTO_DIAS_BOLETO` | INTEGER |  |  | Limite em dias de antecipação que dão direito ao desconto — a frase é "Conceder desconto de R$ X por dia de antecipação do pagamento em até N dias". Sem casas decimais. |
| Cobrar | `JUROS_VALOR_BOLETO` | DOUBLE PRECISION |  |  | Percentual de juros por dia de atraso, com duas casas decimais. Apesar do nome da coluna dizer valor, o rótulo seguinte deixa claro que é percentual. |
| % de juros por dia de atraso após | `JUROS_DIAS_BOLETO` | INTEGER |  |  | Carência em dias antes de os juros começarem a correr — a frase é "Cobrar X % de juros por dia de atraso após N dias do vencimento". Sem casas decimais. |
| Cobrar multa de | `MULTA_VALOR_BOLETO` | DOUBLE PRECISION |  |  | Percentual de multa aplicado após o vencimento, com duas casas decimais — a frase é "Cobrar multa de X % após o vencimento". Também é percentual, apesar do nome da coluna. |

#### Cadastro da Conta Corrente... (continuação, fora das abas)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de conta fora de uso. Valores `'2'` = inativa (caixa marcada) e `'1'` = ativa (caixa desmarcada). O NewRecord grava `'1'`: toda conta nova nasce ativa. |

<a id="umov_extrato_bancario_acerto_saldo"></a>

## `umov_extrato_bancario_acerto_saldo` — Acerto de Saldo do Extrato Bancário...

Tela de correção manual do saldo de uma conta corrente. Ela não grava registro próprio: o botão Altera chama `atualiza_conta`, que lança um débito ou um crédito de acerto em `IT_CONTA` e atualiza `CONTA.SALDO`. A grade `dbconta` mostra o extrato da conta escolhida, lido de `IT_CONTA`. O acesso é restrito — quem não tem `USUARIO_SISTEMA.ADMINISTRADOR = '2'` precisa passar pela senha de prevenção, e sem ela a tela se fecha sozinha.

As caixas de digitação do topo e do rodapé não são ligadas a dataset (são `TComboEdit` e `TCurrencyEdit` comuns), por isso não aparecem no TSV. São elas:

- **Conta** (`edtcadastro`) — código da conta corrente, carregado de `CONTA.CADASTRO`. Abre na conta 1 e o Exit recarrega o extrato. F4 ou o botão abrem a consulta de contas, F3 abre o cadastro de conta corrente, F7 vai para a conta anterior, F8 para a próxima, F9 e o botão localizam a mais próxima abaixo.
- **Descrição da Conta** (`edtdescricao`) — nome da conta, copiado de `CONTA.DESCRICAO`. Não é digitado.
- **Saldo Contábil ->** (`edtsaldo_contabil`) — `CONTA.SALDO` da conta escolhida. Calculado, não digitado. Ao sair dos campos de valor ele já mostra o saldo simulado: saldo atual mais o débito, menos o crédito.
- **Saldo Bancário ->** (`edtsaldo_bancario`) — saldo contábil mais os depósitos vinculados. Calculado.
- **Depósito Vinculado ->** (`edtdeposito_vinculado`) — soma de `CHEQUE_RECEBIDO.VALOR` dos cheques da conta com `STATUS = 'Depósito'`, ou seja, depositados e ainda não creditados. Calculado.
- **Saldo Disponível ->** (`edtsaldo_disponivel`) — saldo contábil menos os cheques não compensados. Calculado.
- **Cheques não Compensados ->** (`edtcheque_nao_compensado`) — soma de `CHEQUE_EMITIDO.VALOR` dos cheques da conta com `STATUS = 'Pendente'`. Calculado.
- **Motivo do Acerto** (`edtmotivo`) — justificativa do acerto. Obrigatório: o Altera recusa em branco. O texto vai para o histórico do lançamento gerado.
- **Débito** (`edtdebito`) — valor a debitar da conta. Não aceita o sinal de menos.
- **Crédito** (`edtcredito`) — valor a creditar na conta. Não aceita o sinal de menos.

O Altera exige que um dos dois valores seja maior que zero — "Valor do Débito / Crédito não Informado" — e recusa os dois preenchidos ao mesmo tempo — "Impossível lançar o Valor do Débito e Crédito Juntos". Confirmado, gera o lançamento com o histórico fixo `'Acerto do Saldo Bancário'` e a operação `'debito'` ou `'credito'` conforme o campo preenchido.

### Grade `dbconta` — tabela IT_CONTA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data do lançamento no extrato. Somente leitura na tela: a grade só exibe o extrato, quem grava é o `atualiza_conta`. O acerto entra com a data do dia. |
| Histórico | `HISTORICO` | VARCHAR(100) | 100 | Descrição do lançamento. Nos acertos feitos por esta tela vem sempre como `'Acerto do Saldo Bancário'`. Somente leitura. |
| Referência | `REFERENCIA` | VARCHAR(300) | 300 | Complemento do lançamento. Nos acertos recebe o texto digitado em Motivo do Acerto. Somente leitura. |
| Débito | `DEBITO` | DOUBLE PRECISION |  | Valor debitado da conta neste lançamento. Somente leitura. |
| Crédito | `CREDITO` | DOUBLE PRECISION |  | Valor creditado na conta neste lançamento. Somente leitura. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo da conta depois do lançamento. Somente leitura. |

A grade também carrega `EMPRESA`, `CONTA`, `NUMERO` e `PLANO_CONTAS`, que identificam o lançamento e a conta contábil mas não têm coluna visível.

<a id="ucad_carteira_pagto_contabilidade"></a>

## `ucad_carteira_pagto_contabilidade` — Cadastro da Carteira de Pagamento da Contabilidade

Cadastro das carteiras de pagamento usadas na integração contábil, na tabela `CARTEIRA_PAGTO_CONTABILIDADE`, chave `CADASTRO`. Tela de três campos, sem abas nem grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da carteira. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta, F7/F8/F9 navegam. |
| Descrição da Carteira de Pagamento da Contabilidade | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da carteira. Único campo exigido no Gravar: vazio aborta com "Descrição da Carteira de Pagto da Contabilidade". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de carteira desativada. Grava `'2'` quando marcado e `'1'` quando desmarcado. O NewRecord inicia em `'1'` (ativa). |

<a id="umov_boleto_gerar_lote"></a>

## `umov_boleto_gerar_lote` — Gerar Lotes de Boletos...

Seleciona títulos em aberto de uma conta bancária e gera o lote de boletos. O cabeçalho (conta, descrição, agência, número da conta e os dois totalizadores) é formado por controles não ligados a dataset. A grade é carregada em um `TClientDataSet` de memória (`tbtemp`) a partir de um SELECT em `RECEBER` unido a `CLIENTE`, filtrado por `BOLETO_CONTA` e pelos botões de rádio `( F7 ) Filtrar os Boletos Pendentes` (`SALDO > 0` e `BOLETO_STATUS = 'Pendente'`), `( F8 ) Filtrar os Boletos Gerados` (`BOLETO_STATUS = 'Enviado'`) e `( F9 ) Filtrar Todos os Boletos Bancários`. O botão Gerar percorre as linhas marcadas, monta o boleto do banco da conta e grava `BOLETO_LOTE` de volta em `RECEBER`.

### Grade `dbcontas_receber` — tabela de trabalho `tbtemp` (em memória), carregada de RECEBER

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do tipo de documento do título em `RECEBER`. Junto com número, série e parcela identifica o título ao regravar o lote (calculado na consulta). |
| Número | `NUMERO` | INTEGER |  | Número do título a receber (calculado na consulta). |
| Parc. | `SEQ` | INTEGER |  | Número da parcela do título (calculado na consulta). |
| Emissão | `EMISSAO` | DATE |  | Data de emissão do título (calculado na consulta). |
| Vencimento | `VENCIMENTO` | DATE |  | Data de vencimento do título, levada para o boleto (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do título, levado para o boleto (calculado na consulta). |
| Código | `CLIENTE` | INTEGER |  | Código do cliente sacado (calculado na consulta). |
| Razão Social / Nome do Cliente | `NOME` | VARCHAR(70) | 70 | Nome do sacado, vindo de `CLIENTE.NOME`. A consulta também traz o endereço de cobrança do cliente quando ele existe, caindo para o endereço normal quando não (calculado na consulta). |
| Nº Boleto | `BOLETO_NUMERO` | INTEGER |  | Número do boleto do título. É com ele que se monta o Nosso Número — cada banco tem sua composição, combinando convênio, número da conta e este número com zeros à esquerda. (calculado na consulta) |
| Nº Lote | `BOLETO_LOTE` | INTEGER |  | Número do lote de remessa gravado pelo botão Gerar. Enquanto está vazio o título pode ser selecionado; se já tiver lote, tentar marcar a linha dá "Esse Título já Possuí um Lote. Impossível Selecionar o Registro". (calculado na consulta) |
| `SELECIONA_REGISTRO` | `SELECIONA_REGISTRO` | VARCHAR(1) | 1 | Marcador de seleção da linha, sem título de coluna na grade e somente leitura para digitação — alterna pela tecla de seleção. `'2'` = linha marcada para gerar boleto, `''` = desmarcada. Toda linha carregada nasce marcada com `'2'` (calculado na consulta). |

<a id="umov_contas_receber"></a>

## `umov_contas_receber` — Contas a Receber

Tela de consulta e roteamento dos títulos do cliente: não grava nada, apenas lista a tabela
RECEBER e chama as telas de baixa, ocorrência e alteração. O SELECT é montado em tempo de
execução (`FROM RECEBER R LEFT OUTER JOIN CLIENTE C`) e o TSV resolveu o dataset como PAGAR.
Toda a tela é uma grade só, sem `dgEditing`: os campos são somente leitura.

Três radiobuttons filtram o conteúdo da grade: `rbpendente` (F7) acrescenta `AND R.SALDO > 0`,
`rbpago` (F8) acrescenta `AND R.SALDO <= 0` e `rbtodos` (F9) não filtra. Clicar no título de
uma coluna troca o ORDER BY. Enter ou duplo clique abre a baixa do título — ou a tela de
ocorrências, quando a variável global `vtipo` vale 'Ocorrência'; F3 abre a alteração do título
e F12 a tela de filtro adicional.

### Grade `DBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do documento que gerou o título: 'NF' nota fiscal, 'CI' controle interno. Faz parte da chave (PK1) e é repassada às telas de baixa e ocorrência. |
| Série **·chave** | `SERIE` | VARCHAR(5) | 5 | Série do documento de origem (PK4). Na tela o campo é tratado como inteiro. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento de origem (PK3). Digitar um algarismo ou barra na grade abre a busca por Número/Parcela. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título (PK5). |
| Cliente **·chave** | `CLIENTE` | INTEGER |  | Código do cliente devedor (PK2). |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente, vindo do LEFT JOIN com CLIENTE. Digitar uma letra na grade abre a busca por nome. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento. Governa a cor da linha: vermelho quando já venceu e ainda há saldo. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original da parcela. |
| Saldo | `SALDO_ATUAL` | DOUBLE PRECISION |  | Campo calculado no OnCalcFields, não gravado. Vale SALDO quando o título está quitado ou dentro do prazo. Passando dos dias de tolerância do parâmetro JUROS_DIAS_ATRAZO, vira SALDO mais os juros de mora do período, calculados pela TAXA_JUROS_MENSAL do título. Linha azul quando SALDO é zero. |

<a id="umov_cheque_recebido"></a>

## `umov_cheque_recebido` — Cobrança com Cheques Recebidos...

Cadastro do cheque de terceiro recebido do cliente, gravado em `CHEQUE_RECEBIDO` (chave `EMPRESA` + `NUMERO`). O cabeçalho é uma tela de digitação simples, sem abas: identificação do cheque (banco, agência, conta, número), datas, valor, cliente e titular. Nome do banco vem por LEFT JOIN com `BANCO` e nome do cliente por LEFT JOIN com `CLIENTE`. Abaixo, a grade Lista das Duplicatas Vinculadas ao Cheque mostra `IT_CHEQUE_RECEBIDO` com LEFT JOIN em `RECEBER`: são os títulos que este cheque paga. A grade é apenas exibição — o dataset dos itens não tem ModifySQL nem InsertSQL, e o vínculo é criado nas telas de recebimento e de borderô; aqui os itens só são apagados, em bloco, quando o cheque inteiro é excluído.

O campo `STATUS` comanda toda a tela: só com `'Pendente'` é possível alterar ou excluir o cheque. Além disso, se o cheque já estiver lançado em `IT_BORDERO_CHEQUE_RECEBIDO`, a alteração e a exclusão são bloqueadas e remetidas à tela de emissão do borderô — exceto quando a tela é aberta a partir do histórico de cheques recebidos, caso em que emissão, vencimento e titular são replicados no item do borderô.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(30) | 30 |  | Situação do cheque, exibida como texto fixo ao lado do número, sem rótulo. Não é digitável. Valores gravados pelo sistema: `'Pendente'` (posto pelo NewRecord, cheque em carteira, único estado que permite alterar ou excluir aqui), `'Depósito'` (incluído em um depósito ou liberado para depósito), `'Baixado'` (depósito compensado e duplicatas baixadas), `'Devolvido'` (cheque devolvido pelo banco) e `'Devolv\Canc'` (devolução cancelada ou cheque devolvido e cancelado). Qualquer valor diferente de `'Pendente'` faz o Gravar e o Excluir abortarem com a mensagem que informa a situação atual. Observação: o TField no DFM declara 10 posições, menos que as 30 da coluna no banco. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do lançamento do cheque recebido, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(NUMERO) + 1` da empresa, e na gravação de registro novo o número é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; número inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de cheques recebidos; F7, F8 e F9 navegam entre os números. Gravar só age com número maior que zero. |
| Razão Social / Nome do Titular do Cheque | `TITULAR` | VARCHAR(50) | 50 |  | Nome de quem assina o cheque, que pode não ser o cliente. Ao entrar no campo, se estiver vazio, o sistema copia o nome do cliente para cá; a partir daí é texto livre. É replicado em `IT_BORDERO_CHEQUE_RECEBIDO.NOME_TITULAR` quando o cheque já está em borderô e a tela foi aberta pelo histórico. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do cheque. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. Serve de piso para o vencimento. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido de `CLIENTE.NOME` pelo LEFT JOIN e regravado pelo sistema no Exit do campo Cliente e na volta da consulta de clientes. Controle desabilitado na tela, não é digitado (calculado na consulta). |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente de quem o cheque foi recebido. Obrigatório: Gravar aborta com "Cliente do Cheque" em branco. F4 abre a consulta de clientes e F3 abre o cadastro de cliente. Ao sair do campo o sistema busca em `CLIENTE`; se não achar, limpa o código e o nome. Não pode ser trocado depois de gravado: a consulta traz o valor original em `LAST_CLIENTE` e, se o código digitado diferir dele, o Gravar recusa com a instrução de excluir o lançamento para mudar de cliente. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco sacado, trazido de `BANCO.NOME` pelo LEFT JOIN e regravado pelo sistema no Exit do campo Banco. Controle desabilitado na tela, não é digitado. Não é coluna de `CHEQUE_RECEBIDO` e não entra no INSERT nem no UPDATE (calculado na consulta). |
| Banco | `BANCO` | INTEGER |  |  | Código do banco sacado, do cadastro `BANCO` — na prática o código FEBRABAN impresso no cheque. Obrigatório: Gravar aborta com "Banco" em branco. F4 abre a consulta de bancos e F3 abre o cadastro. Ao sair do campo o sistema busca o nome; se não achar, limpa os dois. Junto com agência, conta e número do cheque forma a identificação usada para detectar cheque repetido. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor de face do cheque, com duas casas decimais. Obrigatório e maior que zero: Gravar aborta com "Valor do Cheque" zerado. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data em que o cheque pode ser apresentado — a data do "bom para". Obrigatória: data inválida aborta o Gravar, e vencimento anterior à emissão também é recusado. É replicada em `IT_BORDERO_CHEQUE_RECEBIDO` quando o cheque já está em borderô. |
| Nr. Cheque | `NUMERO_CHEQUE` | INTEGER |  |  | Número impresso na folha do cheque. Obrigatório: Gravar aborta com "Nr. do Cheque" em branco. Ao sair do campo o sistema procura em `CHEQUE_RECEBIDO` outro lançamento com o mesmo banco, agência, conta e número de cheque; se existir e for outro número de lançamento, a tela troca sozinha para aquele registro em vez de duplicar o cheque. |
| Nr. Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 |  | Número da conta corrente do emitente, em texto livre. Obrigatório: Gravar aborta com "Nr. da Conta" em branco. Entra na chave de detecção de cheque repetido. |
| Agência | `AGENCIA` | VARCHAR(20) | 20 |  | Agência do emitente, em texto livre. Obrigatória: Gravar aborta com "Agência" em branco. Entra na chave de detecção de cheque repetido. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Observação livre sobre o cheque. Não é validada na gravação. |

### Grade `dbcontas_receber` — tabela IT_CHEQUE_RECEBIDO

Lista das Duplicatas Vinculadas ao Cheque. Só exibição: o vínculo é criado nas telas de recebimento e de borderô, e aqui os itens só somem quando o cheque inteiro é excluído. Emissão, Vencimento e Saldo vêm de `RECEBER` pelo LEFT JOIN.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do tipo de documento do título a receber, primeira parte da chave da duplicata em `RECEBER`. Código de duas letras, gravado pela tela que originou o título. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento a receber (nota ou duplicata) que este cheque paga. Parte da chave do título. |
| Série **·chave** | `SERIE` | INTEGER |  | Série do documento a receber. Parte da chave do título. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título. Parte da chave: uma linha por parcela paga com este cheque. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da duplicata, lida de `RECEBER` pelo LEFT JOIN. Não é do item. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento da duplicata, lida de `RECEBER` pelo LEFT JOIN. Não é do item. |
| Valor | `VALOR_TITULO` | DOUBLE PRECISION |  | Valor original da duplicata, apelido de `RECEBER.VALOR` no SELECT. Serve de referência contra o valor aplicado do cheque (calculado na consulta). |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto da duplicata em `RECEBER`, lido pelo LEFT JOIN. Mostra quanto ainda falta depois do que este cheque cobre. |
| R$ Cheque | `VALOR` | DOUBLE PRECISION |  | Parcela do valor do cheque aplicada nesta duplicata. É a coluna própria do item: a soma das linhas é o que o cheque quita. |
| Juros | `JUROS_RECEBIDO` | DOUBLE PRECISION |  | Juros cobrados do cliente nesta duplicata no ato do recebimento com o cheque. Zero quando não houve. |
| Desconto | `DESCONTO_CONCEDIDO` | DOUBLE PRECISION |  | Desconto concedido ao cliente nesta duplicata no ato do recebimento com o cheque. Zero quando não houve. |

Colunas do dataset do cabeçalho que não têm controle na tela: `EMPRESA`, preenchida com a empresa logada no NewRecord; `DATA_BAIXA`, gravada pelas telas de depósito e de liberação, não pelo cadastro; `TOTAL`, que faz parte do INSERT e do UPDATE mas não é alimentada por nenhum campo desta tela; e `LAST_CLIENTE`, cópia de `CLIENTE` no SELECT usada só para impedir a troca do cliente.

<a id="umov_adiantamento_recebimento"></a>

## `umov_adiantamento_recebimento` — Adiantamentos de Clientes...

Lança adiantamentos recebidos de clientes na tabela `ADIANTAMENTO_RECEBIMENTO`, chave `EMPRESA` + `NUMERO`. Painel único, sem grade. O `BeforePost` chama `atualiza_conta` duas vezes — crédito na conta de adiantamento e débito na conta de depósito — mas só quando `STATUS` ainda é `'Aberto'`; em seguida ele mesmo vira o `STATUS` para `'Executado'`, o que impede que os lançamentos de conta se repitam em uma regravação.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Numero **·chave** | `NUMERO` | INTEGER |  |  | Número do adiantamento, chave do registro. Sequencial: a tela abre com o maior número existente mais um. Obrigatório no Gravar, que aborta com "Número do Adiantamento". |
| Conta Adiantamento | `CONTA_ADIANTAMENTO` | INTEGER |  |  | Conta contábil de adiantamento de cliente, **creditada** pelo valor. Obrigatória no Gravar, que aborta com "Conta de Adiantamento". Depois de gravada não pode mudar: se divergir de `OLD_CONTA_ADIANTAMENTO` o Gravar recusa e manda excluir o registro e lançar de novo. F4 abre a consulta de contas correntes. |
| `edtdescricao_conta_adiantamento` | `DESCRICAO_CONTA_ADIANTAMENTO` | VARCHAR(50) | 50 |  | Descrição da conta de adiantamento. Campo sem rótulo na tela, e não digitado: o Exit e o F4 da Conta Adiantamento o trazem de `CONTA` (calculado na consulta). |
| Conta Depósito | `CONTA_DEPOSITO` | INTEGER |  |  | Conta corrente onde o dinheiro entrou, **debitada** pelo valor. Obrigatória no Gravar, que aborta com "Conta de Depósito". Também é imutável depois de gravada: divergir de `OLD_CONTA_DEPOSITO` faz o Gravar recusar. F4 abre a consulta de contas correntes. |
| Descrição da Conta de Depósito | `DESCRICAO_CONTA_DEPOSITO` | VARCHAR(50) | 50 |  | Descrição da conta de depósito. Não é digitada: o Exit e o F4 do campo Conta Depósito a trazem de `CONTA` (calculado na consulta). |
| Data | `DATA` | TIMESTAMP |  |  | Data do adiantamento, e a data usada nos dois lançamentos de conta. O Gravar valida o conteúdo digitado e aborta com "Data do Adiantamento não Informada ou Inválida". |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente que adiantou o valor. F4 abre a consulta de clientes. |
| Nome \ Razão Social do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente. Não é digitado: o Exit e o F4 do campo Cliente o trazem do cadastro. É gravado na própria tabela e vai no histórico dos lançamentos de conta. |
| Histórico Lançamento | `HISTORICO` | VARCHAR(100) | 100 |  | Texto livre que descreve o adiantamento. Entra no histórico dos dois lançamentos de conta, no formato "Adiantamento: número - histórico". |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor do adiantamento. É o mesmo valor lançado a crédito na conta de adiantamento e a débito na conta de depósito. |

<a id="umov_contas_receber_emissao_bordero"></a>

## `umov_contas_receber_emissao_bordero` — Remessas para o Banco...

Tela que monta o borderô de remessa de títulos ao banco. O cabeçalho grava a tabela BORDERO;
a grade abaixo não é uma tabela filha e sim um ClientDataSet em memória (`tbtemp`), onde o
usuário digita documento, série, número e parcela dos títulos. Ao gravar, a tela varre a grade
e atualiza cada título correspondente em RECEBER, carimbando NUMERO_BORDERO, BANCO e
SITUACAO_TITULO; antes disso ela limpa esses três campos em todos os títulos que já apontavam
para este borderô. Excluir o borderô faz a mesma limpeza e apaga o registro de BORDERO.

A tela tem dois modos, decididos pelo checkbox Gerar Arquivo de Remessa para o Banco. Marcado
(GERAR_BOLETOS = '2'), o par Conta e Descrição da Conta fica visível e Banco e Nome do Banco
somem; a Conta passa a ser obrigatória e a consulta de contas é filtrada por
GERA_BOLETO_BANCARIO = '2'. Desmarcado ('1'), vale o contrário: aparecem Banco e Nome do Banco,
e o Banco é o obrigatório. Nesse segundo modo a tela também recusa título que já esteja em
outro borderô.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do borderô (PK1). Gerado pelo sistema como o maior NUMERO da tabela BORDERO mais um; digitar um número existente traz o borderô para alteração. Aceita 8 dígitos. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do borderô. Obrigatória e validada no Gravar. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco para onde vai a remessa, chave do cadastro BANCO. Só aparece quando o borderô não gera arquivo de remessa, e nesse caso é obrigatório. É copiado para o campo BANCO de cada título do borderô. F4 consulta bancos, F3 abre o cadastro. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, buscado pelo código. Preenchido pelo sistema, visível junto com o campo Banco (calculado na consulta). |
| Situação | `SITUACAO_TITULO` | INTEGER |  |  | Código da situação que os títulos deste borderô passam a ter, chave do cadastro SITUACAO_TITULO, do tipo em cobrança bancária. Obrigatória no Gravar. É gravada em cada título do borderô e limpa quando o borderô é excluído. F4 consulta, F3 abre o cadastro. |
| Descrição da Situação do Título | `DESCRICAO_SITUACAO_TITULO` | VARCHAR(50) | 50 |  | Descrição da situação, buscada pelo código. Preenchida pelo sistema. |
| Gerar Arquivo de Remessa para o Banco | `GERAR_BOLETOS` | VARCHAR(1) | 1 |  | Marcador que escolhe o modo da tela. Vale '2' marcado e '1' desmarcado, e nasce '1' no NewRecord. Marcado, troca Banco por Conta na tela, exige a Conta, libera o botão Visualizar para imprimir os boletos dos títulos selecionados e dispensa a crítica de título já lançado em outro borderô. |
| Conta | `CONTA` | INTEGER |  |  | Código da conta corrente que emite os boletos, chave do cadastro CONTA. Só aparece quando o borderô gera arquivo de remessa, e nesse caso é obrigatória. A consulta só lista contas com GERA_BOLETO_BANCARIO igual a '2'. O rótulo casado por geometria n |
| Descrição da Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente, buscada pelo código. Preenchida pelo sistema. Mesmo caso de rótulo sobreposto do campo anterior: n |

### Grade `RxDBGrid1` — ClientDataSet `tbtemp`, sem tabela no banco

Cada linha é um título a incluir no borderô. O usuário digita a chave (documento, série, número
e parcela) e o AfterPost consulta RECEBER: se o título não existe, a linha é apagada na hora.
As colunas descritivas são preenchidas ao recarregar o borderô, quando a tela relê RECEBER com
JOIN em CLIENTE. Delete na grade exclui a linha, com confirmação.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc | `documento` | VARCHAR(2) | 2 | Sigla do documento de origem do título. Nasce 'NF' no NewRecord da linha e é convertida para maiúsculas na digitação (calculado na consulta). |
| Serie | `serie` | INTEGER |  | Série do documento. Nasce com o parâmetro NOTA_SERIE do sistema (calculado na consulta). |
| Número **·chave** | `numero` | INTEGER |  | Número do documento de origem, digitado pelo usuário (calculado na consulta). |
| Parc. | `seq` | INTEGER |  | Número da parcela do título, digitado pelo usuário (calculado na consulta). |
| Emissão | `emissao` | DATE |  | Data de emissão do título, trazida de RECEBER ao recarregar o borderô (calculado na consulta). |
| Cliente | `cliente` | INTEGER |  | Código do cliente devedor, trazido de RECEBER (calculado na consulta). |
| Razão Social / Nome do Cliente | `nome_cliente` | VARCHAR(70) | 70 | Nome do cliente, trazido do JOIN com CLIENTE (calculado na consulta). |
| E-mail do Cliente | `email` | VARCHAR(120) | 120 | E-mail do cliente, trazido do cadastro. O botão E-mail monta a lista de destinatários a partir desta coluna, sem repetir endereços (calculado na consulta). |
| Vencimento | `vencimento` | DATE |  | Data de vencimento do título (calculado na consulta). |
| Valor | `valor` | DOUBLE PRECISION |  | Valor da parcela, somado no total impresso do borderô (calculado na consulta). |
| `selecionar_titulo` | `selecionar_titulo` | VARCHAR(1) | 1 | Marcador de seleção da linha, sem rótulo na grade. Vale '2' selecionado e vazio não selecionado, e nasce '2' no NewRecord. Selecionado, a célula é desenhada com o ícone da ImageList. Clicar na célula alterna o valor, o item do menu de contexto alterna só a linha corrente e o rótulo Selecionar todos os registros (F12) alterna todas de uma vez. Só as linhas com '2' têm boleto impresso pelo botão Visualizar (calculado na consulta). |

<a id="umov_contas_receber_por_cliente"></a>

## `umov_contas_receber_por_cliente` — Alteração dos Títulos do Cliente

Tela de consulta dos títulos de um cliente só. Ao abrir, ela chama a consulta de clientes; sem
cliente escolhido a janela se fecha sozinha, e com cliente escolhido o título da janela vira
'Alteração dos Títulos do Cliente..: nome (código)'. A grade lê direto a tabela RECEBER, sem
JOIN, filtrando por empresa e cliente, e não tem `dgEditing`: é somente leitura. F3, Enter ou
duplo clique abrem `umov_contas_receber_alteracao` para o título selecionado.

Os três radiobuttons definem o filtro: `rbpendente` (F7) usa `AND SALDO > 0`, `rbpago` (F8) usa
`AND SALDO <= 0` e `rbtodos` (F9) traz todos. O rodapé tem seis totalizadores que não estão no
TSV porque são TCurrencyEdit sem DataSource — Valor Títulos, Valor Pago, Juros, Desconto, Saldo
e Atraso — somados em laço sobre a grade a cada filtragem; Atraso acumula só o saldo dos
títulos já vencidos.

A tela também é usada como alerta: quando aberta com a variável global `vconsulta_historico`
ligada, a partir da digitação do cliente no Controle Interno, ela se fecha sozinha se o total
em atraso for zero, e só aparece quando há atraso.

### Grade `DBGrid1` — tabela RECEBER

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do documento que gerou o título: 'NF' nota fiscal, 'CI' controle interno. Chave do título (PK1). |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento de origem (PK3). |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título (PK5). |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento. Ordenação inicial da grade e base do total em atraso do rodapé. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original da parcela. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 | Texto de origem do título gravado por quem o gerou, do tipo 'CI 1234'. |
| Atraso | `DIAS_ATRAZO` | INTEGER |  | Campo calculado no OnCalcFields, não gravado. Título quitado: dias entre a data de recebimento e o vencimento. Título em aberto: dias entre agora e o vencimento, menos um. Fica em branco quando não há atraso. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo devedor da parcela. É o campo que os três radiobuttons usam para separar pendentes de pagos. |

<a id="ucad_ocorrencia_titulo"></a>

## `ucad_ocorrencia_titulo` — Cadastro da Ocorrência do Título...

Cadastro das ocorrências que podem ser lançadas sobre um título do contas a receber, gravado na tabela `OCORRENCIA_TITULO`. Cada ocorrência amarra uma situação de título e diz se o evento retira a duplicata do banco. Tela sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da ocorrência. Sugerido pelo sistema como `MAX(CADASTRO) + 1` da tabela OCORRENCIA_TITULO dentro da empresa corrente. Se o código digitado não existir, a tela pergunta se grava com ele ou com o próximo da sequência. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição da Ocorrência do Título | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto da ocorrência. Obrigatório: o Gravar recusa a gravação com o campo vazio. |
| Situação | `SITUACAO_TITULO` | INTEGER |  |  | Código da situação de título que a ocorrência aplica ao documento. F4 abre a consulta de situações do título e F3 abre o cadastro delas. Ao sair do campo, o sistema busca a situação; se não achar, limpa o código e a descrição. |
| Descrição da Situação do Título | `DESCRICAO_SITUACAO_TITULO` | VARCHAR(50) | 50 |  | Descrição da situação escolhida. Não é digitada: o sistema copia de SITUACAO_TITULO.DESCRICAO ao sair do código ou ao escolher pela consulta. |
| Retira a Duplicata do Banco | `RETIRA_TITULO_BANCO` | VARCHAR(1) | 1 |  | Marcador. `'2'` marcado (a ocorrência retira o título da carteira do banco), `'1'` desmarcado. Novo registro nasce com `'1'`. |

<a id="ucad_situacao_titulo"></a>

## `ucad_situacao_titulo` — Cadastro da Situação do Título...

Tabela de apoio `SITUACAO_TITULO`, chave `EMPRESA` + `CADASTRO`. Painel único. Além do código e da descrição, os três marcadores decidem como os títulos naquela situação se comportam no fluxo de caixa, na cobrança e no protesto — cada um é lido por um relatório específico do contas a receber.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da situação, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de situações. |
| Descrição da Situação do Título | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto da situação. Único campo exigido no Gravar — vazio aborta com "Descrição da Situação do Título". |
| Não Listar na Previsão do Fluxo de Caixa | `NAO_LISTA_PREVISAO_FLUXO_CAIXA` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'`. Com `'2'`, os títulos nesta situação são excluídos do mapa de previsão do fluxo de caixa e do mapa de posição geral — é assim que situações como título cancelado ou em discussão deixam de contaminar a previsão. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de situação fora de uso. Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Abreviação | `ABREVIACAO` | VARCHAR(3) | 3 |  | Sigla de até três letras da situação, usada nas colunas estreitas dos mapas de contas a receber. |
| Pode ser enviado para Protesto em Cartório | `ENVIAR_PROTESTO_CARTORIO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'`. O relatório de títulos a protestar só considera títulos cuja situação tem `'2'` aqui. |
| Cobrança com Cheques | `COBRANCA_CHEQUE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`; o NewRecord inicia em `'1'`. Identifica a situação como cobrança lastreada em cheque; o mapa de contas a receber detalhado por cliente separa os títulos por este marcador. |

<a id="ucad_instrucao_cobranca"></a>

## `ucad_instrucao_cobranca` — Cadastro da Instrução de Cobrança...

Grava as instruções de cobrança do boleto bancário na tabela INSTRUCAO_COBRANCA, por empresa. Cadastro de dois campos, sem abas, sem grade e sem marcador de inativo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da instrução. Proposto como MAX(CADASTRO)+1 da empresa e regravado com esse valor na inclusão; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição da Instrução de Cobrança | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. É o texto da instrução que sai impresso no boleto. Serve também de referência no log do sistema. |

<a id="ucad_forma_pagamento"></a>

## `ucad_forma_pagamento` — Cadastro da Forma de Pagamento...

Tela de cadastro simples, sem abas nem grade. Grava na tabela `FORMA_PAGAMENTO` as formas de pagamento usadas no financeiro, com um conjunto de marcadores que definem o que cada forma dispara na baixa: comissão, cheque, aviso contábil, recibo. Quando a forma é eletrônica, um bloco extra pede o intermediador, que é um cliente — daí o LEFT JOIN com `CLIENTE` para trazer a razão social. O registro é por empresa: o SELECT filtra por `EMPRESA` e o NewRecord grava a empresa corrente, mas esse campo não aparece na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da forma de pagamento, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(CADASTRO) + 1` da empresa, e na gravação de registro novo o código é reatribuído por esse cálculo. Aceita digitação para localizar registro existente; código inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de formas de pagamento; F7, F8 e F9 navegam entre os códigos. Se ficar vazio ou zerado, o botão Gravar apenas limpa a tela e não grava nada. |
| Descrição da Forma de Pagamento | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da forma de pagamento. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Tipo de Baixa | `TIPO_BAIXA` | VARCHAR(10) | 10 |  | Define em qual movimento a baixa desta forma repercute. Combo com dois valores, gravados como texto literal: `'Financeiro'` = baixa que movimenta caixa e banco, e `'Contábil'` = baixa apenas contábil, sem efeito financeiro. O NewRecord grava `'Financeiro'`. Campo do controle `cbtipo_pagamento`, |
| Gera Comissão | `GERA_COMISSAO` | VARCHAR(1) | 1 |  | Diz se a baixa por esta forma gera comissão para o vendedor. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. |
| Gera Cheques | `GERA_CHEQUE` | VARCHAR(1) | 1 |  | Diz se esta forma gera registro de cheque no controle de cheques. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de forma de pagamento fora de uso. Valores `'2'` = inativa (caixa marcada) e `'1'` = ativa (caixa desmarcada). O NewRecord grava `'1'`: toda forma nova nasce ativa. |
| Emite Aviso de Lançamento Contábil | `EMITE_AVISO_LANCAMENTO_CONTABIL` | VARCHAR(1) | 1 |  | Diz se a baixa por esta forma imprime o aviso de lançamento contábil. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. |
| Emite Recibo de Pagamento | `EMITE_RECIBO_PAGAMENTO` | VARCHAR(1) | 1 |  | Diz se a baixa por esta forma imprime recibo de pagamento. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. |
| Forma de Pagamento Eletrônica | `FORMA_PAGAMENTO_ELETRONICA` | VARCHAR(1) | 1 |  | Marca a forma como pagamento eletrônico, por exemplo cartão ou carteira digital. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. É o interruptor dos dois campos seguintes: com `'2'` o rótulo e o campo do intermediador ficam visíveis, com `'1'` somem da tela e o BeforePost limpa os dois antes de gravar. |
| Intermediador | `INTERMEDIADOR_PAGTO_ELETRONICO` | INTEGER |  |  | Código do cliente que faz a intermediação do pagamento eletrônico, a operadora informada na NF-e. Só aparece quando a forma está marcada como eletrônica, e nesse caso é obrigatório: o Gravar aborta com "Intermediador da Forma de Pagamento Eletrônica" em branco. F4 abre a consulta de clientes; F3 abre o cadastro de cliente para incluir um novo. Ao sair do campo o sistema busca o cliente pelo código: se não achar, limpa este campo e a razão social ao lado. Com a forma não eletrônica, o BeforePost zera esta coluna. |
| Razão Social do Intermediador da Transf. Eletrônica | `NOME_INTERMEDIADOR` |  |  |  | Razão social do intermediador, trazida de `CLIENTE.NOME` pelo LEFT JOIN e regravada pelo sistema ao sair do campo Intermediador ou ao escolher pela consulta. Não é digitada. Só aparece quando a forma está marcada como eletrônica, e o BeforePost a limpa quando não está. É apelido de coluna do SELECT, não coluna gravável de `FORMA_PAGAMENTO` (calculado na consulta). |

<a id="umov_contas_pagar"></a>

## `umov_contas_pagar` — Contas a Pagar:

Lista geral dos títulos a pagar da empresa, lidos de `PAGAR` com nome do fornecedor por LEFT JOIN com `FORNECEDOR`. Não há cabeçalho: é só a grade, de seleção de linha inteira, sem célula digitável. A tela não grava campos — ela despacha para outras: Baixar (ou duplo clique, ou Enter) abre `umov_contas_pagar_baixa_titulo` para o título corrente, e Alterar (F3) abre `umov_contas_pagar_alteracao`. O que a tela faz por conta própria é excluir o título, e aí desfaz muita coisa junto.

Excluir só passa se o título não estiver amarrado a mais de um cheque emitido e se o cheque dele não pagar vários títulos; caso contrário recusa com aviso. Passando, o BeforeDelete estorna na conta corrente cada item de `IT_PAGAR` pago por cheque baixado ou por forma de pagamento do tipo `'Financeiro'`, apaga o cheque em `CHEQUE_EMITIDO` e apaga todos os itens de `IT_PAGAR` do título.

Três filtros em botões de rádio remontam o SELECT, todos por saldo e não por status: Exibir Somente os Pendentes (F7) traz `SALDO > 0`, Exibir Somente os Já Pagos (F8) traz `SALDO <= 0`, e Exibir todos os Títulos (F9) tira o filtro. A grade colore a linha: azul quando o saldo é zero, vermelho quando está vencida e ainda com saldo. Digitar número ou barra abre a caixa Digite o Número / Parcela do Título e posiciona na linha; digitar letra abre Informe o Nome do Fornecedor e procura por nome parcial.

### Grade `DBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla de duas letras do tipo de documento que originou o título, primeira parte da chave primária. Gravada pela tela de origem: `'CF'` para conhecimento de frete, `'FF'` para conferência de fatura de frete, `'NF'` para nota fiscal de entrada. Só leitura. Clicar no título ordena a grade por ela. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento de origem — nota, conhecimento ou conferência. Parte da chave primária. Só leitura. Clicar no título ordena por ele, e é o campo casado com a parte antes da barra na busca por número. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título. Parte da chave primária: uma linha por parcela. Só leitura. É a parte depois da barra na busca por número. Clicar no título ordena por ela. |
| Fornecedor **·chave** | `FORNECEDOR` | INTEGER |  | Código do fornecedor a quem se deve, do cadastro `FORNECEDOR`. Parte da chave primária. Só leitura. Clicar no título ordena por ele. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido de `FORNECEDOR.NOME` pelo LEFT JOIN. Não é coluna de `PAGAR` (calculado na consulta). É a ordem inicial da grade e o campo procurado quando o usuário digita uma letra. Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Só leitura. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. Só leitura. Título com saldo e vencimento anterior a hoje é desenhado em vermelho. Clicar no título ordena por ela. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original da parcela. Só leitura. Entra na referência gravada no log ao excluir. Clicar no título ordena por ele. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Quanto ainda falta pagar da parcela. Só leitura, mantido pela tela de baixa. É o campo que define os três filtros: maior que zero é pendente, zero ou menos é pago. Saldo zero pinta a linha de azul. Clicar no título ordena por ele. |

Colunas do dataset que não aparecem na grade: `SERIE`, parte da chave primária e usada em todas as buscas de itens de pagamento; `DATA_PAGAMENTO`, `VALOR_PAGO`, `JURO` e `DESCONTO`, mantidos pela tela de baixa; `CONTA`, a conta corrente do pagamento; `PLANO_CONTAS`, repassada ao estorno na conta corrente; `REFERENCIA`, texto de identificação do título, gravado no log da exclusão; `SELECIONA_REGISTRO`, marcador usado por outras telas de seleção em lote; e `DIAS_ATRAZO`, campo calculado no Delphi, sem coluna nesta grade — vale a diferença entre a data de pagamento e o vencimento quando o saldo é zero, e entre hoje e o vencimento quando ainda há saldo, ficando em branco quando o resultado não é positivo.

<a id="umov_cheque_emitido"></a>

## `umov_cheque_emitido` — Pagamento com Cheques Emitidos...

Emite um cheque da conta corrente da empresa e o distribui entre títulos a pagar. O cabeçalho grava em `CHEQUE_EMITIDO` (chave `EMPRESA` + `NUMERO`) e a grade em `IT_PAGAR`, com uma linha por parcela paga por este cheque. A cada item lançado o sistema abate `SALDO_LIQUIDO` e `SALDO` do título em `PAGAR`, soma `VALOR_PAGO` e acumula o `TOTAL` do cheque; excluir o item desfaz tudo isso. O `STATUS` do cheque governa a tela inteira.

#### Pagamento com Cheques Emitidos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do lançamento do cheque, chave do registro. Sequencial: a tela abre com o maior número existente mais um. Digitar número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do cheque. O Gravar valida o conteúdo digitado e aborta com "Emissão do Cheque não Informado ou Inválido". |
| Descrição da Conta Corrente | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente do cheque, trazida de `CONTA` pelo código (calculado na consulta). Aparece nas mensagens de recusa de alteração e exclusão. |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente de onde sai o cheque. Obrigatória no Gravar, que aborta com "Conta". |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor do cheque emitido. Obrigatório no Gravar, que aborta com "Valor do Cheque". É o teto a distribuir entre os títulos da grade. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data para apresentação do cheque. Validada no Gravar e comparada com a emissão: anterior a ela aborta com "Data de Vencimento não pode ser Menor que data de Emissão". |
| Nr. Cheque | `NUMERO_CHEQUE` | INTEGER |  |  | Número impresso no talão. Obrigatório no Gravar, que aborta com "Nr. do Cheque". Junto com a conta é o que identifica o cheque nas críticas da tela. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Texto livre sobre o pagamento. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos valores da grade, ou seja, quanto do cheque já foi distribuído entre títulos. Não é digitado: o sistema acumula a cada item lançado e subtrai a cada item excluído. |

O campo `STATUS` da tabela não tem controle na tela, mas comanda o comportamento dela: o NewRecord grava `'Pendente'`, e enquanto o cheque estiver `'Pendente'` ele pode ser alterado e excluído. Qualquer outra situação faz o Gravar, o Excluir e o lançamento de itens pararem com "O Cheque da Conta Corrente ... se encontra <status>. Impossível alterar o Cheque Emitido."

### Grade `RxDBGrid1` — tabela IT_PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do tipo de documento do título a pagar. Copiada de `PAGAR` no NewRecord do item, junto com fornecedor, número, série e parcela — o usuário escolhe o título, não digita a chave. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do título a pagar, copiado de `PAGAR`. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Parcela do título, copiada de `PAGAR`. O item ainda recebe um `ITEM` sequencial, calculado como o maior já existente para aquela parcela mais um, porque a mesma parcela pode ser paga por mais de um cheque. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor do título. Somente exibição (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, lida de `PAGAR`. Somente exibição. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título, lida de `PAGAR`. Somente exibição. |
| Valor | `VALOR_TITULO` | DOUBLE PRECISION |  | Valor original do título, copiado de `PAGAR.VALOR` no lançamento do item. Somente conferência (calculado na consulta). |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto do título em `PAGAR`. É abatido pelo valor do cheque e pelo desconto quando o item é gravado, e nunca fica negativo — o sistema o zera nesse caso. |
| R$ Cheque | `VALOR` | DOUBLE PRECISION |  | Parcela do cheque destinada a este título. Vem sugerida do `VALOR_CHEQUE` do título e é o valor que abate o saldo, soma `VALOR_PAGO` em `PAGAR` e acumula no R$ Total do cabeçalho. |

<a id="umov_adiantamento_pagamento"></a>

## `umov_adiantamento_pagamento` — Adiantamentos de Fornecedores...

Lança adiantamentos pagos a fornecedores na tabela `ADIANTAMENTO_PAGAMENTO`, chave `EMPRESA` + `NUMERO`. Painel único, sem grade. O documento é de lançamento único: ao gravar, o `BeforePost` chama `atualiza_conta` duas vezes, debitando a conta de adiantamento e creditando a conta corrente pelo mesmo valor; a exclusão faz o par inverso (estorno débito e estorno crédito). Por isso o Gravar recusa alteração de registro já existente com "Impossível Alterar os Dados do Adiantamento do Fornecedor" — para corrigir é preciso excluir e lançar de novo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Numero **·chave** | `NUMERO` | INTEGER |  |  | Número do adiantamento, chave do registro. Sequencial: a tela abre com o maior número existente mais um e o regrava no Gravar quando é inclusão. Digitar número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. |
| Conta Adiantamento | `CONTA_ADIANTAMENTO` | INTEGER |  |  | Conta contábil de adiantamento a fornecedor, **debitada** pelo valor no BeforePost. Obrigatória no Gravar, que aborta com "Conta de Adiantamento". F4 abre a consulta de contas correntes. |
| `edtdescricao_conta_adiantamento` | `DESCRICAO_CONTA_ADIANTAMENTO` | VARCHAR(50) | 50 |  | Descrição da conta de adiantamento. Campo sem rótulo na tela, e não digitado: o Exit e o F4 da Conta Adiantamento o trazem de `CONTA`, e o limpam junto com o código quando a conta não existe (calculado na consulta). |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente de onde sai o dinheiro, **creditada** pelo valor no BeforePost. Obrigatória no Gravar, que aborta com "Conta Corrente". F4 abre a consulta de contas correntes. |
| Descrição da Conta Corrente | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente. Não é digitada: o Exit e o F4 do campo Conta a trazem de `CONTA`, e a limpam junto com o código quando a conta não existe (calculado na consulta). |
| Data | `DATA` | TIMESTAMP |  |  | Data do adiantamento, e a data usada nos dois lançamentos de conta. O Gravar valida o conteúdo digitado e aborta com "Data do Adiantamento não Informada ou Inválida". |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor que recebeu o adiantamento. F4 abre a consulta de fornecedores e F5 abre o cadastro de fornecedor a partir daqui. |
| Nome \ Razão Social do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor. Não é digitado: o Exit e o F4 do campo Fornecedor o trazem de `FORNECEDOR`, e o limpam junto com o código quando o fornecedor não existe. É gravado na própria tabela e vai no histórico dos lançamentos de conta. |
| Histórico Lançamento | `HISTORICO` | VARCHAR(100) | 100 |  | Texto livre que descreve o adiantamento. Obrigatório no Gravar, que aborta com "Histórico do Adiantamento". Entra no histórico dos dois lançamentos de conta, no formato "Adiantamento: número - histórico", e é a referência gravada no log de sistema. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor do adiantamento. Obrigatório no Gravar, que aborta com "Valor do Adiantamento". É o mesmo valor lançado a débito na conta de adiantamento e a crédito na conta corrente. |

<a id="umov_recibo_fornecedor"></a>

## `umov_recibo_fornecedor` — Emissão de Recibo à Fornecedores...

Emissão de recibos de pagamento a fornecedores, gravados na tabela `RECIBO_FORNECEDOR`, chave `EMPRESA` + `NUMERO`. Painel único, sem abas nem grade. Não gera lançamento financeiro: a tela só registra o recibo e imprime. O Gravar chama a impressão em seguida, com escolha entre uma ou duas vias (`qr_recibo_01_via` / `qr_recibo_02_vias`); o valor sai por extenso e a data em dia, mês por extenso e ano. Endereço, cidade e CNPJ/CPF do fornecedor entram no impresso pelo JOIN com `FORNECEDOR` e `CIDADE`, sem campo na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do recibo, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `RECIBO_FORNECEDOR` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta recibos, F7 anterior, F8 próximo, F9 posiciona. Quando a tela é chamada por outra já com um número definido, ela abre nesse recibo com o foco no Imprimir. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 |  | Texto que descreve a que se refere o pagamento. Exigido no Gravar. É o que aparece no corpo do recibo impresso e vira a referência do log do sistema. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do recibo. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. No impresso é quebrada em dia, mês por extenso e ano. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome do fornecedor, trazido do JOIN com `FORNECEDOR`. Preenchido pelo Exit do código do fornecedor e pela consulta F4; não é digitado (calculado na consulta). |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor a quem o recibo é emitido. Exigido no Gravar. F4 abre a consulta de fornecedores, F3 abre o cadastro de fornecedor. Ao sair do campo, o sistema busca o cadastro e preenche o nome; se o código não existir, limpa código e nome. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor do recibo. Exigido no Gravar e precisa ser maior que zero. Convertido para extenso na impressão pela rotina `extenso`. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 |  | Observação livre do recibo. Não é exigida no Gravar. Sai impressa nas duas versões do recibo. |

<a id="umov_programacao_pagamento_contas_pagar"></a>

## `umov_programacao_pagamento_contas_pagar` — Programação de Pagamento das Contas a Pagar...

Monta um lote de pagamento: o cabeçalho é gravado em `PROGRAMACAO_PAGAMENTO_PAGAR` (conta corrente, forma de pagamento e data de agendamento) e a grade lista os títulos de `PAGAR` que foram amarrados a essa programação. A amarração não é digitada na grade: o botão Consultar abre a consulta de contas a pagar e grava `NUMERO_PROGRAMACAO_PAGAMENTO` em cada título escolhido. Inserir ou excluir linha direto na grade está bloqueado; Delete apenas desamarra o título.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da programação, só exibida (TDBText). Assume `'Pendente'` (gravado no NewRecord, permite alterar, excluir e trocar os títulos) e `'Baixado'` (gravado pela tela de baixa; a partir daí gravar, excluir e usar o botão Consultar são recusados com aviso). |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da programação por empresa: MAX(NUMERO) + 1, calculado em busca_ultimo e preenchido ao limpar a tela. F7 volta um registro, F8 avança, F9 e F4 procuram. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da programação. Ao entrar no campo, se estiver vazia ou inválida o sistema preenche com a data de hoje. Data válida é exigida para gravar. |
| Descrição da Conta Corrente | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Nome da conta corrente, trazido de CONTA no Exit do código ou na consulta F4. Não é digitado (calculado na consulta). |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente que vai pagar o lote. F4 abre a consulta de contas correntes, F3 abre o cadastro. Obrigatório para gravar. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos saldos dos títulos amarrados, SUM(CP.SALDO). Não é digitado (calculado na consulta). |
| Descrição da Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Nome da forma de pagamento, trazido de FORMA_PAGAMENTO no Exit do código ou na consulta F4. Não é digitado (calculado na consulta). |
| Forma Pagto | `FORMA_PAGAMENTO` | INTEGER |  |  | Forma de pagamento do lote. F4 abre a consulta, F3 abre o cadastro. Obrigatório para gravar. É ela que define o TIPO_BAIXA usado na baixa: só `'Financeiro'` movimenta a conta corrente. |
| Agendamento | `DATA_AGENDAMENTO` | TIMESTAMP |  |  | Data prevista para o pagamento do lote. Data válida é exigida para gravar. |

### Grade `RxDBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla do documento do título a pagar. Somente leitura na grade: vem do título selecionado na consulta. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do título a pagar. Somente leitura na grade. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título. Somente leitura na grade. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, vindo do JOIN com FORNECEDOR (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Somente leitura. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. Somente leitura. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original do título. Somente leitura. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto do título; é o que soma no R$ Total e o que será baixado. Somente leitura. |

A grade fica desabilitada quando `DATA_BAIXA` do cabeçalho está preenchida. Delete sobre a linha pede confirmação e limpa `NUMERO_PROGRAMACAO_PAGAMENTO` do título, tirando-o da programação sem apagar o título.

<a id="umov_programacao_pagamento_contas_pagar_baixa"></a>

## `umov_programacao_pagamento_contas_pagar_baixa` — Baixa da Programação de Pagamento das Contas a Pagar...

Tela só de grade: baixa, altera a data da baixa ou estorna programações de pagamento gravadas em `PROGRAMACAO_PAGAMENTO_PAGAR`. Ao abrir, exige a escolha de uma conta corrente (consulta F4 obrigatória; sem conta a tela se fecha) e o título da janela passa a mostrar essa conta. Não há campos de digitação: a data da baixa é pedida em uma janela de consulta e a baixa gera as linhas de `IT_PAGAR`, atualiza saldo, juro, desconto e valor pago de `PAGAR` e, quando a forma de pagamento é do tipo `'Financeiro'`, credita a conta corrente.

Três filtros de exibição controlam o SELECT: `( F7 ) Exibir Somente os Pendentes` (STATUS = `'Pendente'`), `( F8 ) Exibir Somente os Baixados` (STATUS = `'Baixado'`) e `( F9 ) Exibir Todos` (sem filtro de STATUS).

### Grade `DBGrid1` — tabela PROGRAMACAO_PAGAMENTO_PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número da programação de pagamento. Somente leitura; clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da programação. Serve de piso para a data da baixa: baixa anterior à emissão é recusada. Ordem padrão da grade. |
| Descrição da Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 | Nome da forma de pagamento, vindo do JOIN com FORMA_PAGAMENTO (calculado na consulta). |
| Total | `TOTAL` | DOUBLE PRECISION |  | Soma dos saldos dos títulos amarrados à programação, SUM(CP.SALDO) (calculado na consulta). |
| Baixa | `DATA_BAIXA` | TIMESTAMP |  | Data da baixa. Vazia significa programação em aberto; preenchida trava nova baixa e libera Alterar e Excluir. Não é digitada na grade: Baixar e Alterar pedem a data em janela à parte e gravam junto STATUS = `'Baixado'`; Excluir limpa a data e volta STATUS para `'Pendente'`, estornando a conta corrente. Linhas com data preenchida são desenhadas em azul. |

Colunas lidas pelo código mas não exibidas na grade: `STATUS` (`'Pendente'` / `'Baixado'`), `CONTA` e `DESCRICAO_CONTA` (conta corrente escolhida na abertura, usada no crédito e no texto das confirmações) e `TIPO_BAIXA`, vindo de FORMA_PAGAMENTO — só o valor `'Financeiro'` faz a baixa movimentar a conta corrente.

<a id="umov_contas_pagar_por_fornecedor"></a>

## `umov_contas_pagar_por_fornecedor` — Alteração dos Títulos do Fornecedor..:

Mesma lista de `PAGAR` da tela geral de contas a pagar, mas de um fornecedor só: ao abrir, a tela obriga a escolher o fornecedor na consulta de fornecedores, e o nome dele passa a compor o título da janela. Diferente da tela geral, o SELECT lê só `PAGAR`, sem LEFT JOIN, e por isso não há coluna de nome de fornecedor na grade — ele já está no título. Nenhuma célula é digitável: a grade é de seleção de linha inteira. A tela também não grava nada por conta própria — Alterar (ou duplo clique, ou Enter) abre `umov_contas_pagar_alteracao` para o título corrente e, na volta, refaz o filtro.

Três filtros em botões de rádio remontam o SELECT, por saldo: Exibir Somente os Pendentes (F7) traz `SALDO > 0`, Exibir Somente os Já Pagos (F8) traz `SALDO <= 0`, e Exibir todos os Títulos (F9) tira o filtro. A grade colore a linha: azul quando o saldo é zero, vermelho quando está vencida e ainda com saldo.

No rodapé há seis totalizadores, calculados em laço pelo próprio código a cada filtragem, somando as linhas trazidas. Não são campos de dataset e por isso não constam no TSV: Valor Títulos soma `VALOR`, Valor Pago soma `VALOR_PAGO`, Juros soma `JURO`, Desconto soma `DESCONTO`, Saldo soma `SALDO`, e Atraso soma o `SALDO` apenas das linhas com vencimento anterior a hoje.

### Grade `DBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla de duas letras do tipo de documento que originou o título, primeira parte da chave primária. Só leitura. Clicar no título ordena a grade por ela. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento de origem, parte da chave primária. Só leitura. Clicar no título ordena por ele. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela, parte da chave primária: uma linha por parcela. Só leitura. Clicar no título ordena por ela. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Só leitura. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. Só leitura. Ordem inicial da grade. Título com saldo e vencido é desenhado em vermelho, e seu saldo entra no totalizador Atraso do rodapé. Clicar no título ordena por ela. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original da parcela. Só leitura. Soma no totalizador Valor Títulos. Clicar no título ordena por ele. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 | Texto de identificação do título, gravado pela tela que o originou. Só leitura aqui — quem altera é a tela de alteração de título. Clicar no título desta coluna não muda a ordenação, porque o código só trata os outros nomes. |
| Atraso | `DIAS_ATRAZO` | INTEGER |  | Dias de atraso do título. Não é coluna de tabela: é campo calculado no Delphi, recalculado a cada linha. Com saldo zero, vale a diferença entre a data de pagamento e o vencimento; com saldo em aberto, vale a diferença entre agora e o vencimento, menos um dia. Resultado zero ou negativo deixa a célula em branco — ou seja, título em dia não mostra nada (calculado na consulta). |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Quanto ainda falta pagar da parcela. Só leitura. É o campo que define os três filtros: maior que zero é pendente, zero ou menos é pago. Saldo zero pinta a linha de azul. Soma no totalizador Saldo e, quando o título está vencido, também no Atraso. Clicar no título ordena por ele. |

Colunas do dataset que não aparecem na grade: `FORNECEDOR`, fixo pelo fornecedor escolhido na abertura e presente no título da janela; `SERIE`, parte da chave primária, repassada à tela de alteração; e `DATA_PAGAMENTO`, `VALOR_PAGO`, `JURO` e `DESCONTO`, mantidos pela tela de baixa — os três últimos alimentam os totalizadores do rodapé, e a data de pagamento entra no cálculo do atraso dos títulos já quitados.

<a id="umov_contas_pagar_confirmacao_recebimento_fatura"></a>

## `umov_contas_pagar_confirmacao_recebimento_fatura` — Confirmação do Recebimento da Fatura das Contas a Pagar...

Tela de marcação: registra que a fatura do fornecedor chegou fisicamente, antes de o título ser liberado para pagamento. Lê `PAGAR` com nome do fornecedor por LEFT JOIN com `FORNECEDOR` e mostra só títulos com saldo maior que zero. Não há cabeçalho e nenhuma célula é digitável — a grade é de seleção de linha inteira. O único campo que a tela grava é `CONFIRMACAO_RECEBIMENTO_FATURA`, e o botão Confirmar (ou duplo clique, ou Enter) alterna o valor da linha corrente, sempre com pergunta antes.

Três filtros em botões de rádio remontam o SELECT: Exibir Somente os Pendentes (F7) traz `CONFIRMACAO_RECEBIMENTO_FATURA = '1'`, Exibir Somente os Confirmados (F8) traz `= '2'`, e Exibir todos os Títulos (F9) tira o filtro de confirmação — todos os três exigem saldo maior que zero, então título já quitado nunca aparece. A grade colore a linha: azul quando a fatura está confirmada, vermelho quando está pendente e o título já venceu. Digitar número ou barra abre a caixa Digite o Número / Parcela do Título; digitar letra abre Informe o Nome do Fornecedor e procura por nome parcial.

### Grade `DBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. **·chave** | `DOCUMENTO` | VARCHAR(2) | 2 | Sigla de duas letras do tipo de documento que originou o título, primeira parte da chave primária. Só leitura. Clicar no título ordena a grade por ela. |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do documento de origem, parte da chave primária. Só leitura. É o campo casado com a parte antes da barra na busca por número. Clicar no título ordena por ele. |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela, parte da chave primária. A confirmação é por parcela, não pelo título inteiro. É a parte depois da barra na busca por número. Clicar no título ordena por ela. |
| Fornecedor **·chave** | `FORNECEDOR` | INTEGER |  | Código do fornecedor, parte da chave primária. Só leitura. Clicar no título ordena por ele. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 | Nome do fornecedor, trazido de `FORNECEDOR.NOME` pelo LEFT JOIN. Não é coluna de `PAGAR` (calculado na consulta). É a ordem inicial da grade, o campo procurado quando o usuário digita uma letra, e o nome que aparece na pergunta de confirmação. Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. Só leitura. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. Só leitura. Título ainda não confirmado e com vencimento anterior a hoje é desenhado em vermelho. Clicar no título ordena por ela. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original da parcela. Só leitura. Clicar no título ordena por ele. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Quanto ainda falta pagar. Só leitura. Não é filtro de exibição escolhido pelo usuário: os três SELECTs exigem saldo maior que zero, então a tela só lista título em aberto. Clicar no título ordena por ele. |

Coluna do dataset que não aparece na grade e é o objeto desta tela: `CONFIRMACAO_RECEBIMENTO_FATURA`, marcador de duas posições com os valores `'1'` = fatura ainda não recebida, o estado em que o título nasce nas telas que o geram, e `'2'` = recebimento da fatura confirmado. O botão Confirmar alterna entre os dois — em `'1'` pergunta "Confirma o Recebimento da Fatura do Fornecedor" e grava `'2'`; em `'2'` pergunta "Desejas Cancelar a Confirmação do Recebimento da Fatura do Fornecedor" e volta para `'1'`. Também ficam fora da grade `SERIE`, parte da chave primária, e `DATA_PAGAMENTO`, `VALOR_PAGO`, `JURO` e `DESCONTO`, mantidos pela tela de baixa.

<a id="umov_despesa_a_vista"></a>

## `umov_despesa_a_vista` — Despesas (A Vista)...

Lança uma despesa paga na hora, gravando na tabela `DESPESA` (chave `EMPRESA` + `NUMERO`). No AfterPost o programa gera o título em `PAGAR` já quitado — data de pagamento igual a hoje, valor pago igual ao valor, saldo zero — e a baixa correspondente em `IT_PAGAR` com a conta e a forma de pagamento informadas. Tela de registro único, sem grade nem abas. É a irmã de `umov_despesa_a_prazo`: as duas gravam na mesma tabela e se distinguem pela coluna `TIPO`, que aqui recebe sempre `'AVISTA'`. A diferença visível são os quatro campos a mais — Forma Pagto e Conta com suas descrições — que dizem por onde o dinheiro saiu.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da despesa dentro da empresa, gerado na gravação por MAX(NUMERO)+1. O botão do campo abre a consulta de despesas. Vira o NUMERO do título em PAGAR e entra na referência do título (DS <número>). Parte da chave primária (PK1). |
| Descrição da Despesa | `DESCRICAO` | VARCHAR(50) | 50 |  | Do que se trata a despesa. Obrigatória na gravação. Compõe a referência do título gerado em PAGAR. |
| Data Entrada | `EMISSAO` | TIMESTAMP |  |  | Data de entrada da despesa. Obrigatória e precisa ser data válida. Copiada para a EMISSAO do título em PAGAR e para a DATA da baixa em IT_PAGAR. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do cadastro de fornecedores ao sair do código. Campo desabilitado, não digitável (calculado na consulta). |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor da despesa. Obrigatório, é a primeira crítica da gravação. Ao sair do campo traz o nome, o plano de contas e a descrição do plano de contas do cadastro do fornecedor; fornecedor inexistente limpa os quatro. Se for trocado depois de gravado, o BeforePost reaponta PAGAR e IT_PAGAR para o novo código. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor da despesa. Não pode ficar zerado. Vai para VALOR e VALOR_PAGO do título em PAGAR, que nasce com saldo zero, e para o VALOR da baixa em IT_PAGAR. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta contábil da despesa. Obrigatório. Vem preenchido do cadastro do fornecedor, mas pode ser trocado; F3 abre o cadastro de planos de contas e o botão abre a consulta. A gravação só aceita plano de contas do tipo Analítico e recusa Sintético, avisando o tipo encontrado. Copiado para o título em PAGAR. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de planos de contas. Campo desabilitado, não digitável (calculado na consulta). |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título. Obrigatória e precisa ser data válida, mesmo sendo despesa à vista: vira o VENCIMENTO do título em PAGAR, que já nasce quitado. |
| Descrição da Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de formas de pagamento. Campo desabilitado, não digitável (calculado na consulta). |
| Forma Pagto | `FORMA_PAGAMENTO` | INTEGER |  |  | Como a despesa foi paga. Obrigatória — crítica exclusiva desta tela. Ao sair do campo traz a descrição; forma inexistente limpa código e descrição. F3 abre o cadastro de formas de pagamento. Se a forma escolhida tiver GERA_CHEQUE = `'2'`, o programa pede o número do cheque logo depois de gravar e recusa número já lançado, repetindo a pergunta até receber um livre; o cheque fica amarrado à baixa em IT_PAGAR. |
| Descrição da Conta Corrente / Caixa | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de contas. Campo desabilitado, não digitável (calculado na consulta). |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente ou caixa de onde o dinheiro saiu. Obrigatória — crítica exclusiva desta tela. Ao sair do campo traz a descrição; conta inexistente limpa código e descrição. Gravada na baixa em IT_PAGAR e usada para checar se o número de cheque já existe naquela conta. |
| Nº Documento | `DOCUMENTO` | VARCHAR(15) | 15 |  | Número da nota ou do recibo da despesa. Opcional. Quando preenchido, a referência do título em PAGAR sai como DS <número> Doc.: <documento> <descrição>; quando vazio, sai como DS <número> - <descrição>. Não confundir com o DOCUMENTO do título em PAGAR, que é fixo em DS. |
| Despesa de Viagem | `DESPESA_VIAGEM` | VARCHAR(1) | 1 |  | Marcador de despesa de viagem. Caixa marcada grava `'2'`, desmarcada grava `'1'`. O NewRecord inicia em `'1'`, ou seja, desmarcada. |

### Observações

- Como o título já nasce pago, qualquer regravação passa pela mesma trava da tela a prazo: havendo valor em `IT_PAGAR` para o documento, a alteração é recusada com o aviso de que a despesa já foi paga. A exclusão é recusada quando há cheques emitidos, e mais ainda quando o mesmo cheque quitou vários títulos.
- Os campos `TIPO` (fixo em `'AVISTA'`) e `LAST_FORNECEDOR` (fornecedor anterior, usado para reapontar os títulos) são gravados pelo programa e não aparecem na tela. O título gerado sai com `SITUACAO_TITULO` = 1.

<a id="umov_despesa_a_prazo"></a>

## `umov_despesa_a_prazo` — Despesas (A Prazo)...

Lança uma despesa a prazo na tabela `DESPESA` (chave `EMPRESA` + `NUMERO`) e, no AfterPost, gera automaticamente o título correspondente em `PAGAR`, com documento `DS`, série `1`, sequência `1` e situação 1 (em aberto). Tela de registro único, sem grade nem abas: todos os campos ficam no corpo do formulário. É a irmã de `umov_despesa_a_vista`; as duas gravam na mesma tabela e se distinguem pela coluna `TIPO`, que aqui recebe sempre `'APRAZO'` — a tela só abre registros com esse tipo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da despesa dentro da empresa, gerado na gravação por MAX(NUMERO)+1. O botão do campo abre a consulta de despesas. Vira o NUMERO do título em PAGAR e entra na referência do título (DS <número>). Parte da chave primária (PK1). |
| Descrição da Despesa | `DESCRICAO` | VARCHAR(50) | 50 |  | Do que se trata a despesa. Obrigatória na gravação. Compõe a referência do título gerado em PAGAR. |
| Data Entrada | `EMISSAO` | TIMESTAMP |  |  | Data de entrada da despesa. Obrigatória e precisa ser data válida. Copiada para a EMISSAO do título em PAGAR e usada no cálculo de DIAS do título (vencimento menos emissão). |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do cadastro de fornecedores ao sair do código. Campo desabilitado, não digitável (calculado na consulta). |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor da despesa. Obrigatório, é a primeira crítica da gravação. Ao sair do campo traz o nome, o plano de contas e a descrição do plano de contas do cadastro do fornecedor; fornecedor inexistente limpa os quatro. Se o fornecedor for trocado depois de gravado, o BeforePost atualiza PAGAR e IT_PAGAR com o novo código. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor da despesa. Não pode ficar zerado. Alimenta VALOR, SALDO e SALDO_LIQUIDO do título gerado em PAGAR. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta contábil da despesa. Obrigatório. Vem preenchido do cadastro do fornecedor, mas pode ser trocado; F3 abre o cadastro de planos de contas e o botão abre a consulta. A gravação só aceita plano de contas do tipo Analítico e recusa Sintético, avisando o tipo encontrado. Copiado para o título em PAGAR. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de planos de contas. Campo desabilitado, não digitável (calculado na consulta). |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data em que a despesa vence. Obrigatória e precisa ser data válida. É o que caracteriza a despesa a prazo: vira o VENCIMENTO do título em PAGAR, e a diferença para a emissão vira o campo DIAS do título. |
| Nº Documento | `DOCUMENTO` | VARCHAR(15) | 15 |  | Número da nota ou do recibo da despesa. Opcional. Quando preenchido, a referência do título em PAGAR sai como DS <número> Doc.: <documento> <descrição>; quando vazio, sai como DS <número> - <descrição>. Não confundir com o DOCUMENTO do título em PAGAR, que é fixo em DS. |
| Despesa de Viagem | `DESPESA_VIAGEM` | VARCHAR(1) | 1 |  | Marcador de despesa de viagem. Caixa marcada grava `'2'`, desmarcada grava `'1'`. O NewRecord inicia em `'1'`, ou seja, desmarcada. |

### Observações

- Depois que o título gerado começa a ser pago, a tela trava: se houver qualquer valor em `IT_PAGAR` para o documento, a gravação é recusada com o aviso de que a despesa já foi paga parcial ou integralmente. A exclusão também é recusada quando existem cheques emitidos para a despesa.
- Os campos `TIPO` (fixo em `'APRAZO'`) e `LAST_FORNECEDOR` (guarda o fornecedor anterior, para reapontar os títulos) são gravados pelo programa e não aparecem na tela.

<a id="umov_emprestimo"></a>

## `umov_emprestimo` — Empréstimos...

Registra um empréstimo tomado junto a um fornecedor (banco ou financeira), gravando na tabela `EMPRESTIMO` (chave `EMPRESA` + `NUMERO`). No AfterPost o programa apaga os títulos anteriores do empréstimo em `PAGAR` e regera a carteira inteira: para cada parcela cria **dois** títulos, um com o valor da parcela do principal e outro com o valor da parcela dos juros, ambos com documento `EM`, série `1`, situação 1 (em aberto) e vencimentos mês a mês a partir do Vencimento informado. Por isso a tela tem dois planos de contas — um para o principal e outro para os juros. Tela de registro único, sem grade nem abas.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do empréstimo dentro da empresa, gerado na gravação. O botão do campo abre a consulta de empréstimos. Vira o NUMERO dos títulos em PAGAR e entra na referência deles (EM <número>). Parte da chave primária (PK1). |
| Descrição da Despesa | `DESCRICAO` | VARCHAR(50) | 50 |  | Descrição do empréstimo. Obrigatória na gravação, onde é cobrada como Descrição do Empréstimo. Compõe a referência dos títulos gerados. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de contratação do empréstimo. Obrigatória e precisa ser data válida. Copiada para a EMISSAO de todos os títulos gerados e usada no cálculo de DIAS de cada um. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do cadastro de fornecedores ao sair do código. Campo desabilitado, não digitável (calculado na consulta). |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Quem emprestou — o banco ou a financeira, cadastrado como fornecedor. Obrigatório, é a primeira crítica da gravação. Ao sair do campo traz o nome do cadastro. Se for trocado depois de gravado, o BeforePost reaponta os títulos em PAGAR e IT_PAGAR para o novo código. |
| Parcelas | `QUANTIDADE_PARCELAS` | INTEGER |  |  | Em quantas vezes o empréstimo será pago. Não pode ficar zerado. É o divisor das duas parcelas calculadas e o número de voltas do laço que gera os títulos — cada volta cria dois títulos, então a carteira final tem o dobro deste número. |
| Plano Contas Emp. | `PLANO_CONTAS_EMPRESTIMO` | VARCHAR(20) | 20 |  | Conta contábil do principal. Obrigatório. A gravação só aceita plano de contas do tipo Analítico e recusa outro tipo, avisando qual encontrou. F3 abre o cadastro de planos de contas. Vai para os títulos de principal em PAGAR. |
| Descrição do Plano de Contas do Empréstimo | `DESCRICAO_PLANO_CONTAS_EMPREST` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de planos de contas. Campo desabilitado, não digitável (calculado na consulta). |
| Nº Documento | `NUMERO_DOCUMENTO` | VARCHAR(15) | 15 |  | Número do contrato ou do documento do empréstimo. Opcional. Quando preenchido, a referência dos títulos sai como EM <número> Doc.: <documento> <descrição>; quando vazio, EM <número> - <descrição>. Não confundir com o DOCUMENTO dos títulos em PAGAR, fixo em EM. |
| Conta | `CONTA` | INTEGER |  |  | Conta corrente em que o dinheiro entrou. Obrigatória na gravação. Ao sair do campo traz a descrição; conta inexistente limpa código e descrição. F3 abre o cadastro de contas correntes. Gravada em todos os títulos gerados. |
| Descrição Conta | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de contas correntes. Somente leitura e campo desabilitado, não digitável (calculado na consulta). |
| Valor Empréstimo | `VALOR_EMPRESTIMO` | DOUBLE PRECISION |  |  | Principal contratado, sem juros. Não pode ficar zerado. Ao sair do campo, o programa divide pelo número de parcelas e grava o resultado em Valor Parcela Emp.; com parcelas ou valor zerados, zera a parcela. |
| Valor Parcela Emp. | `VALOR_PARCELA_EMPRESTIMO` | DOUBLE PRECISION |  |  | Valor de cada parcela do principal, calculado como Valor Empréstimo dividido por Parcelas ao sair do campo de valor. Pode ser corrigido à mão, mas não pode ficar zerado. É o VALOR, o SALDO e o SALDO_LIQUIDO de cada título de principal gerado. |
| Valor Juros | `VALOR_JUROS` | DOUBLE PRECISION |  |  | Total de juros do empréstimo. Não pode ficar zerado. Ao sair do campo, o programa divide pelo número de parcelas e grava em Valor Parcela Juros. |
| Valor Parcela Juros | `VALOR_PARCELA_JUROS` | DOUBLE PRECISION |  |  | Valor de cada parcela de juros, calculado como Valor Juros dividido por Parcelas. Pode ser corrigido à mão, mas não pode ficar zerado. É o VALOR, o SALDO e o SALDO_LIQUIDO de cada título de juros gerado. |
| Plano Contas Juros | `PLANO_CONTAS_JUROS` | VARCHAR(20) | 20 |  | Conta contábil dos juros, separada da do principal para que a despesa financeira apareça em conta própria. Obrigatório e também precisa ser do tipo Analítico. Vai para os títulos de juros em PAGAR. |
| Descrição do Plano de Contas dos Juros | `DESCRICAO_PLANO_CONTAS_JUROS` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de planos de contas. Campo desabilitado, não digitável (calculado na consulta). |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Vencimento da primeira parcela. Obrigatório e precisa ser data válida. Serve de ponto de partida: o programa mantém o dia e avança um mês a cada parcela, virando o ano quando passa de dezembro. |

### Observações

- Regravar o empréstimo apaga e refaz toda a carteira de títulos em `PAGAR`. Por isso a tela trava assim que qualquer parcela começa a ser paga: havendo valor em `IT_PAGAR` para o documento, a gravação é recusada com o aviso de que o empréstimo já foi pago parcial ou integralmente. A exclusão é recusada quando existem cheques emitidos, e mais ainda quando um mesmo cheque quitou vários títulos.
- O campo `LAST_FORNECEDOR`, que guarda o fornecedor anterior para reapontar os títulos, é gravado pelo programa e não aparece na tela.

<a id="umov_receita"></a>

## `umov_receita` — Receitas...

Lançamento de receitas avulsas na tabela `RECEITA`, chave `EMPRESA` + `NUMERO`. Painel único, sem abas nem grade. Ao gravar, o `AfterPost` gera automaticamente o título correspondente no contas a receber: um registro em `RECEBER` com `DOCUMENTO = 'RT'`, `SERIE = '1'`, `SEQ = 1`, e um item em `IT_RECEBER` já quitado (`VALOR_RECEBIDO` igual ao valor, `SALDO = 0`, `SITUACAO_TITULO = 1`), com a referência `RT <número> - <descrição>`. Se a forma de pagamento for de tipo de baixa `Financeiro`, a conta corrente também é movimentada por `atualiza_conta` como débito.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da receita, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `RECEITA` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta receitas, F7 anterior, F8 próximo, F9 posiciona. |
| Descrição da Receita | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto livre que identifica a receita. Exigido no Gravar. Vai para a referência do título gerado em `RECEBER`, no formato `RT <número> - <descrição>`. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da receita. Ao entrar no campo, se estiver vazia ou inválida, o sistema preenche com a data de hoje. Precisa ser data válida no Gravar. Copiada para `RECEBER.EMISSAO`. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do JOIN com `CLIENTE`. Preenchido pelo Exit do código do cliente e pela consulta F4; não é digitado (calculado na consulta). |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da receita. Exigido no Gravar. F4 abre a consulta de clientes, F3 abre o cadastro de cliente. Ao sair do campo, o sistema busca o cliente e preenche o nome, o plano de contas e a descrição do plano de contas a partir do cadastro; se o código não existir, limpa os quatro campos. O valor gravado é copiado para `LAST_CLIENTE` no BeforePost, para que a exclusão e a checagem de títulos pagos encontrem o título mesmo depois de trocar o cliente. |
| Valor | `VALOR` | DOUBLE PRECISION |  |  | Valor da receita. Exigido no Gravar e precisa ser maior que zero. Vira o valor e o valor recebido do título em `RECEBER`. |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Código do plano de contas, digitado com a máscara `##.##.##.##.###`. Exigido no Gravar. O sistema recusa plano de contas cujo `TIPO` não seja `Analítico` — sintético não é aceito. Vem preenchido automaticamente do cadastro do cliente quando o código do cliente é informado. F4 consulta planos de contas, F3 abre o cadastro. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição do plano de contas, trazida do JOIN. Preenchida pelo Exit do plano de contas e pelo Exit do cliente; não é digitada (calculado na consulta). |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  |  | Data de vencimento do título gerado. Precisa ser data válida no Gravar. A diferença entre vencimento e emissão vira `RECEBER.DIAS`. |
| Descrição da Forma de Pagamento | `DESCRICAO_FORMA_PAGAMENTO` | VARCHAR(50) | 50 |  | Descrição da forma de pagamento, trazida do JOIN. Preenchida pelo Exit do código da forma de pagamento; não é digitada (calculado na consulta). |
| Forma Pagto | `FORMA_PAGAMENTO` | INTEGER |  |  | Código da forma de pagamento. Exigido no Gravar. Define o comportamento na baixa: se o cadastro tiver `TIPO_BAIXA = 'Financeiro'`, o valor é lançado como débito na conta corrente informada; nos demais tipos de baixa, só o título é gerado. F4 consulta formas de pagamento, F3 abre o cadastro. |
| Descrição da Conta Corrente / Caixa | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta corrente ou caixa, trazida do JOIN. Preenchida pelo Exit do código da conta; não é digitada (calculado na consulta). |
| Conta | `CONTA` | INTEGER |  |  | Código da conta corrente ou caixa que recebe o valor. Exigido no Gravar. Gravado no item de recebimento (`IT_RECEBER.CONTA`) e usado no lançamento em conta quando a forma de pagamento é financeira. F4 consulta contas, F3 abre o cadastro. |

<a id="umov_bordero_cheque_recebido"></a>

## `umov_bordero_cheque_recebido` — Emissão do Bordero dos Cheques Recebidos

Monta o borderô de cheques recebidos de um cliente. O cabeçalho grava em `BORDERO_CHEQUE_RECEBIDO` (chave `EMPRESA` + `NUMERO`), a grade de cima em `IT_BORDERO_CHEQUE_RECEBIDO` (os cheques entregues) e a de baixo em `IT_BORDERO_CHEQUE_DUPLICATA` (as duplicatas quitadas por eles, lidas de `RECEBER`). O NewRecord do cabeçalho grava `TIPO_BORDERO = 'Bordero'` e zera todos os totalizadores — é esse campo que separa esta tela da de renegociação, que grava `'Renegociação'` na mesma tabela. Cada cheque só entra se `CHEQUE_RECEBIDO.STATUS` for `'Pendente'`; cada duplicata só entra se sua situação de título for 1 ou 10, e a seleção por F4 lista as duplicatas na situação `CA` (em carteira).

#### Emissão do Bordero dos Cheques Recebidos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do borderô, chave do registro. Sequencial dentro dos borderôs de `TIPO_BORDERO = 'Bordero'`. |
| Data Emissão | `DATA_EMISSAO` | DATE |  |  | Data de emissão do borderô. O NewRecord já preenche com a data de hoje. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente dono dos cheques. Fixa o cliente cujos cheques e duplicatas o F4 das duas grades vai listar. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do cadastro pelo código (calculado na consulta). Os primeiros 50 caracteres são copiados para o Nome do Títular de cada cheque novo lançado na grade. |

#### Cheques Recebidos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total dos Cheques Lançados ==> | `TOTAL_CHEQUE_RECEBIDO` | DOUBLE PRECISION |  |  | Soma dos cheques da grade de cima. Somente leitura: é acumulado pelo sistema a cada cheque lançado ou alterado, nunca digitado. Nasce zerado no NewRecord. |

### Grade `dbcheque_recebido` — tabela IT_BORDERO_CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência do cheque dentro do borderô. Gerada pelo NewRecord do item como o maior SEQ do borderô mais um. |
| Banco | `BANCO` | INTEGER |  | Código do banco do cheque. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO` pelo código. Somente exibição (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do cheque. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do cheque. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número do cheque. Junto com o banco, agência e conta é o que amarra o item ao registro em `CHEQUE_RECEBIDO`. |
| Emissão | `EMISSAO` | DATE |  | Data de emissão do cheque. |
| Vencto | `VENCIMENTO` | DATE |  | Data para depósito do cheque (bom para). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque. Alterar aqui recalcula o Total dos Cheques Lançados pela diferença sobre o valor anterior. |
| Nome do Títular | `NOME_TITULAR` | VARCHAR(50) | 50 | Titular do cheque. Vem preenchido com os 50 primeiros caracteres do nome do cliente do cabeçalho, e pode ser trocado quando o cheque é de terceiro. |
| Status | `STATUS` | VARCHAR(30) | 30 | Situação do cheque em `CHEQUE_RECEBIDO`, copiada para o item. Valores vistos no sistema: `'Pendente'` (em carteira, único que a tela aceita lançar), `'Depósito'`, `'Devolvido'` e `'Renegociado'`. Cheque em qualquer situação diferente de `'Pendente'` é recusado com "O Cheque do Cliente se Encontra com o Status ... Impossível Efetuar o Lançamento do Cheque no Bordero." |

### Grade `dbduplicata` — tabela IT_BORDERO_CHEQUE_DUPLICATA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência da duplicata dentro do borderô. Gerada pelo NewRecord do item como o maior SEQ do borderô mais um. |
| Doc. | `DOCUMENTO_DUPLICATA` | VARCHAR(2) | 2 | Sigla do tipo de documento do título em `RECEBER`. |
| Série | `SERIE_DUPLICATA` | INTEGER |  | Série do título. |
| Número | `NUMERO_DUPLICATA` | INTEGER |  | Número do título a receber. |
| Parcela | `PARCELA_DUPLICATA` | INTEGER |  | Parcela do título. Doc., série, número e parcela juntos identificam a linha de `RECEBER` que o borderô quita. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, lida de `RECEBER`. Somente exibição. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título, lida de `RECEBER`. Somente exibição. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original do título, lido de `RECEBER`. Somente exibição. |
| Juros | `JUROS` | DOUBLE PRECISION |  | Juros negociados na quitação desta duplicata pelo borderô. |
| Desconto | `DESCONTO` | DOUBLE PRECISION |  | Desconto concedido na quitação desta duplicata pelo borderô. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto do título em `RECEBER`. É o que o borderô abate ao gravar; ao quitar, a situação do título passa para a configurada em `SITUACAO_TITULO_CHEQUE_RECEBIDO` dos parâmetros do sistema, e volta para 1 quando o item é desfeito. |

<a id="umov_bordero_renegociacao_cheque_sem_fundo"></a>

## `umov_bordero_renegociacao_cheque_sem_fundo` — Emissão do Bordero da Renegociação dos Cheques s/ Fundo

Troca cheques devolvidos por cheques novos, ou por duplicatas, no mesmo cliente. Grava na mesma tabela do borderô comum, `BORDERO_CHEQUE_RECEBIDO` (chave `EMPRESA` + `NUMERO`), mas com `TIPO_BORDERO = 'Renegociação'` gravado no NewRecord — é esse campo que separa as duas telas. São três grades: os cheques devolvidos que estão sendo renegociados (`IT_BORDERO_CHEQUE_SEM_FUNDO`), os cheques novos recebidos em troca (`IT_BORDERO_CHEQUE_RECEBIDO`) e as duplicatas usadas para cobrir a diferença (`IT_BORDERO_CHEQUE_DUPLICATA`, lidas de `RECEBER`). Ao concluir, o cheque devolvido passa a `STATUS = 'Renegociado'` em `CHEQUE_RECEBIDO`.

#### Emissão do Bordero da Renegociação dos Cheques s/ Fundo

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do borderô, chave do registro. Sequencial dentro dos borderôs de `TIPO_BORDERO = 'Renegociação'`. |
| Data Emissão | `DATA_EMISSAO` | DATE |  |  | Data de emissão do borderô de renegociação. O NewRecord já preenche com a data de hoje. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente dono dos cheques devolvidos. Fixa o cliente cujos cheques e duplicatas o F4 das grades vai listar. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente, trazido do cadastro pelo código (calculado na consulta). Os primeiros 50 caracteres viram o Nome do Títular dos cheques novos lançados. |
| Tipo de Renegociação | `TIPO_DEVOLUCAO` | VARCHAR(15) | 15 |  | Radiogroup com dois valores: `'Devolvido'` e `'Pendente'`. O NewRecord grava `'Devolvido'`. Define quais cheques o F4 da grade de cima lista (filtra `CHEQUE_RECEBIDO.STATUS` por este valor) e é também o status devolvido ao cheque quando o item é desfeito. O rótulo casado por geometria no levantamento saiu como "Data Emissão"; a legenda real do controle é " Tipo de Renegociação ". |

#### gbcheque_devolvido — Cheques Devolvidos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total dos Cheques Devolvidos ==> | `TOTAL_CHEQUE_SEM_FUNDO` | DOUBLE PRECISION |  |  | Soma dos cheques da grade de devolvidos. Somente leitura: acumulado pelo sistema a cada cheque lançado ou alterado. Nasce zerado no NewRecord. |

#### Cheques Recebidos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Total dos Cheques Recebidos ==> | `TOTAL_CHEQUE_RECEBIDO` | DOUBLE PRECISION |  |  | Soma dos cheques novos dados em troca. Somente leitura, acumulado pelo sistema. Nasce zerado no NewRecord. |
| Diferença ==> | `DIFERENCA_TOTAL_CHEQUE` | DOUBLE PRECISION |  |  | Total dos cheques recebidos menos total dos cheques devolvidos. Somente leitura, recalculado a cada lançamento nas duas grades. Diferença positiva sem nenhuma duplicata lançada é criticada na gravação: a sobra precisa estar amarrada a um título. |

### Grade `dbcheque_sem_fundo` — tabela IT_BORDERO_CHEQUE_SEM_FUNDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência do cheque devolvido dentro do borderô. |
| Banco | `BANCO` | INTEGER |  | Código do banco do cheque devolvido. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO` pelo código. Somente exibição (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do cheque devolvido. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do cheque devolvido. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número do cheque devolvido. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do cheque, lida de `CHEQUE_RECEBIDO`. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data para depósito do cheque, lida de `CHEQUE_RECEBIDO`. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque devolvido, lido de `CHEQUE_RECEBIDO`. Alterar recalcula o Total dos Cheques Devolvidos e a Diferença. |
| Nome do Títular | `TITULAR` | VARCHAR(50) | 50 | Titular do cheque devolvido, lido de `CHEQUE_RECEBIDO`. |
| Nº Bordero | `NUMERO_BORDERO` | INTEGER |  | Número do borderô original em que o cheque tinha sido recebido. Rastreia de onde veio o cheque que voltou. (calculado na consulta) |
| Status | `STATUS` | VARCHAR(30) | 30 | Situação do cheque em `CHEQUE_RECEBIDO`. Ao entrar no borderô o campo do item é limpo, e ao concluir a renegociação o cheque passa a `'Renegociado'`. Desfazer o item devolve o cheque ao valor do Tipo de Renegociação (`'Devolvido'` ou `'Pendente'`). |

### Grade `dbcheque_recebido` — tabela IT_BORDERO_CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência do cheque novo dentro do borderô. |
| Banco | `BANCO` | INTEGER |  | Código do banco do cheque dado em troca. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO` pelo código. Somente exibição (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do cheque novo. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do cheque novo. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número do cheque novo. |
| Emissão | `EMISSAO` | DATE |  | Data de emissão do cheque novo. |
| Vencto | `VENCIMENTO` | DATE |  | Data para depósito do cheque novo. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque novo. Alterar recalcula o Total dos Cheques Recebidos e a Diferença. |
| Nome do Títular | `NOME_TITULAR` | VARCHAR(50) | 50 | Titular do cheque novo. Vem preenchido com os 50 primeiros caracteres do nome do cliente do cabeçalho. |
| Status | `STATUS` | VARCHAR(30) | 30 | Situação do cheque novo em `CHEQUE_RECEBIDO`. O cheque criado por esta tela nasce `'Pendente'`, ou seja, volta para a carteira aguardando depósito. |

### Grade `dbduplicata` — tabela IT_BORDERO_CHEQUE_DUPLICATA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq. **·chave** | `SEQ` | INTEGER |  | Sequência da duplicata dentro do borderô. |
| Doc. | `DOCUMENTO_DUPLICATA` | VARCHAR(2) | 2 | Sigla do tipo de documento do título em `RECEBER`. |
| Série | `SERIE_DUPLICATA` | INTEGER |  | Série do título. |
| Número | `NUMERO_DUPLICATA` | INTEGER |  | Número do título a receber. |
| Parcela | `PARCELA_DUPLICATA` | INTEGER |  | Parcela do título. Doc., série, número e parcela juntos identificam a linha de `RECEBER`. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, lida de `RECEBER`. Somente exibição. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título, lida de `RECEBER`. Somente exibição. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original do título, lido de `RECEBER`. Somente exibição. |
| Juros | `JUROS` | DOUBLE PRECISION |  | Juros negociados na renegociação desta duplicata. |
| Desconto | `DESCONTO` | DOUBLE PRECISION |  | Desconto concedido na renegociação desta duplicata. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto do título em `RECEBER`, abatido pelo borderô. |
| Situação | `ABREVIACAO` | VARCHAR(3) | 3 | Abreviação da situação do título, lida de `SITUACAO_TITULO` pelo código gravado em `RECEBER`. `CA` é em carteira, situação em que o F4 lista as duplicatas selecionáveis. Somente exibição. |

<a id="umov_cheque_recebido_deposito"></a>

## `umov_cheque_recebido_deposito` — Emissão do Depósito dos Cheques Recebidos...

Monta o depósito bancário de um lote de cheques de terceiros. O cabeçalho grava `DEPOSITO_CHEQUE_RECEBIDO` (chave `EMPRESA` + `NUMERO`) — número, data, conta corrente de destino e total. A grade grava `IT_DEPOSITO_CHEQUE_RECEBIDO`, uma linha por cheque, e a linha é identificada só pela quádrupla banco + agência + conta + número do cheque: com ela o sistema acha o registro em `CHEQUE_RECEBIDO` e copia valor e titular. Nome do banco vem de `BANCO`, descrição da conta de `CONTA`, e a sigla do documento da duplicata vem de `IT_BORDERO_CHEQUE_DUPLICATA` por dois LEFT JOIN encadeados através do borderô.

Lançar um cheque na grade muda o `STATUS` dele em `CHEQUE_RECEBIDO` para `'Depósito'`; tirar da grade devolve a `'Pendente'`. Cheque com status `'Baixado'`, `'Devolvido'` ou `'Devolv\Canc'` é recusado com aviso, tanto na inclusão quanto na tentativa de excluir o item. Cheque já lançado em outro depósito também é recusado. Se o vencimento do cheque for posterior à data do depósito, a tela pede confirmação antes de aceitar. O total do cabeçalho não é digitado: é recalculado a cada item gravado e a cada item excluído.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do depósito, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela já traz `MAX(NUMERO) + 1` da empresa, e na gravação de registro novo é reatribuído por esse cálculo. Aceita digitação para localizar depósito existente; número inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F7, F8 e F9 navegam entre os números. Gravar só age com número maior que zero. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do depósito. Ao entrar no campo, se estiver vazio ou inválido, o sistema preenche com a data de hoje. Obrigatória: data inválida aborta o Gravar. É comparada com o vencimento de cada cheque lançado — cheque com vencimento posterior só entra se o usuário confirmar. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos cheques do depósito. Controle desabilitado, não é digitado: o sistema regrava o valor a cada item gravado, somando a diferença entre o valor novo e o anterior do item, e o abate de novo quando um item é excluído. |
| Conta Corrente | `CONTA` | INTEGER |  |  | Conta bancária da empresa em que o lote será depositado, do cadastro `CONTA`. Obrigatória: Gravar aborta com "Conta Corrente" em branco. F4 abre a consulta de contas correntes e F3 abre o cadastro de conta. Ao sair do campo o sistema busca a conta e preenche a descrição ao lado; se o código não existir, limpa os dois. |
| Descrição da Conta Corrente | `DESCRICAO_CONTA` | VARCHAR(50) | 50 |  | Descrição da conta, trazida de `CONTA.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Controle desabilitado, não é digitado, e não entra no INSERT nem no UPDATE do depósito (calculado na consulta). É o texto gravado no log do sistema junto com o código da conta. |

### Grade `RxDBGrid1` — tabela IT_DEPOSITO_CHEQUE_RECEBIDO

Uma linha por cheque do lote. Só quatro colunas são digitáveis — Banco, Agência, Nº Conta e Nº Cheque; o cursor pula Nome do Banco, e ao chegar em Valor ou Titular a grade já abre uma linha nova e volta ao começo. Delete na grade exclui o item, com confirmação. `SEQ` é o sequencial do item, calculado no NewRecord como `MAX(SEQ) + 1` do depósito, e não tem coluna na tela.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  | Código do banco sacado do cheque, do cadastro `BANCO`. Digitável. F4 abre a consulta de cheques recebidos já filtrada por `STATUS = 'Pendente'`, e o cheque escolhido preenche de uma vez banco, nome do banco, agência, conta, número do cheque, valor e titular. F3 abre o cadastro de bancos. Ao sair da coluna o sistema busca o nome do banco; código inexistente limpa banco e nome, e item gravado com banco inválido é apagado logo depois do post. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN e regravado pelo sistema ao informar o código. A grade pula esta coluna na digitação. Não entra no INSERT nem no UPDATE do item (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do emitente do cheque. Digitável. Parte da quádrupla que identifica o cheque em `CHEQUE_RECEBIDO`: ao sair da coluna o sistema refaz a busca e repreenche valor e titular. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do emitente do cheque. Digitável. Parte da quádrupla de identificação do cheque. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número impresso na folha do cheque. Digitável. Fecha a quádrupla de identificação: com banco, agência e conta o sistema acha o registro em `CHEQUE_RECEBIDO` e grava a chave dele em `CHEQUE_RECEBIDO` do item. Não achando o cheque, valor e titular são zerados e o vínculo fica vazio. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque, lido de `CHEQUE_RECEBIDO.VALOR` pelo LEFT JOIN e copiado pelo sistema quando o cheque é identificado. Não é digitado — a grade pula esta coluna. É o que alimenta o R$ Total do cabeçalho. |
| Razão Social / Nome do Títular | `TITULAR` | VARCHAR(50) | 50 | Nome do emitente do cheque, copiado de `CHEQUE_RECEBIDO.TITULAR` quando o cheque é identificado. Não é digitado — a grade pula esta coluna. Não entra no INSERT nem no UPDATE do item. |
| Doc | `DOCUMENTO_DUPLICATA` | VARCHAR(2) | 2 | Sigla de duas letras do tipo de documento da duplicata que o cheque paga, trazida de `IT_BORDERO_CHEQUE_DUPLICATA` pelo LEFT JOIN que passa por `IT_BORDERO_CHEQUE_RECEBIDO`. Vazio quando o cheque não está em nenhum borderô. Só exibição, não é gravada por esta tela. |

Colunas do item que o SELECT traz para uso interno e não aparecem na grade: `CHEQUE_RECEBIDO`, o número do lançamento do cheque, gravado pelo sistema e única ligação real com `CHEQUE_RECEBIDO`; e `LAST_BANCO`, `LAST_AGENCIA`, `LAST_NUMERO_CONTA`, `LAST_NUMERO_CHEQUE` e `LAST_VALOR`, que são cópias dos mesmos campos do cheque no SELECT e servem para o sistema saber qual cheque estava na linha antes da alteração — é por eles que o status do cheque anterior volta a `'Pendente'` e que o total do depósito é ajustado.

<a id="umov_cheque_recebido_liberacao_deposito"></a>

## `umov_cheque_recebido_liberacao_deposito` — Liberação do Depósito..:

Tela do acerto final do depósito de cheques: diz quais cheques do lote compensaram e quais voltaram. Ao abrir, obriga a escolher a conta corrente na consulta de contas, e a descrição dela compõe o título da janela. Não há cabeçalho digitável — só a grade, que parte de `DEPOSITO_CHEQUE_RECEBIDO` e desce por LEFT JOIN até `IT_DEPOSITO_CHEQUE_RECEBIDO`, `CHEQUE_RECEBIDO`, `CLIENTE`, `BANCO`, `CONTA` e `IT_BORDERO_CHEQUE_RECEBIDO`. As colunas de banco, agência, conta e número do cheque vêm do item do depósito; datas, valor e status vêm do cheque. Nenhuma célula é digitável: a grade é de seleção de linha inteira.

Baixar (ou duplo clique, ou Enter) abre a tela de baixa de duplicatas vinculadas (`umov_cheque_recebido_liberacao_deposito_baixa_titulo`) para distribuir o valor entre os títulos; confirmada a distribuição, pede a data em uma caixa rotulada Informe a Data do Cheque Compensado e grava `DATA_BAIXA` com `STATUS = 'Baixado'`. No BeforePost isso gera os itens de `IT_RECEBER`, atualiza saldo, juros, desconto e data de recebimento em `RECEBER`, calcula comissão de liquidação quando cabe, e lança na conta corrente do depósito. A forma de pagamento desses itens não é escolhida aqui: vem do parâmetro `FORMA_PAGAMENTO_CHEQUE_RECEBIDO` do sistema. Devolver pede Informe a Data do Cheque Devolvido, recusa data futura ou anterior à emissão, e grava `DATA_DEVOLUCAO` com `STATUS = 'Devolvido'`. Estornar desfaz um ou outro conforme o filtro em uso, sempre devolvendo `STATUS = 'Depósito'`.

Três filtros em botões de rádio remontam o SELECT: Exibir os Cheques em Depósito (F7) filtra `STATUS = 'Depósito'`, Exibir os Cheques Baixados (F8) filtra `STATUS = 'Baixado'`, e Exibir os Cheques Devolvidos (F9) traz `'Devolvido'` e `'Devolv\Canc'`. Estornar fica desabilitado no filtro Depósito. A grade colore a linha: azul quando há `DATA_BAIXA`, vermelho quando o cheque está vencido e ainda não baixado.

### Grade `dbcheque_recebido` — tabela CHEQUE_RECEBIDO, itens de IT_DEPOSITO_CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número | `NUMERO_LANCAMENTO` | INTEGER |  | Número do depósito, apelido de `DEPOSITO_CHEQUE_RECEBIDO.NUMERO` no SELECT — não é o número do cheque. Só leitura. Clicar no título ordena a grade por ele (calculado na consulta). |
| Banco | `BANCO` | INTEGER |  | Código do banco sacado do cheque, lido do item do depósito. Só leitura. Entra na referência gravada no log a cada baixa, devolução ou estorno. Clicar no título ordena por ele. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN. Não é coluna de `CHEQUE_RECEBIDO` (calculado na consulta). Clicar no título ordena por ele. |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do emitente, lida do item do depósito. Só leitura. Clicar no título ordena por ela. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do emitente, lida do item do depósito. Só leitura. Clicar no título ordena por ela. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número impresso na folha do cheque, lido do item do depósito. Só leitura. Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do cheque. Só leitura. Serve de piso para as duas datas pedidas pela tela: compensação e devolução anteriores a ela são recusadas. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data do bom para do cheque. Só leitura. Cheque não baixado e com vencimento anterior a hoje é desenhado em vermelho. Ordem inicial da grade e critério ao clicar no título. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor de face do cheque. Só leitura. É o teto do que pode ser distribuído entre as duplicatas e o valor que a mensagem de estorno anuncia como devolvido à conta corrente. Clicar no título ordena por ele. |
| Baixa | `DATA_BAIXA` | TIMESTAMP |  | Data em que o cheque compensou. É gravada pelo botão Baixar, com a data pedida como Informe a Data do Cheque Compensado. Vazio significa depósito ainda pendente; preenchido pinta a linha de azul e bloqueia tanto Baixar quanto Devolver. Estornar, no filtro Baixados, limpa esta data e devolve o status a `'Depósito'`. |

Colunas do dataset que não aparecem na grade mas comandam a tela: `STATUS`, gravado como `'Baixado'` na compensação, `'Devolvido'` na devolução e `'Depósito'` no estorno — os outros valores possíveis em `CHEQUE_RECEBIDO` são `'Pendente'` e `'Devolv\Canc'`; `DATA_DEVOLUCAO`, gravada pelo botão Devolver e limpa pelo Estornar quando o filtro é o de devolvidos; `NUMERO`, o número do lançamento do cheque, usado para achar os títulos em `RECEBER`; `CONTA` e `DESCRICAO_CONTA`, a conta do depósito, que aparece no título da janela e vai para `CONTA` dos itens de `IT_RECEBER`; `NUMERO_BORDERO`, trazido de `IT_BORDERO_CHEQUE_RECEBIDO`; `CLIENTE`, `NOME_CLIENTE`, `TITULAR` e `OBSERVACAO`.

<a id="umov_cheque_recebido_devolucao"></a>

## `umov_cheque_recebido_devolucao` — Cheques Recebidos.:

Tela de acerto dos cheques de terceiros que voltaram do banco, sempre de um cliente só: ao abrir, ela obriga a escolher o cliente na consulta de clientes, e o nome dele passa a compor o título da janela. A grade lista `CHEQUE_RECEBIDO` do cliente, com nome do banco vindo por LEFT JOIN com `BANCO` e nome do cliente por LEFT JOIN com `CLIENTE`. Nenhuma célula é digitável — a grade é de seleção de linha inteira.

O botão Baixar abre a tela de baixa de duplicatas vinculadas (`umov_cheque_recebido_liberacao_deposito_baixa_titulo`), onde o usuário distribui o valor entre os títulos; confirmada a distribuição, a tela pede a Data Baixa em uma caixa à parte e grava `DATA_PAGAMENTO` com `STATUS = 'Baixado'`. No BeforePost isso desdobra em muita coisa: gera os itens de `IT_RECEBER` a partir da tela temporária, atualiza saldo, juros, desconto e data de recebimento em `RECEBER`, calcula comissão de liquidação quando a forma de pagamento gera comissão, e lança o débito na conta corrente informada. A forma de pagamento usada nesses itens não é escolhida aqui: vem do parâmetro `FORMA_PAGAMENTO_BAIXA_CHEQUE` do sistema. O botão Estornar desfaz a baixa — limpa `DATA_PAGAMENTO`, devolve `STATUS = 'Devolv\Canc'` e desfaz os itens de `IT_RECEBER` do cheque.

Três filtros em botões de rádio remontam o SELECT: Exibir os Cheques Devolvidos (F7) filtra `STATUS = 'Devolvido'`, Exibir os Cheques Baixados (F8) filtra `STATUS = 'Baixado'`, e Exibir todos os Cheques Recebidos (F9) traz `'Baixado'`, `'Devolvido'` e `'Devolv\Canc'` juntos — nunca os pendentes ou em depósito. Estornar só fica habilitado com o filtro Baixados. A grade colore a linha: azul quando há `DATA_PAGAMENTO`, vermelho quando o cheque está vencido e ainda não baixado.

#### Duplicatas

Painel de rodapé com o cliente e o borderô do cheque, mais a conta corrente do acerto. Os três primeiros controles estão desabilitados e marcados como somente-leitura no DFM, e não têm DataSource ligado — ficam sempre em branco na tela; os nomes de coluna abaixo são os `DataField` declarados.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente dono dos cheques. Somente leitura e desabilitado; sem DataSource, não exibe valor. O cliente efetivo da tela é o escolhido na consulta da abertura, e o nome dele aparece no título da janela (calculado na consulta). |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente dono dos cheques. Somente leitura e desabilitado; sem DataSource, não exibe valor. O código efetivo é o escolhido na abertura e entra no filtro `CH.CLIENTE` do SELECT (calculado na consulta). |
| Borderô | `NUMERO` | INTEGER |  |  | Número do borderô em que o cheque foi entregue. Somente leitura e desabilitado; sem DataSource, não exibe valor (calculado na consulta). |

Ainda neste painel há dois controles que não são ligados a dataset e por isso não constam no TSV: Conta Corrente (`edtconta`) e Descrição da Conta Corrente (`edtdescricao_conta`), ambos `TComboEdit` comuns. A conta é obrigatória para baixar — o Baixar aborta com "Conta corrente" em branco — e é ela que recebe o débito do valor pago e que vai para `CONTA` dos itens de `IT_RECEBER` e de `RECEBER`. A descrição é preenchida pelo sistema ao informar o código e fica desabilitada.

### Grade `dbcheque` — tabela CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do lançamento do cheque recebido, chave primária junto com a empresa. Só leitura. É por ele que a baixa acha os itens de `RECEBER` e de `IT_RECEBER` ligados ao cheque. Clicar no título ordena a grade por ele. (calculado na consulta) |
| Banco | `BANCO` | INTEGER |  | Código do banco sacado do cheque. Só leitura. Clicar no título ordena por ele. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN. Não é coluna de `CHEQUE_RECEBIDO` (calculado na consulta). Clicar no título ordena por ele. |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do emitente do cheque. Só leitura. Clicar no título ordena por ela. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do emitente do cheque. Só leitura. Clicar no título ordena por ela. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número impresso na folha do cheque. Só leitura. Vai para o histórico da conta corrente na baixa, como "Depósito Ref. Cheque Nº X". Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do cheque. Só leitura. Serve de piso para a data da baixa: data anterior a ela é recusada com aviso. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data do bom para do cheque. Só leitura. Cheque ainda não baixado e com vencimento anterior a hoje é desenhado em vermelho. Ordem inicial da grade e critério ao clicar no título. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor de face do cheque. Só leitura. É o teto do que pode ser distribuído entre as duplicatas na tela de baixa. Clicar no título ordena por ele. |
| Baixa | `DATA_BAIXA` | TIMESTAMP |  | Coluna exibida sob o título Baixa. Atenção: é `DATA_BAIXA`, mas quem manda no fluxo desta tela é `DATA_PAGAMENTO` — é ela que o botão Baixar grava, que o Estornar limpa, que decide a cor azul da linha e que bloqueia a baixa repetida. As duas são colunas distintas de `CHEQUE_RECEBIDO` e podem divergir: `DATA_BAIXA` é gravada pelas telas de depósito e liberação. Clicar no título desta coluna não muda a ordenação, porque o código só trata os outros nomes. |

Colunas do dataset que não aparecem na grade: `STATUS`, que a tela grava como `'Baixado'` na baixa e `'Devolv\Canc'` no estorno, e cujos outros valores possíveis em `CHEQUE_RECEBIDO` são `'Pendente'`, `'Depósito'` e `'Devolvido'`; `DATA_PAGAMENTO`, a data efetiva da baixa; `DATA_DEVOLUCAO`; `CLIENTE` e `NOME_CLIENTE`, fixos pelo cliente escolhido na abertura; `TITULAR`, que entra na referência do lançamento da conta corrente; e `OBSERVACAO`.

<a id="umov_cheque_cobranca"></a>

## `umov_cheque_cobranca` — Razão de Cheques em Cobrança

Tela de consulta apenas, sem Gravar nem Excluir: mostra, para um cliente, os cheques dele que ainda estão em cobrança e as duplicatas que esses cheques deveriam quitar. O cliente é informado nos campos soltos do topo (código e nome, não ligados a dataset). A grade de cima lê `IT_BORDERO_CHEQUE_RECEBIDO` unida a `BORDERO_CHEQUE_RECEBIDO`, `BANCO` e `CHEQUE_RECEBIDO`, trazendo só os cheques com `CHEQUE_RECEBIDO.STATUS` igual a `'Pendente'` ou `'Depósito'`. A grade de baixo lê `RECEBER` unida a `SITUACAO_TITULO`, trazendo só os títulos com saldo maior que zero e situação de abreviação `CH` (em cheque). Os totalizadores e o Saldo do rodapé são campos soltos calculados na abertura das consultas.

### Grade `dbcheque_recebido` — tabela IT_BORDERO_CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  | Código do banco do cheque. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO` pelo código. Somente exibição (calculado na consulta). |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do cheque. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do cheque. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número do cheque. É por ele e pelo número do cheque recebido que a consulta amarra o item ao registro em `CHEQUE_RECEBIDO`. |
| Emissão | `EMISSAO` | DATE |  | Data de emissão do cheque. |
| Vencto | `VENCIMENTO` | DATE |  | Data para depósito do cheque (bom para). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque. A abertura da consulta soma esta coluna no Total dos Cheques Lançados, e o Saldo do rodapé é esse total menos o saldo das duplicatas. |
| Nome do Títular | `NOME_TITULAR` | VARCHAR(50) | 50 | Titular do cheque, que pode ser o próprio cliente ou um terceiro. |
| Status | `STATUS` | VARCHAR(30) | 30 | Situação do cheque em `CHEQUE_RECEBIDO`. Aqui só aparecem duas: `'Pendente'` (em carteira) e `'Depósito'` (enviado ao banco). As demais situações do sistema, `'Devolvido'` e `'Renegociado'`, são excluídas pelo filtro da consulta. |

### Grade `dbduplicata` — tabela RECEBER

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Doc. | `DOCUMENTO_DUPLICATA` | VARCHAR(2) | 2 | Sigla do tipo de documento do título, vinda de `RECEBER.DOCUMENTO` com apelido. (calculado na consulta) |
| Série | `SERIE_DUPLICATA` | INTEGER |  | Série do título, vinda de `RECEBER.SERIE`. (calculado na consulta) |
| Número | `NUMERO_DUPLICATA` | INTEGER |  | Número do título, vindo de `RECEBER.NUMERO`. (calculado na consulta) |
| Parcela | `PARCELA_DUPLICATA` | INTEGER |  | Parcela do título, vinda de `RECEBER.SEQ`. (calculado na consulta) |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título. |
| Vencto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do título. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor original do título. |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo em aberto do título. Só entram na tela os títulos com saldo maior que zero; a soma desta coluna é confrontada com o total dos cheques para produzir o Saldo do rodapé. |
| Situação | `ABREVIACAO` | VARCHAR(3) | 3 | Abreviação da situação do título, lida de `SITUACAO_TITULO`. A consulta fixa `CH`, ou seja, título em cobrança por cheque — é o que define o que a tela lista. |

<a id="umov_cheque_emitido_baixa"></a>

## `umov_cheque_emitido_baixa` — Cheques Emitidos.:

Tela de baixa dos cheques emitidos pela empresa, gravados em `CHEQUE_EMITIDO`. Não há cabeçalho digitável: ao abrir, a tela obriga a escolher uma conta corrente na consulta de contas, e a partir daí só exibe a grade dos cheques daquela conta. A descrição da conta vem por LEFT JOIN com `CONTA` e entra no título da janela. Os botões Baixar, Alterar e Excluir gravam apenas `DATA_BAIXA` e `STATUS` do registro corrente; nenhuma célula da grade é digitável. Cada baixa e cada estorno lançam movimento na conta corrente pela rotina `atualiza_conta`.

Três filtros de exibição, em botões de rádio fora da grade, remontam o SELECT: Exibir Somente os Cheques Pendentes (F7) filtra `STATUS = 'Pendente'`, Exibir Somente os Cheques Baixados (F8) filtra `STATUS = 'Baixado'`, e Exibir todos os Cheques Emitidos (F9) tira o filtro de status. A grade colore a linha: azul quando o cheque já tem `DATA_BAIXA`, vermelho quando está pendente e vencido.

### Grade `DBGrid1` — tabela CHEQUE_EMITIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do lançamento do cheque emitido, chave primária junto com a empresa. Vem da tela que emitiu o cheque; aqui é só leitura. Clicar no título ordena a grade por este campo. É a chave usada para achar o fornecedor em `IT_PAGAR` na hora de lançar o movimento na conta. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número impresso na folha do cheque. Só leitura. É o texto que vai para o histórico da conta corrente: "Emissão Cheque Nº X" na baixa e "Estorno Cheque Nº X" no estorno. Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do cheque. Só leitura. Serve de piso para a data da baixa: informar data de baixa anterior à emissão é recusado com aviso. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento do cheque, a data em que ele pode ser apresentado. Só leitura. Cheque sem baixa e com vencimento anterior a hoje é desenhado em vermelho na grade. Ordem inicial da grade e critério de ordenação ao clicar no título. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do cheque. Só leitura. É o valor lançado na conta corrente: crédito na baixa e estorno de crédito na exclusão da baixa. Clicar no título ordena por ele. |
| Baixa | `DATA_BAIXA` | TIMESTAMP |  | Data em que o cheque foi compensado. É o único campo que a tela grava, e não por digitação na grade: o botão Baixar (ou duplo clique, ou Enter) abre uma caixa pedindo Data Baixa. Vazio significa cheque pendente; preenchido significa baixado e a linha passa a azul. Baixar um cheque que já tem data é recusado; Alterar e Excluir só funcionam com data preenchida. Excluir (Delete) limpa a data e devolve o status a Pendente, estornando o valor na conta corrente. Clicar no título ordena por ela. |
| Observação | `OBSERVACAO` | VARCHAR(50) | 50 | Observação livre do cheque, herdada do lançamento de origem. Só leitura nesta tela. |

Coluna do dataset que não aparece na grade: `STATUS` (VARCHAR na `CHEQUE_EMITIDO`), gravado pela tela junto com a data. Assume `'Pendente'` enquanto o cheque não foi compensado e `'Baixado'` depois da baixa; é o valor comparado nos filtros F7 e F8. `CONTA` e `DESCRICAO_CONTA` também ficam fora da grade: a conta é a escolhida na abertura da tela e aparece no título da janela.

<a id="ucad_gasto_fixo_mensal"></a>

## `ucad_gasto_fixo_mensal` — Cadastro do Gasto Fixo Mensal...

Grava o gasto fixo mensal na tabela GASTO_FIXO_MENSAL, por empresa. A tela tem um bloco único de campos e, embaixo, uma grade somente leitura que mostra quais planos de conta estão amarrados a este gasto — a amarração é feita no cadastro do plano de contas (PLANO_CONTAS.GASTO_FIXO_MENSAL), não aqui. O tipo de fornecedor vem por código, com a descrição buscada em TIPO_FORNECEDOR.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do gasto fixo. Proposto pelo sistema como MAX(CADASTRO)+1 da empresa e regravado com esse mesmo valor no momento da inclusão. Digitar um código existente carrega aquele registro; F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Gasto Fixo Mensal | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. É o texto usado como referência no log do sistema. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (gasto fora de uso), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| Dia Vencto | `DIA_VENCIMENTO` | INTEGER |  |  | Dia do mês em que o gasto vence. Obrigatório no Gravar e precisa ser diferente de zero. |
| Rateia Gasto Mensal | `RATEIA_GASTO_MENSAL` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (o gasto é rateado), desmarcado grava `'1'`. NewRecord inicia em `'1'`. |
| Tipo Fornecedor | `TIPO_FORNECEDOR` | INTEGER |  |  | Obrigatório no Gravar. Código do tipo de fornecedor. Ao sair do campo busca em TIPO_FORNECEDOR e preenche a descrição ao lado; código inexistente limpa os dois. F4 abre a consulta de tipos de fornecedor. |
| Descrição do Tipo do Fornecedor | `DESCRICAO_TIPO_FORNECEDOR` | VARCHAR(50) | 50 |  | Descrição do tipo de fornecedor, trazida do JOIN e reescrita pelo Exit do código. Não é digitada. |
| `cbtipo_gasto_mensal` | `TIPO_GASTO_MENSAL` | VARCHAR(15) | 15 |  | Combo Tipo Gasto Mensal. Grava o texto escolhido, sem tradução: `'Custo Fixo'` ou `'Custo Variável'` (o EnableValues está desligado, então a lista Values do DFM é ignorada). NewRecord inicia em `'Custo Fixo'`. Campo não presente n |

### Grade `dbplano_contas` — tabela PLANO_CONTAS

Grade somente leitura: lista os planos de conta cujo campo GASTO_FIXO_MENSAL aponta para este cadastro. F3 sobre a grade abre o cadastro de plano de contas e recarrega a lista ao voltar.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 | Código do plano de contas ligado a este gasto fixo. É PLANO_CONTAS.CADASTRO renomeado no SELECT. Somente leitura. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 | Descrição do plano de contas. É PLANO_CONTAS.DESCRICAO renomeada no SELECT. Somente leitura. |

<a id="umov_orcamento_gasto_fixo_mensal"></a>

## `umov_orcamento_gasto_fixo_mensal` — Orçamento dos Gastos Fixos Mensais...

Monta o orçamento anual de custos: um registro por ano em `ORCAMENTO_GASTO_FIXO_MENSAL` e uma linha por gasto fixo em `IT_ORCAMENTO_GASTO_FIXO_MENSAL`, com os doze meses previstos. A tela não edita o banco diretamente — trabalha sobre um ClientDataSet em memória (`tbtemp`), carregado dos itens do ano. Por isso todos os campos aparecem sem tabela: são colunas do dataset temporário, espelho de `IT_ORCAMENTO_GASTO_FIXO_MENSAL`. Ao gravar, os itens do ano são apagados e regravados a partir da memória.

O arranjo é um gasto por vez: em cima o gasto fixo e sua descrição, no painel da esquerda janeiro a junho e no da direita julho a dezembro, cada mês com duas caixas lado a lado — Previsto, digitável, e Realizado, em verde e desabilitado. À direita dos painéis ficam o total previsto e o total realizado, e abaixo o tipo do gasto e o dia de vencimento, ambos trazidos do cadastro.

O Realizado não é orçado: vem da soma dos títulos de `PAGAR` do ano, agrupados por mês do vencimento, dos planos de contas amarrados àquele gasto fixo. É recalculado a cada gravação da linha em memória. F4 sobre um mês previsto (e também a simples digitação do valor) abre a tela de detalhamento daquele mês, que mostra os títulos que formaram o realizado e recolhe o texto gravado em `DETALHAMENTO_GASTO_<MÊS>`.

O botão Excluir pergunta em dois passos: Sim apaga o orçamento inteiro do ano, Não apaga só o gasto fixo em foco. O botão Novo Ano copia os gastos do ano em tela para o ano seguinte, criando o cabeçalho se ainda não existir e pulando os gastos já lançados lá.

Controle do DFM sem linha no TSV: `edtnumero`, sob o rótulo "Ano", que não é campo de banco — é o ano do orçamento (`NUMERO`), usado como parâmetro de todas as consultas. Ao sair dele, a tela recarrega o ano e monta o dataset temporário; F4 abre a consulta e F7/F8 navegam entre os anos. É obrigatório na gravação.

#### Orçamento dos Gastos Fixos Mensais...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Gasto Fixo / Variável | `GASTO_FIXO_MENSAL` | INTEGER |  |  | Código do gasto fixo ou variável sendo orçado. O botão abre a consulta de gastos fixos mensais e F3 abre o cadastro. Código inexistente é rejeitado e limpa a descrição. Ao sair, posiciona na linha do gasto se ela já existir em memória, ou cria uma nova, e traz descrição, tipo e dia de vencimento (calculado na consulta). |
| `edtdescricao_gasto_fixo_mensal` | `DESCRICAO_GASTO_FIXO_MENSAL` | VARCHAR(50) | 50 |  | Descrição do gasto, sem rótulo próprio ao lado do código. Copiada do cadastro do gasto fixo, não digitada (calculado na consulta). |
| Total ==> | `TOTAL_PREVISTO` | DOUBLE PRECISION |  |  | Soma dos doze meses previstos. Recalculada na gravação da linha; o controle é desabilitado (calculado na consulta). |
| `edttotal_realizado` | `TOTAL_REALIZADO` | DOUBLE PRECISION |  |  | Soma dos doze meses realizados, ao lado do total previsto, em verde. Recalculada a partir dos títulos a pagar; controle desabilitado (calculado na consulta). |
| Tipo Gasto Mensal | `TIPO_GASTO_MENSAL` | VARCHAR(15) | 15 |  | Classificação do gasto, trazida do cadastro: `Custo Fixo` ou `Custo Variável`. Somente leitura. Não é regravado no item — a gravação pula esta coluna (calculado na consulta). |
| Dia Vencto | `DIA_VENCIMENTO` | INTEGER |  |  | Dia do mês em que o gasto costuma vencer, trazido do cadastro do gasto fixo. Somente leitura (calculado na consulta). |

#### Panel1 — Janeiro a Junho

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Janeiro | `JANEIRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para janeiro. Digitável; formatado com duas casas. Digitar o valor ou pressionar F4 abre o detalhamento do mês, cujo texto vai para `DETALHAMENTO_GASTO_JANEIRO`. Zerado no item novo (calculado na consulta). |
| `edtjaneiro_realizado` | `JANEIRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de janeiro, em verde ao lado do previsto. Soma dos títulos a pagar com vencimento no mês, nos planos de contas do gasto. Controle desabilitado (calculado na consulta). |
| Fevereiro | `FEVEREIRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para fevereiro. Mesmo comportamento de janeiro, com detalhamento em `DETALHAMENTO_GASTO_FEVEREIRO` (calculado na consulta). |
| `edtfevereiro_ralizado` | `FEVEREIRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de fevereiro, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| `edtmarco_previsto` | `MARCO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para março, sob o rótulo "Março" do painel. Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtmarco_realizado` | `MARCO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de março, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| `edtabril_previsto` | `ABRIL_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para abril, sob o rótulo "Abril". Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtabril_realizado` | `ABRIL_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de abril, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| `edtmaio_previsto` | `MAIO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para maio, sob o rótulo "Maio". Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtmaio_realizado` | `MAIO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de maio, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| `edtjunho_previsto` | `JUNHO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para junho, sob o rótulo "Junho". Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtjunho_realizado` | `JUNHO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de junho, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |

#### Panel2 — Julho a Dezembro

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtjulho_previsto` | `JULHO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para julho, sob o rótulo "Julho". Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtjulho_realizado` | `JULHO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de julho, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| `edtagosto_previsto` | `AGOSTO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para agosto, sob o rótulo "Agosto". Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtagosto_realizado` | `AGOSTO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de agosto, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| Setembro | `SETEMBRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para setembro. Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtsetembro_realizado` | `SETEMBRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de setembro, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| Outubro | `OUTUBRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para outubro. Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtoutubro_realizado` | `OUTUBRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de outubro, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| Novembro | `NOVEMBRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para novembro. Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtnovembro_realizado` | `NOVEMBRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de novembro, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |
| Dezembro | `DEZEMBRO_PREVISTO` | DOUBLE PRECISION |  |  | Valor orçado para dezembro. Digitável, com detalhamento próprio do mês (calculado na consulta). |
| `edtdezembro_realizado` | `DEZEMBRO_REALIZADO` | DOUBLE PRECISION |  |  | Realizado de dezembro, calculado dos títulos a pagar. Controle desabilitado (calculado na consulta). |

---

# Módulo 5 — Produção

16 telas.

<a id="umov_pedido_venda_finalizar_itens"></a>

## `umov_pedido_venda_finalizar_itens` — Finalização do Pedido de Venda

Janela modal chamada por `umov_pedido_venda_finalizar` para coletar o número de série dos itens antes de dar o pedido como finalizado. Lista os itens de `IT_PEDIDO_VENDA` do pedido recebido em `vnumero_pedido`, mas só os que precisam de série: o SELECT junta `MATERIA_PRIMA` e `GRUPO_PRODUTO` e filtra `GRUPO_PRODUTO.PREENCHER_NUMERO_SERIE_PEDIDO = '2'`. A tela é uma grade só, com uma única coluna editável.

### Grade `dbpedidos` — tabela IT_PEDIDO_VENDA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro | `PRODUTO` | INTEGER |  | Código do produto do item, aponta para `MATERIA_PRIMA.CADASTRO`. Somente leitura. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, vinda de `MATERIA_PRIMA`. Somente leitura. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, vinda de `MATERIA_PRIMA`. Somente leitura. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade pedida do item. Somente leitura. |
| Número de Série | `NUMERO_SERIE` | VARCHAR(50) | 50 | Único campo digitável da tela, e o motivo dela existir. O foco já entra nesta coluna e o ColEnter não deixa sair dela. Gravar exige série preenchida em todas as linhas: uma linha em branco aborta com "Existem Produto(s) sem Número de Série informado". Ao gravar, um UPDATE direto grava a série no item e ainda a concatena no fim de `COMPLEMENTO_PRODUTO`, separada por um espaço, para que ela apareça na descrição do item na nota. Só depois disso a tela marca `vpedido_finalizado = True` e devolve o controle para a tela chamadora. |

Colunas do SELECT sem controle na tela: `NUMERO` e `SEQ`, usadas para localizar o item no UPDATE.

<a id="umov_baixa_estoque_materia_prima"></a>

## `umov_baixa_estoque_materia_prima` — Baixa do Estoque dos Materiais

Tela multifunção de baixa de estoque de material. O grupo "Tipo da Baixa do Estoque dos Materiais" tem quatro caixas de marcação que trocam o painel visível: `Individual ( F6 )`, `Consulta de Materiais ( F7 )`, `Lote \ Setor ( F8 )` e `Encerramento da Produção ( F9 )`. A baixa é efetivada por `baixa_estoque_materia_prima`, com uma requisição de material gerada em `REQUISICAO_MATERIAL` e `IT_REQUISICAO_MATERIAL`, e abatimento de `QUANTIDADE_BAIXADA` em `IT_LOTE_MATERIAL_EMPENHADO`.

Os dois painéis com grade — Lote \ Setor e Encerramento da Produção — usam a mesma consulta `qrmateria_prima` sobre `IT_LOTE_MATERIAL_EMPENHADO` unida a `MATERIA_PRIMA`, e por isso as duas grades têm colunas idênticas. Os campos de digitação dos quatro painéis (material, data, funcionário, lote, setor, quantidade) são controles não ligados a dataset e não aparecem neste catálogo.

### Grade `dbmateria_prima_setor` — painel Lote \ Setor, consulta sobre IT_LOTE_MATERIAL_EMPENHADO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material empenhado no lote e setor informados no painel. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO`. (calculado na consulta) |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida do cadastro. |
| Estoque | `ESTOQUE` | DOUBLE PRECISION |  | Saldo físico do material, lido de `MATERIA_PRIMA.SALDO`. É o primeiro teto da baixa: quantidade a baixar acima dele dispara a crítica de estoque insuficiente. (calculado na consulta) |
| Saldo Baixa | `SALDO` | DOUBLE PRECISION |  | Saldo ainda empenhado e não baixado, calculado na consulta como quantidade empenhada menos quantidade já baixada. É o segundo teto: quantidade acima dele também é criticada. |
| Qtde. a Baixar | `QUANTIDADE_MATERIAL` | DOUBLE PRECISION |  | Quantidade que será efetivamente baixada. Calculada na consulta como a quantidade informada no painel multiplicada pela quantidade unitária empenhada do material, e conferida contra Estoque e Saldo Baixa antes de gravar. É o valor que vai para `IT_REQUISICAO_MATERIAL.QUANTIDADE`. |

### Grade `dbmateria_prima_encerramento` — painel Encerramento da Produção, mesma consulta sobre IT_LOTE_MATERIAL_EMPENHADO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material empenhado no lote que está sendo encerrado. |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO`. (calculado na consulta) |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, trazida do cadastro. |
| Estoque | `ESTOQUE` | DOUBLE PRECISION |  | Saldo físico do material, lido de `MATERIA_PRIMA.SALDO`. Teto da baixa, igual ao painel de setor. (calculado na consulta) |
| Saldo Baixa | `SALDO` | DOUBLE PRECISION |  | Saldo ainda empenhado e não baixado no lote, calculado na consulta como quantidade empenhada menos quantidade já baixada. |
| Qtde. a Baixar | `QUANTIDADE_MATERIAL` | DOUBLE PRECISION |  | Quantidade a baixar no encerramento do lote, calculada na consulta a partir da quantidade do lote e da quantidade unitária empenhada. O histórico gravado aqui é "Baixa do Estoque dos Materiais <lote> - Encerramento". |

<a id="ucad_setor_producao"></a>

## `ucad_setor_producao` — Cadastro dos Setores de Produção...

Cadastro dos setores de produção na tabela `SETOR`, chave `EMPRESA` + `CADASTRO`. Painel único, quatro campos. Ao contrário das outras telas de cadastro do sistema, o código não é sequencial: é uma sigla de até três caracteres digitada pelo usuário. Os dois marcadores definem o papel do setor no controle de estoque de matéria-prima.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(3) | 3 |  | Sigla do setor, chave do registro, digitada pelo usuário — não há geração automática nesta tela. Exigido no Gravar — vazio aborta com "Código do Setor". F4 abre a consulta de setores. |
| Descrição do Setor | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do setor. Exigido no Gravar — vazio aborta com "Descrição do Setor". |
| Almoxarifado | `TIPO_ALMOXARIFADO` | VARCHAR(1) | 1 |  | Marca o setor como almoxarifado. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (não é almoxarifado). Com `'2'`, o setor entra na consulta de estoque de matéria-prima empenhada como almoxarifado; com valor diferente de `'2'`, entra como setor consumidor. É esse marcador que separa o que está guardado no almoxarifado do que já foi distribuído para a produção. |
| Consumo de Materiais | `CONSUMO_MATERIAIS` | VARCHAR(1) | 1 |  | Marca o setor como consumidor de materiais. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'`. O cadastro de desenho de produção copia este valor do setor escolhido e, quando ele é `'2'`, desabilita ali a opção de baixar materiais do almoxarifado — o consumo já é do setor. |

<a id="ucad_centro_custo"></a>

## `ucad_centro_custo` — Cadastro do Centro de Custo...

Cadastro dos centros de custo em `CENTRO_CUSTO` (cabeçalho, chave `EMPRESA` + `CADASTRO`), com a grade de funcionários rateados em `IT_CENTRO_CUSTO` (chave `EMPRESA` + `CENTRO_CUSTO` + `SEQ`). O custo médio da hora no cabeçalho não é digitado: é recalculado a cada linha gravada na grade.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do centro de custo. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. Ao sair do campo a grade de funcionários é recarregada para o centro escolhido. |
| Descrição do Centro de Custo | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do centro de custo. Exigido no Gravar: vazio aborta com "Descrição do Centro de Custo". |
| Custo Médio Hora | `CUSTO_MEDIO_MAO_OBRA` | DOUBLE PRECISION |  |  | Custo médio da hora de mão de obra do centro. Não é digitado: a cada linha gravada na grade o sistema regrava este campo com a média do custo hora dos funcionários lançados a 100 por cento mais a soma rateada dos lançados com percentual diferente de 100. Se não houver nenhum funcionário a 100 por cento, fica só a parcela rateada. |
| Inclusão / Alteração | `DATA_INCLUSAO_ALTERACAO` | TIMESTAMP |  |  | Data de inclusão ou da última alteração do centro de custo. É digitada e validada no Gravar: data inválida ou em branco aborta com "Data da Inclusão / Alteração não Informado ou Inválido". |

### Grade `RxDBGrid1` — tabela IT_CENTRO_CUSTO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Funcionário | `FUNCIONARIO` | INTEGER |  | Código do funcionário alocado ao centro de custo. Ao sair da coluna o sistema busca o funcionário e preenche nome e custo hora; se o código não existir, limpa as três colunas e a linha é descartada no AfterPost. |
| Nome do Funcionário | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 | Nome do funcionário, trazido de `FUNCIONARIO.NOME` ao validar o código. Não é digitado (calculado na consulta). |
| Custo p/ Hora | `CUSTO_HORA_MENSAL` | DOUBLE PRECISION |  | Custo mensal da hora do funcionário. Vem preenchido de `FUNCIONARIO.CUSTO_HORA_MENSAL` ao informar o código. Valor menor ou igual a zero faz a linha ser descartada no AfterPost com "Custo da Hora Mensal do Funcionário não Informado". |
| % Custo Hora | `PERCENTUAL_CUSTO_HORA_MENSAL` | DOUBLE PRECISION |  | Percentual do custo do funcionário atribuído a este centro. Valor menor ou igual a zero faz a linha ser descartada no AfterPost com "% Perc. Custo Hora do Funcionário não Informado". O valor `100.00` tem sentido próprio no cálculo: linhas com 100 entram na média simples do custo médio; linhas com percentual diferente entram como rateio somado por fora. |

`EMPRESA`, `CENTRO_CUSTO` e `SEQ` são preenchidos pelo sistema no NewRecord da grade — `SEQ` recebe o maior `SEQ` do mesmo centro mais um — e não têm coluna visível. `EMPRESA` do cabeçalho também é gravada no NewRecord.

<a id="ucad_maquina"></a>

## `ucad_maquina` — Cadastro das Máquinas de Produção...

Grava as máquinas de produção na tabela MAQUINA, por empresa. Cada máquina é amarrada a um centro de custo (descrição vinda por LEFT JOIN com CENTRO_CUSTO) e tem, no grupo Horas Disponíveis, a capacidade diária de cada dia da semana. As horas são texto no formato HH:MM, com máscara `##:##` e validação por `strtotime`.

### Campos

#### Cadastro das Máquinas de Produção...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da máquina. Proposto como MAX(CADASTRO)+1 da empresa e regravado com esse valor na inclusão; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição da Máquina | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. Serve de referência no log do sistema. |
| Centro Custo | `CENTRO_CUSTO` | INTEGER |  |  | Obrigatório no Gravar. Código do centro de custo a que a máquina pertence. Ao sair do campo busca em CENTRO_CUSTO e preenche a descrição ao lado; código inexistente limpa os dois. F4 abre a consulta, F3 abre o cadastro de centros de custo. |
| Descrição do Centro de Custo | `DESCRICAO_CENTRO_CUSTO` | VARCHAR(50) | 50 |  | Nome do centro de custo, trazido do JOIN com CENTRO_CUSTO e reescrito pelo Exit do código. Não é digitado. |

#### Horas Disponíveis

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Segunda | `HORA_DISPONIVEL_SEGUNDA` | VARCHAR(5) | 5 |  | Horas de capacidade da máquina na segunda-feira, no formato HH:MM. NewRecord inicia em `'00:00'`, que na prática significa máquina indisponível nesse dia. Valor inválido é recusado na hora pelo OnSetText e o campo volta vazio; o Gravar repete a checagem e aborta. |
| Terça | `HORA_DISPONIVEL_TERCA` | VARCHAR(5) | 5 |  | Horas disponíveis na terça-feira, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Quarta | `HORA_DISPONIVEL_QUARTA` | VARCHAR(5) | 5 |  | Horas disponíveis na quarta-feira, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Quinta | `HORA_DISPONIVEL_QUINTA` | VARCHAR(5) | 5 |  | Horas disponíveis na quinta-feira, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Sexta | `HORA_DISPONIVEL_SEXTA` | VARCHAR(5) | 5 |  | Horas disponíveis na sexta-feira, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Sábado | `HORA_DISPONIVEL_SABADO` | VARCHAR(5) | 5 |  | Horas disponíveis no sábado, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Domingo | `HORA_DISPONIVEL_DOMINGO` | VARCHAR(5) | 5 |  | Horas disponíveis no domingo, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |

<a id="ucad_ocorrencia_producao"></a>

## `ucad_ocorrencia_producao` — Cadastro das Ocorrências da Produção...

Cadastro das ocorrências (paradas, apontamentos e eventos) que podem ser lançadas na produção, gravado na tabela `OCORRENCIA_PRODUCAO`. Tela de dois campos, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da ocorrência. Sugerido pelo sistema como `MAX(CADASTRO) + 1` da tabela OCORRENCIA_PRODUCAO dentro da empresa corrente. Se o código digitado não existir, a tela pergunta se grava com ele ou com o próximo da sequência. F4 abre a consulta, F7 anterior, F8 próximo, F9 procura. |
| Descrição da Ocorrência da Produção | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto da ocorrência, que é o que aparece nas consultas e nos apontamentos. Obrigatório: o Gravar recusa a gravação com o campo vazio. |

<a id="umov_programacao_lote"></a>

## `umov_programacao_lote` — Programação de Lote...

Abre e mantém o lote de produção. O cabeçalho é gravado em `LOTE` e as abas trazem o que pendura nele: a planilha de custo por máquina (`IT_LOTE_PLANILHA_CUSTO_MAQUINA`, preenchida só no encerramento), a lista de desenhos da referência (`IT_LOTE_DESENHO`), os dados de importação, os materiais empenhados (`IT_LOTE_MATERIAL_EMPENHADO`) e a base da composição do produto (`IT_LOTE_BASE_COMPOSICAO`).

O tipo do lote muda a cara da tela: em `'Pré-Lote'` o sistema esconde Previsão Entrega, Início Produção, Nº Inicial, Nº Final, Baixado, Empenhado e Faturado, e desabilita o botão Empenhar. A aba de importação só aparece quando o primeiro caractere do TRIBUTO do produto é diferente de `'0'`. Ao gravar, o sistema atualiza o último lote da referência, regrava a lista de desenhos e, na primeira vez, carrega a base da composição a partir de `PRODUTO_COMPOSICAO`.

### Campos

#### Programação de Lote...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do lote, só exibida (TDBText). Assume `'Pendente'` (gravado no NewRecord, lote em produção) e `'Encerrado'` (gravado pela tela de encerramento, quando o custo do lote é apurado). |
| `edtstatus_material` | `STATUS_EMPENHO_MATERIAL` | VARCHAR(15) | 15 |  | Situação do empenho de material do lote, só exibida. Nasce `'Pendente'` no NewRecord; os itens passam a `'Empenhado'` conforme o material é empenhado. Há trechos comentados que também tratavam o valor `'Baixado'`. |
| Nº Lote **·chave** | `NUMERO` | INTEGER |  |  | Número do lote. Sequencial MAX(NUMERO) + 1 por empresa; o botão do campo abre a consulta de lotes, F7 volta, F8 avança, F9 procura. Chave primária PK1 de LOTE. |
| Produto | `PRODUTO` | INTEGER |  |  | Produto que o lote vai produzir. F4 abre a consulta, F3 abre o cadastro. Recusa item com TIPO_PRODUTO = `'1'` (só Material) e item com INATIVO = `'2'`; em lote manual, recusa também produto com GERA_PROGRAMACAO_LOTE_AUTO = `'2'` e produto que não tenha GERA_PROGRAMACAO_LOTE = `'2'`. Ao aceitar, traz descrição, referência, TIPO_CONTROLE_LOTE_PRODUCAO e GERA_PROGRAMACAO_LOTE_AUTO. Obrigatório para gravar. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de MATERIA_PRIMA junto com o código. Não é digitada (calculado na consulta). |
| Quantidade | `QUANTIDADE` | INTEGER |  |  | Quantidade a produzir. Obrigatória para gravar. Ao sair do campo, se este for o lote mais novo da referência, o sistema recalcula Nº Inicial e Nº Final; também multiplica a quantidade por unidade de cada material empenhado. |
| Empenhado | `EMPENHADA` | INTEGER |  |  | Quantidade do lote já empenhada em pedidos. Zerada no NewRecord e mantida pelo sistema. Só aparece quando o tipo é Lote. |
| Previsão Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  |  | Data prevista de entrega do lote. Exigida no gravar somente quando o tipo do lote é `'Lote'`; em Pré-Lote o campo é escondido. |
| Faturado | `FATURADO` | INTEGER |  |  | Quantidade do lote já faturada. Zerada no NewRecord e mantida pelo sistema. Só aparece quando o tipo é Lote. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do lote. Ao entrar no campo, se estiver vazia ou inválida vira a data de hoje. Data válida é exigida para gravar. |
| Nº Inicial | `NUMERO_INICIAL` | INTEGER |  |  | Primeiro número de peça do lote: último Nº Final gravado para a mesma referência mais 1. Calculado ao sair da Quantidade e só quando este é o lote mais novo da referência. Obrigatório no gravar quando o tipo é `'Lote'`. |
| Nº Final | `NUMERO_FINAL` | INTEGER |  |  | Último número de peça do lote: Nº Inicial mais a quantidade menos 1. Calculado junto com o Nº Inicial e replicado para ULTIMO_NUMERO da referência na gravação. Obrigatório no gravar quando o tipo é `'Lote'`. |
| Observações | `OBSERVACAO` | BLOB |  |  | Observações livres do lote. O texto é convertido para maiúsculas conforme é digitado. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência do produto, trazida junto com o produto. Obrigatória para gravar e não pode ser trocada depois que o lote já tem referência gravada. É por ela que o sistema monta a lista de desenhos e controla o último lote e o último número emitido. |
| Início Produção | `DATA_INICIO_PRODUCAO` | TIMESTAMP |  |  | Data prevista de início da produção do lote. Só aparece quando o tipo é Lote. |
| Baixar Matéria Prima por Lote \ Setor | `BAIXA_MATERIA_PRIMA_ENTRADA` | VARCHAR(1) | 1 |  | Define como a matéria-prima é baixada. Marcado grava `'2'` (baixa por lote e setor, valor padrão do NewRecord), desmarcado grava `'1'`. Com `'2'`, o sistema passa a exigir a quantidade por unidade em cada material empenhado. Somente leitura na tela. |
| Baixado | `BAIXADO` | INTEGER |  |  | Quantidade do lote já baixada na produção. Zerada no NewRecord e mantida pela baixa de estoque. Somente leitura; é a trava do encerramento do lote. Só aparece quando o tipo é Lote. |
| Tipo do Lote | `TIPO_LOTE` | VARCHAR(10) | 10 |  | Radiogroup com dois valores gravados literalmente: `'Lote'` (padrão do NewRecord, produção de verdade, com previsão de entrega, numeração de peças, empenho e faturamento) e `'Pré-Lote'` (só a programação; os campos de entrega, numeração, baixa, empenho e faturamento somem e o botão Empenhar é desabilitado). |
| Movimentar Estoque dos Produtos | `MOVIMENTA_ESTOQUE_PRODUTO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (padrão do NewRecord), desmarcado grava `'1'`. Com `'2'`, a baixa de materiais do encerramento dá entrada no estoque do produto acabado; com `'1'`, o lote não movimenta o estoque do produto. |
| Produção de Peças | `PRODUCAO_PECAS` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'` (padrão do NewRecord). Com `'2'`, a baixa do encerramento também atualiza a quantidade empenhada do lote junto com a baixada, e a impressão pula a checagem dos itens da composição do produto. |

#### Planilha de Custo do Lote

Aba inteira somente-leitura: os seis campos são apurados pela tela de encerramento do lote a partir de `CONTROLE_PRODUCAO_DIARIA` e zerados no estorno.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Data Inicial Prod. | `DATA_INICIAL_PRODUCAO` | TIMESTAMP |  |  | Primeiro dia com apontamento de produção do lote. Somente leitura, preenchida no encerramento. |
| Data Final Prod. | `DATA_FINAL_PRODUCAO` | TIMESTAMP |  |  | Último dia com apontamento de produção do lote. Somente leitura, preenchida no encerramento. |
| Nº Dias Úteis | `DIAS_UTEIS_PRODUCAO` | INTEGER |  |  | Quantidade de dias distintos com apontamento de produção. Somente leitura, calculada no encerramento. |
| Total Horas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(10) | 10 |  | Total de horas produtivas do lote no formato HH:MM. Somente leitura, calculado no encerramento. |
| Total M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  |  | Custo total da mão de obra do lote. Somente leitura, calculado no encerramento. |
| M. O. Unitária | `MEDIA_MAO_OBRA` | DOUBLE PRECISION |  |  | Custo de mão de obra por peça: total da mão de obra dividido pela quantidade do lote. Somente leitura, calculado no encerramento. |

#### Tipo de Lote

Aba de importação, visível apenas quando o primeiro caractere do TRIBUTO do produto é diferente de `'0'`. O radiogroup `rgtipo_importacao` não está ligado a campo: o BeforePost converte a escolha em `TIPO_IMPORTACAO`, gravando `''` quando nada foi escolhido, `'Direta'` para Produção Própria ou Importação Direta e `'Via Trading'` para Importação Via Trading. Com a aba visível, escolher um tipo é obrigatório; com Via Trading, os quatro campos abaixo passam a ser exigidos.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Fornecedor | `FORNECEDOR_IMPORTACAO` | INTEGER |  |  | Código do fornecedor da importação. F4 abre a consulta de fornecedores, F3 abre o cadastro. Obrigatório quando o tipo é Importação Via Trading. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR_IMPORTACAO` | VARCHAR(70) | 70 |  | Nome do fornecedor, trazido de FORNECEDOR no Exit do código. Somente leitura (calculado na consulta). |
| Valor ICMS | `VALOR_ICMS_IMPORTACAO` | DOUBLE PRECISION |  |  | Valor do ICMS da nota de importação. Obrigatório e maior que zero quando o tipo é Importação Via Trading. |
| B.C. ICMS | `BASE_ICMS_IMPORTACAO` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da nota de importação. Obrigatória e maior que zero quando o tipo é Importação Via Trading. |
| N.F. Compra | `NUMERO_NOTA_IMPORTACAO` | VARCHAR(10) | 10 |  | Número da nota fiscal de compra da importação. Obrigatório quando o tipo é Importação Via Trading. |

#### Materiais Empenhados

Campos de digitação de um item da grade de materiais empenhados. Só ficam habilitados enquanto um item novo está sendo incluído (botão Novo); fora disso a linha é apenas exibida. Os botões Novo, Gravar, Excluir e Limpar comandam o item.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  |  | Código do material a empenhar. F4 abre a consulta. Só aceita cadastro diferente de 1, ativo (INATIVO = `'1'`), com TIPO_MATERIA_PRIMA = `'2'` (Material) e com classificação fiscal quando o tipo de item é de 0 a 6; ao aceitar traz descrição, unidade de consumo e o preço de custo como valor unitário. Gravar o item exige ainda que o material tenha CONTROLA_ESTOQUE_POR_EMPENHO = `'2'`, senão o lançamento é recusado. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição do material, trazida de MATERIA_PRIMA. Não é digitada. |
| Qtd Total | `QUANTIDADE` | DOUBLE PRECISION |  |  | Quantidade total do material no lote. Somente leitura: é a quantidade por unidade multiplicada pela quantidade do lote. Precisa ser maior que zero, múltipla da quantidade base e nunca menor que a quantidade já baixada. Ao gravar, a diferença em relação ao valor anterior é somada ao ESTOQUE_EMPENHADO do material. |
| UN Consumo | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Unidade de consumo do material, trazida de MATERIA_PRIMA. Não é digitada. |
| Descrição do Desenho | `DESCRICAO_DESENHO` | VARCHAR(50) | 50 |  | Descrição do desenho ao qual o material está amarrado, trazida de DESENHO (calculado na consulta). |
| Desenho | `DESENHO` | VARCHAR(15) | 15 |  | Código do desenho ao qual o material pertence. F4 abre a consulta de desenhos de produção. Fica bloqueado quando o produto tem TIPO_CONTROLE_LOTE_PRODUCAO = `'Produto'`, ou seja, quando o lote não é controlado por desenho. Junto com o material, é a chave que o sistema usa para detectar item repetido e somar quantidades em vez de duplicar a linha. |
| Qtde Base | `QUANTIDADE_UNIDADE` | DOUBLE PRECISION |  |  | Quantidade do material por unidade do produto. Obrigatória quando o lote baixa matéria-prima por lote e setor (BAIXA_MATERIA_PRIMA_ENTRADA = `'2'`) e não pode ser maior que a quantidade total. |

#### Base da Composição

Composição do produto copiada para o lote em `IT_LOTE_BASE_COMPOSICAO`, gravada automaticamente na primeira gravação a partir de `PRODUTO_COMPOSICAO` e mantida aqui pelos botões Novo, Gravar, Excluir e Limpar. Nem a grade nem os campos desta aba têm DataSource atribuído no DFM, e o código não atribui nenhum em tempo de execução: as rotinas trabalham direto no dataset `qrit_lote_base_composicao`.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Material | `MATERIA_PRIMA` | INTEGER |  |  | Código do material da composição do lote. F4 abre a consulta. Cadastro inexistente ou igual a 1 é recusado no Gravar (calculado na consulta). |
| Descrição do Material | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 |  | Descrição do material, trazida de MATERIA_PRIMA. Não é digitada (calculado na consulta). |
| UN Cons. | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Unidade de consumo do material, trazida de MATERIA_PRIMA. Não é digitada (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Quantidade do material por unidade do produto. Precisa ser maior que zero para gravar o item (calculado na consulta). |
| Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  |  | Custo unitário do material, copiado da composição do produto (calculado na consulta). |
| Total Custo | `TOTAL` | DOUBLE PRECISION |  |  | Quantidade vezes custo unitário, calculado no próprio SELECT do item (calculado na consulta). |

### Grade `dbmaquina` — tabela IT_LOTE_PLANILHA_CUSTO_MAQUINA

Somente exibição nesta tela: as linhas são geradas pelo encerramento do lote, que agrupa os apontamentos de `CONTROLE_PRODUCAO_DIARIA` por máquina, e apagadas pelo estorno.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `MAQUINA` | INTEGER |  | Código da máquina que trabalhou no lote. Faz parte da chave primária da tabela (PK2). |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 | Descrição da máquina, vinda do JOIN com MAQUINA (calculado na consulta). |
| Horas Unit. | `TEMPO_MEDIO_PRODUCAO` | VARCHAR(10) | 10 | Tempo unitário de produção na máquina, no formato de horas. |
| Total Horas | `TOTAL_HORAS` | VARCHAR(10) | 10 | Total de horas da máquina no lote, no formato HH:MM. |
| Custo M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  | Custo da mão de obra da máquina no lote. |

### Grade `dbdesenho` — tabela IT_LOTE_DESENHO

Lista dos desenhos da referência do produto. É montada sozinha na gravação do lote e refeita pelo botão Atualizar Desenhos, que apaga e regrava as linhas. Desenhos desenhados em azul são os que baixam estoque de material pelo almoxarifado.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `DESENHO` | VARCHAR(15) | 15 | Código do desenho da referência. Faz parte da chave primária da tabela (PK2). |
| Descrição do Desenho | `DESCRICAO_DESENHO` | VARCHAR(50) | 50 | Descrição do desenho, vinda do JOIN com DESENHO (calculado na consulta). |
| Nº Revisão | `REVISAO` | INTEGER |  | Número da revisão do desenho no momento em que a linha foi criada. |
| Data Revisão | `DATA_REVISAO` | TIMESTAMP |  | Data da revisão do desenho no momento em que a linha foi criada. |
| Setor | `SETOR` | VARCHAR(3) | 3 | Setor do desenho, vindo do cadastro DESENHO. |

A tabela guarda ainda `STATUS_BAIXA_ESTOQ_MAT_DESENHO`, que não é exibido na grade: nasce `'Pendente'` quando o desenho tem BAIXA_MATERIAIS_ALMOXARIFADO = `'2'` e `'Não Controla'` nos demais casos.

### Grade `dbmaterial_empenhado` — tabela IT_LOTE_MATERIAL_EMPENHADO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Setor | `SETOR` | VARCHAR(3) | 3 | Setor que vai consumir o material, herdado do desenho escolhido. |
| Descrição do Setor | `DESCRICAO_SETOR` | VARCHAR(50) | 50 | Descrição do setor, vinda do JOIN com SETOR (calculado na consulta). |
| Desenho | `DESENHO` | VARCHAR(15) | 15 | Desenho ao qual o material está amarrado. Junto com o material forma a chave lógica do item. |
| Descrição do Desenho | `DESCRICAO_DESENHO` | VARCHAR(50) | 50 | Descrição do desenho, vinda do JOIN com DESENHO (calculado na consulta). |
| Materia Prima | `MATERIA_PRIMA` | INTEGER |  | Código do material empenhado. |
| Descrição da Materia Prima | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, vinda de MATERIA_PRIMA. |
| UN C | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, vinda de MATERIA_PRIMA. |
| Qtde Base | `QUANTIDADE_UNIDADE` | DOUBLE PRECISION |  | Quantidade do material por unidade do produto. |
| Valor Base | `VALOR_BASE` | DOUBLE PRECISION |  | Valor unitário do material vezes a quantidade base, calculado no SELECT. Sua soma alimenta o campo Total Base da aba (calculado na consulta). |
| Qtde Total | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade total empenhada: quantidade base vezes a quantidade do lote. A variação deste campo é o que soma ou devolve ESTOQUE_EMPENHADO no cadastro do material. |
| Valor Total | `VALOR_TOTAL` | DOUBLE PRECISION |  | Valor unitário vezes a quantidade total, calculado no SELECT. Sua soma alimenta o campo Total Lote da aba (calculado na consulta). |
| Qtde Baixada | `QUANTIDADE_BAIXADA` | DOUBLE PRECISION |  | Quantidade do material já baixada do estoque. Nasce zerada no NewRecord e é mantida pela baixa de estoque; a quantidade empenhada nunca pode ficar abaixo dela. |
| Valor Baixado | `VALOR_BAIXADO` | DOUBLE PRECISION |  | Valor unitário vezes a quantidade baixada, calculado no SELECT. Sua soma alimenta o campo Total Baixado da aba (calculado na consulta). |
| Saldo | `SALDO` | DOUBLE PRECISION |  | Saldo a baixar: quantidade total empenhada menos a quantidade já baixada. É um campo calculado do próprio dataset (fkCalculated), preenchido no OnCalcFields, e não a coluna SALDO do cadastro de material. |

A tabela guarda ainda, sem exibir na grade, `VALOR_UNITARIO` (preço de custo do material no momento do empenho), `STATUS_EMPENHO_MATERIAL` (passa a `'Empenhado'` quando o material controla estoque por empenho), `SEPARADO` (nasce `'1'`) e `CONSUMO_MATERIAIS` (gravado `'1'` no item novo).

### Grade `dbbase_composicao` — tabela IT_LOTE_BASE_COMPOSICAO

Mesma origem dos campos da aba Base da Composição, e com a mesma ressalva: a grade não tem DataSource atribuído no DFM nem em tempo de execução.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material da composição do lote, copiado de PRODUTO_COMPOSICAO na primeira gravação (calculado na consulta). |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, vinda do JOIN com MATERIA_PRIMA (calculado na consulta). |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, vinda de MATERIA_PRIMA (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material por unidade do produto (calculado na consulta). |
| Valor | `PRECO_CUSTO` | DOUBLE PRECISION |  | Custo unitário do material, copiado da composição do produto (calculado na consulta). |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes custo unitário, calculado no SELECT do item (calculado na consulta). |
| R$ Venda | `PRECO_VENDA` | DOUBLE PRECISION |  | Preço de venda do material, copiado da composição do produto. Não aparece nos campos de digitação da aba, só na grade (calculado na consulta). |

<a id="umov_programacao_lote_encerramento"></a>

## `umov_programacao_lote_encerramento` — Encerramento do Lote...

Encerra ou estorna um lote de produção já programado. Trabalha sobre o mesmo registro de `LOTE` da tela de programação, mas aqui só o número do lote e a marca de custo incompleto são acessíveis: todo o resto é somente leitura. Encerrar apura o custo do lote a partir de `CONTROLE_PRODUCAO_DIARIA` (datas, dias úteis, horas produtivas e mão de obra) e grava o rateio por máquina em `IT_LOTE_PLANILHA_CUSTO_MAQUINA`, que é a grade da tela. Estornar limpa esses campos, volta o lote para pendente e apaga as linhas de máquina.

Encerrar só é aceito quando a quantidade baixada é igual à quantidade do lote e o lote ainda não está encerrado; estornar só é aceito com o lote encerrado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do lote, só exibida (TDBText). Assume `'Pendente'` (lote em produção, único estado em que Encerrar funciona) e `'Encerrado'` (custo apurado, único estado em que Estornar funciona). Encerrar grava `'Encerrado'`; Estornar devolve `'Pendente'`. |
| Nº Lote **·chave** | `NUMERO` | INTEGER |  |  | Número do lote a encerrar. Digitar o número carrega o lote na hora e avisa se ele não existe; o botão do campo abre a consulta de lotes para encerramento. Único campo digitável da tela. Chave primária PK1 de LOTE. |
| Produto | `PRODUTO` | INTEGER |  |  | Produto do lote. Somente leitura, vem da programação do lote. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto do lote. Somente leitura (calculado na consulta). |
| Quantidade | `QUANTIDADE` | INTEGER |  |  | Quantidade programada do lote. Somente leitura. É o divisor da mão de obra unitária e do tempo médio por máquina, e o encerramento só é liberado quando o campo Baixado é igual a ela. |
| Empenhada | `EMPENHADA` | INTEGER |  |  | Quantidade do lote já empenhada em pedidos. Somente leitura. |
| Previsão Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  |  | Data prevista de entrega do lote. Somente leitura. |
| Faturado | `FATURADO` | INTEGER |  |  | Quantidade do lote já faturada. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do lote. Somente leitura. |
| Nº Inicial | `NUMERO_INICIAL` | INTEGER |  |  | Primeiro número de série ou de peça do lote. Somente leitura. |
| Nº Final | `NUMERO_FINAL` | INTEGER |  |  | Último número de série ou de peça do lote. Somente leitura. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência do lote, usada no texto do log de encerramento e estorno. Somente leitura. |
| Data Final Prod. | `DATA_FINAL_PRODUCAO` | TIMESTAMP |  |  | Último dia com apontamento em CONTROLE_PRODUCAO_DIARIA para o lote. Somente leitura: preenchida pelo Encerrar e limpa pelo Estornar. |
| Data Inicial Prod. | `DATA_INICIAL_PRODUCAO` | TIMESTAMP |  |  | Primeiro dia com apontamento em CONTROLE_PRODUCAO_DIARIA para o lote. Somente leitura: preenchida pelo Encerrar e limpa pelo Estornar. |
| Nº Dias Úteis | `DIAS_UTEIS_PRODUCAO` | INTEGER |  |  | Quantidade de dias distintos com apontamento de produção do lote. Somente leitura: calculada no Encerrar e zerada no Estornar. |
| M. O. Unitária | `MEDIA_MAO_OBRA` | DOUBLE PRECISION |  |  | Custo de mão de obra por peça: total de mão de obra dividido pela quantidade do lote. Somente leitura: calculada no Encerrar e zerada no Estornar. |
| Total M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  |  | Custo total da mão de obra do lote, somando horas e minutos apontados vezes o valor da mão de obra de cada apontamento. Somente leitura: calculado no Encerrar e zerado no Estornar. |
| Total Horas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(10) | 10 |  | Total de horas produtivas do lote no formato HH:MM, montado a partir dos minutos apontados. Somente leitura: calculado no Encerrar e devolvido a `'00:00'` no Estornar. |
| Custo do Lote Incompleto | `CUSTO_LOTE_INCOMPLETO` | VARCHAR(1) | 1 |  | Marca o lote como de custo incompleto. Marcado grava `'2'`, desmarcado grava `'1'`; o lote nasce com `'1'` na programação. O valor é preservado durante o encerramento. Os mapas de PCP e de acompanhamento de produção só listam lotes com `'1'`, então marcar aqui tira o lote desses relatórios. |
| Baixado | `BAIXADO` | INTEGER |  |  | Quantidade do lote já baixada na produção. Somente leitura, mas é a trava do encerramento: se for diferente da Quantidade, o sistema recusa encerrar e coloca o foco neste campo. |

### Grade `dbmaquina` — tabela IT_LOTE_PLANILHA_CUSTO_MAQUINA

Nenhuma linha é digitada. O Encerrar apaga e regrava a grade agrupando `CONTROLE_PRODUCAO_DIARIA` por máquina; o Estornar apaga todas as linhas.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `MAQUINA` | INTEGER |  | Código da máquina que trabalhou no lote, vindo dos apontamentos diários. Faz parte da chave primária da tabela (PK2). |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 | Descrição da máquina, vinda do JOIN com MAQUINA (calculado na consulta). |
| Tempo Médio | `TEMPO_MEDIO_MINUTOS` | DOUBLE PRECISION |  | Tempo médio por peça, em minutos: total de minutos apontados na máquina dividido pela quantidade do lote. |
| Total Horas | `TOTAL_HORAS` | VARCHAR(10) | 10 | Total de horas da máquina no lote, no formato HH:MM, montado a partir dos minutos apontados. |
| Custo M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  | Custo de mão de obra da máquina no lote: minutos apontados vezes o valor da mão de obra de cada apontamento, convertido em horas. |

<a id="umov_lote_entrada"></a>

## `umov_lote_entrada` — Lote de Entrada...

Registra a entrada em estoque do que foi produzido em um lote. O cabeçalho é a leitura do lote em `LOTE` (chave `EMPRESA` + `NUMERO`) e as entradas são gravadas em `IT_LOTE_ENTRADA` (chave `EMPRESA` + `NUMERO` + `SEQ`). Todo o cabeçalho é somente leitura: o lote nasce na produção, e aqui só se escolhe qual lote é e se lançam as parcelas produzidas na grade `dbit_lote_entrada`. Cada linha gravada dá entrada do produto no estoque e baixa os materiais empenhados da composição, na proporção da quantidade lançada.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação do lote, exibida em destaque no alto. Somente leitura, é um rótulo sem digitação. Valores: `'Pendente'` enquanto o total já lançado for menor que a quantidade do lote — nasce assim no NewRecord; `'Encerrado'` quando a soma das entradas iguala a quantidade do lote. Cada gravação e cada exclusão de linha recalculam esse estado. |
| Nº Lote **·chave** | `NUMERO` | INTEGER |  |  | Número do lote de produção. É por onde se escolhe o lote: digitar um número carrega o lote e suas entradas, e número inexistente limpa a tela. O botão do campo abre a consulta de lotes de produção; F7 volta ao anterior, F8 avança, F9 e o botão localizam o mais próximo abaixo. |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto do lote. Somente leitura: vem do lote carregado. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto do lote. Somente leitura, vem do lote carregado. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de abertura do lote. Somente leitura, vem do lote carregado. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência comercial do produto do lote. Somente leitura, vem do lote carregado. |
| `edtcampo_temp` | `PRODUTO` | INTEGER |  |  | Caixa de apoio, somente leitura, ligada à mesma coluna `PRODUTO`. Existe só para a navegação por tabulação: ao receber o foco ela o devolve imediatamente ao campo Produto. Não é campo de digitação nem grava nada por si. |
| Quantidade | `QUANTIDADE` | INTEGER |  |  | Quantidade total prevista do lote. Somente leitura, vem do lote carregado. É o teto das entradas: a gravação de uma linha recusa com "A quantidade informada excede a quantidade total do lote" quando o acumulado passaria desse valor, e é a igualdade com o acumulado que muda o status para `'Encerrado'`. |

### Grade `dbit_lote_entrada` — tabela IT_LOTE_ENTRADA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data da entrada desta parcela do lote. Ao sair da grade o cursor volta para a primeira linha, para não deixar uma linha em branco com data depois do último lançamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade produzida que entra no estoque nesta parcela. Obrigatória: o AfterPost apaga a linha e avisa "Quantidade do Lote não informado" se for menor ou igual a zero, e a gravação recusa quantidade que estoure o total do lote. Ao gravar, o sistema dá entrada dessa quantidade no estoque do produto e, para cada material empenhado da composição, baixa a quantidade proporcional e reduz o `ESTOQUE_EMPENHADO`; se faltar saldo de algum material, avisa "Estoque de matéria prima insuficiente" e lista os materiais. Excluir a linha estorna tudo isso. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada e `SEQ` da linha recebe o maior `SEQ` do lote mais um, ambos no NewRecord. `SALDO` do lote acumula o que já entrou: cada gravação soma a diferença da quantidade da linha e cada exclusão a devolve, e é a comparação de `SALDO` com `QUANTIDADE` que define o `STATUS`. `LAST_QUANTIDADE` guarda a quantidade já movimentada da linha, para que uma alteração movimente apenas a diferença e a exclusão estorne o valor certo.

<a id="umov_controle_producao_diaria"></a>

## `umov_controle_producao_diaria` — Controle de Produção Diária...

Apontamento diário de produção por máquina e operador, gravado na tabela `CONTROLE_PRODUCAO_DIARIA` (chave `EMPRESA` + `NUMERO`). Um registro por apontamento, sem grade: o painel Informações da Produção guarda máquina, data, cartões-ponto e horário; o painel Horas Produtivas guarda o desenho ou lote trabalhado; o painel Horas não Produtivas guarda a ocorrência que consumiu o turno. Os totais em horas são todos calculados pelo programa a partir de Hora Inicial, Hora Final e do horário de café do funcionário do Cartão Ponto 01.

### Campos

#### Controle de Produção Diária...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do apontamento dentro da empresa. Gerado na gravação por MAX(NUMERO)+1 sobre CONTROLE_PRODUCAO_DIARIA. O botão ao lado abre a consulta de controles já lançados para recuperar um registro. Parte da chave primária (PK1). |
| Total Horas | `TOTAL_HORAS` | VARCHAR(5) | 5 |  | Duração bruta do turno no formato HH:MM. Calculada por Hora Final menos Hora Inicial, virando o dia quando a hora final é menor. Inicia em 00:00 no NewRecord. Campo desabilitado, não digitável. |
| Horas Café | `TOTAL_HORAS_CAFE` | VARCHAR(5) | 5 |  | Minutos de café descontados do turno, em HH:MM. Buscados do cadastro do funcionário do Cartão Ponto 01: usa ENTRADA/SAIDA_CAFE_SABADO quando a emissão cai no sábado e os dois períodos de ENTRADA/SAIDA_CAFE_SEGUNDA_A_SEXTA nos demais dias, e só conta o intervalo que cai dentro do turno. Inicia em 00:00. Campo desabilitado, não digitável. |

#### Informações da Produção

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do apontamento. Na gravação é recusada se for maior que a data atual, se cair num domingo (só aceita de segunda a sábado) ou se for anterior à data de abertura do Lote de Produção informado. Ao sair do campo, recalcula todos os totais de horas. |
| Nº Cartão Ponto 01 | `NUMERO_CARTAO_PONTO_01` | INTEGER |  |  | Cartão-ponto do operador principal. Obrigatório na gravação. Precisa existir no cadastro de funcionários; se não existir, avisa e limpa o campo. Ao aceitar, grava o código do funcionário em FUNCIONARIO_01 e é ele quem define o horário de café usado no cálculo. |
| Nº Cartão Ponto 02 | `NUMERO_CARTAO_PONTO_02` | INTEGER |  |  | Cartão-ponto do segundo operador da máquina, opcional. Se preenchido, precisa existir no cadastro e grava o código em FUNCIONARIO_02. Conta na multiplicação do custo de mão de obra. |
| Nº Cartão Ponto 03 | `NUMERO_CARTAO_PONTO_03` | INTEGER |  |  | Cartão-ponto do terceiro operador, opcional. Mesma validação do 02, grava em FUNCIONARIO_03. |
| Hora Inicial | `HORA_INICIAL` | VARCHAR(5) | 5 |  | Início do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Ao sair do campo recalcula os totais e avisa se as horas produtivas passarem de 10 horas. |
| Hora Final | `HORA_FINAL` | VARCHAR(5) | 5 |  | Fim do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Se for menor que a Hora Inicial, o cálculo entende virada de dia. |
| Máquina | `MAQUINA` | INTEGER |  |  | Código da máquina em que se produziu. Obrigatório na gravação. F3 abre o cadastro de máquinas e o botão do campo abre a consulta. O custo médio de mão de obra dessa máquina alimenta VALOR_MAO_OBRA no BeforePost. |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de máquinas ao sair do código; se a máquina não existir, limpa também o código. Campo desabilitado, não digitável (calculado na consulta). |

#### Horas Produtivas

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Desenho | `DESENHO` | VARCHAR(15) | 15 |  | Desenho de produção trabalhado no turno. F3 abre o cadastro de desenhos e o botão abre a consulta. Na gravação, se houver Lote informado, compara a referência do desenho com a referência do produto do lote e avisa quando divergem. |
| Descrição do Desenho | `DESCRICAO_DESENHO` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de desenhos ao sair do código. Campo desabilitado, não digitável (calculado na consulta). |
| Lote | `LOTE` | INTEGER |  |  | Lote de produção apontado. Ao informar, o programa busca o lote e preenche sozinho a descrição, o PRODUTO e a descrição do produto; lote inexistente limpa os três. F3 abre a programação de lotes. |
| Descrição do Lote | `DESCRICAO_LOTE` | VARCHAR(70) | 70 |  | Descrição do produto do lote, trazida junto com o lote. Campo desabilitado, não digitável (calculado na consulta). |
| Nº Operação | `NUMERO_OPERACAO` | INTEGER |  |  | Número da operação do roteiro executada neste apontamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Peças produzidas no turno. Se houver Desenho informado e a quantidade ficar zerada, avisa Quantidade do Desenho não Informado ao sair do campo, mas não impede a gravação. |
| Programação | `QUANTIDADE_HORAS_PROGRAMACAO` | VARCHAR(5) | 5 |  | Horas gastas programando a máquina, em HH:MM. Inicia em 00:00. Valor inválido é recusado na digitação e na gravação. |
| Preparação | `QUANTIDADE_HORAS_PREPARACAO` | VARCHAR(5) | 5 |  | Horas gastas preparando ferramenta ou setup, em HH:MM. Inicia em 00:00. Valor inválido é recusado na digitação e na gravação. |
| Total | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(5) | 5 |  | Horas efetivamente produtivas, em HH:MM: Total Horas menos Horas Café. Só recebe valor quando não há Ocorrência informada; com ocorrência, fica 00:00. Acima de 10 horas o programa avisa. Se ficar negativo, a gravação é bloqueada. Campo desabilitado, não digitável. |

#### Horas não Produtivas

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Observações | `OBSERVACAO` | VARCHAR(300) | 300 |  | Texto livre sobre o apontamento, convertido para maiúsculas na digitação. |
| Ocorrência | `OCORRENCIA_PRODUCAO` | INTEGER |  |  | Código da ocorrência que parou a produção (cadastro de ocorrências de produção). É o campo que chaveia a tela: com ocorrência maior que zero, todo o turno vai para Total não produtivo e as Horas Produtivas ficam 00:00; sem ocorrência, é o contrário. F3 abre o cadastro de ocorrências. |
| Descrição da Ocorrência da Produção | `DESCRICAO_OCORRENCIA_PRODUCAO` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de ocorrências ao sair do código; ocorrência inexistente limpa também o código. Campo desabilitado, não digitável (calculado na consulta). |
| Total | `TOTAL_HORAS_NAO_PRODUTIVAS` | VARCHAR(5) | 5 |  | Horas perdidas na ocorrência, em HH:MM: Total Horas menos Horas Café. Só recebe valor quando há Ocorrência informada; sem ocorrência, fica 00:00. Inicia em 00:00. Campo desabilitado, não digitável. |

<a id="umov_controle_producao_diaria_por_veiculo"></a>

## `umov_controle_producao_diaria_por_veiculo` — Controle da Produção Diária dos Veículos...

Variante do apontamento diário aplicada a veículos em vez de máquinas, gravando na mesma tabela `CONTROLE_PRODUCAO_DIARIA` (chave `EMPRESA` + `NUMERO`). O veículo é gravado na coluna `MAQUINA`, reaproveitando o cadastro de máquinas. Tela sem grade e sem painéis: veículo, data, cartões-ponto, horário, totais de horas e, no final, os campos exclusivos desta variante — quilometragem de saída, quilometragem de chegada e destino da viagem.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do apontamento dentro da empresa, gerado na gravação por MAX(NUMERO)+1 sobre CONTROLE_PRODUCAO_DIARIA. O botão do campo abre a consulta de apontamentos. Parte da chave primária (PK1). |
| Observações | `OBSERVACAO` | VARCHAR(300) | 300 |  | Texto livre sobre a viagem ou o serviço do dia, convertido para maiúsculas na digitação. |
| Veículo | `MAQUINA` | INTEGER |  |  | Código do veículo, gravado na mesma coluna usada para máquina nas outras variantes. Obrigatório na gravação, que reclama pelo nome Veículo. F3 abre o cadastro e o botão abre a consulta. O custo médio de mão de obra desse registro alimenta VALOR_MAO_OBRA no BeforePost, multiplicado pela quantidade de cartões-ponto informados. |
| Descrição do Veículo | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro ao sair do código; código inexistente limpa também o código. Campo desabilitado, não digitável (calculado na consulta). |
| Data | `EMISSAO` | TIMESTAMP |  |  | Data do apontamento. A gravação exige data válida. É ela que decide qual intervalo de café do funcionário será descontado: no sábado usa o café de sábado, nos demais dias os dois cafés de segunda a sexta. |
| Nº Cartão Ponto 01 | `NUMERO_CARTAO_PONTO_01` | INTEGER |  |  | Cartão-ponto do motorista ou operador principal. Obrigatório na gravação. Precisa existir no cadastro de funcionários, senão avisa e limpa o campo. Grava o código do funcionário em FUNCIONARIO_01 e define o horário de café usado no cálculo. |
| Hora Inicial | `HORA_INICIAL` | VARCHAR(5) | 5 |  | Início do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Ao sair do campo recalcula Total Horas, Horas Café e Produtivas. |
| Hora Final | `HORA_FINAL` | VARCHAR(5) | 5 |  | Fim do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Menor que a Hora Inicial significa virada de dia no cálculo. |
| Produtivas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(5) | 5 |  | Horas efetivamente produtivas em HH:MM: duração do turno menos as Horas Café. Recebe 00:00 quando há ocorrência de produção lançada no registro. Inicia em 00:00. Se der negativo, a gravação é bloqueada com o aviso para ajustar as horas inicial e final. Campo desabilitado, não digitável. |
| Horas Café | `TOTAL_HORAS_CAFE` | VARCHAR(5) | 5 |  | Minutos de café descontados do turno, em HH:MM, tirados do cadastro do funcionário do Cartão Ponto 01 e contados apenas quando o intervalo cai dentro do turno. Inicia em 00:00. Campo desabilitado, não digitável. |
| Nº Cartão Ponto 02 | `NUMERO_CARTAO_PONTO_02` | INTEGER |  |  | Cartão-ponto do segundo ocupante, opcional. Se preenchido, precisa existir no cadastro e grava o código em FUNCIONARIO_02. Entra na contagem que multiplica o custo de mão de obra. |
| Nº Cartão Ponto 03 | `NUMERO_CARTAO_PONTO_03` | INTEGER |  |  | Cartão-ponto do terceiro ocupante, opcional. Mesma validação do 02, grava em FUNCIONARIO_03. |
| KM Saída | `KILOMETRAGEM_SAIDA` | INTEGER |  |  | Odômetro do veículo na saída. Exclusivo desta variante; digitado livremente, sem crítica no código. |
| KM Chegada | `KILOMETRAGEM_CHEGADA` | INTEGER |  |  | Odômetro do veículo na chegada. Exclusivo desta variante; digitado livremente, sem crítica no código. A distância percorrida é a diferença para o KM Saída. |
| Local do Destino | `DESTINO` | VARCHAR(50) | 50 |  | Para onde o veículo foi. Texto livre, exclusivo desta variante. |

<a id="umov_emissao_etiqueta_lote"></a>

## `umov_emissao_etiqueta_lote` — Emissão de Etiquetas do Lote de Produção...

Tela só de impressão: monta uma lista de lotes de produção e imprime a faixa de etiquetas numeradas de cada um. Nada é gravado no banco — a grade vive num ClientDataSet em memória (`tbtemp`), recriado vazio a cada Limpar e descartado ao fechar. A tela é a grade `dblote` mais os botões Limpar, Imprimir e Sair. F10 imprime, F5 limpa, F4 (ou o botão da célula do Lote) abre a consulta de lotes de produção para encerramento, Delete apaga a linha depois de confirmar. Ao imprimir, o programa pede o modelo de etiqueta e percorre a lista chamando a rotina de impressão uma vez por lote.

### Grade `dblote` — lista em memória, sem tabela

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Lote | `LOTE` | INTEGER |  | Número do lote de produção, digitado ou escolhido na consulta (F4). É a única célula que o usuário preenche: ao informar, o programa busca o lote e preenche todo o resto da linha; lote inexistente limpa a linha inteira. Não é coluna de tabela — a lista só existe em memória (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto do lote, trazida junto com o lote. Coluna somente-leitura na grade. Não é coluna de tabela (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do produto do lote, trazida junto com o lote e impressa na etiqueta. Coluna somente-leitura na grade. Não é coluna de tabela (calculado na consulta). |
| Descrição da Referência | `DESCRICAO_REFERENCIA` | VARCHAR(50) | 50 | Descrição da referência, trazida junto com o lote e impressa na etiqueta. Coluna somente-leitura na grade. Não é coluna de tabela (calculado na consulta). |
| Nº Inicial | `NUMERO_INICIAL` | INTEGER |  | Primeiro número da faixa de etiquetas do lote, trazido do lote mas editável. Não é coluna de tabela (calculado na consulta). |
| Nº Final | `NUMERO_FINAL` | INTEGER |  | Último número da faixa, trazido do lote mas editável. A quantidade impressa é Nº Final menos Nº Inicial mais um; se esse resultado não for positivo, o programa avisa Quantidade de Etiquetas não Informado e apaga a linha logo após o post. Não é coluna de tabela (calculado na consulta). |

### Observações

- A lista em memória carrega três campos a mais que não aparecem na grade e vão para a etiqueta impressa: `CAPACIDADE`, `PESO` (peso médio do lote, formatado com duas casas) e `PREVISAO_ENTREGA`. Todos são trazidos do lote junto com as demais colunas e não podem ser conferidos nem corrigidos na tela.
- Com a lista vazia, o Imprimir avisa que não existem itens selecionados e limpa a tela.

<a id="ucad_desenho_producao"></a>

## `ucad_desenho_producao` — Cadastro dos Desenhos de Produção...

Cadastro da ficha técnica de produção. O cabeçalho grava na tabela `DESENHO` e amarra o desenho a um setor, a uma referência (e por ela ao produto) e, opcionalmente, a um lote de produção. Abaixo, um controle de abas: Matéria Prima traz a grade de materiais, gravada em `IT_DESENHO`; Mão de Obra traz a grade de máquinas e tempos, gravada em `IT_DESENHO_TEMPO`; Arquivo PDF do Desenho não tem campos de banco — guarda o PDF em disco, no servidor, com o nome do campo Nº Desenho. Os totais das duas grades somam no campo `TOTAL` de `DESENHO`.

#### Cadastro dos Desenhos de Produção...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(15) | 15 |  | Código do desenho, chave primária junto com a empresa. Texto, não numérico, e sem sequencial automático — o usuário digita. Ao sair do campo o sistema procura o código: se existir, carrega o desenho para alteração; se não existir, inicia um desenho novo já com esse código. F4 abre a consulta de desenhos; F7, F8 e F9 navegam entre os códigos. Obrigatório na gravação: o botão Gravar aborta com "Cadastro do Desenho" em branco. É também a chave dos itens das duas grades. |
| Descrição do Desenho | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do desenho. Obrigatório na gravação: o botão Gravar aborta com "Descrição do Desenho" em branco. É o texto usado no log do sistema. |
| Setor | `SETOR` | VARCHAR(3) | 3 |  | Código do setor de produção responsável pelo desenho, do cadastro `SETOR`. F4 abre a consulta de setores. Ao sair do campo o sistema busca o setor e preenche a descrição ao lado; se não achar, limpa os dois. Traz junto o marcador `CONSUMO_MATERIAIS` do setor, que comanda a caixa Baixa Estoque dos Materiais: setor com consumo de materiais igual a `'2'` desabilita a caixa e força seu valor para `'1'`. Obrigatório na gravação: o botão Gravar aborta com "Setor do Desenho" em branco. |
| Descrição do Setor | `DESCRICAO_SETOR` | VARCHAR(50) | 50 |  | Descrição do setor, trazida de `SETOR.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema ao informar o código ao lado. Não é digitada (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Código da referência do produto, do cadastro `REFERENCIA`. F4 abre a consulta de referências. Ao sair do campo o sistema busca a referência e preenche sozinho a descrição da referência, o código do Produto e a Descrição do Produto; se não achar, limpa os quatro. Obrigatório na gravação: o botão Gravar aborta com "Referência do Desenho" em branco. Também é conferida contra a referência do lote informado. |
| Data Revisão | `DATA_REVISAO` | TIMESTAMP |  |  | Data da revisão vigente do desenho. Depois da gravação, o sistema copia esta data e o Nº Revisão para o item correspondente em `IT_LOTE_DESENHO`, quando o desenho já estiver amarrado ao lote — é assim que a programação fica sabendo que o desenho mudou de revisão. |
| Nº Revisão | `REVISAO` | INTEGER |  |  | Número sequencial da revisão do desenho, digitado. Como a Data Revisão, é replicado para `IT_LOTE_DESENHO` depois da gravação. |
| Lote Produção | `LOTE_PRODUCAO` | INTEGER |  |  | Número do lote de produção a que este desenho se refere. Opcional, mas quando maior que zero o Gravar valida contra a tabela `LOTE` e avisa em três casos: o lote não existe, o lote é do tipo `'Pré-Lote'`, ou a referência do lote é diferente da referência do desenho. Os três são avisos, não bloqueios: a gravação segue. |
| Nº Desenho | `NUMERO_DESENHO` | VARCHAR(15) | 15 |  | Número do desenho de engenharia, distinto do código Cadastro. É também o nome do arquivo PDF na aba Arquivo PDF do Desenho: o PDF é gravado no servidor em `\Foto\Desenho_Producao\Empresa_NNN\` com este conteúdo mais a extensão, e é por ele que os botões Visualizar e Remover encontram o arquivo. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto acabado, trazida de `MATERIA_PRIMA.DESCRICAO` através da referência e regravada pelo sistema ao informar a Referência. Não é digitada (calculado na consulta). |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto acabado. Vem de `REFERENCIA.PRODUTO`, preenchido pelo sistema ao informar a Referência — não é digitado nem tem consulta própria. Depois da gravação o sistema lê `MATERIA_PRIMA.UTILIZA_COMPOSICAO_DESENHO` deste produto e, quando vale `'2'`, atualiza a base de composição do produto a partir dos itens do desenho. |

Fora dessa lista, a tela mostra três totalizadores que não são campos de banco: Custo Material, na aba Matéria Prima, Custo Mão de Obra, na aba Mão de Obra, e Total, no cabeçalho. Os três são caixas de moeda comuns, recalculadas em memória a cada item gravado ou excluído, e a soma dos dois primeiros é que alimenta a coluna `TOTAL` de `DESENHO`.

#### Matéria Prima

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Baixa Estoque dos Materiais no Almoxarifado por Lote | `BAIXA_MATERIAIS_ALMOXARIFADO` | VARCHAR(1) | 1 |  | Diz se os materiais deste desenho são baixados do almoxarifado por lote. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`. Depende do setor: quando o setor escolhido tem `CONSUMO_MATERIAIS = '2'`, a caixa é desabilitada e o sistema força este campo de volta para `'1'`, porque nesse caso a baixa já acontece pelo consumo do setor. |

### Grade `dbmaterial` — tabela IT_DESENHO

Materiais que compõem o desenho. A chave é empresa, cadastro do desenho e `SEQ`; o `SEQ` é gerado pelo NewRecord como `MAX(SEQ) + 1` dentro do desenho e não aparece na grade. Preço de custo, unidade e descrição vêm por LEFT JOIN com `MATERIA_PRIMA`; só `MATERIA_PRIMA` e `QUANTIDADE` são de fato gravados em `IT_DESENHO`.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Matéria Prima | `MATERIA_PRIMA` | INTEGER |  | Código do material. F4 ou o botão de reticências abre a consulta de matérias-primas. Digitar o código também vale: o SetText valida contra `MATERIA_PRIMA` e só aceita o material com `INATIVO = '1'` — material com `INATIVO = '2'` é recusado com o aviso de produto inativo, e material sem NCM cadastrado também é recusado, com aviso próprio. Aceito o código, o sistema preenche sozinho a descrição, a unidade, o custo padrão, o total, e coloca quantidade 1 quando ela ainda estiver zerada. |
| Descrição da Matéria Prima | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, vinda de `MATERIA_PRIMA.DESCRICAO` pelo LEFT JOIN. Preenchida pelo sistema e não digitável: o ColEnter da grade pula esta coluna. |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, vinda de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Somente leitura na grade, e o ColEnter também a pula. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material consumida por peça. É a única coluna, além do código do material, realmente digitada e gravada em `IT_DESENHO`. Ao sair da coluna o sistema recalcula o Total da linha como quantidade vezes custo padrão. |
| Custo Padrão | `CUSTO` | DOUBLE PRECISION |  | Preço de custo do material, vindo de `MATERIA_PRIMA.PRECO_CUSTO` no SELECT. Somente leitura: não é digitado nem gravado em `IT_DESENHO`, é sempre o custo vigente do cadastro do material. (calculado na consulta) |
| Total | `TOTAL` | DOUBLE PRECISION |  | Custo da linha, quantidade vezes custo padrão, calculado no próprio SELECT e recalculado na tela ao sair da coluna Quantidade e no BeforePost. Somente leitura. A diferença em relação ao valor anterior da linha é somada ao totalizador Custo Material, e a exclusão da linha desconta esse mesmo valor do `TOTAL` do desenho. |

### Grade `dbmao_de_obra` — tabela IT_DESENHO_TEMPO

Operações de máquina e tempos do desenho. A chave é empresa, cadastro do desenho e `SEQ`, gerado pelo NewRecord como `MAX(SEQ) + 1` e não exibido. O custo da máquina vem do centro de custo dela, por LEFT JOIN de `MAQUINA` com `CENTRO_CUSTO`; gravados em `IT_DESENHO_TEMPO` são apenas máquina, número da operação, os dois tempos e a quantidade de peças.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Máquina | `MAQUINA` | INTEGER |  | Código da máquina que executa a operação, do cadastro `MAQUINA`. F4 ou o botão de reticências abre a consulta de máquinas. Digitar o código também vale: o SetText valida contra `MAQUINA` e, se existir, preenche a descrição, traz o custo médio de mão de obra da máquina e coloca quantidade 1 quando ela ainda estiver zerada; se não existir, limpa o código e a descrição. |
| Descrição da Máquina | `DESCRICAO` | VARCHAR(50) | 50 | Descrição da máquina, vinda de `MAQUINA.DESCRICAO` pelo LEFT JOIN. Preenchida pelo sistema e não digitável: o ColEnter da grade pula esta coluna. |
| Oper. | `NUMERO_OPERACAO` | INTEGER |  | Número da operação dentro do roteiro do desenho, digitado. Define a ordem em que a operação é executada. |
| Tempo Prep. (min.) | `TEMPO_PREPARACAO_MINUTOS` | INTEGER |  | Tempo de preparação da máquina, em minutos inteiros, para o conjunto de peças informado em Qtde. Peças. Entra na conta do tempo unitário. Ao sair da coluna o sistema recalcula tempo unitário e total da linha. |
| Tempo Trab. (min.) | `TEMPO_TRABALHO_MINUTOS` | INTEGER |  | Tempo de trabalho efetivo da máquina, em minutos inteiros, para o conjunto de peças informado em Qtde. Peças. Ao sair da coluna o sistema recalcula tempo unitário e total da linha. |
| Qtde. Peças | `QUANTIDADE` | INTEGER |  | Número de peças produzidas naquele tempo — é o divisor dos dois tempos. Com zero, o tempo unitário e o total ficam zerados. Ao sair da coluna o sistema recalcula tempo unitário e total. |
| Tempo Unit. | `TEMPO_UNITARIO` | DOUBLE PRECISION |  | Tempo por peça, em minutos: soma do tempo de preparação com o de trabalho, dividido pela quantidade de peças, ou zero quando a quantidade é zero. Calculado no próprio SELECT e recalculado na tela. Somente leitura, e o ColEnter pula a coluna (calculado na consulta). |
| Custo Máq. | `CUSTO` | DOUBLE PRECISION |  | Custo-hora da máquina, vindo de `CENTRO_CUSTO.CUSTO_MEDIO_MAO_OBRA` do centro de custo a que a máquina pertence. Somente leitura, o ColEnter pula a coluna, e o valor não é gravado em `IT_DESENHO_TEMPO`. (calculado na consulta) |
| Total | `TOTAL` | DOUBLE PRECISION |  | Custo de mão de obra da linha: tempo unitário dividido por 60, para virar hora, vezes o custo-hora da máquina. Calculado no próprio SELECT e recalculado na tela. Somente leitura. A diferença em relação ao valor anterior da linha é somada ao totalizador Custo Mão de Obra, e a exclusão da linha desconta esse mesmo valor do `TOTAL` do desenho (calculado na consulta). |

<a id="umov_registro_diario_producao"></a>

## `umov_registro_diario_producao` — Registro Diário da Produção...

Apontamento diário de produção por referência, gravado na tabela `REGISTRO_DIARIO_PRODUCAO`, chave `EMPRESA` + `NUMERO`. Tela de painel único, sem abas nem grade: um lançamento por referência e por data. Só grava o apontamento; não movimenta estoque nem ordem de produção. Feita para digitação em sequência — a data do último lançamento gravado é repetida no lançamento seguinte, para não redigitar a cada linha do dia.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do apontamento, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `REGISTRO_DIARIO_PRODUCAO` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta apontamentos, F7 anterior, F8 próximo, F9 posiciona. Quando a tela é aberta em modo consulta por outra (`vabre_tela_consulta`), ela já sobe com a janela de consulta e fecha sozinha se nada for escolhido e a inclusão não estiver liberada. |
| Descrição da Referência | `DESCRICAO_REFERENCIA` | VARCHAR(50) | 50 |  | Descrição da referência, trazida do JOIN com `REFERENCIA`. Preenchida pelo Exit da referência e pela consulta F4; não é digitada nem gravada (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência produzida. Exigida no Gravar. Ao sair do campo, o sistema procura em `REFERENCIA`: achando, traz a descrição; não achando, apaga a referência digitada e a descrição. F4 abre a consulta de referências, F3 abre o cadastro de referência. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Quantidade produzida da referência naquela data. Exigida no Gravar: valor menor ou igual a zero aborta com "Quantidade não informada". |
| Data | `DATA` | TIMESTAMP |  |  | Data da produção. Exigida no Gravar e precisa ser data válida. Não vem com a data de hoje: no NewRecord, o sistema repete a data do último apontamento gravado nesta sessão da tela e deixa em branco enquanto nenhum foi gravado. |

<a id="umov_pedido_venda_finalizar"></a>

## `umov_pedido_venda_finalizar` — Finalização de Pedidos de Venda

Tela de lote: lista pedidos de venda e alterna o `STATUS_PRODUCAO` deles entre `Encaminhado` e `Finalizado`, gravando na tabela `PEDIDO_VENDA` (colunas `STATUS_PRODUCAO`, `DATA_STATUS_ENCAMINHAMENTO` e `DATA_STATUS_FINALIZACAO`). Não há campos de digitação: a tela é uma grade somente-leitura mais um radiogroup de filtro e um único botão de ação. O SELECT é montado em código, unindo `PEDIDO_VENDA` com `IT_PEDIDO_VENDA` (para somar o pendente) e com `CLIENTE` (para o nome), e sempre descarta pedidos com `STATUS = 'Faturado'`.

O radiogroup `rgstatus_producao` ("Filtro por status de produção") não é campo de banco. Ele tem dois itens, `Encaminhado` e `Finalizado`, e comanda a tela inteira: no item 0 filtra `STATUS_PRODUCAO = 'Encaminhado'`, o botão vira "Gravar/Finalizar" e a última coluna mostra `DATA_STATUS_ENCAMINHAMENTO`; no item 1 filtra `STATUS_PRODUCAO = 'Finalizado'`, o botão vira "Estornar" e a última coluna passa a mostrar `DATA_STATUS_FINALIZACAO` com o título "Finalização".

### Grade `dbpedidos` — tabela PEDIDO_VENDA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  | Número do pedido de venda. É a chave usada para carregar os itens na tela de números de série. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do pedido. Somente leitura. |
| Código | `CLIENTE` | INTEGER |  | Código do cliente do pedido. Somente leitura. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente, trazido de `CLIENTE.NOME` pelo LEFT JOIN. Somente leitura (calculado na consulta). |
| Total | `TOTAL` | DOUBLE PRECISION |  | Valor total do pedido. Somente leitura. |
| Status Produção | `STATUS_PRODUCAO` | VARCHAR(15) | 15 | Estágio do pedido na produção. Assume `Encaminhado` (liberado para a fábrica, gravado pela tela do pedido de venda), `Finalizado` (produção concluída, gravado aqui) ou vazio (ainda não encaminhado, portanto fora desta tela). O botão grava `Finalizado` com a data de hoje em `DATA_STATUS_FINALIZACAO`, e no modo estorno volta para `Encaminhado` zerando essa data. Somente leitura na grade. |
| Encaminhamento | `DATA_STATUS_ENCAMINHAMENTO` | TIMESTAMP |  | Data em que o pedido foi encaminhado à produção. Esta coluna troca de campo conforme o filtro: no modo Finalizado passa a exibir `DATA_STATUS_FINALIZACAO` com o título "Finalização". Somente leitura. |

Finalizar não é imediato: antes de gravar, a tela conta os itens do pedido cujo grupo de produto tem `GRUPO_PRODUTO.PREENCHER_NUMERO_SERIE_PEDIDO = '2'`. Havendo algum, abre `umov_pedido_venda_finalizar_itens` para digitar os números de série, e o pedido só é marcado como `Finalizado` se aquela tela devolver `vpedido_finalizado = True`. Sem itens desse tipo, marca direto.

Colunas do SELECT sem controle na tela: `EMPRESA`, `CONTATO`, `STATUS` (usado só no filtro, para excluir `'Faturado'`), `ORCAMENTO`, `PENDENTE` (soma de `(QUANTIDADE - QUANTIDADE_FATURADA) * VALOR` dos itens) e `DATA_STATUS_FINALIZACAO` (aparece na grade só pela troca de campo da última coluna).

<a id="umov_visualizacao_produtos_materiais"></a>

## `umov_visualizacao_produtos_materiais` — Visualização de Produtos/Materiais...

Tela de consulta do cadastro de produtos e materiais, sobre `MATERIA_PRIMA` (chave `EMPRESA` + `CADASTRO`), com a grade dos documentos anexos do item em `IT_MATERIA_PRIMA_DOCUMENTOS`. É só leitura: não há botão Gravar nem Excluir, apenas Limpar e Sair, e todos os controles de campo estão com ReadOnly = True, assim como a própria grade. O dataset traz dezenas de colunas de `MATERIA_PRIMA`, mas a tela expõe apenas identificação, classificação e o código de barras — o resto fica só carregado no dataset. A navegação F7, F8 e F9 é restrita a itens com `TIPO_PRODUTO = '2'`, isto é, só percorre produtos.

#### Visualização de Produtos/Materiais...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do produto ou material. Chave primária junto com EMPRESA. É o único campo digitável da tela: digitar um código carrega o item. O botão abre a consulta de produtos por descrição ou referência; F7 volta um produto, F8 avança, F9 procura, sempre limitados a `TIPO_PRODUTO = '2'`. O Limpar posiciona no último cadastro da empresa. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 |  | Descrição do item, lida de `MATERIA_PRIMA.DESCRICAO`. Somente leitura. |
| Unidade | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 |  | Unidade de consumo do item. Somente leitura. Observe que o rótulo diz apenas "Unidade", mas a coluna é a de consumo — o cadastro tem também `UNIDADE_COMPRA`, que esta tela não mostra. |
| Grupo | `GRUPO` | INTEGER |  |  | Código do grupo do item. Somente leitura. |
| Descrição do Grupo | `DESCRICAO_GRUPO` | VARCHAR(50) | 50 |  | Descrição do grupo, trazida pelo JOIN da consulta. Somente leitura. (calculado na consulta) |
| SubGrupo | `SUBGRUPO` | INTEGER |  |  | Código do subgrupo do item. Somente leitura. |
| Descrição do SubGrupo | `DESCRICAO_SUBGRUPO` | VARCHAR(50) | 50 |  | Descrição do subgrupo, trazida pelo JOIN da consulta. Somente leitura. (calculado na consulta) |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 |  | Referência do item. Somente leitura. É por ela que a consulta de produtos permite procurar, junto com a descrição. |

#### Tipo

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Produto | `TIPO_PRODUTO` | VARCHAR(1) | 1 |  | Marcador de que o item pode ser usado como produto acabado. `'2'` = marcado, `'1'` = desmarcado. Somente leitura. É este valor que a navegação F7, F8 e F9 desta tela exige para percorrer o cadastro, e é o mesmo marcador que o Termo de Garantia cobra para aceitar um item. |
| Materiais | `TIPO_MATERIA_PRIMA` | VARCHAR(1) | 1 |  | Marcador de que o item pode ser usado como material ou matéria-prima. `'2'` = marcado, `'1'` = desmarcado. Somente leitura. Os dois marcadores são independentes: um item pode ser produto e material ao mesmo tempo. |

#### Visualização de Produtos/Materiais... (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Código de Barras | `CODIGO_BARRA` | VARCHAR(25) | 25 |  | Código de barras do item, lido de `MATERIA_PRIMA.CODIGO_BARRA`. Somente leitura. O controle não recebeu nome próprio no DFM, é o `RxDBComboEdit1`. |

### Grade `dbmateria_prima_documentos` — tabela IT_MATERIA_PRIMA_DOCUMENTOS

Documentos anexados ao item — desenhos, fichas, laudos. A grade é recarregada a cada troca de produto, filtrada por `EMPRESA` e `CADASTRO`, e está com ReadOnly = True: serve para consultar e abrir os arquivos, não para cadastrá-los. `NOME_ARQUIVO`, que existe na tabela e no dataset, não aparece como coluna.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Seq **·chave** **·obrig** | `SEQ` | INTEGER |  | Sequencial do documento dentro do item, NOT NULL no banco. Chave primária na segunda posição, junto com EMPRESA e CADASTRO. Somente leitura nesta tela. |
| Data | `DATA` | TIMESTAMP |  | Data do documento, com máscara `99/99/0000`. Somente leitura. |
| Descrição do Documento | `DESCRICAO` | VARCHAR(50) | 50 | Descrição do documento anexado. Somente leitura. |
| Caminho do Arquivo | `CAMINHO_ARQUIVO` | VARCHAR(250) | 250 | Caminho completo do arquivo em disco ou na rede. É o que a coluna Abrir usa para chamar o arquivo. Somente leitura. |
| `ABRIR` | `ABRIR` | VARCHAR(5) | 5 | Coluna sem título, de 35 pixels, que não guarda dado nenhum: a consulta devolve a constante `'ABRIR'` e o OnDrawColumnCell desenha um botão escrito "Abrir" no lugar do texto. Clicar nela manda o Windows abrir o arquivo indicado em `CAMINHO_ARQUIVO` com o programa padrão do tipo. (calculado na consulta) |

---

# Módulo 6 — Custos

8 telas.

<a id="ucad_custo_fixo"></a>

## `ucad_custo_fixo` — Cadastro do Custo Fixo...

Tela de cadastro simples, sem abas nem grade. Grava na tabela `CUSTO_FIXO`, um registro por rubrica de custo fixo mensal da empresa, com dois valores mensais: o do rateio geral e o da planilha de margem de contribuição. O registro é por empresa: o SELECT filtra por `EMPRESA` e o NewRecord grava a empresa corrente, mas esse campo não aparece na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da rubrica de custo fixo, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela ele já traz `MAX(CADASTRO) + 1` da empresa, e na gravação de registro novo o código é reatribuído por esse mesmo cálculo. O campo aceita digitação para localizar um registro existente; código inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de custos fixos; F7, F8 e F9 navegam entre os códigos. Se ficar vazio ou zerado, o botão Gravar apenas limpa a tela e não grava nada. |
| Descrição do Custo Fixo | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da rubrica de custo fixo, por exemplo aluguel ou energia. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Valor Mensal | `VALOR` | DOUBLE PRECISION |  |  | Valor mensal da rubrica, usado no rateio do custo fixo. Obrigatório na gravação e não pode ser zero: o Gravar chama a validação de número vazio com o texto "Valor do Custo Fixo Mensal" e aborta. |
| Valor Mensal (MC) | `VALOR_PLANILHA_MC` | DOUBLE PRECISION |  |  | Valor mensal considerado especificamente na planilha de margem de contribuição, separado do valor de rateio ao lado. Não é validado na gravação, ou seja, pode ficar zerado. |

<a id="ucad_custo_variavel"></a>

## `ucad_custo_variavel` — Cadastro dos Custos Variáveis...

Tela de cadastro simples, sem abas nem grade. Grava na tabela `CUSTO_VARIAVEL`, um registro por rubrica de custo variável, expressa em percentual sobre as vendas, mais dois marcadores que dizem em qual cálculo a rubrica entra. O registro é por empresa: o SELECT filtra por `EMPRESA` e o NewRecord grava a empresa corrente, mas esse campo não aparece na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da rubrica de custo variável, chave primária junto com a empresa. Preenchido pelo sistema: ao limpar a tela ele já traz `MAX(CADASTRO) + 1` da empresa, e na gravação de registro novo o código é reatribuído por esse mesmo cálculo. Aceita digitação para localizar um registro existente; código inexistente e acima da sequência abre a tela de seleção de cadastro novo, que pergunta se o usuário quer o próximo da sequência ou o número digitado. F4 abre a consulta de custos variáveis; F7, F8 e F9 navegam entre os códigos. Se ficar vazio ou zerado, o botão Gravar apenas limpa a tela e não grava nada. |
| Descrição do Custo Variável | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome da rubrica de custo variável, por exemplo comissão ou frete. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. |
| Percentual | `PERCENTUAL` | DOUBLE PRECISION |  |  | Percentual da rubrica sobre as vendas. Obrigatório na gravação e não pode ser zero: o Gravar chama a validação de número vazio com o texto "% Custo Variável sobre as Vendas" e aborta. |
| Utiliza no Ponto de Equilíbrio | `UTILIZA_PONTO_EQUILIBRIO` | VARCHAR(1) | 1 |  | Diz se esta rubrica entra no cálculo do ponto de equilíbrio. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`: por padrão a rubrica nova fica fora do cálculo. |
| Utiliza na Planilha de Custo do Produto | `UTILIZA_PLANILHA_CUSTO_PRODUTO` | VARCHAR(1) | 1 |  | Diz se esta rubrica entra na planilha de custo do produto. Valores `'2'` = sim (caixa marcada) e `'1'` = não (caixa desmarcada). O NewRecord grava `'1'`: por padrão a rubrica nova fica fora da planilha. Os dois marcadores são independentes, então a mesma rubrica pode servir a um cálculo e não ao outro. |

<a id="umov_planilha_custo_fixo_referencia"></a>

## `umov_planilha_custo_fixo_referencia` — Planilha de Custos Fixos pela Referência...

Planilha que rateia os custos fixos da empresa entre as referências de produto, proporcionalmente ao faturamento mensal previsto de cada uma. Trabalha com duas tabelas: `PLANILHA_CUSTO_FIXO_REFERENCIA` (uma linha por referência, chave `EMPRESA` + `NUMERO`), alimentada pela grade de cima e apenas exibida na grade do meio, e `CUSTO_FIXO` (as rubricas de custo da empresa), na grade da direita. A tela tem três grades: `RxDBGrid1` é onde se digita, `RxDBGrid2` é somente-leitura e mostra o rateio calculado, `RxDBGrid3` lista as rubricas de custo fixo e aceita só o valor de cada uma. O botão Atualizar recalcula tudo e o Imprimir sai pelo QuickReport "Mapa da Planilha de Custos Fixos / Mão de Obra".

Os oito botões chapados sobre as grades (`M. O. Indireta`, `Custos Fixos`, `Material Consumo`, `Depreciação`, `Custos Eventuais`, `Totais`, `Previsão da Venda Mensal`, `Mão de Obra Direta`) são só faixas de título dos blocos de colunas; não têm dados. Os oito `TCurrencyEdit` do rodapé (`edttotal_venda_mensal` e irmãos) também não são campos de banco: `atualiza_valores` os preenche com somas SQL sobre `PLANILHA_CUSTO_FIXO_REFERENCIA` de toda a empresa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `meobservacao` | `OBSERVACAO_PLANILHA_CUSTO` | BLOB |  |  | Caixa de texto sem legenda no rodapé, com as anotações gerais da planilha de custos. Não pertence às tabelas da tela: está ligada a `dm.dsparsis`, ou seja, à coluna `OBSERVACAO_PLANILHA_CUSTO` do registro de parâmetros do sistema (`PARSIS`). É um texto único da empresa, não uma observação por referência. Ao entrar no campo a tela põe `tbparsis` em edição e ao sair dá `post`, gravando sem passar por nenhum botão. O texto é convertido para maiúsculas a cada tecla. (calculado na consulta) |

### Grade `RxDBGrid1` — tabela PLANILHA_CUSTO_FIXO_REFERENCIA

Grade de digitação. O cursor pula sozinho as colunas calculadas (índices 1, 3 e 5) e, ao chegar nas duas últimas, salta para uma linha nova. `NUMERO` é sequencial: o NewRecord grava `MAX(NUMERO) + 1` da empresa. O AfterPost funciona como validação: se a referência não existir, ou se `QUANTIDADE_VENDA_MENSAL`, `TOTAL_VENDA_MENSAL`, `HORAS_MAO_OBRA_DIRETA` ou `VALOR_MAO_OBRA_DIRETA` vierem zerados, avisa e **exclui a linha recém-gravada**. Esses quatro são os obrigatórios de fato.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência de produto a que a linha se refere; aponta para a tabela `REFERENCIA`. Digitada em maiúsculas e validada no `OnSetText`: se não existir em `REFERENCIA`, o campo é limpo junto com a descrição. F4 (ou o botão de reticências) abre a consulta de referências e F3 abre o cadastro. O ColExit repete a validação ao sair da coluna. |
| Descrição da Referência | `DESCRICAO_REFERENCIA` | VARCHAR(50) | 50 | Descrição da referência, trazida de `REFERENCIA.DESCRICAO` pelo join e regravada pelo Exit da coluna anterior. Não é digitada — o cursor pula esta coluna (calculado na consulta). |
| Quantidade | `QUANTIDADE_VENDA_MENSAL` | DOUBLE PRECISION |  | Quantidade de peças dessa referência vendida por mês (previsão). Digitada. Ao ser alterada, recalcula na hora o Valor Médio. Zero faz a linha ser excluída no AfterPost. |
| Valor Médio | `VALOR_VENDA_MENSAL` | DOUBLE PRECISION |  | Preço médio unitário: `TOTAL_VENDA_MENSAL / QUANTIDADE_VENDA_MENSAL`. Calculado pelo sistema no `OnSetText` das duas colunas vizinhas e de novo no BeforePost; o cursor pula esta coluna. É a base sobre a qual todos os percentuais de rateio viram reais. |
| Total | `TOTAL_VENDA_MENSAL` | DOUBLE PRECISION |  | Faturamento mensal previsto dessa referência. Digitado. Ao ser alterado, recalcula o Valor Médio. Zero faz a linha ser excluída no AfterPost. |
| % Perc. | `PERCENTUAL_VENDA_MENSAL` | DOUBLE PRECISION |  | Peso dessa referência no faturamento: `100 / (soma de TOTAL_VENDA_MENSAL de todas as referências) * TOTAL_VENDA_MENSAL`. Calculado pelo botão Atualizar; o cursor pula esta coluna. É este percentual que distribui os custos fixos entre as referências. |
| Horas | `HORAS_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  | Horas de mão de obra direta gastas em uma peça da referência. Digitada. Ao ser alterada, recalcula o Total de mão de obra direta. Zero faz a linha ser excluída no AfterPost. |
| Valor Hora | `VALOR_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  | Valor da hora de mão de obra direta. Digitado. Ao ser alterado, recalcula o Total de mão de obra direta. Zero faz a linha ser excluída no AfterPost. |
| Total | `TOTAL_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  | Custo de mão de obra direta por peça: `Horas x Valor Hora`, mais a parcela da 6ª rubrica de `CUSTO_FIXO` aplicada sobre o Valor Médio. Calculado; entrar nesta coluna já joga o cursor para uma linha nova. |
| % Perc. | `PERCENTUAL_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  | Quanto a mão de obra direta representa do Valor Médio, em percentual. Calculado pelo botão Atualizar; entrar nesta coluna já joga o cursor para uma linha nova. |

### Grade `RxDBGrid2` — tabela PLANILHA_CUSTO_FIXO_REFERENCIA

Grade inteira marcada `ReadOnly`. Mostra o rateio dos custos fixos sobre a mesma linha de referência da grade de cima. Todos os pares `% Perc.` / `Valor` são preenchidos pelo botão Atualizar com a mesma fórmula: o percentual é `((PERCENTUAL_VENDA_MENSAL / 100) x valor da rubrica em CUSTO_FIXO) / TOTAL_VENDA_MENSAL x 100`, e o valor é esse percentual aplicado sobre o `VALOR_VENDA_MENSAL`. O que muda de par para par é a rubrica de `CUSTO_FIXO` usada, tomada pela **posição** da linha na grade `RxDBGrid3` (ordenada por `CADASTRO`): 1ª rubrica para M. O. Indireta, 2ª para Custos Fixos, 3ª para Material Consumo, 4ª para Depreciação, 5ª para Custos Eventuais.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | A mesma referência da grade de cima, repetida para dar âncora à linha. Somente leitura. |
| % Perc. | `PERCENTUAL_MAO_OBRA_INDIRETA` | DOUBLE PRECISION |  | Percentual de mão de obra indireta rateado para a referência (1ª rubrica de `CUSTO_FIXO`). Calculado pelo Atualizar. Somente leitura. |
| Valor | `VALOR_MAO_OBRA_INDIRETA` | DOUBLE PRECISION |  | Valor em reais da mão de obra indireta por peça: o percentual acima sobre o Valor Médio. Calculado. Somente leitura. |
| % Perc. | `PERCENTUAL_CUSTO_FIXO` | DOUBLE PRECISION |  | Percentual de custo fixo rateado para a referência (2ª rubrica de `CUSTO_FIXO`). Calculado. Somente leitura. |
| Valor | `VALOR_CUSTO_FIXO` | DOUBLE PRECISION |  | Valor em reais do custo fixo por peça. Calculado. Somente leitura. |
| % Perc. | `PERCENTUAL_MATERIAL_CONSUMO` | DOUBLE PRECISION |  | Percentual de material de consumo rateado para a referência (3ª rubrica de `CUSTO_FIXO`). Calculado. Somente leitura. |
| Valor | `VALOR_MATERIAL_CONSUMO` | DOUBLE PRECISION |  | Valor em reais do material de consumo por peça. Calculado. Somente leitura. |
| % Perc. | `PERCENTUAL_DEPRECIACAO` | DOUBLE PRECISION |  | Percentual de depreciação rateado para a referência (4ª rubrica de `CUSTO_FIXO`). Calculado. Somente leitura. |
| Valor | `VALOR_DEPRECIACAO` | DOUBLE PRECISION |  | Valor em reais da depreciação por peça. Calculado. Somente leitura. |
| % Perc. | `PERCENTUAL_CUSTO_EVENTUAL` | DOUBLE PRECISION |  | Percentual de custos eventuais rateado para a referência (5ª rubrica de `CUSTO_FIXO`). Calculado. Somente leitura. |
| Valor | `VALOR_CUSTO_EVENTUAL` | DOUBLE PRECISION |  | Valor em reais dos custos eventuais por peça. Calculado. Somente leitura. |
| % Perc. | `PERCENTUAL_TOTAL` | DOUBLE PRECISION |  | Soma dos seis percentuais da linha: mão de obra direta, indireta, custo fixo, material de consumo, depreciação e custos eventuais. Calculado pelo Atualizar. Somente leitura. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Custo total apurado por peça da referência: soma do total de mão de obra direta com os cinco valores rateados. Calculado pelo Atualizar. É o número final da planilha. Somente leitura. |

### Grade `RxDBGrid3` — tabela CUSTO_FIXO

Lista as rubricas de custo fixo da empresa. As linhas são fixas: `BeforeInsert`, `OnNewRecord` e `BeforeDelete` cancelam e abortam, ou seja, não se acrescenta nem se exclui rubrica por esta tela — só se altera o valor de cada uma. O cursor pula a coluna de descrição.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Descrição do Custo Fixo | `DESCRICAO` | VARCHAR(50) | 50 | Nome da rubrica de custo fixo. Somente leitura; a ordem em que as rubricas aparecem (`ORDER BY CADASTRO`) é o que define para qual coluna da grade do meio cada uma vai. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor mensal da rubrica na empresa. Única coluna digitável desta grade, e a entrada de dados que move todo o rateio. |
| Percentual | `PERCENTUAL` | DOUBLE PRECISION |  | Peso da rubrica sobre a soma do faturamento mensal previsto: `100 / (soma de TOTAL_VENDA_MENSAL) x VALOR`. Gravado pelo botão Atualizar. Somente leitura. |

`EMPRESA` e `NUMERO` de `PLANILHA_CUSTO_FIXO_REFERENCIA`, e `EMPRESA` e `CADASTRO` de `CUSTO_FIXO`, não têm controle na tela.

<a id="umov_planilha_custo_produto"></a>

## `umov_planilha_custo_produto` — Planilha de Custos dos Produtos...

Monta a planilha de custo de um produto: cabeçalho em `PLANILHA_CUSTO_PRODUTO`, composição de materiais em `IT_PLANILHA_CUSTO_PRODUTO` e custos variáveis em `IT_PLANILHA_CUSTO_VARIAVEL`. Quase nada é digitado: os botões Última Compra, Custo Padrão e Novo explodem a composição do produto (`PRODUTO_COMPOSICAO` mais os subconjuntos de `PRODUTO_SUBCONJUNTO_COMPOSICAO`), trazem as despesas fixas de `PLANILHA_CUSTO_FIXO_REFERENCIA` pela referência do produto e os valores mensais de `CUSTO_FIXO`, e a rotina calcula_planilha_custo refaz totais, percentuais, preço de venda e markup. Só percentual de frete, percentual de material de consumo e percentual de lucro são digitados.

Todos os controles estão ligados a datasets temporários em memória (TClientDataSet) copiados dos datasets do banco na entrada e regravados no Gravar — por isso a extração não achou tabela para nenhum campo e marcou tudo como calculado na consulta. As colunas existem em `PLANILHA_CUSTO_PRODUTO`, conforme o INSERT do dataset. Gravar só acontece com o foco no botão Gravar, pede confirmação, apaga e regrava os itens, e ainda oferece atualizar o `PRECO_CUSTO` do produto com o total de matéria-prima.

### Campos

#### Planilha de Custos dos Produtos...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número | `NUMERO` | INTEGER |  |  | Sequencial da planilha por empresa: MAX(NUMERO) + 1 em busca_ultimo. O botão do campo abre a consulta de planilhas de custo; F7 volta, F8 avança, F9 procura (calculado na consulta). |
| Produto | `PRODUTO` | INTEGER |  |  | Produto da planilha. F4 abre a consulta, F3 abre o cadastro. Só aceita cadastro com TIPO_PRODUTO = `'2'` (Produto) e INATIVO = `'1'` (ativo); se for `'1'` (só Material) ou estiver inativo, avisa e limpa código, descrição e referência. Obrigatório para gravar (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de MATERIA_PRIMA no Exit do código ou na consulta. Não é digitada (calculado na consulta). |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da planilha. Vem preenchida com a data de hoje no NewRecord e é corrigida para hoje se estiver inválida ao entrar no campo. Data válida é exigida para gravar; o botão Novo grava a nova planilha sempre com a data de hoje (calculado na consulta). |
| `edttotal_materia_prima` | `TOTAL_MATERIA_PRIMA` | DOUBLE PRECISION |  |  | Total da matéria-prima: soma de quantidade vezes valor de todas as linhas da composição, acumulada pelos botões Última Compra, Custo Padrão e Novo. Não é digitado; é o valor oferecido para atualizar o PRECO_CUSTO do produto na gravação (calculado na consulta). |
| IPI ==> | `TOTAL_IPI` | DOUBLE PRECISION |  |  | Total do IPI da composição: soma de alíquota de IPI do material sobre o total de cada linha. Calculado pelos botões de atualização de custo (calculado na consulta). |
| % Frete ==> | `PERCENTUAL_FRETE` | DOUBLE PRECISION |  |  | Percentual de frete sobre a matéria-prima. Digitado; ao sair do campo a planilha inteira é recalculada (calculado na consulta). |
| `edttotal_frete` | `TOTAL_FRETE` | DOUBLE PRECISION |  |  | Valor do frete: percentual de frete dividido por 100, vezes o total da matéria-prima. Não é digitado (calculado na consulta). |
| `edtpercentual_credito_icms` | `PERCENTUAL_CREDITO_ICMS` | DOUBLE PRECISION |  |  | Percentual que o crédito de ICMS representa sobre a matéria-prima: 100 dividido pelo total da matéria-prima, vezes o valor do crédito. Não é digitado (calculado na consulta). |
| `edtvalor_credito_icms` | `TOTAL_CREDITO_ICMS` | DOUBLE PRECISION |  |  | Valor do crédito de ICMS: soma do ICMS de cada linha da composição. Entra subtraindo no SubTotal. Não é digitado (calculado na consulta). |
| SubTotal==> | `TOTAL_COMPOSICAO` | DOUBLE PRECISION |  |  | Subtotal da composição: matéria-prima mais frete mais material de consumo, menos o crédito de ICMS. Não é digitado (calculado na consulta). |
| CDV ==> | `PERCENTUAL_DESPESA_VARIAVEL` | DOUBLE PRECISION |  |  | Fator dos custos sobre as vendas, gravado com quatro casas: 100 menos a soma dos percentuais da grade de custos variáveis, dividido por 100. Não é digitado (calculado na consulta). |
| `edttotal_despesa_variavel` | `TOTAL_DESPESA_VARIAVEL` | DOUBLE PRECISION |  |  | Soma dos valores dos itens da grade de custos variáveis, mantida item a item no post e no delete da grade. Não é digitado (calculado na consulta). |
| `edttotal_lucro` | `VALOR_LUCRO` | DOUBLE PRECISION |  |  | Valor do lucro em reais: percentual de lucro dividido por 100, vezes o preço de venda. Não é digitado (calculado na consulta). |
| % Lucro ==> | `PERCENTUAL_LUCRO` | DOUBLE PRECISION |  |  | Percentual de lucro desejado. Digitado; ao sair do campo recalcula preço de venda, markup e todos os percentuais de despesa fixa (calculado na consulta). |
| Preço Venda ==> | `PRECO_VENDA` | DOUBLE PRECISION |  |  | Preço de venda calculado: subtotal com despesa fixa dividido por 100 menos a soma dos percentuais de custo variável e do percentual de lucro, sobre 100. É o divisor de todos os percentuais de despesa fixa. Não é digitado (calculado na consulta). |
| Markup ==> | `MARKUP` | DOUBLE PRECISION |  |  | Markup: preço de venda dividido pelo total da matéria-prima. Não é digitado (calculado na consulta). |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de planilha ativa ou inativa. Marcado grava `'2'` (inativa), desmarcado grava `'1'` (ativa); o NewRecord já entra com `'1'`. O botão Novo grava `'2'` na planilha atual antes de gerar a próxima, de modo que só a última versão fica ativa (calculado na consulta). |
| % Mat. Consumo ==> | `PERCENTUAL_MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Percentual de material de consumo sobre a matéria-prima. Digitado, mas já vem sugerido do parâmetro do sistema PARSIS.PERCENTUAL_MATERIAL_CONSUMO no NewRecord; ao sair do campo recalcula a planilha (calculado na consulta). |
| `edttotal_material_consumo` | `TOTAL_MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Valor do material de consumo: percentual de material de consumo dividido por 100, vezes o total da matéria-prima. Somente leitura (calculado na consulta). |

#### Despesas Fixas

O painel é uma matriz: coluna da esquerda com o valor mensal do custo fixo, coluna % Perc. com a participação sobre o preço de venda e coluna Total com o valor rateado para este produto, vindo de `PLANILHA_CUSTO_FIXO_REFERENCIA` pela referência do produto. Todos os campos são preenchidos pelos botões Última Compra, Custo Padrão e Novo; nenhum é digitado.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Mão de Obra Indireta ==> | `VALOR_MAO_OBRA_INDIRETA` | DOUBLE PRECISION |  |  | Valor mensal da mão de obra indireta, lido do cadastro CUSTO_FIXO (segundo registro da lista). Preenchido pelo sistema (calculado na consulta). |
| `edtpercentual_mao_obra_indireta` | `PERCENTUAL_MAO_OBRA_INDIRETA` | DOUBLE PRECISION |  |  | Coluna % Perc. da linha Mão de Obra Indireta: total da mão de obra indireta dividido pelo preço de venda, vezes 100 (calculado na consulta). |
| `edttotal_mao_obra_indireta` | `TOTAL_MAO_OBRA_INDIRETA` | DOUBLE PRECISION |  |  | Coluna Total da linha Mão de Obra Indireta: valor rateado para este produto, copiado de PLANILHA_CUSTO_FIXO_REFERENCIA pela referência do produto. Zera quando não existe planilha de custo fixo para a referência (calculado na consulta). |
| `edtvalor_custo_fixo` | `VALOR_CUSTO_FIXO` | DOUBLE PRECISION |  |  | Valor mensal dos custos fixos, lido do cadastro CUSTO_FIXO (terceiro registro da lista). Preenchido pelo sistema (calculado na consulta). |
| `edtpercentual_custo_fixo` | `PERCENTUAL_CUSTO_FIXO` | DOUBLE PRECISION |  |  | Coluna % Perc. da linha Custos Fixos: total do custo fixo dividido pelo preço de venda, vezes 100 (calculado na consulta). |
| `edttotal_custo_fixo` | `TOTAL_CUSTO_FIXO` | DOUBLE PRECISION |  |  | Coluna Total da linha Custos Fixos: valor rateado para este produto, copiado de PLANILHA_CUSTO_FIXO_REFERENCIA (calculado na consulta). |
| `edtvalor_depreciacao` | `VALOR_DEPRECIACAO` | DOUBLE PRECISION |  |  | Valor mensal da depreciação, lido do cadastro CUSTO_FIXO. Preenchido pelo sistema (calculado na consulta). |
| `edtpercentual_depreciacao` | `PERCENTUAL_DEPRECIACAO` | DOUBLE PRECISION |  |  | Coluna % Perc. da linha Depreciação: total da depreciação dividido pelo preço de venda, vezes 100 (calculado na consulta). |
| `edttotal_depreciacao` | `TOTAL_DEPRECIACAO` | DOUBLE PRECISION |  |  | Coluna Total da linha Depreciação: valor rateado para este produto, copiado de PLANILHA_CUSTO_FIXO_REFERENCIA (calculado na consulta). |
| `edtvalor_custo_eventual` | `VALOR_CUSTO_EVENTUAL` | DOUBLE PRECISION |  |  | Valor mensal dos custos eventuais, lido do cadastro CUSTO_FIXO. Preenchido pelo sistema (calculado na consulta). |
| `edtpercentual_custo_eventual` | `PERCENTUAL_CUSTO_EVENTUAL` | DOUBLE PRECISION |  |  | Coluna % Perc. da linha Custos Eventuais: total do custo eventual dividido pelo preço de venda, vezes 100 (calculado na consulta). |
| `edttotal_custo_eventual` | `TOTAL_CUSTO_EVENTUAL` | DOUBLE PRECISION |  |  | Coluna Total da linha Custos Eventuais: valor rateado para este produto, copiado de PLANILHA_CUSTO_FIXO_REFERENCIA (calculado na consulta). |
| `edtpercentual_despesa_fixa` | `PERCENTUAL_DESPESA_FIXA` | DOUBLE PRECISION |  |  | Linha Totais, coluna % Perc.: soma dos percentuais de mão de obra direta, mão de obra indireta, custos fixos, depreciação e custos eventuais (calculado na consulta). |
| `edttotal_despesa_fixa` | `TOTAL_DESPESA_FIXA` | DOUBLE PRECISION |  |  | Linha Totais, coluna Total: soma dos totais de mão de obra direta, mão de obra indireta, custos fixos, depreciação e custos eventuais (calculado na consulta). |
| % Perc. | `PERCENTUAL_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  |  | O rótulo casado é o cabeçalho da coluna: este é o % Perc. da linha Mão de Obra Direta, igual ao total da mão de obra direta dividido pelo preço de venda, vezes 100 (calculado na consulta). |
| Total | `TOTAL_MAO_OBRA_DIRETA` | DOUBLE PRECISION |  |  | O rótulo casado é o cabeçalho da coluna: este é o Total da linha Mão de Obra Direta, copiado de PLANILHA_CUSTO_FIXO_REFERENCIA pela referência do produto. A linha não tem campo de valor mensal (calculado na consulta). |
| `edttotal_composicao_despesa_fixa` | `TOTAL_COMPOSICAO_DESPESA_FIXA` | DOUBLE PRECISION |  |  | Linha SubTotal do painel: subtotal da composição mais o total das despesas fixas. É a base do cálculo do preço de venda (calculado na consulta). |

### Grade `dbproduto_composicao` — tabela IT_PLANILHA_CUSTO_PRODUTO

Grade inteira somente-leitura (ReadOnly no grid). O conteúdo é gerado pelos botões Última Compra (usa MATERIA_PRIMA.COMPRA_PRECO e cai para PRECO_CUSTO quando a última compra é zero), Custo Padrão (usa sempre MATERIA_PRIMA.PRECO_CUSTO) e Novo. Materiais que aparecem tanto na composição direta quanto nos subconjuntos são somados na mesma linha.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material da composição, vindo de PRODUTO_COMPOSICAO ou da composição dos subconjuntos (calculado na consulta). |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, copiada de MATERIA_PRIMA. A grade é reordenada por esta coluna depois de montada (calculado na consulta). |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, copiada de MATERIA_PRIMA (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material por unidade do produto, vinda da composição. Quando o material se repete em subconjuntos, as quantidades são somadas (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Custo unitário do material. Última Compra usa COMPRA_PRECO e, se for zero, PRECO_CUSTO; Custo Padrão usa sempre PRECO_CUSTO (calculado na consulta). |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes valor unitário (calculado na consulta). |
| % Perc. | `PERCENTUAL_CUSTO` | DOUBLE PRECISION |  | Participação da linha no custo total da composição: 100 dividido pelo total da composição, vezes o total da linha (calculado na consulta). |
| % Icms | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do material, copiada de MATERIA_PRIMA.ICMS (calculado na consulta). |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  | Valor do ICMS da linha: alíquota dividida por 100, vezes o total da linha. Soma no crédito de ICMS do cabeçalho (calculado na consulta). |

A grade também grava, sem exibir, `ALIQUOTA_IPI` e `VALOR_IPI`, que alimentam o IPI do cabeçalho.

### Grade `dbcusto_variavel` — tabela IT_PLANILHA_CUSTO_VARIAVEL

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `CUSTO_VARIAVEL` | INTEGER |  | Código do custo variável, os custos sobre as vendas. F4 ou o botão da célula abrem a consulta de custos variáveis; digitar o código busca o cadastro e preenche descrição e percentual. Código inexistente limpa a linha, e a linha sem cadastro válido é apagada depois do post. Quando a grade está vazia, os botões de atualização de custo carregam todos os custos variáveis cadastrados (calculado na consulta). |
| Descrição do Custo Variável | `DESCRICAO_CUSTO_VARIAVEL` | VARCHAR(50) | 50 | Descrição do custo variável, copiada do cadastro. Somente leitura (calculado na consulta). |
| % Perc. | `PERCENTUAL` | DOUBLE PRECISION |  | Percentual do custo variável sobre o preço de venda. Vem sugerido do cadastro do custo variável quando ainda está zerado, e pode ser alterado na linha. A soma destes percentuais forma o CDV e entra no divisor do preço de venda (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do custo variável: percentual dividido por 100, vezes o preço de venda. Recalculado a cada recálculo da planilha; não é digitado (calculado na consulta). |

<a id="umov_planilha_custo_produto_margem_contribuicao"></a>

## `umov_planilha_custo_produto_margem_contribuicao` — Planilha de Custos dos Produtos (Margem de Contribuição)...

Versão da planilha de custo que trabalha por margem de contribuição, em vez de ratear despesas fixas por produto. Cabeçalho em `PLANILHA_CUSTO_PRODUTO_MC`, composição de materiais em `IT_PLANILHA_CUSTO_PRODUTO_MC` e custos variáveis em `IT_PLANILHA_CUSTO_VARIAVEL_MC`. Os percentuais padrão (frete, material de consumo e custo fixo sobre faturamento) vêm da tela de parâmetros `PLANILHA_CUSTO_PROD_MC_PAR`.

Três botões montam a composição a partir de `PRODUTO_COMPOSICAO` e dos subconjuntos, cada um com uma ordem de preferência para o custo do material: Custo Padrão (PRECO_CUSTO, depois COMPRA_PRECO, depois COMPRA_CUSTO_MEDIO), Última Compra (COMPRA_PRECO, depois PRECO_CUSTO, depois COMPRA_CUSTO_MEDIO) e Custo Médio (COMPRA_CUSTO_MEDIO, depois PRECO_CUSTO, depois COMPRA_PRECO). Só percentual de frete, percentual de material de consumo e percentual de margem de contribuição são digitados; o resto é calculado.

Todos os controles estão ligados a datasets temporários em memória (TClientDataSet) copiados dos datasets do banco e regravados no Gravar — por isso a extração não achou tabela para nenhum campo e marcou tudo como calculado na consulta. Quatro campos são apenas de tela e nunca chegam ao banco: `LUCRO`, `TOTAL_CUSTO_PADRAO`, `VARIACAO_CUSTO_PADRAO` e `TOTAL_EXCLUSAO` são pulados na cópia para o registro gravado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número | `NUMERO` | INTEGER |  |  | Sequencial da planilha por empresa: MAX(NUMERO) + 1 sobre PLANILHA_CUSTO_PRODUTO_MC. O botão do campo abre a consulta de planilhas; F7 volta, F8 avança, F9 procura (calculado na consulta). |
| Produto | `PRODUTO` | INTEGER |  |  | Produto da planilha. F4 abre a consulta, F3 abre o cadastro. Só aceita cadastro com TIPO_PRODUTO = `'2'` (Produto) e INATIVO = `'1'` (ativo); se for `'1'` (só Material) ou estiver inativo, avisa e limpa código, descrição e referência. Obrigatório para gravar (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de MATERIA_PRIMA no Exit do código ou na consulta. Não é digitada (calculado na consulta). |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da planilha. Entra com a data de hoje no NewRecord e é corrigida para hoje se estiver inválida ao entrar no campo. Data válida é exigida para gravar; o botão Novo grava a nova planilha sempre com a data de hoje (calculado na consulta). |
| `edttotal_materia_prima` | `TOTAL_MATERIA_PRIMA` | DOUBLE PRECISION |  |  | Total da matéria-prima: soma da coluna Total de todas as linhas da composição, refeita a cada atualização de custo. Não é digitado (calculado na consulta). |
| IPI ==> | `TOTAL_IPI` | DOUBLE PRECISION |  |  | Total do IPI da composição: soma do valor de IPI das linhas. Informativo, não entra no subtotal (calculado na consulta). |
| % Frete ==> | `PERCENTUAL_FRETE` | DOUBLE PRECISION |  |  | Percentual de frete sobre a matéria-prima. Digitado, mas já vem sugerido do parâmetro FRETE da tela de parâmetros MC no NewRecord; ao sair do campo a planilha é recalculada (calculado na consulta). |
| `edttotal_frete` | `TOTAL_FRETE` | DOUBLE PRECISION |  |  | Valor do frete: percentual de frete dividido por 100, vezes o total da matéria-prima. Não é digitado (calculado na consulta). |
| `edtpercentual_credito_icms` | `PERCENTUAL_CREDITO_ICMS` | DOUBLE PRECISION |  |  | Percentual que o crédito de ICMS representa sobre a matéria-prima: 100 dividido pelo total da matéria-prima, vezes o valor do crédito. Não é digitado (calculado na consulta). |
| `edtvalor_credito_icms` | `TOTAL_CREDITO_ICMS` | DOUBLE PRECISION |  |  | Valor do crédito de ICMS: soma do ICMS das linhas da composição. Entra subtraindo no SubTotal (calculado na consulta). |
| SubTotal==> | `TOTAL_COMPOSICAO` | DOUBLE PRECISION |  |  | Subtotal: matéria-prima mais frete mais material de consumo, menos o crédito de ICMS e menos o crédito de PIS/COFINS. É a base do preço de venda (calculado na consulta). |
| CDV ==> | `PERCENTUAL_DESPESA_VARIAVEL` | DOUBLE PRECISION |  |  | Fator dos custos sobre as vendas, gravado com quatro casas: 100 menos a soma dos percentuais da grade de custos variáveis, dividido por 100. Não é digitado (calculado na consulta). |
| `edttotal_despesa_variavel` | `TOTAL_DESPESA_VARIAVEL` | DOUBLE PRECISION |  |  | Soma dos valores dos itens da grade de custos variáveis, mantida item a item no post e no delete da grade (calculado na consulta). |
| `edttotal_lucro` | `VALOR_LUCRO` | DOUBLE PRECISION |  |  | Valor da margem em reais: percentual de margem de contribuição dividido por 100, vezes o preço de venda (calculado na consulta). |
| % Margem Contrib. ==> | `PERCENTUAL_LUCRO` | DOUBLE PRECISION |  |  | Percentual de margem de contribuição desejado. É o único percentual de resultado digitado; ao sair do campo recalcula preço de venda, markup e lucro previsto. Confronte com a Margem de Contribuição Mínima dos parâmetros MC (calculado na consulta). |
| Preço Venda ==> | `PRECO_VENDA` | DOUBLE PRECISION |  |  | Preço de venda calculado: SubTotal dividido por 100 menos a soma dos percentuais de custo variável e do percentual de margem de contribuição, sobre 100 (calculado na consulta). |
| Markup ==> | `MARKUP` | DOUBLE PRECISION |  |  | Markup: preço de venda dividido pelo total da matéria-prima (calculado na consulta). |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de planilha ativa ou inativa. Marcado grava `'2'` (inativa), desmarcado grava `'1'` (ativa); o NewRecord já entra com `'1'`. O botão Novo grava `'2'` na planilha atual antes de gerar a próxima, de modo que só a última versão fica ativa (calculado na consulta). |
| % Mat. Consumo ==> | `PERCENTUAL_MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Percentual de material de consumo sobre a matéria-prima. Digitado, mas já vem sugerido do parâmetro MATERIAL_CONSUMO da tela de parâmetros MC no NewRecord; ao sair do campo recalcula a planilha (calculado na consulta). |
| `edttotal_material_consumo` | `TOTAL_MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Valor do material de consumo: percentual de material de consumo dividido por 100, vezes o total da matéria-prima. Somente leitura (calculado na consulta). |
| `edtvalor_credito_pis_cofins` | `TOTAL_CREDITO_PIS_COFINS` | DOUBLE PRECISION |  |  | Valor do crédito de PIS e COFINS: soma da coluna PIS/COFINS das linhas da composição, calculada pelas alíquotas da classificação fiscal do material. Entra subtraindo no SubTotal e é o que distingue esta planilha da versão comum (calculado na consulta). |
| % CF s/ Faturamento ==> | `PERCENTUAL_FATURAMENTO` | DOUBLE PRECISION |  |  | Percentual de custo fixo sobre o faturamento, copiado da tela de parâmetros MC a cada recálculo. Se o valor da planilha for diferente do parâmetro, o sistema pergunta Atualizar o Percentual do Faturamento antes de trocar. Não é digitado (calculado na consulta). |
| % Lucro Previsto ==> | `LUCRO` | DOUBLE PRECISION |  |  | Lucro previsto: percentual de margem de contribuição menos o percentual de custo fixo sobre faturamento. É só indicador de tela, calculado a cada recálculo e nunca gravado no registro (calculado na consulta). |
| `edttotal_custo_padrao` | `TOTAL_CUSTO_PADRAO` | DOUBLE PRECISION |  |  | Quanto a mesma composição custaria pelo custo padrão: soma da coluna Custo Padrão das linhas. Só indicador de tela, não é gravado no registro (calculado na consulta). |
| `edtvariacao_custo_padrao` | `VARIACAO_CUSTO_PADRAO` | DOUBLE PRECISION |  |  | Variação percentual entre o custo padrão total e a matéria-prima apurada, sempre em módulo: quando o custo padrão é o maior, custo padrão dividido pela matéria-prima menos 1, vezes 100; senão 1 menos matéria-prima dividida pelo custo padrão, vezes 100. Só indicador de tela, não é gravado (calculado na consulta). |
| Exclusão Composição==> | `TOTAL_EXCLUSAO` | DOUBLE PRECISION |  |  | Valor dos materiais marcados como excluídos da composição deste produto, somando quantidade vezes PRECO_CUSTO em PRODUTO_COMPOSICAO_EXCLUSAO. Serve para mostrar o que ficou de fora do custo; só indicador de tela, não é gravado (calculado na consulta). |

### Grade `dbproduto_composicao` — tabela IT_PLANILHA_CUSTO_PRODUTO_MC

Grade inteira somente-leitura (ReadOnly no grid). O conteúdo é montado pelos botões Custo Padrão, Última Compra, Custo Médio e Novo; material repetido entre a composição direta e os subconjuntos é acumulado na mesma linha.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material da composição, vindo de PRODUTO_COMPOSICAO ou da composição dos subconjuntos. Linhas com código zero são ignoradas (calculado na consulta). |
| Descrição da Matéria Prima | `DESCRICAO_MATERIA_PRIMA` | VARCHAR(150) | 150 | Descrição do material, copiada de MATERIA_PRIMA. A grade é reordenada por esta coluna depois de montada (calculado na consulta). |
| UN | `UNIDADE_CONSUMO` | VARCHAR(3) | 3 | Unidade de consumo do material, copiada de MATERIA_PRIMA (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material por unidade do produto, somada quando o material aparece em mais de um subconjunto (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Custo unitário do material, escolhido pela regra do botão usado: Custo Padrão, Última Compra ou Custo Médio, cada um com sua ordem de recuo quando o preço preferido é zero (calculado na consulta). |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes valor unitário. A soma desta coluna é o total da matéria-prima do cabeçalho (calculado na consulta). |
| % Perc. | `PERCENTUAL_CUSTO` | DOUBLE PRECISION |  | Participação da linha no custo total da composição: 100 dividido pelo total da composição, vezes o total da linha (calculado na consulta). |
| % Icms | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do material, copiada de MATERIA_PRIMA.ICMS (calculado na consulta). |
| Valor Icms | `VALOR_ICMS` | DOUBLE PRECISION |  | Valor do ICMS da linha: alíquota dividida por 100, vezes o total da linha. Soma no crédito de ICMS do cabeçalho (calculado na consulta). |
| PIS/COFINS | `VALOR_PIS_COFINS` | DOUBLE PRECISION |  | Crédito de PIS e COFINS da linha: soma das alíquotas de PIS e COFINS da classificação fiscal do material, dividida por 100, vezes o total da linha. Soma no crédito de PIS/COFINS do cabeçalho (calculado na consulta). |
| Custo Padrão | `TOTAL_CUSTO_PADRAO` | DOUBLE PRECISION |  | Quanto a linha custaria pelo custo padrão: quantidade vezes MATERIA_PRIMA.PRECO_CUSTO, independentemente do botão usado. Serve de comparação (calculado na consulta). |
| % Variação | `VARIACAO_CUSTO_PADRAO` | DOUBLE PRECISION |  | Variação percentual entre o custo padrão da linha e o total da linha, sempre em módulo. Aponta material com preço fora do padrão (calculado na consulta). |

A grade também grava, sem exibir, `ALIQUOTA_IPI` e `VALOR_IPI`, que alimentam o IPI do cabeçalho.

### Grade `dbcusto_variavel` — tabela IT_PLANILHA_CUSTO_VARIAVEL_MC

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `CUSTO_VARIAVEL` | INTEGER |  | Código do custo variável, os custos sobre as vendas. F4 ou o botão da célula abrem a consulta; digitar o código busca o cadastro e preenche descrição e percentual. Código inexistente limpa a linha, e a linha sem cadastro válido é apagada depois do post. Quando a grade está vazia, os botões de atualização de custo carregam todos os custos variáveis cadastrados (calculado na consulta). |
| Descrição do Custo Variável | `DESCRICAO_CUSTO_VARIAVEL` | VARCHAR(50) | 50 | Descrição do custo variável, copiada do cadastro. Somente leitura (calculado na consulta). |
| % Perc. | `PERCENTUAL` | DOUBLE PRECISION |  | Percentual do custo variável sobre o preço de venda. Vem sugerido do cadastro quando ainda está zerado e pode ser alterado na linha. A soma destes percentuais forma o CDV e, junto com a margem de contribuição, é o divisor do preço de venda (calculado na consulta). |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor do custo variável: percentual dividido por 100, vezes o preço de venda. Recalculado a cada recálculo da planilha; não é digitado (calculado na consulta). |

<a id="umov_alteracao_custo_padrao_preco_venda_produto"></a>

## `umov_alteracao_custo_padrao_preco_venda_produto` — Alteração do Preço de Custo / Preço de Venda dos Produtos Acabados...

Recalcula em lote o custo e os preços de venda dos produtos acabados a partir da explosão da estrutura (soma de quantidade vezes custo dos materiais). A tela não tem cabeçalho gravável: acima da grade ficam o filtro por referência, o botão Filtrar e duas caixas de marcação soltas — "Atualizar Preço de Custo" e "Atualizar Preço de Venda" — que decidem o que o Gravar regrava em `MATERIA_PRIMA` (o produto acabado). A grade é um `TClientDataSet` de memória (`tbtemp`). Os botões coloridos "Consumidor" e "Revendedora" são apenas rótulos que agrupam as colunas de preço: as duas primeiras colunas de preço são do consumidor, as três últimas do revendedor.

### Grade `RxDBGrid1` — tabela de trabalho `tbtemp` (em memória)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto acabado trazido pelo filtro (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 | Referência do produto, usada também como filtro no topo da tela (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto (calculado na consulta). |
| Custo Atual | `PRECO_CUSTO_ATUAL` | DOUBLE PRECISION |  | Custo hoje gravado no produto. Base do cálculo de % Variação. Somente conferência, não é regravado (calculado na consulta). |
| Novo Custo | `NOVO_PRECO_CUSTO` | DOUBLE PRECISION |  | Custo recalculado pela estrutura: soma de quantidade do componente vezes custo do material. Pode ser digitado; ao mudar, recalcula o % Variação. Só vai para `MATERIA_PRIMA.PRECO_CUSTO` se "Atualizar Preço de Custo" estiver marcado (calculado na consulta). |
| % Variação | `PERCENTUAL_VARIACAO` | DOUBLE PRECISION |  | Diferença percentual entre o novo custo e o custo atual. Sempre calculado, nunca digitado; fica zero quando o custo atual é zero (calculado na consulta). |
| Markup | `MARKUP` | DOUBLE PRECISION |  | Multiplicador de formação do preço, carregado de `MATERIA_PRIMA.LUCRO`. Só age quando o produto tem `UTILIZA_PRECO_VENDA_MARKUP = '2'`: nesse caso digitar o markup recalcula o Novo Preço do revendedor como novo custo vezes markup, e daí o Novo Preço do consumidor. É gravado de volta em `LUCRO` (calculado na consulta). |
| Preço Atual (Consumidor) | `PRECO_CONSUMIDOR_ATUAL` | DOUBLE PRECISION |  | Preço de venda ao consumidor hoje gravado no produto. Somente conferência (calculado na consulta). |
| Novo Preço (Consumidor) | `NOVO_PRECO_CONSUMIDOR` | DOUBLE PRECISION |  | Novo preço ao consumidor. Com markup ligado é derivado do preço do revendedor dividido por (100 menos % Desconto); sem markup é digitado e passa a ser a base de que sai o preço do revendedor. Só vai para `PRECO_VENDA_CONSUMIDOR` se "Atualizar Preço de Venda" estiver marcado e o valor for maior que zero (calculado na consulta). |
| % Desconto | `PERCENTUAL_DESCONTO_REVENDEDOR` | DOUBLE PRECISION |  | Percentual de desconto do revendedor sobre o preço de consumidor. Digitar aqui recalcula o outro lado do par: com markup ligado recalcula o preço de consumidor, sem markup recalcula o preço de venda ao revendedor. É sempre regravado em `PERCENTUAL_DESCONTO_REVENDEDOR`, independentemente das caixas de marcação. (calculado na consulta) |
| Preço Atual (Revendedora) | `PRECO_VENDA_ATUAL` | DOUBLE PRECISION |  | Preço de venda ao revendedor hoje gravado no produto. Somente conferência (calculado na consulta). |
| Novo Preço (Revendedora) | `NOVO_PRECO_VENDA` | DOUBLE PRECISION |  | Novo preço ao revendedor. Só vai para `PRECO_VENDA` se "Atualizar Preço de Venda" estiver marcado e o valor for maior que zero; nesse caso o Gravar também carimba `DATA_ALTERACAO_PRECO_VENDA` com a data de hoje e, se o produto tiver `INTERVALO` preenchido, recalcula `PRECO_MINIMO` e `PRECO_MAXIMO` como o preço menos e mais esse percentual (calculado na consulta). |

<a id="umov_alteracao_preco_venda_produto"></a>

## `umov_alteracao_preco_venda_produto` — Alteração do Preço das Peças...

Reajusta em lote o preço de venda das peças. A tela não tem cabeçalho gravável: acima da grade ficam o filtro por grupo e subgrupo do material, o campo solto "% Reajuste" e o radiogroup `rgtipo_reajuste` — "Tipo de Reajuste" com as opções `Pelo Mark-Up` (índice 0) e `Informar o % de Reajuste` (índice 1) — que muda o sentido da coluna % Reajuste e a fórmula do novo preço. O Filtrar carrega a grade em um `TClientDataSet` de memória (`tbtemp`); o Gravar regrava `PRECO_VENDA` e `PRECO_CUSTO` em `MATERIA_PRIMA` apenas nas linhas em que o novo preço difere do atual e é maior que zero.

### Grade `dbprodutos` — tabela de trabalho `tbtemp` (em memória)

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código da peça trazida pelo filtro (calculado na consulta). |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência da peça (calculado na consulta). |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição da peça (calculado na consulta). |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade da peça, trazida do cadastro. (calculado na consulta) |
| Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  | Custo hoje gravado na peça. Somente conferência (calculado na consulta). |
| Novo Custo | `PRECO_CUSTO_REAJUSTADO` | DOUBLE PRECISION |  | Custo recalculado pela estrutura no Filtrar (soma do custo dos componentes). No tipo "Pelo Mark-Up" é a base do novo preço. Vai para `MATERIA_PRIMA.PRECO_CUSTO` no Gravar (calculado na consulta). |
| Preço Atual | `PRECO_VENDA_ATUAL` | DOUBLE PRECISION |  | Preço de venda hoje gravado na peça. É a base do cálculo no tipo "Informar o % de Reajuste" e a referência de comparação no Gravar (calculado na consulta). |
| % Reajuste | `PERCENTUAL_REAJUSTE` | DOUBLE PRECISION |  | Muda de sentido conforme o tipo de reajuste. Com "Pelo Mark-Up" guarda o **multiplicador** de markup (vem de `LUCRO` do produto) e o novo preço é novo custo vezes esse valor. Com "Informar o % de Reajuste" guarda o **percentual** (vem do campo do topo) e o novo preço é o preço atual acrescido dele — só nesse caso a coluna é exibida com o sufixo %. (calculado na consulta) |
| Novo Preço | `PRECO_VENDA_REAJUSTADO` | DOUBLE PRECISION |  | Novo preço de venda. Calculado pela regra do tipo escolhido, e repete o preço atual quando o cálculo dá zero. Pode ser digitado direto, e então o % Reajuste é recalculado para trás (razão sobre o custo no modo markup, variação percentual no modo percentual). Vai para `MATERIA_PRIMA.PRECO_VENDA` no Gravar (calculado na consulta). |

<a id="umov_planilha_custo_produto_margem_contribuicao_parametros"></a>

## `umov_planilha_custo_produto_margem_contribuicao_parametros` — Parâmetros da Planilha de Custo de Produto (MC)...

Registro único por empresa em `PLANILHA_CUSTO_PROD_MC_PAR`: guarda os percentuais padrão usados pela planilha de custo por margem de contribuição. A grade lista os custos fixos mensais que entram na conta, gravados em `IT_PLANILHA_CUSTO_PROD_MC_PAR` (só a chave do custo fixo é gravada; descrição e valor vêm de `CUSTO_FIXO`). O botão Recalcular converte a soma desses custos em percentual sobre o faturamento.

### Campos

#### Parâmetros da Planilha de Custo de Produto (MC)...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| % CF s/ Faturamento | `PERCENTUAL_FATURAMENTO` | DOUBLE PRECISION |  |  | Percentual do custo fixo sobre o faturamento, aplicado em cada planilha de custo MC. Somente leitura: só é preenchido pelo botão Recalcular, que faz soma dos valores da grade dividida por Média de Faturamento Mensal, vezes 100. |
| `edttotal` | `TOTAL` | DOUBLE PRECISION |  |  | Soma dos custos fixos mensais da grade, SUM(VALOR_PLANILHA_MC) trazida por subconsulta. Somente leitura; o sistema a mantém somando e subtraindo cada item lançado ou excluído. |

#### Procedimentos Padrão

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| % Fretes sobre Compras | `FRETE` | DOUBLE PRECISION |  |  | Percentual de frete sobre compras usado como padrão na planilha de custo MC. Digitado. |
| % Material de Consumo sobre Compras | `MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Percentual de material de consumo sobre compras usado como padrão na planilha de custo MC. Digitado. |
| Média de Faturamento Mensal R$ | `BASE_FATURAMENTO` | DOUBLE PRECISION |  |  | Faturamento médio mensal em reais. É o divisor do Recalcular: sem ele o percentual de custo fixo não fecha. Digitado. |
| % Margem de Contribuição Mínima | `MARGEM_CONTRIBUICAO_MINIMA` | DOUBLE PRECISION |  |  | Margem de contribuição mínima aceita, usada como piso na planilha de custo MC. Digitado. |

### Grade `dbplanilha_custo` — tabela IT_PLANILHA_CUSTO_PROD_MC_PAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cod. | `CUSTO_FIXO` | INTEGER |  | Código do custo fixo mensal que entra no rateio. F4 ou o botão da célula abrem a consulta de custos fixos, F3 abre o cadastro. Digitar o código dispara a busca e preenche descrição e valor; código inexistente limpa os três campos. Única coluna realmente gravada no item, junto com EMPRESA e SEQ. |
| Descrição do Custo Fixo Mensal | `DESCRICAO_CUSTO_FIXO` | VARCHAR(50) | 50 | Descrição do custo fixo, trazida de CUSTO_FIXO (calculado na consulta). Somente leitura; item que fique sem descrição é apagado logo após o post. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor mensal do custo fixo, que é o campo VALOR_PLANILHA_MC do cadastro CUSTO_FIXO. Preenchido pelo sistema junto com a descrição; alimenta o total e o Recalcular. |

SEQ é o sequencial do item, MAX(SEQ) + 1 por empresa, gerado no NewRecord e não exibido na grade.

---

# Módulo 7 — Estoques

5 telas.

<a id="umov_movimentacao_estoque"></a>

## `umov_movimentacao_estoque` — Movimentação do Estoque...

Extrato do estoque de um produto ou material: mostra, em ordem decrescente de data, tudo o que entrou e saiu e como o saldo foi ficando. A grade `dbmovimentacao_estoque` lê `MOVIMENTACAO_ESTOQUE` filtrada pela empresa e pelo produto, e não é de digitação — os lançamentos são gravados pelas telas de movimento. O acesso é restrito: quem não tem `USUARIO_SISTEMA.ADMINISTRADOR = '2'` precisa passar pela senha de prevenção, e sem ela a tela se fecha sozinha. Ao abrir, a consulta de materiais já aparece para escolher o produto.

As três caixas do topo não são ligadas a dataset e por isso não aparecem no TSV:

- **Produto/Material** (`edtcadastro`) — código do item cujo extrato se quer ver, de `MATERIA_PRIMA.CADASTRO`. O Exit recarrega o extrato. F4 ou o botão abrem a consulta de materiais, F3 abre o cadastro, F7 vai para o item anterior, F8 para o próximo, F9 e o botão localizam o mais próximo abaixo.
- **Descrição do Produto/Material** (`edtdescricao`) — descrição do item, copiada de `MATERIA_PRIMA.DESCRICAO`. Não é digitada.
- **Unidade** (`edtunidade`) — unidade de consumo do item, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Não é digitada.

A grade é dividida em três blocos, marcados pelos painéis Entrada, Saida e Saldo acima dela; por isso os títulos Quantidade, Custo Unitário e Custo Total aparecem três vezes, uma por bloco. As linhas de posição par saem em cinza, só para leitura.

### Grade `dbmovimentacao_estoque` — tabela MOVIMENTACAO_ESTOQUE

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data do lançamento. A grade é ordenada por data decrescente e, dentro do dia, por número decrescente — a primeira linha é sempre a movimentação mais recente. Somente leitura. |
| Histórico | `HISTORICO` | VARCHAR(100) | 100 | Descrição da movimentação, gravada pela tela que a originou. Nas correções feitas por esta tela vem como `'Correção do Saldo'`. Somente leitura. |
| Quantidade (Entrada) | `ENTRADA` | DOUBLE PRECISION |  | Quantidade que entrou no estoque neste lançamento. Somente leitura. |
| Custo Unitário (Entrada) | `ENTRADA_CUSTO_MEDIO` | DOUBLE PRECISION |  | Custo médio unitário da entrada. Somente leitura. |
| Custo Total (Entrada) | `ENTRADA_CUSTO_MEDIO_TOTAL` | DOUBLE PRECISION |  | Custo médio total da entrada. Somente leitura. |
| Quantidade (Saída) | `SAIDA` | DOUBLE PRECISION |  | Quantidade que saiu do estoque neste lançamento. Somente leitura. |
| Custo Unitário (Saída) | `SAIDA_CUSTO_MEDIO` | DOUBLE PRECISION |  | Custo médio unitário da saída. Somente leitura. |
| Custo Total (Saída) | `SAIDA_CUSTO_MEDIO_TOTAL` | DOUBLE PRECISION |  | Custo médio total da saída. Somente leitura. |
| Quantidade (Saldo) | `SALDO` | DOUBLE PRECISION |  | Saldo de estoque depois deste lançamento. Somente leitura. É o valor que o botão Corrigir Saldo compara com `MATERIA_PRIMA.SALDO`. |
| Custo Unitário (Saldo) | `SALDO_MEDIO` | DOUBLE PRECISION |  | Custo médio unitário do saldo depois deste lançamento. Somente leitura. |
| Custo Total (Saldo) | `SALDO_MEDIO_TOTAL` | DOUBLE PRECISION |  | Custo médio total do saldo depois deste lançamento. Somente leitura. |

A consulta traz ainda `NUMERO`, `ENTRADA_CUSTO`, `ENTRADA_TOTAL`, `SAIDA_CUSTO`, `SAIDA_TOTAL`, `SALDO_CUSTO`, `SALDO_TOTAL`, `CUSTO` e `CUSTO_MEDIO`, sem coluna visível na grade — a tela mostra os valores pelo custo médio, e o custo direto fica de fora.

O botão Corrigir Saldo age sobre a primeira linha da grade, a mais recente. Ele compara o `SALDO` dela com o `SALDO` do cadastro do produto e checa a coerência do custo médio: saldo positivo com custo médio ou total zerado, ou saldo zerado com custo médio ou total ainda positivo. Havendo divergência e confirmação do usuário, grava um novo lançamento de acerto com o histórico `'Correção do Saldo'` — entrada quando falta estoque na movimentação, saída quando sobra — e avisa "Saldo corrigido com sucesso".

<a id="umov_movimentacao_estoque_conferencia"></a>

## `umov_movimentacao_estoque_conferencia` — Movimentação do Estoque (Conferência)...

Aponta e corrige, em lote, os produtos cujo saldo em `MATERIA_PRIMA` não bate com o saldo do último lançamento em `MOVIMENTACAO_ESTOQUE`. A tela é só a grade `dbmovimentacao_estoque` e três botões: Filtrar lista as divergências, Gravar corrige todas de uma vez e Limpar esvazia a lista. Não há campos de digitação e nada na grade é editável — a consulta compara os dois saldos, arredondados a três casas, e traz apenas as linhas em que eles diferem, ordenadas por código de produto. Ao abrir, a lista vem vazia, porque a consulta é carregada com empresa zero.

O acesso é restrito: quem não tem `USUARIO_SISTEMA.ADMINISTRADOR = '2'` precisa passar pela senha de prevenção, e sem ela a tela se fecha sozinha. As linhas de posição par saem em cinza, só para leitura.

### Grade `dbmovimentacao_estoque` — tabela MATERIA_PRIMA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Produto | `PRODUTO` | INTEGER |  | Código do produto ou material com saldo divergente, vindo de `MATERIA_PRIMA.CADASTRO`. Somente leitura. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto. Somente leitura. |
| Saldo Produto | `SALDO_PRODUTO` | DOUBLE PRECISION |  | Saldo gravado no cadastro do produto, `MATERIA_PRIMA.SALDO`, convertido para três casas decimais. É o valor tomado como certo: a correção ajusta a movimentação para chegar nele (calculado na consulta). |
| Saldo Moviment. | `SALDO_MOVIMENTACAO` | DOUBLE PRECISION |  | Saldo do último lançamento do produto em `MOVIMENTACAO_ESTOQUE` — o de maior `NUMERO` —, também em três casas. É o valor considerado errado quando difere do anterior (calculado na consulta). |

O botão Filtrar recarrega a consulta com a empresa logada e avisa "Nenhum registro inconsistente localizado" quando nada diverge. O botão Gravar, confirmado, percorre todas as linhas listadas e grava para cada uma um lançamento de acerto com o histórico `'Acerto de Saldo - Movimentação do Estoque (Conferência)'` e a data do dia: entrada da diferença quando o saldo do cadastro é maior, saída da diferença em módulo quando é menor. Ao final avisa "Registro corrigidos com sucesso" e limpa a lista.

<a id="umov_inventario"></a>

## `umov_inventario` — Inventário dos Produtos

Levantamento de estoque valorizado para o registro de inventário. O cabeçalho grava em `INVENTARIO` (chave `EMPRESA` + `NUMERO`) e as linhas em `IT_INVENTARIO` (chave `EMPRESA` + `NUMERO` + `SEQ`); a grade traz ainda dados de `MATERIA_PRIMA` pelo JOIN. A tela tem o cabeçalho no topo, a grade `dbproduto` no meio e um quadro Reajuste à parte. As linhas podem ser digitadas uma a uma, geradas do saldo do cadastro pelo botão Gerar, ou lidas de um arquivo TXT de posições fixas pelo botão Importar.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do inventário. Sugerido como `MAX(NUMERO)` da empresa mais um. O botão do campo abre a consulta de inventários; F7 volta ao anterior, F8 avança, F9 e o botão localizam o mais próximo abaixo. |
| Data Inicial | `DATA_INICIAL` | TIMESTAMP |  |  | Início do período inventariado. Obrigatória: o Gravar recusa data inválida com "Data Inicial não Informada ou Inválida". |
| Data Final | `DATA_FINAL` | TIMESTAMP |  |  | Fim do período inventariado. Obrigatória: o Gravar recusa data inválida com "Data Final não Informada ou Inválida". É a data que identifica o inventário no bloco fiscal. |
| Total ==> | `TOTAL` | DOUBLE PRECISION |  |  | Valor total do inventário. Somente leitura. Calculado: cada gravação de linha soma a diferença do Total da linha, cada exclusão devolve o valor, e o Gravar refaz a conta inteira com `SUM(TOTAL)` de `IT_INVENTARIO`. |
| Tipo Item Inicial | `TIPO_ITEM_INICIAL` | INTEGER |  |  | Primeiro tipo de item do intervalo usado pelo botão Gerar. Não filtra a grade nem o que já está lançado: serve só para escolher que produtos o Gerar vai trazer. Obrigatório no Gerar, que recusa em branco. F4 ou o botão abrem a consulta de tipos de item, F3 abre o cadastro. |
| Descrição do Tipo do Item Inicial | `DESCRICAO_TIPO_ITEM_INICIAL` | VARCHAR(50) | 50 |  | Descrição do tipo de item inicial, trazida de `TIPO_ITEM_PRODUTO.DESCRICAO` pelo Exit do código. Não é digitada. |
| Tipo Item Final | `TIPO_ITEM_FINAL` | INTEGER |  |  | Último tipo de item do intervalo usado pelo botão Gerar. Obrigatório no Gerar. Mesmas teclas do inicial. |
| Descrição do Tipo do Item Final | `DESCRICAO_TIPO_ITEM_FINAL` | VARCHAR(50) | 50 |  | Descrição do tipo de item final, trazida de `TIPO_ITEM_PRODUTO.DESCRICAO` pelo Exit do código. Não é digitada. |
| Utilizar Inventário no Bloco K | `USAR_BLOCO_K` | VARCHAR(1) | 1 |  | Marca se este inventário alimenta o bloco K do SPED. Caixa de marcação: marcada grava `'2'`, desmarcada grava `'1'`. Nasce desmarcada, com `'1'`, no NewRecord. |

### Grade `dbproduto` — tabela IT_INVENTARIO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Produto | `PRODUTO` | INTEGER |  | Código do produto ou material inventariado. F4 ou o botão da célula abrem a consulta de materiais, F3 abre o cadastro. Só entra cadastro ativo `INATIVO = '1'`; inativo é recusado com "está Inativo" e limpa a linha. O mesmo produto não pode aparecer duas vezes no mesmo inventário: a gravação recusa com "já se Encontra Lançado no Inventário". |
| Referencia | `REFERENCIA` | VARCHAR(20) | 20 | Referência comercial do produto, vinda de `MATERIA_PRIMA` pelo JOIN da consulta. Não é digitada. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, copiada de `MATERIA_PRIMA.DESCRICAO` ao aceitar o código. Não é digitada. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade de consumo do produto, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Não é digitada (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade inventariada, com três casas. Obrigatória e maior que zero: a digitação recusa valor inválido ou zerado com "Quantidade do Produto Inválido" e a gravação repete a crítica. No botão Gerar vem de `MATERIA_PRIMA.SALDO`. |
| Custo Médio | `CUSTO_MEDIO` | DOUBLE PRECISION |  | Custo unitário usado na valorização, com três casas. Ao escolher o produto vem sugerido de `MATERIA_PRIMA.PRECO_CUSTO`; no botão Gerar vem de `COMPRA_CUSTO_MEDIO`, e só cai para `PRECO_CUSTO` quando aquele é zero. Obrigatório e maior que zero, com as mesmas críticas da quantidade. É o campo que o quadro Reajuste altera em massa. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes o custo médio. Calculado a cada digitação de quantidade ou custo e refeito na gravação da linha. Alimenta o Total do cabeçalho. |
| K | `CONTROLA_BLOCO_K` | VARCHAR(1) | 1 | Indica se o produto é controlado no bloco K, vindo de `MATERIA_PRIMA`. Não é digitado. A coluna não mostra texto: `'2'` desenha o ícone de marcado, qualquer outro valor fica em branco. |
| Tipo Item | `TIPO_ITEM_PRODUTO` | INTEGER |  | Tipo de item fiscal do produto, vindo de `MATERIA_PRIMA`. Não é digitado; é o campo que o intervalo Tipo Item Inicial e Final usa para selecionar os produtos no Gerar. |
| Descrição do Tipo do item | `DESCRICAO_TIPO_ITEM_PRODUTO` | VARCHAR(50) | 50 | Descrição do tipo de item, vinda de `TIPO_ITEM_PRODUTO.DESCRICAO`. Não é digitada. |

### Quadro Reajuste

Três controles fora do dataset, que não aparecem no TSV, e o botão Reajustar:

- **Tipo Item** (`edttipo_item`) — limita o reajuste aos produtos de um tipo de item. Em branco, reajusta todas as linhas do inventário.
- **Descrição do Tipo do Item** (`edtdescricao_tipo_item`) — descrição do tipo escolhido. Não é digitada.
- **% Reajuste** (`edtpercentual_reajuste`) — percentual a aplicar. Obrigatório e numérico: o Reajustar recusa zero e valor inválido.

Reajustar exige o inventário já gravado — com registro novo em tela ele avisa "Gravar o registro antes de efetuar o reajuste". Confirmado, ele aplica o percentual sobre `CUSTO_MEDIO` das linhas, recalcula `TOTAL = CUSTO_MEDIO * QUANTIDADE` e regrava o `TOTAL` do cabeçalho pela soma das linhas.

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada no NewRecord e `SEQ` da linha recebe o maior `SEQ` do inventário mais um. `LAST_TOTAL` guarda o total já somado ao cabeçalho, para que a regravação some só a diferença e a exclusão devolva o valor certo. O botão Gerar traz os produtos com `CONTROLA_ESTOQUE = '2'`, `INATIVO = '1'` e `SALDO > 0` dentro do intervalo de tipo de item. O botão Importar lê um TXT de posições fixas — código nas colunas 1 a 10, descrição na 12, unidade na 163, quantidade na 167 e custo médio na 181 — e acusa por linha código inexistente, estoque zerado e custo zerado ou inválido.

<a id="umov_inventario_mensal"></a>

## `umov_inventario_mensal` — Registro de Inventário Mensal

Inventário fechado por mês e ano. O cabeçalho grava em `INVENTARIO_MENSAL` (chave `EMPRESA` + `NUMERO`) e as linhas em `IT_INVENTARIO_MENSAL` (chave `EMPRESA` + `NUMERO` + `SEQ`); a referência do produto vem de `MATERIA_PRIMA` pelo JOIN. O cabeçalho tem duas partes: a identificação do período no topo e, embaixo, cinco valores globais que entram no total do inventário sem passar por produto. A grade `dbproduto` é dividida em dois blocos de colunas, sinalizados pelos rótulos Produtos em Elaboração e Produtos Acabados, com quantidade e totais de cada situação para o mesmo produto.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do inventário mensal. Sugerido como `MAX(NUMERO)` da empresa mais um. F7 volta ao anterior, F8 avança, F9 e o botão localizam o mais próximo abaixo. |
| Ano | `ANO` | INTEGER |  |  | Ano de referência do inventário. Obrigatório: o Gravar recusa em branco. Aceita só número inteiro; qualquer outro conteúdo é descartado na digitação e o campo fica vazio. |
| `edtdescricao_produto` | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto da linha em que a grade está posicionada, exibida por extenso acima dela porque a grade não tem coluna de descrição. Somente leitura, ligada à linha corrente de `IT_INVENTARIO_MENSAL` (calculado na consulta). |
| Matéria Prima | `VALOR_MATERIA_PRIMA` | DOUBLE PRECISION |  |  | Valor global de matéria prima em estoque no mês. Digitado direto no cabeçalho, não sai dos produtos da grade. Entra no total impresso. |
| Material Consumo | `VALOR_MATERIAL_CONSUMO` | DOUBLE PRECISION |  |  | Valor global de material de consumo em estoque no mês. Digitado direto no cabeçalho. Entra no total impresso. |
| Embalagem | `VALOR_EMBALAGEM` | DOUBLE PRECISION |  |  | Valor global de embalagens em estoque no mês. Digitado direto no cabeçalho. Entra no total impresso. |
| Adiantamento Import. | `VALOR_ADIANTAMENTO_IMPORTACAO` | DOUBLE PRECISION |  |  | Valor de adiantamentos de importação em aberto no mês. Digitado direto no cabeçalho. Entra no total impresso. |
| Outros | `VALOR_OUTROS` | DOUBLE PRECISION |  |  | Demais valores de estoque que não se encaixam nas quatro linhas acima. Digitado direto no cabeçalho. Entra no total impresso. |

O mês fica em `edtmes`, um combo ligado a `MES` que não foi captado no TSV. É lista fechada, com os doze nomes por extenso, de `'Janeiro'` a `'Dezembro'` — é assim que o valor é gravado e comparado, não como número.

### Grade `dbproduto` — tabela IT_INVENTARIO_MENSAL

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Produto | `PRODUTO` | INTEGER |  | Código do produto inventariado. F4 ou o botão da célula abrem a consulta, F3 abre o cadastro. Só entra cadastro ativo; inativo é recusado e limpa a linha. O mesmo produto não pode repetir no inventário: a gravação recusa com "já se Encontra Lançado no Inventário". Produto que não existe mais faz a linha ser apagada depois da gravação. |
| Referência do Produto | `REFERENCIA` | VARCHAR(20) | 20 | Referência comercial do produto, vinda de `MATERIA_PRIMA` pelo JOIN. Não é digitada. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade de consumo do produto, copiada do cadastro ao aceitar o código. Não é digitada (calculado na consulta). |
| R$ Custo | `PRECO_CUSTO` | DOUBLE PRECISION |  | Preço de custo unitário, com três casas. Vem sugerido de `MATERIA_PRIMA.PRECO_CUSTO` ao escolher o produto e pode ser digitado por cima. Multiplica as duas quantidades para formar os totais de custo. |
| R$ Venda | `PRECO_VENDA` | DOUBLE PRECISION |  | Preço de venda unitário, com três casas. Vem sugerido de `MATERIA_PRIMA.PRECO_VENDA` e pode ser digitado por cima; valor não numérico é recusado com "Preço de Venda do Produto Inválido". Multiplica as duas quantidades para formar os totais de venda. |
| Quantidade | `QUANTIDADE_ELABORACAO` | DOUBLE PRECISION |  | Quantidade do produto em elaboração, ou seja, ainda em processo. É a primeira das duas colunas Quantidade, a do bloco Produtos em Elaboração. Ao ser digitada recalcula os dois totais de elaboração. |
| Total Custo | `TOTAL_CUSTO_ELABORACAO` | DOUBLE PRECISION |  | Quantidade em elaboração vezes o R$ Custo. Calculado, e fica vazio quando um dos dois é zero (calculado na consulta). |
| Total Venda | `TOTAL_VENDA_ELABORACAO` | DOUBLE PRECISION |  | Quantidade em elaboração vezes o R$ Venda. Calculado, e fica vazio quando um dos dois é zero (calculado na consulta). |
| Quantidade | `QUANTIDADE_ACABADO` | DOUBLE PRECISION |  | Quantidade do produto acabado, pronto em estoque. É a segunda coluna Quantidade, a do bloco Produtos Acabados. Ao ser digitada recalcula os dois totais de acabado. |
| Total Custo | `TOTAL_CUSTO_ACABADO` | DOUBLE PRECISION |  | Quantidade acabada vezes o R$ Custo. Calculado, e fica vazio quando um dos dois é zero (calculado na consulta). |
| Total Venda | `TOTAL_VENDA_ACABADO` | DOUBLE PRECISION |  | Quantidade acabada vezes o R$ Venda. Calculado, e fica vazio quando um dos dois é zero (calculado na consulta). |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada no NewRecord e `SEQ` da linha recebe o maior `SEQ` do inventário mais um. O botão Duplicar Registro cria o inventário do mês seguinte: lê mês e ano do último registro, avança um mês — virando o ano quando passa de Dezembro para Janeiro — e copia os produtos com os preços de custo e venda, deixando as duas quantidades em branco para serem contadas. O relatório soma os totais de venda de elaboração e acabado com os cinco valores globais do cabeçalho.



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Mês | `MES` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Mês”. Função não verificada no código. |

<a id="umov_conversao_produto"></a>

## `umov_conversao_produto` — Conversão de Produtos...

Executa a conversão de um produto em outro conforme uma base de conversão previamente cadastrada, gravando o cabeçalho na tabela `CONVERSAO_PRODUTO` (chave `EMPRESA` + `NUMERO`). Não há grade: o usuário informa apenas a base de conversão, a data e a quantidade — todo o resto da tela é trazido de `BASE_CONVERSAO_PRODUTO` e mostrado desabilitado, em duas linhas: a de cima é o produto estornado, a de baixo é o produto produzido. Ao gravar uma inclusão, o programa movimenta o estoque de verdade: estorna a entrada do produto estornado, estorna as baixas de `IT_BASE_CONVERSAO_PROD_ENTRADA`, dá entrada do produto novo e baixa os materiais de `IT_BASE_CONVERSAO_PROD_SAIDA`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** **·obrig** | `NUMERO` | INTEGER |  | sim | Sequencial da conversão dentro da empresa, gerado na gravação por MAX(NUMERO)+1 sobre CONVERSAO_PRODUTO. O botão do campo abre a consulta de conversões. Parte da chave primária (PK1). Chave duplicada é tratada com o aviso de que outro usuário está usando o registro. |
| Prod. Estornado | `PRODUTO_ESTORNO` | INTEGER |  |  | Código do produto que sai do estoque, trazido da base de conversão ao informar a Base Conversão. Campo desabilitado, não digitável. Coluna de BASE_CONVERSAO_PRODUTO. |
| Descrição do Produto Estornado | `DESCRICAO_PRODUTO_ESTORNO` | VARCHAR(150) | 150 |  | Descrição do produto estornado, trazida junto com a base de conversão. Campo desabilitado, não digitável (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da conversão. Preenchida com a data de hoje no NewRecord e reposta para hoje ao entrar no campo se o conteúdo estiver inválido. A gravação recusa data inválida. |
| Base Conversão | `BASE_CONVERSAO` | INTEGER |  |  | Código da base de conversão cadastrada. É o único campo-chave que o usuário digita, e o obrigatório na gravação. Ao sair do campo, preenche sozinho Prod. Estornado, sua descrição e estoque, Prod. Produzido, sua descrição e estoque, e as referências; base inexistente limpa todos eles. F3 abre o cadastro de bases de conversão. Também é a base que define a lista de materiais entrada e saída movimentada no estoque. |
| Prod. Produzido | `PRODUTO_NOVO` | INTEGER |  |  | Código do produto que entra no estoque, trazido da base de conversão. Campo desabilitado, não digitável. Coluna de BASE_CONVERSAO_PRODUTO. |
| Descrição do Produto Produzido | `DESCRICAO_PRODUTO_NOVO` | VARCHAR(150) | 150 |  | Descrição do produto produzido, trazida junto com a base de conversão. Campo desabilitado, não digitável (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Quantidade a converter. Não pode ser zero e não pode passar do estoque do produto estornado — as duas críticas barram a gravação. É o multiplicador de toda a movimentação: cada material da base é baixado ou estornado por esta quantidade vezes a quantidade da base. Antes de gravar, o programa ainda percorre IT_BASE_CONVERSAO_PROD_SAIDA e barra a conversão se algum material não tiver saldo suficiente. |
| Estoque (produto estornado) | `ESTOQUE_ESTORNO` | DOUBLE PRECISION |  |  | Saldo atual do produto estornado, trazido da base de conversão para conferência. Campo desabilitado, não digitável, é o teto da Quantidade (calculado na consulta). |
| Estoque (produto produzido) | `ESTOQUE_NOVO` | DOUBLE PRECISION |  |  | Saldo atual do produto produzido, trazido da base de conversão para conferência. Campo desabilitado, não digitável (calculado na consulta). |
| Referência (produto estornado) | `REFERENCIA_PRODUTO_ESTORNO` | VARCHAR(20) | 20 |  | Referência do produto estornado, trazida da base de conversão. Campo desabilitado, não digitável (calculado na consulta). |
| Referência (linha do produto produzido) | `REFERENCIA_PRODUTO_ESTORNO` | VARCHAR(20) | 20 |  | Segundo controle de referência, posicionado na linha do produto produzido, mas ligado à mesma coluna do produto estornado. Pela consulta e pelo código deveria mostrar REFERENCIA_PRODUTO_NOVO. Campo desabilitado, não digitável (calculado na consulta). |

### Observações

- Nenhuma alteração é aceita depois de gravado: se o registro já existe e Base Conversão, Quantidade, Emissão, Prod. Estornado ou Prod. Produzido mudarem, a gravação é barrada com o aviso de que o estoque já foi convertido.
- Toda a movimentação de estoque acontece só na inclusão. A exclusão do registro reverte a conversão, refazendo o caminho no sentido inverso.

---

# Módulo 9 — RH

6 telas.

<a id="Ucad_cep"></a>

## `Ucad_cep` — Cadastro de Cep...

Cadastro da faixa de CEP na tabela `CEP`, chave `CADASTRO` (o próprio CEP). Tela de campo único, sem abas nem grade: o CEP é digitado com máscara e a cidade é escolhida por consulta (F4), que traz junto nome da cidade e UF. É a tabela que as telas de cliente consultam para preencher endereço a partir do CEP.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | VARCHAR(10) | 10 |  | O próprio número do CEP, digitado com máscara `##.###-###`. É a chave do registro. Obrigatório na gravação: sem ele o botão Gravar aborta com "Código do CEP". F4 abre a consulta de CEP, F7 volta um registro, F8 avança, F9 procura. |
| Nome da Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Nome da cidade. Não é digitado: o Exit de Cidade e a consulta F4 copiam `CIDADE.NOME` para cá. Fica em branco quando o código de cidade não existe. |
| Cidade | `CODIGO_CIDADE` | INTEGER |  |  | Código da cidade em `CIDADE`. F4 abre a consulta de cidades, F3 abre o cadastro de cidades. Obrigatório na gravação: sem ele o Gravar aborta com "Código Cidade". Ao sair do campo o sistema busca a cidade e preenche `CIDADE` e `ESTADO`; se não achar, limpa os três. |
| `cbestado` | `ESTADO` | VARCHAR(2) | 2 |  | Sigla da UF, combo com a lista fechada das 27 unidades da federação de AC a TO. Não é digitado: vem preenchido junto com a cidade pelo Exit de Cidade ou pela consulta F4. No NewRecord já entra com a UF da própria empresa, lida de `PARSIS.ESTADO`. Campo não listado n |

<a id="ucad_funcionario"></a>

## `ucad_funcionario` — Cadastro dos Funcionários...

Grava a ficha do funcionário na tabela FUNCIONARIO, sempre dentro da empresa corrente (EMPRESA vem de `vempresa` no NewRecord). O painel de cima traz identificação, endereço e documentos; a aba Informações Gerais traz vínculo, remuneração e dados bancários; a aba Centros de Custo grava o rateio do custo/hora em IT_CENTRO_CUSTO e a aba Eventos no Ponto grava ocorrências em IT_FUNCIONARIO_EVENTOS_PONTO. Cidade, Estado e as descrições de departamento, cargo, horário e banco vêm de LEFT JOIN (CEP, DEPARTAMENTO, CARGO, HORARIO_TRABALHO, BANCO) e não são digitadas.

### Campos

#### Cadastro dos Funcionários...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do funcionário. A tela propõe MAX(CADASTRO)+1 da empresa, mas o campo é digitável: digitar um código existente carrega aquele registro no Exit; se for maior que o último, a tela pergunta se cria novo ou reaproveita o número. F4 abre a consulta, F7/F8/F9 navegam. |
| Nome do Funcionário | `NOME` | VARCHAR(50) | 50 |  | Obrigatório no Gravar. É o texto usado como referência no log do sistema. |
| Apelido / Sobrenome | `FANTASIA` | VARCHAR(20) | 20 |  | Apelido. O NewRecord grava um espaço em branco de propósito, porque campo nulo quebra a concatenação usada nas consultas. |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcado grava `'2'` (funcionário desligado), desmarcado grava `'1'`. NewRecord inicia em `'1'`. Ao marcar com o foco na caixa, o sistema pergunta se deve excluir os rateios do funcionário nos centros de custo. A checagem de duplicidade de cartão-ponto só considera quem tem INATIVO diferente de `'2'`. |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro. NewRecord grava um espaço em branco para não deixar nulo. |
| Bairro | `BAIRRO` | VARCHAR(40) | 40 |  | Bairro. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | Obrigatório no Gravar (a mensagem fala em Cidade do Funcionário). Guarda o código da tabela CEP. Ao sair do campo busca o CEP e preenche Cidade e Estado; se não achar, limpa CEP, Cidade e Estado. F3 abre o cadastro de CEP. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Preenchido pelo sistema a partir da tabela CEP quando se sai do campo Cep. Não é digitado. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | UF, também trazida da tabela CEP junto com a cidade. Não é digitada. |
| CPF | `CPF` | VARCHAR(15) | 15 |  | Ao sair do campo o sistema tira a pontuação, exige 11 dígitos, reformata e valida o dígito verificador, recusando o valor inválido. Depois procura o CPF em outro funcionário da empresa: se achar, abandona a digitação e carrega na tela o funcionário já cadastrado. |
| RG | `RG` | VARCHAR(12) | 12 |  | Número do RG. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone fixo. NewRecord grava um espaço em branco para não deixar nulo. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Celular. NewRecord grava um espaço em branco para não deixar nulo. |
| Nº Carteira Trabalho | `CARTEIRA_TRABALHO` | VARCHAR(20) | 20 |  | Número da CTPS. |
| PIS | `PIS` | VARCHAR(15) | 15 |  | Número do PIS. |
| Nº Título Eleitor | `TITULO_ELEITOR` | VARCHAR(15) | 15 |  | Número do título de eleitor. |
| Data Nascimento | `DATA_NASCIMENTO` | TIMESTAMP |  |  | Data de nascimento. |
| `cbestado_civil` | `ESTADO_CIVIL` | VARCHAR(15) | 15 |  | Estado civil, combo à direita do painel. Grava o texto escolhido, sem tradução: `'Amaziado(a)'`, `'Casado(a)'`, `'Divorciado(a)'`, `'Solteiro(a)'` ou `'Viúvo(a)'` (o EnableValues está desligado, então a lista Values do DFM é ignorada). Campo não presente n |

#### Informações Gerais

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nome do Cônjuge | `NOME_CONJUGE` | VARCHAR(50) | 50 |  | Nome do cônjuge. |
| Departamento | `DEPARTAMENTO` | INTEGER |  |  | Obrigatório no Gravar. Código do departamento. Ao sair do campo busca em DEPARTAMENTO e preenche a descrição ao lado; código inexistente limpa os dois. F4 abre a consulta, F3 abre o cadastro de departamentos. |
| Descrição do Departamento | `DESCRICAO_DEPARTAMENTO` | VARCHAR(50) | 50 |  | Nome do departamento, trazido pelo JOIN com DEPARTAMENTO e reescrito pelo Exit do código. Não é digitado. |
| Data Admissão | `DATA_ADMISSAO` | TIMESTAMP |  |  | Data de admissão. |
| Data Demissão | `DATA_DEMISSAO` | TIMESTAMP |  |  | Data de demissão. Preenchê-la não inativa o funcionário: quem faz isso é a caixa Inativo. |
| Salário | `SALARIO` | DOUBLE PRECISION |  |  | Valor do salário. Ao sair do campo o sistema recalcula o Custo Hora Mês e replica o novo custo para todos os itens de centro de custo do funcionário. O que ele significa depende do Tipo Salário: valor da hora quando `'Por Hora'`, valor do mês quando `'Mensal'`. |
| Horário | `HORARIO` | INTEGER |  |  | Obrigatório no Gravar. Código do horário de trabalho. Exit busca em HORARIO_TRABALHO e preenche a descrição; F4 consulta, F3 abre o cadastro de horários. |
| Descrição do Horário | `DESCRICAO_HORARIO` | VARCHAR(50) | 50 |  | Descrição do horário, trazida do JOIN com HORARIO_TRABALHO. Não é digitada. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco para pagamento. Exit busca em BANCO e preenche o nome; F4 consulta, F3 abre o cadastro de bancos. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, vindo de BANCO.NOME pelo JOIN. Não é digitado (calculado na consulta). |
| Adicional Noturno | `ADICIONAL_NOTURNO` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`. NewRecord inicia em `'1'`. Com `'2'`, o cálculo do Custo Hora Mês acrescenta o PERCENTUAL_ADICIONAL_NOTURNO dos parâmetros do sistema. |
| Adicional Periculosidade | `ADICIONAL_PERICULOSIDADE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`. NewRecord inicia em `'1'`. Só fica registrado: nesta tela ele não entra no cálculo do custo/hora. |
| Adicional Insalubridade | `ADICIONAL_INSALUBRIDADE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`. NewRecord inicia em `'1'`. Com `'2'`, o custo/hora recebe (SALARIO_MINIMO dos parâmetros dividido por 100, vezes o Grau Insalub.) dividido pela Hora Mês. |
| Grau Insalub. | `GRAU_INSALUBRIDADE` | DOUBLE PRECISION |  |  | Percentual de insalubridade. Só produz efeito quando Adicional Insalubridade está marcado. |
| Observação | `OBSERVACAO` | VARCHAR(240) | 240 |  | Observações livres. NewRecord grava um espaço em branco para não deixar nulo. |
| Nome do Pai | `NOME_PAI` | VARCHAR(50) | 50 |  | Nome do pai. |
| Nome da Mãe | `NOME_MAE` | VARCHAR(50) | 50 |  | Nome da mãe. |
| Nº Cartão Ponto | `NUMERO_CARTAO_PONTO` | INTEGER |  |  | Número do cartão de ponto. Ao sair do campo o sistema procura o mesmo número em outro funcionário ativo da empresa (INATIVO diferente de `'2'`); se achar, avisa de quem é e troca a tela para aquele funcionário, descartando a digitação. |
| Nº Matrícula | `NUMERO_MATRICULA` | VARCHAR(15) | 15 |  | Matrícula do funcionário. |
| Hora Mês | `QUANTIDADE_HORAS_MENSAIS` | DOUBLE PRECISION |  |  | Quantidade de horas mensais. É o divisor do salário no cálculo do custo/hora quando o Tipo Salário é `'Mensal'`, e o divisor do adicional de insalubridade nos dois casos. Zerado, o cálculo cai na exceção e o custo/hora fica em zero. |
| Cargo | `CARGO` | INTEGER |  |  | Obrigatório no Gravar. Código do cargo. Exit busca em CARGO e preenche a descrição; F4 consulta, F3 abre o cadastro de cargos. |
| Descrição do Cargo | `DESCRICAO_CARGO` | VARCHAR(50) | 50 |  | Descrição do cargo, trazida do JOIN com CARGO. Não é digitada. |
| Agência | `AGENCIA` | VARCHAR(10) | 10 |  | Agência bancária. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(15) | 15 |  | Número da conta bancária. |
| Grau Escolar | `GRAU_ESCOLAR` | VARCHAR(25) | 25 |  | Escolaridade, em texto livre. Não há lista de opções no código. |
| Custo Hora Mês | `CUSTO_HORA_MENSAL` | DOUBLE PRECISION |  |  | Calculado pelo sistema ao sair do Salário, nunca digitado de forma confiável. Parte do salário (direto se `'Por Hora'`, dividido pela Hora Mês se `'Mensal'`), soma adicional noturno e insalubridade quando marcados e por fim aplica o PERCENTUAL_ENCARGOS_SOCIAIS dos parâmetros. O valor é copiado para cada linha de centro de custo. |
| `cbtipo_salario` | `TIPO_SALARIO` | VARCHAR(10) | 10 |  | Combo ao lado do Salário. Grava o texto `'Mensal'` ou `'Por Hora'` e decide como o Custo Hora Mês é calculado; qualquer outro conteúdo faz o cálculo não rodar. Sair do combo dispara o mesmo recálculo do Salário. Campo não presente n |

### Grade `dbcentro_custo` — tabela IT_CENTRO_CUSTO

Aba Centros de Custo. Rateio do custo/hora do funcionário entre centros de custo.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `CENTRO_CUSTO` | INTEGER |  | Código do centro de custo; o botão da célula abre a consulta. Ao sair da coluna busca em CENTRO_CUSTO, traz descrição e custo/hora e gera o SEQ como MAX(SEQ)+1 daquele centro. Obrigatório no BeforePost; depois de gravado não pode ser trocado (é preciso excluir a linha e lançar de novo). |
| Descrição do Centro de Custo | `DESCRICAO` | VARCHAR(50) | 50 | Nome do centro de custo, vindo do JOIN. Coluna somente leitura na grade. |
| Custo p/ Hora | `CUSTO_HORA_MENSAL` | DOUBLE PRECISION |  | Cópia do Custo Hora Mês do funcionário, gravada pelo sistema e reescrita em todas as linhas sempre que o Salário é alterado. Coluna somente leitura na grade. |
| % Custo Hora | `PERCENTUAL_CUSTO_HORA_MENSAL` | DOUBLE PRECISION |  | Percentual do custo/hora atribuído a este centro. Obrigatório e tem de ser maior que zero, senão o BeforePost cancela a linha. Ao gravar o funcionário, o sistema usa esses percentuais para recalcular o CUSTO_MEDIO_MAO_OBRA de cada centro de custo. |

### Grade `dbeventos_ponto` — tabela IT_FUNCIONARIO_EVENTOS_PONTO

Aba Eventos no Ponto. Ocorrências de ponto do funcionário.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data do evento. Obrigatória: o BeforePost cancela a linha se estiver vazia. |
| Histórico | `HISTORICO` | VARCHAR(100) | 100 | Descrição da ocorrência. Obrigatória: o BeforePost cancela a linha se estiver vazia. O SEQ da linha é gerado pelo sistema como MAX(SEQ)+1 do funcionário. |

<a id="ucad_horario_trabalho"></a>

## `ucad_horario_trabalho` — Cadastro dos Horários de Trabalho...

Grava as jornadas de trabalho na tabela HORARIO_TRABALHO, por empresa. É o horário que o cadastro de funcionários referencia pelo campo HORARIO. Os dois campos de identificação ficam no topo; abaixo, dois grupos separam a jornada de segunda a sexta (dois turnos, cada um com sua parada de café) da jornada de sábado (um turno e um café). Todos os horários são texto no formato HH:MM, com máscara `##:##` e validação por `strtotime`.

### Campos

#### Cadastro dos Horários de Trabalho...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do horário. Proposto como MAX(CADASTRO)+1 da empresa e regravado com esse valor na inclusão; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Horário de Trabalho | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. É o texto que aparece no cadastro de funcionários e no log do sistema. |

#### Horário de Trabalho de Segunda a Sexta

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Entrada 01 | `ENTRADA_01_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Hora de entrada do primeiro turno, no formato HH:MM. NewRecord inicia em `'00:00'`. Digitação inválida é recusada na hora pelo OnSetText e o campo volta vazio; o Gravar repete a checagem e aborta. |
| Saída 01 | `SAIDA_01_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Hora de saída do primeiro turno, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Entrada Café | `ENTRADA_CAFE_01_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Volta do café do primeiro turno (café 01), HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Saída Café | `SAIDA_CAFE_01_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Saída para o café do primeiro turno (café 01), HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Saída Café | `SAIDA_CAFE_02_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Saída para o café do segundo turno (café 02), HH:MM. O rótulo na tela é igual ao do café 01; só o nome da coluna distingue. NewRecord `'00:00'`. |
| Entrada Café | `ENTRADA_CAFE_02_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Volta do café do segundo turno (café 02), HH:MM. Rótulo repetido, igual ao do café 01. NewRecord `'00:00'`. |
| Saída 02 | `SAIDA_02_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Hora de saída do segundo turno, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Entrada 02 | `ENTRADA_02_SEGUNDA_A_SEXTA` | VARCHAR(5) | 5 |  | Hora de entrada do segundo turno, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |

#### Horário de Trabalho aos Sábados

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Entrada | `ENTRADA_SABADO` | VARCHAR(5) | 5 |  | Hora de entrada no sábado, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Saída | `SAIDA_SABADO` | VARCHAR(5) | 5 |  | Hora de saída no sábado, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Entrada Café | `ENTRADA_CAFE_SABADO` | VARCHAR(5) | 5 |  | Volta do café no sábado, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |
| Saída Café | `SAIDA_CAFE_SABADO` | VARCHAR(5) | 5 |  | Saída para o café no sábado, HH:MM. NewRecord `'00:00'`. Mesma validação de hora. |

<a id="ucad_departamento"></a>

## `ucad_departamento` — Cadastro dos Deparamentos da Empresa...

Tela de cadastro simples, sem abas nem grade. Grava na tabela `DEPARTAMENTO`, um registro por departamento, com apenas código e descrição. O registro é por empresa: o SELECT filtra por `EMPRESA` e o NewRecord grava a empresa corrente, mas esse campo não aparece na tela.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do departamento, numérico. O sistema já sugere o próximo número ao entrar na tela ou ao limpar (`MAX(CADASTRO) + 1` dentro da empresa), mas o campo é editável. Ao sair do campo: código existente carrega o registro para alteração; código inexistente e maior que o próximo da sequência abre a tela de seleção de cadastro novo, onde o usuário escolhe entre usar o próximo número da sequência ou manter o número digitado. F4 abre a consulta de departamentos; F7, F8 e F9 navegam entre os códigos. Só grava se o campo tiver conteúdo e for maior que zero — caso contrário o botão Gravar simplesmente limpa a tela sem avisar. |
| Descrição do Departamento | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do departamento. Obrigatório na gravação: o botão Gravar aborta com aviso se estiver vazio. É o texto usado no log do sistema e o índice da tela de consulta. |

<a id="ucad_cargo"></a>

## `ucad_cargo` — Cadastro dos Cargos da Empresa...

Cadastro dos cargos na tabela `CARGO`, chave `EMPRESA` + `CADASTRO`. Tela de dois campos, sem abas nem grade; é a tabela consultada pelo cadastro de funcionários.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do cargo. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta, F7/F8/F9 navegam. |
| Descrição do Cargo | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do cargo. Único campo exigido no Gravar: vazio aborta com "Descrição do Cargo". |

`EMPRESA` é preenchida pelo sistema no NewRecord com a empresa logada e não tem controle na tela.

<a id="ucad_solicitacao_emprego"></a>

## `ucad_solicitacao_emprego` — Cadastro da Solicitação de Emprego...

Ficha do candidato a emprego na tabela `SOLICITACAO_EMPREGO`, chave `EMPRESA` + `CADASTRO`. Painel principal com dados pessoais, endereço vindo do CEP, filiação e pretensão salarial; um quadro à parte guarda quatro linhas fixas de experiência profissional, gravadas em colunas numeradas da própria tabela (não há grade nem tabela de itens). O botão Imprimir gera a ficha do solicitante.

### Campos

#### Cadastro da Solicitação de Emprego...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da solicitação, chave do registro. A tela abre com o próximo número livre (maior da empresa mais um). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de solicitações. |
| Nome do Solicitante | `NOME` | VARCHAR(50) | 50 |  | Nome do candidato. Exigido no Gravar — vazio aborta com "Nome do Solicitante". |
| Inativo | `INATIVO` | VARCHAR(1) | 1 |  | Marcador de ficha fora de uso. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (ativa). |
| Endereço | `ENDERECO` | VARCHAR(50) | 50 |  | Logradouro e número. Digitado — o CEP não preenche este campo. |
| Bairro | `BAIRRO` | VARCHAR(50) | 50 |  | Bairro. Digitado — o CEP não preenche este campo. |
| Cep | `CEP` | VARCHAR(10) | 10 |  | CEP do endereço. Ao sair do campo, busca no cadastro de CEP: achando, preenche Cidade e Estado; não achando, limpa o próprio CEP, a Cidade e o Estado. Exigido no Gravar — vazio aborta, embora a mensagem diga "Cidade do Solicitante". F3 abre o cadastro de CEP. |
| Cidade | `CIDADE` | VARCHAR(50) | 50 |  | Cidade, preenchida pelo sistema a partir do CEP. O campo está desabilitado na tela: não há como digitar. |
| Estado | `ESTADO` | VARCHAR(2) | 2 |  | UF, preenchida pelo sistema a partir do CEP. O campo está desabilitado na tela: não há como digitar. |
| CPF | `CPF` | VARCHAR(15) | 15 |  | CPF do candidato. Ao sair, o campo é limpo de pontuação: com 11 dígitos é formatado e tem os dígitos verificadores conferidos; com qualquer outro tamanho, a saída é recusada com "C.P.F. inválido". Em seguida a tela procura outra solicitação da mesma empresa com o mesmo CPF e, se achar, abre aquele registro no lugar do atual — é a trava contra ficha duplicada. |
| RG | `RG` | VARCHAR(12) | 12 |  | Número do RG. Não é validado. |
| Fone | `FONE` | VARCHAR(15) | 15 |  | Telefone fixo. |
| Qualificações Profissionais | `QUALIFICACAO_PROFISSIONAL` | BLOB |  |  | Texto livre com cursos, habilidades e qualificações. Enter dentro do memo pula linha; dois Enters seguidos saem do campo. |
| Celular | `CELULAR` | VARCHAR(15) | 15 |  | Telefone celular. |
| `cbestado_civil` | `ESTADO_CIVIL` | VARCHAR(15) | 15 |  | Estado civil do candidato. Valores literais da lista: `Amaziado(a)`, `Casado(a)`, `Divorciado(a)`, `Solteiro(a)` e `Viúvo(a)` — a grafia é a do próprio cadastro. |
| Nome do Cônjuge | `NOME_CONJUGE` | VARCHAR(50) | 50 |  | Nome do cônjuge. Faz sentido apenas quando o estado civil é `Casado(a)` ou `Amaziado(a)`; a tela não bloqueia o campo nos demais casos. |
| Nome do Pai | `NOME_PAI` | VARCHAR(50) | 50 |  | Filiação — pai. |
| Nome da Mãe | `NOME_MAE` | VARCHAR(50) | 50 |  | Filiação — mãe. |
| Data Cadastro | `DATA_CADASTRO` | TIMESTAMP |  |  | Data de entrada da solicitação. O NewRecord já grava a data de hoje; ao entrar no campo, conteúdo que não seja data válida é substituído pela data de hoje. |
| Salário | `PRETENCAO_SALARIAL` | DOUBLE PRECISION |  |  | Pretensão salarial do candidato, apesar de o rótulo dizer apenas "Salário". |
| Cargo Pretendido | `CARGO_PRETENDIDO` | INTEGER |  |  | Código do cargo pretendido, vindo do cadastro de cargos. Botão abre a consulta de cargos, F3 abre o cadastro. Ao sair, busca o cargo: achando, preenche a descrição; não achando, limpa código e descrição. |
| Descrição do Cargo Pretendido | `DESCRICAO_CARGO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo Cargo Pretendido. Não é digitado (calculado na consulta). |
| Data Nascimento | `DATA_NASCIMENTO` | TIMESTAMP |  |  | Data de nascimento do candidato. |
| Grau Escolar | `GRAU_ESCOLAR` | VARCHAR(70) | 70 |  | Escolaridade, texto livre — não há lista de valores nesta tela. |
| Profissão Atual | `PROFISSAO` | VARCHAR(50) | 50 |  | Profissão que o candidato exerce hoje, texto livre. |
| Naturalidade | `NATURALIDADE` | VARCHAR(50) | 50 |  | Cidade ou estado de nascimento. Fica no painel principal, embora seja o último campo na ordem da tela. |

#### Experiência Profissional

Quatro linhas fixas, gravadas em trios de colunas numeradas `_01` a `_04` da própria `SOLICITACAO_EMPREGO`. Só a primeira linha tem rótulos na tela; as três seguintes repetem a mesma sequência sob os mesmos títulos.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Nome da Empresa | `NOME_EMPRESA_01` | VARCHAR(50) | 50 |  | Empresa da 1ª experiência profissional. |
| Período | `PERIODO_01` | VARCHAR(50) | 50 |  | Período trabalhado na 1ª experiência, texto livre — não é campo de data. |
| Cargo / Função | `NOME_CARGO_01` | VARCHAR(50) | 50 |  | Cargo ou função exercida na 1ª experiência, digitada por extenso (não é o código do cadastro de cargos). |
| `edtnome_empresa_02` | `NOME_EMPRESA_02` | VARCHAR(50) | 50 |  | Empresa da 2ª experiência profissional. Sem rótulo na tela: fica na coluna "Nome da Empresa", segunda linha. |
| `edtperiodo_02` | `PERIODO_02` | VARCHAR(50) | 50 |  | Período da 2ª experiência. Sem rótulo na tela: coluna "Período", segunda linha. |
| `edtfuncao_02` | `NOME_CARGO_02` | VARCHAR(50) | 50 |  | Cargo ou função da 2ª experiência. Sem rótulo na tela: coluna "Cargo / Função", segunda linha. |
| `edtnome_empresa_03` | `NOME_EMPRESA_03` | VARCHAR(50) | 50 |  | Empresa da 3ª experiência profissional. Sem rótulo na tela: coluna "Nome da Empresa", terceira linha. |
| `edtperiodo_03` | `PERIODO_03` | VARCHAR(50) | 50 |  | Período da 3ª experiência. Sem rótulo na tela: coluna "Período", terceira linha. |
| `edtfuncao_03` | `NOME_CARGO_03` | VARCHAR(50) | 50 |  | Cargo ou função da 3ª experiência. Sem rótulo na tela: coluna "Cargo / Função", terceira linha. |
| `edtnome_empresa_04` | `NOME_EMPRESA_04` | VARCHAR(50) | 50 |  | Empresa da 4ª experiência profissional. Sem rótulo na tela: coluna "Nome da Empresa", quarta linha. |
| `edtperiodo_04` | `PERIODO_04` | VARCHAR(50) | 50 |  | Período da 4ª experiência. Sem rótulo na tela: coluna "Período", quarta linha. |
| `edtfuncao_04` | `NOME_CARGO_04` | VARCHAR(50) | 50 |  | Cargo ou função da 4ª experiência. Sem rótulo na tela: coluna "Cargo / Função", quarta linha. |

---

# Módulo 10 — Exportação de Dados

3 telas.

<a id="umov_sped_fiscal_conferencia_bloco_k"></a>

## `umov_sped_fiscal_conferencia_bloco_k` — Conferência do Estoque...

Tela só de consulta: confronta a quantidade inventariada com o saldo de estoque na mesma data, para achar divergências antes de fechar o Bloco K. Não grava nada e não tem campos de entrada — só a grade e o botão Sair. O que conferir vem por variável global: se `vconferencia_bloco_k_numero_bloco_k` for maior que zero a tela confere um Bloco K, senão confere o inventário indicado em `vconferencia_bloco_k_numero_inventario`. As duas datas do topo (`lbldata_inventario_de` e `lbldata_inventario_ate`) e o rótulo à esquerda são preenchidos no OnShow a partir de `INVENTARIO.DATA_INICIAL` e `INVENTARIO.DATA_FINAL`; o mesmo rótulo é copiado para o título da quarta coluna da grade, que por isso aparece como "Bloco K" ou "Inventário" conforme o caso.

A consulta lê `IT_INVENTARIO` do documento escolhido, junta `MATERIA_PRIMA` para descrição e referência, e busca o saldo em `MOVIMENTACAO_ESTOQUE` pelo último lançamento até a data final. O resultado sai ordenado pela diferença, para as divergências aparecerem primeiro.

### Grade `DBGrid1` — tabela MOVIMENTACAO_ESTOQUE

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Cadastro | `PRODUTO` | INTEGER |  | Código do produto inventariado, vindo de `IT_INVENTARIO.PRODUTO`. |
| Referência | `REFERENCIA` | VARCHAR(50) | 50 | Referência do produto. Na consulta desta tela ela é lida de `MATERIA_PRIMA.REFERENCIA`, pelo LEFT JOIN com o cadastro. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, apelido de `MATERIA_PRIMA.DESCRICAO` na consulta. (calculado na consulta) |
| Bloco K | `QUANTIDADE_INVENTARIO` | DOUBLE PRECISION |  | Quantidade apurada no documento conferido, ou seja, `IT_INVENTARIO.QUANTIDADE`. O título da coluna é trocado em tempo de execução: aparece "Bloco K" quando a tela foi aberta para um Bloco K e "Inventário" quando foi aberta para um inventário. (calculado na consulta) |
| Estoque | `QUANTIDADE_ESTOQUE` | DOUBLE PRECISION |  | Saldo do produto em `MOVIMENTACAO_ESTOQUE` no último lançamento até a data final do documento. É o estoque do sistema, para comparação. (calculado na consulta) |
| Diferença | `DIFERENCA` | DOUBLE PRECISION |  | Quantidade apurada menos saldo de estoque. Diferente de zero é divergência a investigar. A grade é ordenada por esta coluna, então as divergências ficam no topo. (calculado na consulta) |

<a id="umov_sped_fiscal_bloco_k_correcao"></a>

## `umov_sped_fiscal_bloco_k_correcao` — Correção de Apontamento (SPED - Bloco K)...

Grava ajustes manuais de quantidade para o Bloco K, na tabela `SPED_BLOCO_K_CORRECAO` (chave `EMPRESA` + `NUMERO`). Tela de bloco único, sem abas nem grade: um registro por correção, sempre de um produto e de uma data. É a origem da coluna Correção das três grades da tela `umov_sped_fiscal_bloco_k` — lá o valor entra como a soma de `QUANTIDADE_ENTRADA - QUANTIDADE_SAIDA` de todas as correções do produto dentro do período apurado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** **·obrig** | `NUMERO` | INTEGER |  | sim | Sequencial da correção, MAX(NUMERO) + 1 da empresa, atribuído no Limpar e de novo na gravação. Chave primária junto com EMPRESA. Digitar um número existente carrega o registro para alteração; número acima do último abre a pergunta de cadastro novo. F7 volta um registro, F8 avança, F9 procura. |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto ou material corrigido, em `MATERIA_PRIMA`. Obrigatório: sem ele o Gravar aborta com "Produto". O botão do campo abre a consulta de produtos por descrição ou referência e F3 abre o cadastro de produto. Ao sair do campo, o sistema busca o cadastro e preenche a descrição; se não achar, limpa o código e a descrição. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de `MATERIA_PRIMA.DESCRICAO` pelo Exit do campo Produto ou pela consulta. Não é digitada. (calculado na consulta) |
| Descrição da Alteração | `DESCRICAO` | VARCHAR(100) | 100 |  | Justificativa da correção, em texto livre. Obrigatória: sem ela o Gravar aborta com "Descrição". É o texto gravado como observação no log do sistema. |
| Entrada | `QUANTIDADE_ENTRADA` | DOUBLE PRECISION |  |  | Quantidade a acrescentar ao estoque do Bloco K. Excludente com Saída: ao sair do campo com valor maior que zero, o sistema zera a Saída. Valor não numérico é zerado. |
| Saida | `QUANTIDADE_SAIDA` | DOUBLE PRECISION |  |  | Quantidade a subtrair do estoque do Bloco K. Excludente com Entrada: ao sair do campo com valor maior que zero, o sistema zera a Entrada. Valor não numérico é zerado. |
| Emissão | `EMISSAO` | DATE |  |  | Data da correção, e o que decide em qual Bloco K ela entra — a apuração soma as correções entre a Data Inicial e a Data Final do período. O NewRecord preenche com a data de hoje. Validada no Gravar: data inválida aborta com "Emissão não Informada ou Inválida". |

<a id="umov_sped_fiscal_bloco_k"></a>

## `umov_sped_fiscal_bloco_k` — SPED Fiscal - Bloco K

Monta o apuramento mensal do Bloco K do SPED Fiscal. O cabeçalho fica em `SPED_BLOCO_K` (chave `EMPRESA` + `NUMERO`) e define o período apurado. Abaixo, um PageControl com três abas: **Produtos** (grade `dbprodutos` sobre `IT_SPED_BLOCO_K_PRODUTOS`, mais duas grades filhas do produto selecionado — composição e subconjuntos), **Materiais** (`IT_SPED_BLOCO_K_MATERIAIS`) e **Revenda** (`IT_SPED_BLOCO_K_REVENDA`). Nenhuma das quantidades é digitada linha a linha: F11 na aba ativa importa os itens e recalcula tudo a partir de entradas, notas, correções e composição de produto. O que separa as três abas é o `TIPO_PRODUTO_SPED` do cadastro em `MATERIA_PRIMA` — `'Produto Produzido'` vai para Produtos, `'Comercial'` para Materiais e `'Revenda'` para Revenda; em todos os casos só entram itens com `CONTROLA_BLOCO_K = '2'` e não inativos.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Data Inicial | `DATA_INICIAL` | DATE |  |  | Primeiro dia do mês apurado. O Gravar avisa "Data Inicial não corresponde com o início do mês selecionado" quando não é o primeiro dia do mês, e aborta se a data for inválida. Delimita todas as somas de entradas, notas e correções das três abas. |
| Lançar Estoque Final | `LANCAR_ESTOQUE_FINAL` | VARCHAR(1) | 1 |  | Marcador de como o estoque final dos itens é obtido. `'2'` = marcado, `'1'` = desmarcado; o NewRecord já entra com `'2'`. Com `'2'`, a importação grava em Est. Final o saldo atual de `MATERIA_PRIMA.SALDO`. Com `'1'`, o Est. Final é calculado — estoque inicial mais entradas e correção, menos vendas, terceiros, outras saídas e consumo. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da apuração, MAX(NUMERO) + 1 da empresa, atribuído no Limpar e na gravação. Chave primária junto com EMPRESA. Também é a ligação entre um mês e o anterior: o estoque inicial de cada item é lido do Bloco K de número NUMERO - 1. F7 volta, F8 avança, F9 procura. |
| Data Final | `DATA_FINAL` | DATE |  |  | Último dia do mês apurado. O Gravar avisa quando não é o fim do mês da Data Inicial e aborta se for menor que a Data Inicial. É a data passada para as rotinas de importação das três abas. |
| Calculo Consumo | `DATA_CALCULO_CONSUMO` | DATE |  |  | Data em que o consumo dos materiais foi calculado pela última vez. Não é digitada: o sistema grava a data de hoje quando a importação de materiais (F11 na aba Materiais) roda, e a limpa no NewRecord e a cada gravação de linha das grades de produtos e materiais. Campo vazio significa apuração desatualizada, e o Gravar avisa "O Consumo dos Materiais ainda não foi calculado". |

### Grade `dbprodutos` — tabela IT_SPED_BLOCO_K_PRODUTOS

Aba Produtos. Um registro por produto produzido do período. F11 (ou o link "( F11 ) Importar Produtos") grava o cabeçalho e importa todos os produtos com `CONTROLA_BLOCO_K = '2'`, `TIPO_PRODUTO_SPED = 'Produto Produzido'` e não inativos. `SEQ`, que não aparece na grade, é gerado como MAX(SEQ) + 1 no NewRecord. Das catorze colunas, só duas são alcançáveis pelo cursor — Código e Est. Final; o OnColEnter pula todas as outras. A linha inteira é pintada de vermelho quando Produção fica negativa ou quando Est. Final difere de Est. Atual.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto em `MATERIA_PRIMA`. Uma das duas colunas em que o cursor para; o botão da célula abre a consulta de produtos. Ao ser preenchido, dispara a carga do produto, que traz descrição, unidade e todas as quantidades. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, copiada de `MATERIA_PRIMA.REFERENCIA` na importação. Não é digitada. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto, copiada de `MATERIA_PRIMA.DESCRICAO` na importação. Não é digitada. |
| Un | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo do produto, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. Não é digitada. |
| Est. Inicial | `ESTOQUE_INICIAL` | DOUBLE PRECISION |  | Estoque no início do período. Não é digitado: é o Est. Final do mesmo produto no Bloco K anterior (NUMERO - 1). Fica zero no primeiro Bloco K do produto. |
| Entrada | `ENTRADA` | DOUBLE PRECISION |  | Soma calculada das quantidades entradas no período: itens de `ENTRADA` com STATUS `'Lançada'` e natureza com `CONTROLA_ESTOQUE = '2'`, mais as devoluções (notas com `NOTA_ENTRADA = '2'` e natureza que gera faturamento operacional). |
| Correção | `CORRECAO` | DOUBLE PRECISION |  | Soma calculada dos apontamentos manuais do período em `SPED_BLOCO_K_CORRECAO` — entrada menos saída — para aquele produto. É por aqui que entra o ajuste feito na tela `umov_sped_fiscal_bloco_k_correcao`. |
| Produção | `PRODUCAO` | DOUBLE PRECISION |  | Quantidade produzida no período. Nunca é digitada: é calculada a cada gravação da linha como Est. Final mais Consumo, Outras, Terceiros e Venda, menos Correção, Entrada e Est. Inicial. Valor negativo pinta a linha de vermelho — indica que as saídas não fecham com o estoque informado. |
| Venda | `VENDA` | DOUBLE PRECISION |  | Soma calculada das saídas por venda: itens de `NOTA` com STATUS `'NFE Autorizada'`, não entrada, natureza com `CONTROLA_ESTOQUE = '2'`, `GERA_FATURAMENTO_OPERACIONAL = '2'` e que não seja produção para terceiros. |
| Terceiros | `TERCEIROS` | DOUBLE PRECISION |  | Soma calculada das saídas cuja natureza de operação tem `PRODUCAO_TERCEIROS = '2'`. Separa a industrialização por conta de terceiros da venda comum. |
| Outras | `OUTRAS_SAIDAS` | DOUBLE PRECISION |  | Soma calculada das demais saídas: notas autorizadas com natureza que controla estoque mas não gera faturamento operacional nem é produção para terceiros. |
| Consumo | `CONSUMO` | DOUBLE PRECISION |  | Quantidade do próprio produto consumida como subconjunto na produção de outros produtos. Preenchida pela rotina que explode os subconjuntos; quando não há consumo, entra zero. |
| Est. Final | `ESTOQUE_FINAL` | DOUBLE PRECISION |  | Estoque no fim do período, e a única quantidade que o usuário pode digitar. Com "Lançar Estoque Final" marcado vem do saldo atual do produto; desmarcado, é calculado pelo movimento. Digitar aqui recalcula a Produção e reexplode os subconjuntos daquele produto. |
| Est. Atual | `ESTOQUE_ATUAL` | DOUBLE PRECISION |  | Saldo atual de `MATERIA_PRIMA.SALDO`, gravado apenas para conferência. Não é digitado. Diferença entre Est. Final e Est. Atual pinta a linha de vermelho. |

### Grade `dbbase_composicao` — tabela IT_SPED_BLOCO_K_COMPOSICAO

Aba Produtos, quadro "Base de Composição". Mostra os materiais da ficha técnica do produto selecionado na grade acima. O conteúdo não é digitado: a importação apaga o que houver e recopia de `PRODUTO_COMPOSICAO` por INSERT direto, gerando `ITEM` sequencial.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material que compõe o produto, copiado de `PRODUTO_COMPOSICAO.MATERIA_PRIMA`. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, copiada de `MATERIA_PRIMA.DESCRICAO` no momento da importação. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade usada na composição, copiada de `PRODUTO_COMPOSICAO.UNIDADE`. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do material por unidade produzida. É o que multiplica a produção para chegar ao consumo do material na aba Materiais. |
| % Perda | `PERCENTUAL_PERDA` | DOUBLE PRECISION |  | Percentual de perda previsto na composição, copiado de `PRODUTO_COMPOSICAO.PERCENTUAL_PERDA`. Entra no cálculo do consumo. |

### Grade `dbsubconjuntos` — tabela IT_SPED_BLOCO_K_SUBCONJUNTOS

Aba Produtos, quadro "Subconjuntos". Lista os produtos que entram como subconjunto do produto selecionado. Também é recopiado inteiro na importação, de `PRODUTO_SUBCONJUNTO_COMPOSICAO`, com `ITEM` sequencial. É essa lista que alimenta a coluna Consumo da grade de produtos.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do subconjunto, copiado de `PRODUTO_SUBCONJUNTO_COMPOSICAO.SUBCONJUNTO`. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do subconjunto, copiada de `MATERIA_PRIMA.DESCRICAO` na importação. |

### Grade `dbmateriais` — tabela IT_SPED_BLOCO_K_MATERIAIS

Aba Materiais. Um registro por material com `TIPO_PRODUTO_SPED = 'Comercial'`, `CONTROLA_BLOCO_K = '2'` e não inativo. F11 nesta aba importa os materiais **e** calcula o consumo, e é o que carimba a Data de Cálculo do Consumo no cabeçalho. Como na aba Produtos, só Código e Est. Final são alcançáveis pelo cursor.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do material em `MATERIA_PRIMA`. Coluna em que o cursor para; o botão da célula abre a consulta. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do material, copiada do cadastro na importação. Não é digitada. |
| Un | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo do material, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. |
| Est. Inicial | `ESTOQUE_INICIAL` | DOUBLE PRECISION |  | Est. Final do mesmo material no Bloco K anterior. Não é digitado. |
| Compra | `COMPRA` | DOUBLE PRECISION |  | Soma calculada das compras do período: itens de `ENTRADA` com STATUS `'Lançada'`, natureza que controla estoque e que não seja devolução de venda nem produção de terceiros. |
| Entrada | `ENTRADA` | DOUBLE PRECISION |  | Soma calculada das demais entradas do período, incluindo as devoluções. Separada da coluna Compra pelo tipo da natureza de operação. |
| Correção | `CORRECAO` | DOUBLE PRECISION |  | Soma dos apontamentos manuais de `SPED_BLOCO_K_CORRECAO` no período — entrada menos saída — para o material. |
| Venda | `VENDA` | DOUBLE PRECISION |  | Soma calculada das saídas por venda do material, mesmos critérios da aba Produtos. |
| Terceiros | `TERCEIROS` | DOUBLE PRECISION |  | Soma calculada das saídas com natureza de produção para terceiros. |
| Outras | `OUTRAS_SAIDAS` | DOUBLE PRECISION |  | Soma calculada das demais saídas do material no período. |
| Consumo | `CONSUMO` | DOUBLE PRECISION |  | Quantidade consumida na produção, calculada a partir da composição dos produtos e da quantidade produzida. É o número que a importação de materiais existe para produzir; o cursor não para nesta coluna. |
| Est. Final | `ESTOQUE_FINAL` | DOUBLE PRECISION |  | Estoque no fim do período. Única quantidade digitável da grade. Com "Lançar Estoque Final" marcado vem do saldo atual; desmarcado, é estoque inicial mais compra, entrada e correção, menos venda, terceiros, outras e consumo. |
| Est. Atual | `ESTOQUE_ATUAL` | DOUBLE PRECISION |  | Saldo atual de `MATERIA_PRIMA.SALDO`, gravado só para conferência contra o Est. Final. |

### Grade `dbrevenda` — tabela IT_SPED_BLOCO_K_REVENDA

Aba Revenda. Mesma estrutura da aba Materiais, sem a coluna Consumo, para os itens com `TIPO_PRODUTO_SPED = 'Revenda'`. F11 nesta aba importa apenas os itens de revenda. Só Código e Est. Final recebem o cursor.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do item de revenda em `MATERIA_PRIMA`. Coluna em que o cursor para; o botão abre a consulta. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do item, copiada do cadastro na importação. |
| Un | `UNIDADE` | VARCHAR(3) | 3 | Unidade de consumo do item, copiada de `MATERIA_PRIMA.UNIDADE_CONSUMO`. |
| Est. Inicial | `ESTOQUE_INICIAL` | DOUBLE PRECISION |  | Est. Final do mesmo item no Bloco K anterior. Não é digitado. |
| Compra | `COMPRA` | DOUBLE PRECISION |  | Soma calculada das compras do período, pelos mesmos critérios da aba Materiais. |
| Entrada | `ENTRADA` | DOUBLE PRECISION |  | Soma calculada das demais entradas e devoluções do período. |
| Correção | `CORRECAO` | DOUBLE PRECISION |  | Soma dos apontamentos manuais de `SPED_BLOCO_K_CORRECAO` no período para o item. |
| Venda | `VENDA` | DOUBLE PRECISION |  | Soma calculada das saídas por venda do item no período. |
| Terceiros | `TERCEIROS` | DOUBLE PRECISION |  | Soma calculada das saídas com natureza de produção para terceiros. |
| Outras | `OUTRAS_SAIDAS` | DOUBLE PRECISION |  | Soma calculada das demais saídas do item no período. |
| Est. Final | `ESTOQUE_FINAL` | DOUBLE PRECISION |  | Estoque no fim do período. Única quantidade digitável desta grade. Com "Lançar Estoque Final" marcado vem do saldo atual; desmarcado, é calculado pelo movimento. |
| Est. Atual | `ESTOQUE_ATUAL` | DOUBLE PRECISION |  | Saldo atual de `MATERIA_PRIMA.SALDO`, gravado só para conferência. |

---

# Infraestrutura e utilitários

8 telas.

<a id="ucad_favorito_tela"></a>

## `ucad_favorito_tela` — Configuração dos Favoritos...

Tela formada por uma única grade, sem campos de cabeçalho. Grava na tabela `REGISTRO_TELA_FAVORITO` a lista de telas que o usuário quer ver no menu de favoritos. A chave é empresa mais usuário mais tela, e os dois primeiros são preenchidos pelo sistema no NewRecord com a empresa e o usuário logados — não aparecem na grade. O nome da tela vem por LEFT JOIN com `TELA_SISTEMA`. Não há botão Gravar: a grade grava direto, com commit no AfterPost, e Ctrl+Del exclui a linha após confirmação.

### Grade `dbfavorito` — tabela REGISTRO_TELA_FAVORITO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Tela **·chave** | `TELA` | INTEGER |  | Código da tela do sistema que vira favorita. Parte da chave primária junto com empresa e usuário. F4 ou o botão de reticências abre a consulta de telas, filtrada por `CONSULTAR = '2'`, ou seja, só telas marcadas como consultáveis. Digitar o código direto também vale: o SetText valida contra `TELA_SISTEMA` e, se o código não existir, limpa a própria coluna e as duas seguintes. No BeforePost, ao incluir, o sistema verifica se aquela tela já está lançada para o usuário e recusa a duplicata com a mensagem "já se Encontra Lançada". |
| Nome da Tela no Sistema | `NOME_TELA` | VARCHAR(70) | 70 | Descrição oficial da tela, trazida de `TELA_SISTEMA.DESCRICAO` pelo LEFT JOIN e regravada pelo sistema sempre que o código da tela é informado. Não é digitável na prática: o ColEnter da grade pula essa coluna. |
| Nome de Exibição nos Favoritos | `NOME_EXIBICAO` | VARCHAR(25) | 25 | Texto curto que aparece no menu de favoritos. O sistema sugere a descrição da tela com só a primeira letra em maiúscula, e o usuário pode reescrever. Obrigatório: o BeforePost aborta com "Nome de Exibição da Tela Favorita não Informado ou Inválido" se ficar em branco. Note que o limite da coluna no banco, 25 caracteres, é menor que a descrição sugerida a partir de `TELA_SISTEMA`. |
| Favorito | `FAVORITO` | VARCHAR(3) | 3 | Diz se a tela fica visível no menu de favoritos. Guarda o texto literal `'Sim'` ou `'Não'` — não é código numérico. Lista de escolha com esses dois valores, e o SetText aceita também `S`, `SIM`, `N`, `NAO` em qualquer caixa, convertendo para a forma correta. O NewRecord grava `'Sim'`, ou seja, a tela recém-incluída já entra como favorita. O BeforePost recusa qualquer outro conteúdo com a mensagem "Marque como Sim ou Não para exibir esta Tela como Favorita". |

<a id="ucad_grupo_materia_prima"></a>

## `ucad_grupo_materia_prima` — Cadastro do Grupo de Matéria - Prima...

Cadastro auxiliar que grava os grupos de matéria-prima na tabela GRUPO_MATERIA_PRIMA, por empresa. Só tem os dois campos de identificação: nem inativação, nem grade, nem abas.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do grupo. Proposto pelo sistema como MAX(CADASTRO)+1 da empresa e regravado com esse valor na inclusão; digitar um código existente carrega aquele registro no Exit. F4 abre a consulta e F7/F8/F9 navegam. |
| Descrição do Grupo | `DESCRICAO` | VARCHAR(50) | 50 |  | Obrigatória no Gravar. É o único dado do cadastro e serve de referência no log do sistema. |

<a id="ucad_materiais_similares"></a>

## `ucad_materiais_similares` — Cadastro dos Materiais Similares...

Cadastro dos grupos de materiais similares — materiais que se substituem entre si e são medidos por uma unidade comum. Grava na tabela `MATERIAIS_SIMILARES`, chaveada só por `CADASTRO`, sem coluna `EMPRESA`. Tela de campo único, sem abas nem grades.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro | `CADASTRO` | INTEGER |  |  | Código sequencial do material similar. Ao limpar a tela o sistema sugere o próximo código livre (MAX(CADASTRO) + 1). Digitar um código existente carrega o registro para alteração; um código acima do último abre a seleção que pergunta se usa o próximo da sequência ou o digitado. F4 abre a consulta de similares pelo índice IDXDESCRICAO, F7/F8/F9 navegam entre registros. |
| Descrição Material Similar | `DESCRICAO` | VARCHAR(150) | 150 |  | Nome do material similar. Obrigatório na gravação: o botão Gravar aborta com mensagem de campo vazio. |
| Fator Conversão | `UNIDADE_CONVERSAO` | DOUBLE PRECISION |  |  | Fator que converte a unidade do material para a unidade comum do grupo de similares. Apesar do nome da coluna, guarda um número, não uma sigla de unidade. Obrigatório na gravação: o botão Gravar aborta se estiver vazio, com a mensagem Unidade de Conversão do Material. |

<a id="ucad_modulo_sistema"></a>

## `ucad_modulo_sistema` — Cadastro dos Módulos do Sistema

Cadastro dos módulos (áreas funcionais) do sistema, usado no controle de acesso e no licenciamento. Grava na tabela `MODULO_SISTEMA`, chaveada só por `CADASTRO` — é uma tabela global, sem coluna `EMPRESA`, ao contrário da maioria dos cadastros.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do módulo. Ao limpar a tela o sistema sugere o próximo código livre (último `CADASTRO` da tabela + 1, sem filtro de empresa). Digitar um código existente carrega o registro para alteração. F4 abre a consulta de módulos, F7/F8/F9 navegam entre registros. |
| Descrição do Módulo do Sistema | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do módulo. Obrigatório na gravação: o botão Gravar aborta com mensagem de campo vazio. |
| Bloqueado | `BLOQUEADO` | VARCHAR(1) | 1 |  | Bloqueia o módulo inteiro para os usuários. Marcado grava `'2'`, desmarcado grava `'1'`. O NewRecord inicia em `'1'` (liberado). |

<a id="ucad_subgrupo_materia_prima"></a>

## `ucad_subgrupo_materia_prima` — Cadastro do SubGrupo da Matéria - Prima...

Cadastro do subgrupo de matéria-prima na tabela `SUBGRUPO_MATERIA_PRIMA`, chave `EMPRESA` + `GRUPO` + `CADASTRO`. Painel único com quatro campos. A particularidade da tela é que o código do subgrupo é sequencial **dentro do grupo**: sem grupo informado não há número a sugerir, então o Grupo precisa ser preenchido antes do Cadastro.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do subgrupo, chave do registro junto com o grupo. A tela sugere o próximo número livre daquele grupo (maior `CADASTRO` da empresa naquele `GRUPO` mais um); com o grupo em branco o sugerido é zero. Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. F4 abre a consulta de subgrupos. |
| Descrição do SubGrupo da Matéria - Prima | `DESCRICAO` | VARCHAR(50) | 50 |  | Nome do subgrupo. Exigido no Gravar — vazio aborta com "Descrição do SubGrupo da Matéria - Prima". |
| Descrição do Grupo da Matéria - Prima | `DESCRICAO_GRUPO` | VARCHAR(50) | 50 |  | Preenchido pelo sistema ao sair do campo Grupo, com a descrição lida do cadastro de grupos de matéria-prima. Não é digitado (calculado na consulta). |
| Grupo **·chave** | `GRUPO` | INTEGER |  |  | Grupo de matéria-prima ao qual o subgrupo pertence. Exigido no Gravar — vazio aborta com "Grupo da Matéria - Prima". Botão abre a consulta de grupos, F3 abre o cadastro. Ao sair, busca o grupo: achando, regrava o código e preenche a descrição; não achando, limpa os dois. É este campo que define a faixa de numeração do Cadastro. |

<a id="ucad_tela_sistema"></a>

## `ucad_tela_sistema` — Cadastro das Telas do Sistema

Cadastro interno das telas do sistema, na tabela `TELA_SISTEMA`, chave `CADASTRO`. É a tela que registra cada janela do sistema pelo `Name` do form e amarra a ela o módulo, o bloqueio por licença e a exigência de inventário fechado. Todo form do sistema passa por `privilegio_acesso`, que lê este cadastro pelo `NAME_FORM` antes de abrir.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código da tela, chave do registro. A tela abre com o próximo número livre (maior `CADASTRO` da tabela mais um — numeração global, não por empresa). Digitar um número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o digitado. É este número que o sistema guarda em `vtela_sistema` e grava no log e na movimentação de estoque. F4 abre a consulta de telas. |
| Descrição da Tela do Sistema | `DESCRICAO` | VARCHAR(70) | 70 |  | Nome da tela para leitura humana. Exigido no Gravar — vazio aborta com "Descrição da Tela do Sistema". |
| Bloqueado | `BLOQUEADO` | VARCHAR(1) | 1 |  | Bloqueio comercial da tela. Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord inicia em `'1'` (liberada). Com `'2'`, `privilegio_acesso` recusa abrir a janela e mostra a mensagem de que a tela foi bloqueada pela Panorama Sistemas e é preciso adquirir a licença de uso. |
| Descrição do Módulo | `DESCRICAO_MODULO` |  |  |  | Preenchido pelo sistema ao sair do campo Módulo, com a descrição lida do cadastro de módulos. Não é digitado. |
| Módulo | `MODULO` | INTEGER |  |  | Módulo do sistema ao qual a tela pertence. Exigido no Gravar — vazio aborta com "Módulo do Sistema". Botão abre a consulta de módulos. Ao sair, busca o módulo: achando, regrava o código, preenche a descrição e ainda avisa na hora se aquele módulo estiver bloqueado; não achando, limpa os dois. |
| Name do Form | `NAME_FORM` | VARCHAR(70) | 70 |  | Nome do objeto form no Delphi (`frmcad_...`, `frmmov_...`). É a chave real de busca: o sistema consulta este cadastro por `NAME_FORM` ao abrir cada janela. Exigido no Gravar — vazio aborta com "Name do Form". |
| Descrição do Atalho da Tela no Menu | `DESCRICAO_TELA_MENU` | VARCHAR(120) | 120 |  | Texto do atalho da tela no menu. `privilegio_acesso` carrega este valor em `vglobal_descricao_tela_menu` quando o acesso é liberado. |
| Movimenta Estoque | `MOVIMENTA_ESTOQUE` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado grava `'1'`; o NewRecord não define valor. Com `'2'`, `privilegio_acesso` só libera a tela depois de verificar que existe inventário fechado com data final no último dia do mês anterior — é a trava que impede movimentar estoque com o mês anterior ainda em aberto. |

<a id="ucad_agenda"></a>

## `ucad_agenda` — Agenda...

Agenda de compromissos por usuário, gravada em `AGENDA` (chave `EMPRESA` + `SEQ`). A tela tem dois blocos: cinco caixas de digitação no rodapé (Usuário, Login do Usuário, Data, Hora, Histórico) e a grade `dbagenda` acima, que lista os compromissos da empresa a partir da data corrente, ordenados por data, hora e sequência. As caixas de digitação não são ligadas ao dataset — são `TComboEdit` comuns, e por isso não aparecem no TSV; o botão Gravar é que copia o conteúdo delas para os campos do registro. Elas gravam exatamente as mesmas colunas da grade, documentadas abaixo.

### Grade `dbagenda` — tabela AGENDA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Data | `DATA` | TIMESTAMP |  | Data do compromisso. Obrigatória e validada no Gravar: data anterior a hoje é recusada com "A data informada é anterior a data atual". A grade só mostra registros com `DATA` maior ou igual à data de abertura da tela. |
| Hora | `HORA` | VARCHAR(5) | 5 | Hora do compromisso, texto livre no formato HH:MM. Obrigatória no Gravar. |
| Histórico | `HISTORICO` | VARCHAR(200) | 200 | Texto do compromisso. Obrigatório no Gravar. Ao sair do campo o texto é convertido para maiúsculas preservando acentos. |
| Usuário | `USUARIO` | INTEGER |  | Código do usuário do sistema dono do compromisso. Obrigatório no Gravar. Ao sair do campo o sistema busca em `USUARIO_SISTEMA` e preenche o login ao lado; se o código não existir, limpa os dois campos. |
| Nome do Usuário | `NOME_USUARIO` | VARCHAR(50) | 50 | Login do usuário, trazido de `USUARIO_SISTEMA.LOGIN` pelo LEFT JOIN da consulta. Não é digitado: é preenchido pelo Exit do campo Usuário (calculado na consulta). |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada e `SEQ` recebe o maior `SEQ` da empresa mais um, ambos no NewRecord.

<a id="ucad_usuario_sistema"></a>

## `ucad_usuario_sistema` — Cadastro dos Usuários do Sistema...

Cadastro dos operadores do sistema na tabela `USUARIO_SISTEMA`, chave `EMPRESA` + `CADASTRO`. Painel único: identificação e senha em cima, e abaixo um bloco de caixas de marcação que definem as permissões e as preferências do usuário. Todas as caixas gravam `'2'` quando marcadas e `'1'` quando desmarcadas.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro **·chave** | `CADASTRO` | INTEGER |  |  | Código do usuário, chave do registro. A tela abre com o próximo número livre (maior existente mais um) e o regrava no Gravar quando é inclusão. Digitar número acima do último faz a tela perguntar por `frmselecao_cadastro_novo` se usa o próximo da sequência ou o número digitado. F4 consulta usuários, F7/F8/F9 navegam. |
| Login | `LOGIN` | VARCHAR(50) | 50 |  | Nome de acesso digitado na entrada do sistema. Obrigatório no Gravar, que aborta com "Login do Usuário". É o texto usado como referência no log de sistema desta tela. |
| Nome completo do Usuário | `NOME_COMPLETO` | VARCHAR(50) | 50 |  | Nome por extenso. Obrigatório no Gravar, que aborta com "Nome Completo do Usuário". |
| E-mail | `EMAIL` | VARCHAR(50) | 50 |  | Endereço de e-mail do usuário, usado como remetente nos envios feitos pelo sistema. |
| Departamento | `DEPARTAMENTO` | INTEGER |  |  | Código do departamento do usuário. Obrigatório no Gravar, que aborta com "Departamento do Usuário". F4 abre a consulta de departamentos e F5 abre o cadastro de departamento a partir daqui. |
| Descrição do Departamento | `DESCRICAO_DEPARTAMENTO` | VARCHAR(50) | 50 |  | Nome do departamento. Não é digitado: o Exit e o F4 do campo Departamento o trazem de `DEPARTAMENTO`, e o limpam junto com o código quando o departamento não existe (calculado na consulta). |
| Administrador do Sistema | `ADMINISTRADOR` | VARCHAR(1) | 1 |  | `'2'` = usuário administrador, com acesso liberado; `'1'` = usuário comum, sujeito ao controle de privilégios de tela. NewRecord grava `'1'`. |
| Utiliza Menu de Acesso a Telas Favoritas | `USA_MENU_ACESSO_FAVORITO` | VARCHAR(1) | 1 |  | `'2'` = mostra o menu de telas favoritas; `'1'` = não mostra. NewRecord grava `'1'`. |
| Responsável por Gerar o FCI | `RESPONSAVEL_FCI` | VARCHAR(1) | 1 |  | `'2'` = este usuário responde pela geração do FCI; `'1'` = não. NewRecord grava `'1'`. |
| Utiliza Chat de Mensagens | `USA_CHAT` | VARCHAR(1) | 1 |  | `'2'` = habilita o chat interno para o usuário; `'1'` = desabilita. NewRecord grava `'1'`. |
| Forçar o fechamento do Outlook antes do envio de E-mail | `MATA_PROCESSO_OUTLOOK` | VARCHAR(1) | 1 |  | `'2'` = o sistema encerra o processo do Outlook antes de disparar o e-mail; `'1'` = não interfere. NewRecord grava `'1'`. |
| Modifica Estoque dos Materiais | `MODIFICA_ESTOQUE_MATERIAIS` | VARCHAR(1) | 1 |  | Permissão para alterar saldo de estoque de material. `'2'` = pode alterar; `'1'` = não pode. NewRecord grava `'1'`. |
| Modifica Custo Médio dos Materiais | `MODIFICA_CUSTO_MEDIO_MATERIAIS` | VARCHAR(1) | 1 |  | Permissão para alterar o custo médio do material. `'2'` = pode alterar; `'1'` = não pode. NewRecord grava `'1'`. |
| Utiliza Email do Outlook | `USA_EMAIL_OUTLOOK` | VARCHAR(1) | 1 |  | `'2'` = envia pelo Outlook instalado; `'1'` = usa o envio próprio do sistema. Não recebe valor no NewRecord: nasce nulo até o usuário marcar ou desmarcar. |
| Utiliza Assinatura do Usuário no E-mail | `UTILIZA_ASSINATURA_EMAIL` | VARCHAR(1) | 1 |  | `'2'` = anexa a assinatura do usuário ao corpo do e-mail; `'1'` = não anexa. Não recebe valor no NewRecord. |
| Validar Estoque Mínimo | `VALIDAR_ESTOQUE_MINIMO` | VARCHAR(1) | 1 |  | `'2'` = o usuário recebe a crítica de estoque mínimo; `'1'` = não recebe. NewRecord grava `'1'`. |

---

# Telas auxiliares diversas

16 telas.

<a id="ucad_cliente_endereco_cobranca"></a>

## `ucad_cliente_endereco_cobranca` — Cadastro dos Clientes...

Tela auxiliar para acertar os dois endereços alternativos do cliente sem abrir o cadastro inteiro. Grava na tabela `CLIENTE` (chave `EMPRESA` + `CADASTRO`) e é chamada por outra tela: ela abre já posicionada no cliente da variável `vcliente`, entra direto em edição e não tem consulta nem navegação. O Gravar apenas confirma o post e fecha a janela — não há validação de campo obrigatório aqui. São dois quadros: Endereço de Entrega e Endereço de Cobrança.

Em ambos os quadros o CEP é o campo que puxa o resto: informado um CEP existente na tabela `CEP`, o sistema preenche código da cidade, nome da cidade, UF, código e nome do país, e então desabilita esses quatro campos, para que não sejam contrariados na mão. CEP não encontrado reabilita os quatro para digitação manual.

### Campos

#### Cadastro dos Clientes...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Razão Social / Nome do Cliente | `NOME` | VARCHAR(70) | 70 |  | Razão social ou nome do cliente aberto. Está aqui para identificar de quem são os endereços; a manutenção do nome é em `ucad_cliente`. |

#### Endereço de Entrega

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_ENTREGA` | VARCHAR(50) | 50 |  | Logradouro do endereço de entrega, usado no grupo de entrega da NF-e. |
| Bairro | `BAIRRO_ENTREGA` | VARCHAR(40) | 40 |  | Bairro do endereço de entrega. |
| Cep | `CEP_ENTREGA` | VARCHAR(10) | 10 |  | CEP de entrega. É o campo condutor do quadro: ao sair, um CEP encontrado em `CEP` preenche cidade, UF e país de entrega, desabilita esses campos e joga o foco no endereço de cobrança. F4 abre a consulta de CEP, F3 abre o cadastro de CEP. |
| Cidade | `CIDADE_ENTREGA` | VARCHAR(50) | 50 |  | Nome da cidade de entrega. Preenchido pelo CEP ou pelo código da cidade; fica desabilitado quando veio do CEP. |
| Estado | `ESTADO_ENTREGA` | VARCHAR(2) | 2 |  | Sigla da UF de entrega. Preenchida pelo CEP ou pelo código da cidade; desabilitada quando veio do CEP. |
| Número | `NUMERO_ENDERECO_ENTREGA` | VARCHAR(10) | 10 |  | Número do endereço de entrega. Único campo do quadro que o CEP nunca preenche. |
| Código Cidade | `CODIGO_CIDADE_ENTREGA` | INTEGER |  |  | Código da cidade de entrega em `CIDADE`. Preenchido pelo CEP; quando o CEP não é achado, volta a aceitar digitação e F4 abre a consulta de cidades. O Exit preenche nome da cidade e UF. |
| País | `PAIS_ENTREGA` | INTEGER |  |  | Código do país de entrega. Preenchido pelo CEP (1058 é o Brasil); desabilitado quando veio dele. F4 abre a consulta de países. |
| Nome do País | `NOME_PAIS_ENTREGA` | VARCHAR(50) | 50 |  | Nome do país de entrega, trazido junto pelo CEP ou pelo Exit do código do país. Não é digitado (calculado na consulta). |

#### Endereço de Cobrança

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Endereço | `ENDERECO_COBRANCA` | VARCHAR(50) | 50 |  | Logradouro para onde vai a cobrança (boleto, carnê) quando difere do endereço principal. |
| Bairro | `BAIRRO_COBRANCA` | VARCHAR(40) | 40 |  | Bairro do endereço de cobrança. |
| Cep | `CEP_COBRANCA` | VARCHAR(10) | 10 |  | CEP de cobrança. Mesmo comportamento do CEP de entrega: encontrado em `CEP`, preenche cidade, UF e país de cobrança, desabilita esses campos e joga o foco no botão Gravar. F4 consulta CEP, F3 abre o cadastro de CEP. |
| Cidade | `CIDADE_COBRANCA` | VARCHAR(50) | 50 |  | Nome da cidade de cobrança. Preenchido pelo CEP ou pelo código da cidade; desabilitado quando veio do CEP. |
| Estado | `ESTADO_COBRANCA` | VARCHAR(2) | 2 |  | Sigla da UF de cobrança. Preenchida pelo CEP ou pelo código da cidade; desabilitada quando veio do CEP. |
| Número | `NUMERO_ENDERECO_COBRANCA` | VARCHAR(10) | 10 |  | Número do endereço de cobrança. O CEP não preenche este campo. |
| Código Cidade | `CODIGO_CIDADE_COBRANCA` | INTEGER |  |  | Código da cidade de cobrança em `CIDADE`. Preenchido pelo CEP; sem CEP achado, aceita digitação e F4 abre a consulta de cidades. |
| País | `PAIS_COBRANCA` | INTEGER |  |  | Código do país de cobrança. Preenchido pelo CEP (1058 é o Brasil); desabilitado quando veio dele. F4 abre a consulta de países. |
| Nome do País | `NOME_PAIS_COBRANCA` | VARCHAR(50) | 50 |  | Nome do país de cobrança, trazido junto pelo CEP ou pelo Exit do código do país. Não é digitado. A coluna não pertence a `CLIENTE`; o tipo é indicação tomada de `NOTA.NOME_PAIS_COBRANCA`. (calculado na consulta) |

<a id="ucad_natureza_operacao_extensao"></a>

## `ucad_natureza_operacao_extensao` — Cadastro das Extensões de Natureza de Operação

Cadastro das extensões (sufixos) que qualificam uma natureza de operação, gravado na tabela `NATUREZA_OPERACAO_EXTENSAO`. Tela de dois campos, sem abas nem grades. É o cadastro de apoio da aba Extensões da tela `ucad_natureza_operacao`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Cadastro | `CADASTRO` | VARCHAR(3) | 3 |  | Código da extensão, digitado pelo usuário — não é sequencial, a tela não sugere próximo número. Obrigatório: o Gravar recusa a gravação com o campo vazio (mensagem "Código da Extensão"). F4 abre a consulta de extensões, F7 anterior, F8 próximo. |
| Descrição | `DESCRICAO` | VARCHAR(50) | 50 |  | Texto da extensão. Obrigatório: o Gravar recusa a gravação com o campo vazio. |

<a id="umov_cheque_recebido_cancelamento"></a>

## `umov_cheque_recebido_cancelamento` — Cancelamento dos Cheques Recebidos...

Tela de cancelamento do cheque de terceiro que voltou devolvido, gravada em `CHEQUE_RECEBIDO`. Não tem cabeçalho digitável: é só a grade dos cheques devolvidos, com nome do banco vindo por LEFT JOIN com `BANCO` e nome do cliente por LEFT JOIN com `CLIENTE`. Os botões Cancelar, Alterar e Excluir gravam apenas `DATA_CANCELAMENTO` e `STATUS` do registro corrente — nenhuma célula da grade é digitável, e a data é pedida em uma caixa à parte, com o rótulo Data Cancelamento.

Cancelar (ou duplo clique, ou Enter) exige que o cheque ainda não tenha data de cancelamento, recusa data anterior à emissão, e grava a data com `STATUS = 'Devolv\Canc'`. Alterar só troca a data, e só em cheque já cancelado. Excluir (Delete) desfaz o cancelamento: limpa a data e devolve `STATUS = 'Devolvido'`.

Três filtros em botões de rádio remontam o SELECT: Exibir Somente os Cheques Devolvidos (F7) filtra `STATUS = 'Devolvido'`, Exibir Somente os Cheques Cancelados (F8) filtra `STATUS = 'Devolv\Canc'`, e Exibir todos os Cheques Recebidos (F9) traz os dois status juntos — mesmo com esse nome, a tela nunca lista cheques pendentes, em depósito ou baixados. A grade colore a linha: azul quando já há data de cancelamento, vermelho quando o cheque está vencido e ainda não cancelado.

### Grade `DBGrid1` — tabela CHEQUE_RECEBIDO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Banco | `BANCO` | INTEGER |  | Código do banco sacado do cheque, do cadastro `BANCO`. Só leitura. Clicar no título ordena a grade por ele. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 | Nome do banco, trazido de `BANCO.NOME` pelo LEFT JOIN. Não é coluna de `CHEQUE_RECEBIDO` e não é gravado por esta tela (calculado na consulta). Clicar no título ordena por ele. |
| Agência | `AGENCIA` | VARCHAR(20) | 20 | Agência do emitente do cheque. Só leitura. Clicar no título ordena por ela. |
| Nº Conta | `NUMERO_CONTA` | VARCHAR(20) | 20 | Conta corrente do emitente do cheque. Só leitura. Clicar no título ordena por ela. |
| Nº Cheque | `NUMERO_CHEQUE` | INTEGER |  | Número impresso na folha do cheque. Só leitura. Entra na referência gravada no log do sistema a cada cancelamento. Clicar no título ordena por ele. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do cheque. Só leitura. Serve de piso para a data de cancelamento: data anterior a ela é recusada com aviso. Clicar no título ordena por ela. |
| Vecto | `VENCIMENTO` | TIMESTAMP |  | Data do bom para do cheque. Só leitura. Cheque ainda não cancelado e com vencimento anterior a hoje é desenhado em vermelho. Ordem inicial da grade e critério ao clicar no título. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor de face do cheque. Só leitura. Clicar no título ordena por ele. |
| Cancelado | `DATA_CANCELAMENTO` | TIMESTAMP |  | Data em que o cheque devolvido foi dado por cancelado. É o único campo que a tela grava, e não por digitação na grade: o botão Cancelar abre uma caixa pedindo Data Cancelamento. Vazio significa cheque apenas devolvido; preenchido significa cancelado e a linha passa a azul. Cancelar um cheque que já tem data é recusado; Alterar e Excluir só funcionam com data preenchida. |

Colunas do dataset que não aparecem na grade: `STATUS` (VARCHAR na `CHEQUE_RECEBIDO`), gravado junto com a data — `'Devolvido'` quando o cheque só voltou do banco e `'Devolv\Canc'` depois do cancelamento; `CLIENTE` e `NOME_CLIENTE`, do cliente que entregou o cheque; `TITULAR`, o emitente; e `OBSERVACAO`. O código também prevê ordenação por `DATA_DEVOLUCAO`, coluna que não está no SELECT nem na grade — esse ramo nunca é acionado.

<a id="umov_controle_interno"></a>

## `umov_controle_interno` — Controle Interno...

Documento interno de venda, usado no lugar da nota fiscal. Grava o cabeçalho em
CONTROLE_INTERNO e os itens em IT_CONTROLE_INTERNO, no máximo oito por documento. Os
totalizadores do cabeçalho (peso, volume, cubagem, R$ Produtos e R$ Total) não são digitados:
são recalculados a cada item gravado, a partir do cadastro do produto, e o BeforePost do
cabeçalho ainda soma frete, seguro e despesas e abate o desconto no R$ Total.

Os doze campos de dias formam o plano de pagamento. Ao gravar, se a natureza de operação tiver
GERA_DUPLICATA igual a '2', a tela apaga os títulos anteriores deste documento em RECEBER e
gera uma parcela por campo de dias preenchido, com documento 'CI', série 1, vencimento igual à
emissão mais os dias, valor igual ao total dos produtos dividido pelas parcelas (frete, seguro
e despesas entram na primeira), SITUACAO_TITULO 1 e a taxa de juros do parâmetro
JURO_ATRAZO_MENSAL. Em seguida abre `umov_controle_interno_vencimento` para conferência. A
geração é recusada quando o documento já tem títulos pagos, cheques em cobrança ou títulos
amarrados a borderô.

Informar o cliente abre antes a consulta de títulos em atraso dele; cliente com BLOQUEAR_VENDA
igual a '2' exige senha de prevenção, e sem a senha o código do cliente é apagado.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número do controle interno (PK1). Gerado pelo sistema como o maior NUMERO existente mais um; digitar um número existente traz o documento para alteração. Aceita 8 dígitos. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente, chave do cadastro CLIENTE. Obrigatório no Gravar. Ao sair do campo o sistema carrega do cadastro do cliente o nome, endereço, CNPJ/CPF, IE/RG, telefone, representante, comissão, plano de contas, transportadora, banco, instrução de cobrança e natureza de operação. F4 consulta clientes, F3 abre o cadastro. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente. Campo desabilitado, preenchido pelo sistema ao informar o código. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora, chave do cadastro TRANSPORTADORA. Vem preenchido do cadastro do cliente e pode ser trocado. F4 consulta, F3 abre o cadastro. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora. Campo desabilitado, preenchido pelo sistema ao informar o código. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão do documento. Nasce com a data de hoje no NewRecord. Obrigatória e validada no Gravar. É a base do cálculo dos vencimentos. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante de venda, chave do cadastro REPRESENTANTE_VENDA. Obrigatório no Gravar. Vem do cadastro do cliente e é repassado aos títulos gerados. F4 consulta, F3 abre o cadastro. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante. Campo desabilitado, preenchido pelo sistema ao informar o código. (calculado na consulta) |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete. Digitado. Entra no R$ Total pelo BeforePost e é somado à primeira parcela na geração dos vencimentos. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Digitado. Mesmo tratamento do frete. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas. Digitado. Mesmo tratamento do frete. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Soma do peso bruto dos itens, quantidade vezes o peso bruto do cadastro do produto. Campo desabilitado, calculado pelo sistema. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Soma do peso líquido dos itens, calculada da mesma forma. Campo desabilitado. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma do total dos itens, sem frete, seguro e despesas. Campo desabilitado. É o valor rateado entre as parcelas. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total geral do documento: produtos mais frete, seguro e despesas, menos desconto. Campo desabilitado, calculado no BeforePost do cabeçalho. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Nome da pessoa de contato no cliente. Texto livre. |
| Ordem de Compra | `NUMERO_PEDIDO` | VARCHAR(15) | 15 |  | Número da ordem de compra do cliente, para referência. Texto livre. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante. Vem do cadastro do cliente. Serve de base para o COMISSAO_REAL dos títulos gerados, que é o percentual reajustado pela proporção entre produtos e total. |
| Banco | `BANCO` | INTEGER |  |  | Código do banco de cobrança, chave do cadastro BANCO. Vem do cadastro do cliente. F4 consulta, F3 abre o cadastro. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco. Campo desabilitado, preenchido pelo sistema. (calculado na consulta) |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança, chave do cadastro INSTRUCAO_COBRANCA. Vem do cadastro do cliente e é copiado para cada título gerado. F4 consulta, F3 abre o cadastro. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Descrição da instrução. Campo desabilitado, preenchido pelo sistema. (calculado na consulta) |
| Observações | `OBSERVACAO` | VARCHAR(240) | 240 |  | Observações do documento, em memo de várias linhas. Texto livre. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Soma do volume dos itens, quantidade vezes o volume do cadastro do produto. Campo desabilitado, calculado pelo sistema. |
| Vencimentos | `DIAS_01` | INTEGER |  |  | Prazo em dias da 1ª parcela, contado da emissão. É o único dos doze exigido no Gravar, e só quando a natureza de operação gera duplicata. O rótulo Vencimentos vale para a fileira inteira de campos de dias. |
| `edtdias_02` | `DIAS_02` | INTEGER |  |  | Prazo em dias da 2ª parcela. Sem rótulo próprio na tela. Zero ou vazio significa que a parcela não existe. |
| `edtdias_03` | `DIAS_03` | INTEGER |  |  | Prazo em dias da 3ª parcela. Sem rótulo próprio. |
| `edtdias_04` | `DIAS_04` | INTEGER |  |  | Prazo em dias da 4ª parcela. Sem rótulo próprio. |
| `edtdias_05` | `DIAS_05` | INTEGER |  |  | Prazo em dias da 5ª parcela. Sem rótulo próprio. |
| `edtdias_06` | `DIAS_06` | INTEGER |  |  | Prazo em dias da 6ª parcela. Sem rótulo próprio. |
| `edtdias_07` | `DIAS_07` | INTEGER |  |  | Prazo em dias da 7ª parcela. Sem rótulo próprio. |
| `edtdias_08` | `DIAS_08` | INTEGER |  |  | Prazo em dias da 8ª parcela. Sem rótulo próprio. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente. Campo desabilitado, copiado do cadastro do cliente ao informar o código. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG do cliente. Campo desabilitado, copiado do cadastro. |
| Endereço | `ENDERECO_CLIENTE` | VARCHAR(151) | 151 |  | Endereço do cliente. Campo desabilitado, copiado do cadastro. |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente. Campo desabilitado, copiado do cadastro. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Soma da cubagem dos itens, quantidade vezes a cubagem do cadastro do produto. Campo desabilitado, calculado pelo sistema. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(10) | 10 |  | Código da natureza de operação, o CFOP do documento. Obrigatório no Gravar. Vem do cadastro do cliente. É ele que decide o resto: com GERA_DUPLICATA igual a '2' o documento exige o prazo da 1ª parcela e gera os títulos em RECEBER; caso contrário nenhum título é gerado. F4 consulta naturezas, F3 abre o cadastro. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da natureza de operação. Campo desabilitado, preenchido pelo sistema. (calculado na consulta) |
| `edtdias_09` | `DIAS_09` | INTEGER |  |  | Prazo em dias da 9ª parcela. Sem rótulo próprio. |
| `edtdias_10` | `DIAS_10` | INTEGER |  |  | Prazo em dias da 10ª parcela. Sem rótulo próprio. |
| `edtdias_11` | `DIAS_11` | INTEGER |  |  | Prazo em dias da 11ª parcela. Sem rótulo próprio. |
| `edtdias_12` | `DIAS_12` | INTEGER |  |  | Prazo em dias da 12ª parcela. Sem rótulo próprio. |

### Grade `RxDBGrid1` — tabela IT_CONTROLE_INTERNO

No máximo oito itens por documento. O item é recusado sem produto válido, sem quantidade, sem
valor ou sem total. A chave da linha é o SEQ, gerado no NewRecord como o maior SEQ do documento
mais um, e não aparece na grade.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto, chave do cadastro PRODUTO. Só aceita item com TIPO_PRODUTO igual a '2' (produto, não material) e INATIVO igual a '1' (ativo); fora disso a tela avisa e limpa a célula. O código 1 é aceito sem consulta, como item avulso. Informado o código, o sistema traz descrição, unidade e referência. F4 na célula abre a consulta de produtos. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do item. Vem do cadastro do produto e pode ser editada; é gravada em maiúsculas. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida. Vem do cadastro do produto, editável, gravada em maiúsculas. |
| Referência | `REFERENCIA` | VARCHAR(20) | 20 | Referência do produto, trazida do cadastro. Coluna somente leitura. Serve de crítica do lote: lote com referência diferente da do produto é recusado. |
| Lote | `LOTE` | INTEGER |  | Número do lote de produção. Só é aceito se o produto tiver CONTROLA_LOTE igual a '2', se o lote existir com TIPO_LOTE igual a 'Lote' (pré-lote é recusado) e se a referência bater. Gravar o item move a quantidade nos campos EMPENHADA e FATURADO do lote, e a quantidade não pode ultrapassar a quantidade do lote. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade do item. Obrigatória e maior que zero. Multiplica peso bruto, peso líquido, volume e cubagem do cadastro do produto para compor os totais do cabeçalho. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário. Abaixo do PRECO_MINIMO ou acima do PRECO_MAXIMO do produto, a tela mostra os três preços do cadastro e pede confirmação; recusando, volta o PRECO_VENDA. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade vezes valor, calculado no BeforePost do item. É o que alimenta o R$ Produtos e o R$ Total do cabeçalho. |

<a id="umov_controle_interno_vencimento"></a>

## `umov_controle_interno_vencimento` — Vencimento dos Títulos a Receber...

Tela de conferência e ajuste das parcelas geradas por um documento, aberta em seguida ao Gravar
do Controle Interno. Grava direto na tabela RECEBER, uma linha por parcela, com a chave do
documento (empresa, documento, cliente, número e série) fixada pelas variáveis globais que a
tela chamadora deixou preenchidas. A janela inteira é uma grade só, editável.

O NewRecord preenche a chave, numera a parcela como o maior SEQ existente mais um, copia a
emissão do documento, grava a hora, marca IMPRESSAO_DUPLICATA como '1', SITUACAO_TITULO como 1
e a taxa de juros com o parâmetro JURO_ATRAZO_MENSAL. Ao entrar na coluna Valor de uma linha
nova, o sistema sugere a diferença entre o total do documento e o que já foi distribuído nas
demais parcelas; se não faltar nada a distribuir, a tela se fecha.

O BeforePost recusa a alteração de parcela que já tenha data de recebimento, exige vencimento e
valor maior que zero, e completa o registro com plano de contas, referência, saldo igual ao
valor, ENTRADA e AVISTA iguais a '1', instrução de cobrança, representante e a comissão. Quando
o TIPO_COMISSAO do documento é 'Fatura' e há comissão, grava VALOR_COMISSAO_FATURA e marca
STATUS_COMISSAO_FATURA como 'Creditado'; caso contrário deixa os dois em branco.

### Grade `RxDBGrid1` — tabela RECEBER

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela (PK5). Gerado no NewRecord como o maior SEQ do documento mais um. Coluna pulada na navegação: não é digitada. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, copiada do documento de origem no NewRecord. Data inválida é recusada. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias entre a emissão e o vencimento. Digitar os dias calcula o vencimento (emissão mais dias); digitar o vencimento recalcula os dias. Os dois campos andam juntos. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento da parcela. Obrigatória no BeforePost e não pode ser menor que a emissão. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. Obrigatório e maior que zero. Em linha nova vem sugerido como o que falta para fechar o total do documento. Ao gravar, alimenta também o SALDO e o SALDO_LIQUIDO do título. |

<a id="umov_controle_producao_diaria_por_desenho"></a>

## `umov_controle_producao_diaria_por_desenho` — Controle de Produção Diária por Desenho...

Variante do apontamento diário de produção voltada ao desenho de peça, gravando na mesma tabela `CONTROLE_PRODUCAO_DIARIA` (chave `EMPRESA` + `NUMERO`). Não há grade: o corpo da tela traz máquina, data, cartões-ponto, desenho, lote e horário, o painel Ocorrências abre as horas perdidas em nove motivos separados, e o rodapé mostra os totais. A diferença para a tela genérica é essa: aqui as horas improdutivas são digitadas por motivo, e não como um único campo de ocorrência.

### Campos

#### Controle de Produção Diária por Desenho...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do apontamento dentro da empresa, gerado na gravação por MAX(NUMERO)+1 sobre CONTROLE_PRODUCAO_DIARIA. O botão do campo abre a consulta de apontamentos já lançados. Parte da chave primária (PK1). |
| Observação | `OBSERVACAO` | VARCHAR(300) | 300 |  | Texto livre sobre o apontamento, convertido para maiúsculas na digitação. |
| Máquina | `MAQUINA` | INTEGER |  |  | Código da máquina que produziu. Obrigatório na gravação, é a primeira crítica feita. F3 abre o cadastro de máquinas. O custo médio de mão de obra dessa máquina alimenta VALOR_MAO_OBRA no BeforePost, multiplicado pela quantidade de funcionários informados. |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de máquinas ao sair do código; máquina inexistente limpa também o código. Campo desabilitado, não digitável (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data do apontamento. A gravação exige data válida. Também define o cálculo do café: sábado usa o intervalo de café de sábado do funcionário, os demais dias usam os dois intervalos de segunda a sexta. Ao sair do campo, recalcula os totais. |
| Nº Cartão Ponto 01 | `NUMERO_CARTAO_PONTO_01` | INTEGER |  |  | Cartão-ponto do operador principal. Obrigatório na gravação. Precisa existir no cadastro de funcionários, senão avisa e limpa o campo. Ao aceitar, grava o código do funcionário em FUNCIONARIO_01, e é esse funcionário que define o horário de café descontado. |
| Desenho | `DESENHO` | VARCHAR(15) | 15 |  | Desenho de produção trabalhado, foco desta tela. F3 abre o cadastro de desenhos e o botão abre a consulta. Se houver Lote informado, a gravação compara a referência do desenho com a referência do produto do lote e avisa quando divergem. |
| Descrição do Desenho | `DESCRICAO_DESENHO` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de desenhos ao sair do código. Campo desabilitado, não digitável (calculado na consulta). |
| Lote | `LOTE` | INTEGER |  |  | Lote de produção apontado, opcional. Ao sair do campo, o programa busca o lote e preenche sozinho a descrição, o PRODUTO e a descrição do produto; lote inexistente limpa o próprio código e os três campos. F3 abre a programação de lotes. |
| Descrição do Lote | `DESCRICAO_LOTE` | VARCHAR(70) | 70 |  | Descrição do produto do lote, trazida junto com o lote. Campo desabilitado, não digitável (calculado na consulta). |
| Nº Operação | `NUMERO_OPERACAO` | INTEGER |  |  | Número da operação do roteiro executada neste apontamento. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  |  | Peças produzidas no turno para o desenho informado. |
| Hora Inicial | `HORA_INICIAL` | VARCHAR(5) | 5 |  | Início do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Ao sair do campo recalcula Total Horas, Horas Café e Produtivas. |
| Hora Final | `HORA_FINAL` | VARCHAR(5) | 5 |  | Fim do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Menor que a Hora Inicial significa virada de dia no cálculo. |
| Total Horas | `TOTAL_HORAS` | VARCHAR(5) | 5 |  | Duração bruta do turno em HH:MM, igual a Hora Final menos Hora Inicial. Inicia em 00:00. Campo desabilitado, não digitável. |
| Ocorrências | `TOTAL_HORAS_OCORRENCIAS` | VARCHAR(5) | 5 |  | Soma em HH:MM das nove horas do painel Ocorrências (programa, ferramenta, limpeza, manutenção, reposição de estoque, troca de produção, conserto, reprocesso e dispositivo). Recalculada a cada saída de um desses campos. Inicia em 00:00. Campo desabilitado, não digitável (calculado na consulta). |
| Produtivas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(5) | 5 |  | Horas efetivamente produtivas em HH:MM: Total Horas menos o café do funcionário e menos o Total de Ocorrências. Inicia em 00:00. Se der negativo, a gravação é bloqueada com o aviso para ajustar as horas de alguma ocorrência. Campo desabilitado, não digitável. |
| Horas Café | `TOTAL_HORAS_CAFE` | VARCHAR(5) | 5 |  | Minutos de café descontados do turno, em HH:MM, tirados do cadastro do funcionário do Cartão Ponto 01 e só contados quando o intervalo cai dentro do turno apontado. Inicia em 00:00. Campo desabilitado, não digitável. |
| Nº Cartão Ponto 02 | `NUMERO_CARTAO_PONTO_02` | INTEGER |  |  | Cartão-ponto do segundo operador, opcional. Se preenchido, precisa existir no cadastro e grava o código em FUNCIONARIO_02. Entra na contagem que multiplica o custo de mão de obra. |
| Nº Cartão Ponto 03 | `NUMERO_CARTAO_PONTO_03` | INTEGER |  |  | Cartão-ponto do terceiro operador, opcional. Mesma validação do 02, grava em FUNCIONARIO_03. |

#### Ocorrências

Todos os campos abaixo são horas perdidas no turno, digitadas em HH:MM. Todos iniciam em 00:00 no NewRecord, recusam valor que não seja hora válida (na digitação e na gravação) e, ao sair do campo, disparam o recálculo de Ocorrências e Produtivas.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Programa | `QUANTIDADE_HORAS_PROGRAMACAO` | VARCHAR(5) | 5 |  | Horas paradas programando a máquina. |
| Ferramenta | `QUANTIDADE_HORAS_FERRAMENTA` | VARCHAR(5) | 5 |  | Horas paradas em ajuste de ferramentas (calculado na consulta). |
| Limpeza | `QUANTIDADE_HORAS_LIMPEZA` | VARCHAR(5) | 5 |  | Horas paradas na limpeza da máquina (calculado na consulta). |
| Manutenção | `QUANTIDADE_HORAS_MANUTENCAO` | VARCHAR(5) | 5 |  | Horas paradas em manutenção (calculado na consulta). |
| Rep. Estoque | `QUANTIDADE_HORAS_REPOSICAO` | VARCHAR(5) | 5 |  | Horas paradas em reposição de estoque (calculado na consulta). |
| Tro. Produção | `QUANTIDADE_HORAS_TROCA_PRODUCAO` | VARCHAR(5) | 5 |  | Horas paradas na troca de produção, ou seja, na virada de um item para outro (calculado na consulta). |
| Conserto | `QUANTIDADE_HORAS_CONSERTO` | VARCHAR(5) | 5 |  | Horas paradas em conserto (calculado na consulta). |
| Reprocesso | `QUANTIDADE_HORAS_REPROCESSO` | VARCHAR(5) | 5 |  | Horas gastas reprocessando peças (calculado na consulta). |
| Dispositivo | `QUANTIDADE_HORAS_DISPOSITIVO` | VARCHAR(5) | 5 |  | Horas paradas em ajuste do dispositivo (calculado na consulta). |

<a id="umov_controle_producao_diaria_por_lote"></a>

## `umov_controle_producao_diaria_por_lote` — Controle de Produção Diária por Lote...

Variante do apontamento diário de produção organizada pelo lote de produção, gravando na mesma tabela `CONTROLE_PRODUCAO_DIARIA` (chave `EMPRESA` + `NUMERO`). Não há grade nem grade de itens: o corpo da tela traz máquina, data, cartões-ponto, lote e horário; o painel Ocorrências abre as horas perdidas em oito motivos; o rodapé mostra os totais calculados. Em relação à tela por desenho, esta não pede desenho, operação nem quantidade produzida, e o painel de ocorrências não tem o campo Programa.

### Campos

#### Controle de Produção Diária por Lote...

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial do apontamento dentro da empresa, gerado na gravação por MAX(NUMERO)+1 sobre CONTROLE_PRODUCAO_DIARIA. O botão do campo abre a consulta de apontamentos. Parte da chave primária (PK1). |
| Observações | `OBSERVACAO` | VARCHAR(300) | 300 |  | Texto livre sobre o apontamento, convertido para maiúsculas na digitação. |
| Máquina | `MAQUINA` | INTEGER |  |  | Código da máquina que produziu. Obrigatório na gravação. F3 abre o cadastro de máquinas e o botão abre a consulta. O custo médio de mão de obra dessa máquina alimenta VALOR_MAO_OBRA no BeforePost, multiplicado pela quantidade de cartões-ponto informados. |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro de máquinas ao sair do código; máquina inexistente limpa também o código. Campo desabilitado, não digitável (calculado na consulta). |
| Data | `EMISSAO` | TIMESTAMP |  |  | Data do apontamento. A gravação exige data válida. É ela que decide qual intervalo de café do funcionário será descontado: no sábado usa o café de sábado, nos demais dias os dois cafés de segunda a sexta. |
| Nº Cartão Ponto 01 | `NUMERO_CARTAO_PONTO_01` | INTEGER |  |  | Cartão-ponto do operador principal. Obrigatório na gravação. Precisa existir no cadastro de funcionários, senão avisa e limpa o campo. Grava o código do funcionário em FUNCIONARIO_01 e define o horário de café usado no cálculo. |
| Lote | `LOTE` | INTEGER |  |  | Lote de produção apontado, foco desta tela. Ao sair do campo o programa busca o lote e preenche sozinho a descrição e o PRODUTO; lote inexistente limpa o próprio código, a descrição e o produto. F3 abre a programação de lotes. |
| Descrição do Lote | `DESCRICAO_LOTE` | VARCHAR(70) | 70 |  | Descrição do produto do lote, trazida junto com o lote. Campo desabilitado, não digitável (calculado na consulta). |
| Hora Inicial | `HORA_INICIAL` | VARCHAR(5) | 5 |  | Início do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Ao sair do campo recalcula os totais. |
| Hora Final | `HORA_FINAL` | VARCHAR(5) | 5 |  | Fim do turno em HH:MM. Inicia em 00:00 e a gravação recusa 00:00 ou valor incompleto. Menor que a Hora Inicial significa virada de dia no cálculo. |
| Total Horas | `TOTAL_HORAS` | VARCHAR(5) | 5 |  | Duração bruta do turno em HH:MM: Hora Final menos Hora Inicial. Inicia em 00:00. Campo desabilitado, não digitável. |
| Ocorrências | `TOTAL_HORAS_OCORRENCIAS` | VARCHAR(5) | 5 |  | Soma em HH:MM das horas do painel Ocorrências. Recalculada a cada saída de um desses campos. Inicia em 00:00. Campo desabilitado, não digitável (calculado na consulta). |
| Produtivas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(5) | 5 |  | Horas efetivamente produtivas em HH:MM: Total Horas menos o café do funcionário e menos o Total de Ocorrências. Inicia em 00:00. Se der negativo, a gravação é bloqueada com o aviso para ajustar as horas de alguma ocorrência. Campo desabilitado, não digitável. |
| Horas Café | `TOTAL_HORAS_CAFE` | VARCHAR(5) | 5 |  | Minutos de café descontados do turno, em HH:MM, tirados do cadastro do funcionário do Cartão Ponto 01 e contados apenas quando o intervalo cai dentro do turno. Inicia em 00:00. Campo desabilitado, não digitável. |
| Nº Cartão Ponto 02 | `NUMERO_CARTAO_PONTO_02` | INTEGER |  |  | Cartão-ponto do segundo operador, opcional. Se preenchido, precisa existir no cadastro e grava o código em FUNCIONARIO_02. Entra na contagem que multiplica o custo de mão de obra. |
| Nº Cartão Ponto 03 | `NUMERO_CARTAO_PONTO_03` | INTEGER |  |  | Cartão-ponto do terceiro operador, opcional. Mesma validação do 02, grava em FUNCIONARIO_03. |

#### Ocorrências

Todos os campos abaixo são horas perdidas no turno, digitadas em HH:MM. Iniciam em 00:00 no NewRecord, recusam valor que não seja hora válida na digitação e na gravação e, ao sair do campo, disparam o recálculo de Ocorrências e Produtivas.

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Dispositivo | `QUANTIDADE_HORAS_DISPOSITIVO` | VARCHAR(5) | 5 |  | Horas paradas em ajuste do dispositivo (calculado na consulta). |
| Ferramenta | `QUANTIDADE_HORAS_FERRAMENTA` | VARCHAR(5) | 5 |  | Horas paradas em ajuste de ferramentas (calculado na consulta). |
| Limpeza | `QUANTIDADE_HORAS_LIMPEZA` | VARCHAR(5) | 5 |  | Horas paradas na limpeza da máquina (calculado na consulta). |
| Manutenção | `QUANTIDADE_HORAS_MANUTENCAO` | VARCHAR(5) | 5 |  | Horas paradas em manutenção (calculado na consulta). |
| Rep. Estoque | `QUANTIDADE_HORAS_REPOSICAO` | VARCHAR(5) | 5 |  | Horas paradas em reposição de estoque (calculado na consulta). |
| Tro. Produção | `QUANTIDADE_HORAS_TROCA_PRODUCAO` | VARCHAR(5) | 5 |  | Horas paradas na troca de produção, na virada de um item para outro (calculado na consulta). |
| Conserto | `QUANTIDADE_HORAS_CONSERTO` | VARCHAR(5) | 5 |  | Horas paradas em conserto (calculado na consulta). |
| Reprocesso | `QUANTIDADE_HORAS_REPROCESSO` | VARCHAR(5) | 5 |  | Horas gastas reprocessando peças (calculado na consulta). |

<a id="umov_entrada_estoque_produto"></a>

## `umov_entrada_estoque_produto` — Entrada do Estoque dos Produtos...

Lançamento manual de entrada de produtos acabados no estoque. O cabeçalho grava em `ENTRADA_ESTOQUE_PRODUTO` (chave `EMPRESA` + `NUMERO`) e os itens em `IT_ENTRADA_ESTOQUE_PRODUTO` (chave `EMPRESA` + `NUMERO` + `SEQ`). A tela é uma folha só: quatro caixas de cabeçalho no topo (Número, Funcionário, Nome do Funcionário, Emissão) e a grade de itens `RxDBGrid1` abaixo. Ao gravar o item, o próprio `BeforePost` movimenta o saldo do produto no estoque e registra a data da última movimentação com o código `'EE'`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número da entrada. Sugerido pelo sistema como `MAX(NUMERO)` da empresa mais um ao limpar a tela e no Gravar de inclusão. Digitar um número existente carrega o documento; digitar um número livre abre a escolha entre criar com o número seguinte ou com o número digitado. F7 volta para o anterior, F8 avança para o próximo, F9 e o botão localizam o mais próximo abaixo. |
| Funcionário | `FUNCIONARIO` | INTEGER |  |  | Código do funcionário responsável pela entrada. Obrigatório: o Gravar recusa em branco com aviso e devolve o foco ao campo. F4 ou o botão abrem a consulta de funcionários, F3 abre o cadastro de funcionário. |
| Nome do Funcionário | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 |  | Nome do funcionário, trazido de `FUNCIONARIO.NOME`. Não é digitado: o Exit do campo Funcionário busca o cadastro e preenche; se o código não existir, limpa os dois campos. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da entrada. Vem preenchida com a data do dia no NewRecord, e o Enter do campo repõe a data do dia se o conteúdo estiver inválido. Obrigatória: o Gravar recusa data inválida com "Data da Emissão não Informada ou Inválida". |

### Grade `RxDBGrid1` — tabela IT_ENTRADA_ESTOQUE_PRODUTO

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do item que entra no estoque. F4 ou o botão da célula abrem a consulta de estoque com o filtro `'Produto'`, F3 abre o cadastro de produto. Só é aceito o cadastro com `TIPO_PRODUTO = '2'` (produto) e `INATIVO = '1'` (ativo). `TIPO_PRODUTO = '1'` é material e é recusado com "está configurado somente como Material"; item inativo é recusado com "está inativo". Em qualquer recusa a linha é limpa. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, copiada de `PRODUTO.DESCRICAO` quando o código é aceito. Não é digitada. |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade de medida do produto, copiada do cadastro junto com a descrição. Não é digitada (calculado na consulta). |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade que entra no estoque. Ao aceitar o produto, o sistema já sugere 1 quando a quantidade está zerada. Obrigatória na prática: o AfterPost apaga a linha e avisa "Quantidade do Produto não informado" se for menor ou igual a zero. O ponto digitado nesta coluna vira vírgula. |

Campos preenchidos pelo sistema, sem controle na tela: `EMPRESA` recebe a empresa logada no NewRecord do cabeçalho e do item; `SEQ` do item recebe o maior `SEQ` do documento mais um. `LAST_PRODUTO` e `LAST_QUANTIDADE` guardam o produto e a quantidade já lançados no estoque para permitir o estorno — o BeforeDelete usa esses dois valores, e não os atuais, para devolver o saldo. Excluir o documento inteiro apaga item a item, estornando cada um.

<a id="umov_nota_fiscal_compra_alteracao"></a>

## `umov_nota_fiscal_compra_alteracao` — Alteração dos Dados da Nota Fiscal de Entrada...

Tela de manutenção de uma nota de entrada já encerrada: o cabeçalho é lido e regravado em `ENTRADA` (dataset `query1`) e os itens em `IT_ENTRADA` aparecem em grade somente-leitura. Só aceita gravar quando `STATUS` = `Lançada`; qualquer outra situação é recusada com aviso. O UPDATE alcança apenas parte do que a tela mostra — datas, valores, transportadora, tipo de frete, conhecimento de frete e plano de contas —, enquanto fornecedor, número da nota, série, natureza e segmentação aparecem desabilitados só para identificação. Gravar também regrava o `CONHECIMENTO_FRETE`, recalcula o custo médio de cada produto da nota e, quando a natureza tem `GERA_DUPLICATA` = `2`, chama a tela de vencimentos.

### Campos

#### Cabeçalho da nota

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Situação da nota, exibida sem rótulo em TDBText — somente leitura. Assume `Pendente` (nota ainda em digitação, sem títulos gerados), `Lançada` (encerrada, com estoque e Contas a Pagar gerados) e `Aberto` (reaberta quando já havia pagamentos em IT_PAGAR, caso em que os títulos são preservados). Esta tela só altera notas em `Lançada`; nas demais o Gravar avisa "Nota Fiscal <status>. Impossível alterar" e cancela. |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número interno do lançamento da entrada, não é o número da nota do fornecedor. Faz parte da chave primária de ENTRADA. É o campo de busca da tela: Enter recarrega o registro, o botão e F4 abrem a consulta de notas de compra, F7 volta, F8 avança e F9 posiciona no menor ou igual. Não é alterado aqui. |
| Fornecedor | `FORNECEDOR` | INTEGER |  |  | Código do fornecedor da nota. Controle desabilitado: exibe o valor, não entra no UPDATE desta tela. Serve de chave dos títulos em PAGAR e do estorno feito pelo Excluir. |
| Razão Social / Nome do Fornecedor | `NOME_FORNECEDOR` | VARCHAR(70) | 70 |  | Nome trazido do JOIN com FORNECEDOR, não é digitado. Controle desabilitado (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota do fornecedor. Editável. O Gravar tenta converter o conteúdo em data e, falhando, avisa "Data de Emissão não Informada ou Inválida" e aborta — obrigatória na prática. |
| Nº. Nota Fiscal | `NOTA` | INTEGER |  |  | Número impresso na nota do fornecedor. Controle desabilitado e fora do UPDATE: aqui é só identificação. Compõe a chave dos títulos em PAGAR e a chave do registro das mercadorias. |
| Recebimento | `RECEBIMENTO` | TIMESTAMP |  |  | Data de entrada física da mercadoria. Editável e validada como data no Gravar. É a data usada como emissão dos títulos e como data da última compra gravada no produto. |
| Natureza | `NATUREZA` | VARCHAR(10) | 10 |  | Código da natureza de operação. Controle desabilitado. É ele que decide o resto do fluxo: com `GERA_DUPLICATA` = `2` a tela de vencimentos é aberta ao gravar; com `TIPO_OPERACAO_MERCADORIA` = `2` o Excluir apaga o registro das mercadorias em CONTROLE_OPERACAO_MERCADORIA lançadas como `Compra/Entrada`; com `3` ele devolve o saldo das mercadorias baixadas em `Venda/Saida` antes de apagar os itens. |
| Base Subst.Trib. | `BASE_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Base de cálculo da substituição tributária da nota. Recalculada pelo sistema a cada gravação de item, como a soma das bases dos itens de IT_ENTRADA. |
| Valor Subst.Trib. | `VALOR_SUBSTITUICAO` | DOUBLE PRECISION |  |  | Valor total da substituição tributária, somado dos itens pelo sistema. Entra no total da nota. |
| Valor Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Frete cobrado na própria nota. No BeforePost a diferença em relação ao valor anterior é somada ao `TOTAL`. Também é rateado proporcionalmente sobre os itens para compor o último custo e o custo médio do produto. |
| Desc. Total | `VALOR_DESCONTO` | DOUBLE PRECISION |  |  | Desconto sobre o total da nota. No BeforePost a diferença é subtraída do `TOTAL`, e o valor é rateado nos itens para abater o custo do produto. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS da nota, somada dos itens pelo sistema. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | Valor do ICMS da nota, somado dos itens pelo sistema. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI da nota, somada dos itens pelo sistema. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | Valor do IPI da nota, somado dos itens. Entra no total da nota. |
| R$  Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Total dos produtos apurado pelo sistema pela soma dos itens, já descontado o desconto de produto. É o valor que o Gravar compara com Total Produtos. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA` | VARCHAR(70) | 70 |  | Descrição vinda do JOIN com NATUREZA_OPERACAO. Controle desabilitado (calculado na consulta). |
| R$  Nota | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota apurado pelo sistema: soma dos itens mais IPI, substituição, frete e outras despesas, menos os descontos. É o valor levado para a tela de vencimentos como total a parcelar. |
| Total Produtos | `TOTAL_PRODUTO_INF` | DOUBLE PRECISION |  |  | Total dos produtos digitado conforme a nota do fornecedor. Exigido no Gravar (não pode ser zero) e precisa bater centavo a centavo com R$ Produtos, senão a gravação é abortada com a diferença na mensagem. Serve ainda de divisor do rateio de frete, despesas e descontos no custo dos produtos. |
| Total Nota | `TOTAL_NOTA_INF` | DOUBLE PRECISION |  |  | Total da nota digitado conforme o documento do fornecedor. Exigido no Gravar e precisa bater com R$ Nota; divergindo, a tela avisa a diferença e devolve o foco para a grade de itens. |
| Outras Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Despesas acessórias da nota. A diferença em relação ao valor anterior é somada ao `TOTAL` no BeforePost e o valor é rateado no custo dos produtos. |
| Desc Produto | `VALOR_DESCONTO_PRODUTO` | DOUBLE PRECISION |  |  | Desconto concedido sobre os produtos. Além de abater `TOTAL` e `TOTAL_PRODUTO` no BeforePost, é rateado item a item em `DESCONTO_TOTAL` de IT_ENTRADA e reduz a base de IPI, ICMS e substituição. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora. O controle está desabilitado nesta tela, embora a coluna faça parte do UPDATE e o código ainda traga a consulta por F4 e o cadastro por F3. É a transportadora usada para gravar o CONHECIMENTO_FRETE e para localizar o fornecedor do título `CF`. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome vindo do JOIN com TRANSPORTADORA. Controle desabilitado; quando a transportadora é trocada, o Exit preenche ou limpa este campo (calculado na consulta). |
| Tipo de Frete | `TIPO_FRETE` | INTEGER |  |  | Código do tipo de frete no cadastro TIPO_FRETE. Editável: o botão e F4 abrem a consulta, F3 abre o cadastro e, no Exit, o sistema busca a descrição — não encontrando o código, limpa os dois campos (calculado na consulta). |
| Descrição do Tipo de Frete | `DESCRICAO_TIPO_FRETE` | VARCHAR(50) | 50 |  | Descrição do tipo de frete, preenchida automaticamente pelo Exit do campo anterior. Controle desabilitado (calculado na consulta). |

#### Conhecimento de Frete

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Base Cálculo | `BASE_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Base de cálculo do ICMS do conhecimento de frete. Ao sair do campo, o sistema recalcula Valor Icms como base dividida por 100 e multiplicada pela alíquota. |
| Valor Frete | `VALOR_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Valor do conhecimento de frete. Exigido sempre que o número do conhecimento ou o CNPJ da transportadora estiverem preenchidos. Ao gravar, vira o valor do título `CF` gerado em PAGAR para a transportadora, com vencimento em recebimento mais 30 dias e plano de contas tirado do parâmetro PLANO_CONTAS_CONHECIMENTO_FRETE. |
| Valor Icms | `VALOR_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | ICMS do conhecimento de frete. Não é digitado na prática: o Exit da base e o da alíquota o recalculam. |
| Cnpj Transportadora | `CNPJ_CPF_TRANSPORTADORA` | VARCHAR(18) | 18 |  | CNPJ ou CPF de quem emitiu o conhecimento. No Exit aceita apenas 11 dígitos (CPF) ou 14 (CNPJ), confere o dígito verificador e devolve o valor formatado. Exigido quando há conhecimento de frete informado. |
| Aliquota Icms | `ALIQUOTA_ICMS_CONHEC_FRETE` | DOUBLE PRECISION |  |  | Alíquota do ICMS do frete, em percentual. No Exit dispara o recálculo de Valor Icms. |
| Número | `NUMERO_CONHEC_FRETE` | VARCHAR(25) | 25 |  | Número do conhecimento de frete. Controle desabilitado nesta tela. Se preenchido, o Gravar exige transportadora cadastrada, valor do frete e CNPJ, e recusa a gravação quando o mesmo número já foi lançado para aquela transportadora em outra entrada. |

#### Cabeçalho da nota (continuação)

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Plano Contas | `PLANO_CONTAS` | VARCHAR(20) | 20 |  | Conta de despesa da compra. Obrigatório no Gravar e só aceita plano de contas cujo `TIPO` seja `Analítico` — sendo Sintético a gravação é abortada com aviso. O botão e F4 abrem a consulta, F3 o cadastro e o Exit traz a descrição. Observação do código: a alteração aqui não é propagada para os títulos já gerados em PAGAR, por causa do orçamento de gasto fixo mensal. |
| Descrição do Plano de Contas | `DESCRICAO_PLANO_CONTAS` | VARCHAR(50) | 50 |  | Descrição trazida do cadastro pelo Exit do plano de contas. Controle desabilitado (calculado na consulta). |
| Série | `SERIE` | VARCHAR(5) | 5 |  | Série da nota do fornecedor. Controle desabilitado e fora do UPDATE. Compõe a chave dos títulos em PAGAR, do registro das mercadorias e da última compra gravada no produto. |
| Segmentação | `SEGMENTACAO` | INTEGER |  |  | Código de segmentação da entrada. Controle desabilitado e fora do UPDATE — no lançamento da nota o sistema grava zero. |

### Grade `RxDBGrid1` — tabela IT_ENTRADA

Grade com `ReadOnly` ligado: os itens são apenas exibidos. O Gravar percorre as linhas em edit/post só para refazer o rateio e recalcular o custo médio dos produtos.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `MATERIA_PRIMA` | INTEGER |  | Código do produto/matéria-prima. Trocar o código de um item já faturado contra pedido de compra é recusado. |
| Descrição do Material | `DESCRICAO` | VARCHAR(150) | 150 | Descrição copiada do cadastro do produto no BeforePost, exceto para o produto 1, que mantém a descrição digitada. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade copiada do campo UNIDADE_CONSUMO do cadastro do produto. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade comprada. Zero ou negativo faz o item ser recusado e apagado. Alterá-la em item faturado contra pedido de compra é bloqueado. Movimenta o estoque da matéria-prima. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Preço unitário. Não é digitado de forma independente: o BeforePost o recalcula como total dividido pela quantidade. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Total do item. Zero ou negativo faz o item ser recusado. É a base do rateio de frete, despesas e descontos e da soma que forma R$ Produtos. |
| Icms | `ICMS` | DOUBLE PRECISION |  | Alíquota de ICMS do item, em percentual. O sistema calcula VALOR_ICMS como total menos desconto rateado, vezes a alíquota, dividido por 100. |
| Ipi | `IPI` | DOUBLE PRECISION |  | Alíquota de IPI do item, em percentual. Alimenta VALOR_IPI pelo mesmo cálculo e entra no total da nota e no custo do produto. |

<a id="umov_nota_fiscal_compra_vencimento"></a>

## `umov_nota_fiscal_compra_vencimento` — Vencimento dos Títulos a Pagar...

Tela modal chamada pela nota fiscal de compra, e também pela tela de alteração da nota, quando a natureza de operação tem `GERA_DUPLICATA` = `2`. Grava direto em `PAGAR`, uma linha por parcela, numa grade única sem cabeçalho: empresa, `DOCUMENTO` = `NF`, fornecedor, número da nota e série vêm da nota que chamou a tela e formam a chave dos títulos junto com a parcela. Só três colunas são digitáveis — Dias, Vencimento e Valor —; o cursor entra sempre em Dias, porque o ColEnter pula as duas primeiras. Além do que a grade mostra, o `BeforePost` grava por conta própria `REFERENCIA` (documento mais número), `SALDO` e `SALDO_LIQUIDO` iguais ao valor da parcela e `SITUACAO_TITULO` = `1`, e o `NewRecord` ainda preenche `HORA`, `PLANO_CONTAS` (o mesmo da nota) e `CONFIRMACAO_RECEBIMENTO_FATURA` = `1`. Ao fechar, a tela soma as parcelas e, se o total não bater com o valor da nota, mostra a diferença e oferece voltar para corrigir.

### Grade `RxDBGrid1` — tabela PAGAR

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Parc. **·chave** | `SEQ` | INTEGER |  | Número da parcela do título. Faz parte da chave primária de PAGAR. Não é digitado: o NewRecord busca o maior SEQ já gravado para aquele documento, fornecedor, número e série e soma 1. Coluna pulada pelo cursor. |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão do título, preenchida pelo NewRecord com a emissão vinda da nota fiscal. Coluna pulada pelo cursor, mas se for editada o sistema valida a data e limpa o campo quando ela for inválida. É a base do cálculo de Dias e do Vencimento. |
| Dias | `DIAS` | INTEGER |  | Prazo em dias da parcela e coluna onde o cursor entra. Digitando o prazo, o sistema calcula sozinho o Vencimento como emissão mais os dias; digitando algo que não seja número, limpa o prazo e devolve o vencimento para a data de emissão. |
| Vencimento | `VENCIMENTO` | TIMESTAMP |  | Data de vencimento da parcela. Recusa data anterior à emissão com aviso e, quando aceita, recalcula Dias. Obrigatória: o BeforePost aborta a gravação com "Vencimento do Título não Informado" e limpa o lançamento. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor da parcela. Obrigatório, tem de ser maior que zero. Ao entrar na coluna com o valor zerado, o sistema soma o que já foi lançado para aquele título e sugere a diferença que falta para fechar o total da nota; se já não faltar nada, fecha a tela. Linhas que já têm data de pagamento aparecem em cinza e não podem ser alteradas — o BeforePost recusa com "Esse vencimento já foi Pago Parcialmente ou Integralmente". |

<a id="umov_nota_fiscal_venda_cancelamento"></a>

## `umov_nota_fiscal_venda_cancelamento` — Cancelamento da Nota Fiscal

Cancela uma nota de venda gravada em `NOTA` (chave EMPRESA + SERIE + NUMERO) e, quando a empresa usa NF-e, dispara o cancelamento na SEFAZ pelo ACBrNFeMonitor. O `ModifySQL` grava só quatro colunas: `STATUS`, `MOTIVO_CANCELAMENTO`, `PROTOCOLO_CANCELA_NFE` e `SITUACAO_DOCUMENTO_FISCAL`; todo o resto da tela é espelho da nota, para conferência. O cancelamento exige `STATUS = 'NFE Autorizada'` e que nenhuma duplicata da nota em `RECEBER` esteja fora da carteira (`SITUACAO_TITULO` maior que 1 bloqueia). O botão de estorno faz o caminho inverso: só aceita notas `Cancelada`, devolve o status para `Faturada`, repõe saldo de lote, quantidade faturada do pedido e regenera as duplicatas.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida sem rótulo em destaque. Valores do sistema: `Pendente`, `NFE Gerada`, `NFE Enviada`, `NFE Autorizada`, `NFE Denegada`, `NFE Inutilizada`, `Cancelada`, `Faturada`. Cancelar só é permitido em `NFE Autorizada`; estornar, só em `Cancelada`, e o estorno regrava `Faturada`. Apenas exibição (TDBText). |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Número da nota a cancelar. Parte da chave primária (PK2). O botão do campo abre a consulta de notas fiscais; F7 e F8 navegam entre notas da série. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente da nota. Serve também para localizar as duplicatas em `RECEBER`. Preenchido pela consulta, não digitado. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente gravado na nota; aparece nas mensagens de bloqueio e no e-mail de comunicação do cancelamento. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora da nota, apenas para conferência. |
| Endereço do Cliente | `ENDERECO_CLIENTE` | VARCHAR(50) | 50 |  | Endereço, bairro, CEP, cidade e UF do cliente concatenados no SELECT sob este mesmo nome; o conteúdo exibido é maior que a coluna original de mesmo nome. Apenas conferência. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota, para conferência antes de cancelar. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Vem de `PARSIS.NOTA_SERIE`. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão da nota. Apenas conferência. |
| Motivo do Cancelamento | `MOTIVO_CANCELAMENTO` | VARCHAR(50) | 50 |  | Único campo realmente digitado na tela. Obrigatório: vazio aborta o cancelamento. Com `PARSIS.UTILIZA_NFE = '2'` exige no mínimo 15 caracteres, porque o texto é enviado à SEFAZ (sem acentos) no comando de cancelamento da NF-e. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora da nota, apenas para conferência. |

<a id="umov_nota_fiscal_venda_emissao_pedido"></a>

## `umov_nota_fiscal_venda_emissao_pedido` — Emissão da Nota Fiscal c/ Pedidos

Emite a nota fiscal de venda a partir de um pedido. O cabeçalho é gravado em `NOTA` (chave EMPRESA + SERIE + NUMERO) e os itens em `IT_NOTA`, mostrados na grade. O caminho normal é digitar o número do pedido e teclar Enter: a rotina de importação copia de `PEDIDO_VENDA` cliente e endereços de entrega e cobrança, representante, comissão, transportadora, redespacho, tipo de frete, banco, instrução de cobrança, natureza de operação, observações, prazos de vencimento e, no faturamento integral, volume, cubagem e pesos — e em seguida chama Gravar sozinha. O número da nota é `MAX(NUMERO) + 1` da série, e a série vem de `PARSIS.NOTA_SERIE`. Só é possível alterar enquanto o status for `Pendente`.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(25) | 25 |  | Situação da nota, exibida sem rótulo em destaque. Nasce `Pendente` no `NewRecord` e depois percorre `NFE Gerada`, `NFE Enviada`, `NFE Autorizada`, podendo virar `NFE Denegada`, `NFE Inutilizada` ou `Cancelada`; sem NF-e a nota impressa fica `Faturada`. Gravar ou excluir aqui só é aceito com `Pendente`. Apenas exibição (TDBText). |
| Nº Nota Fiscal **·chave** | `NUMERO` | INTEGER |  |  | Número da nota. Parte da chave primária (PK2). Em nota nova é gerado no momento de gravar como `MAX(NUMERO) + 1` da série; digitado, localiza uma nota existente. F7 e F8 navegam entre notas, F9 posiciona pela igual ou anterior. |
| Cliente | `CLIENTE` | INTEGER |  |  | Código do cliente. Obrigatório na gravação. Vem do pedido importado e comanda a busca da alíquota de ICMS pelo estado do cliente. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 |  | Nome do cliente copiado do pedido para a nota. |
| Natureza | `NATUREZA_OPERACAO` | VARCHAR(8) | 8 |  | CFOP da operação. Obrigatório na gravação e imutável depois de gravado. Ao sair do campo é validado contra o estado do cliente: cliente no mesmo estado da empresa exige CFOP começando por `1` ou `5`, cliente de fora exige `2` ou `6`; fora disso o campo e as descrições são limpos. Natureza com `TIPO = 'Entrada'` força `NOTA_ENTRADA = '2'`, senão `'1'`; natureza sem `GERA_COMISSAO = '2'` zera a comissão. |
| Descrição da Natureza de Operação | `DESCRICAO_NATUREZA_OPERACAO` | VARCHAR(70) | 70 |  | Descrição da natureza, copiada da tabela `NATUREZA_OPERACAO` ao validar o CFOP. Não é digitada. |
| Transportadora | `TRANSPORTADORA` | INTEGER |  |  | Código da transportadora. Obrigatório na gravação. Ao sair do campo copia para a nota nome, endereço, bairro, CEP, cidade, estado, CNPJ/CPF e IE/RG da transportadora; código inexistente limpa tudo isso. |
| Razão Social / Nome da Transportadora | `NOME_TRANSPORTADORA` | VARCHAR(50) | 50 |  | Nome da transportadora, preenchido pelo Exit do código acima. |
| Data Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de emissão. Iniciada com a data do dia no `NewRecord`. Obrigatória: data inválida aborta a gravação. |
| %  ICMS | `ALIQUOTA_ICMS` | DOUBLE PRECISION |  |  | Alíquota de ICMS da nota. Não é digitada: na gravação o sistema lê `ALIQUOTA_ESTADO` pelo estado do cliente e usa `ICMS_DESTINO_ESTADO` quando o cliente é de outro estado, pessoa Jurídica e com inscrição estadual; nos demais casos, e sempre que a nota for venda a consumidor final, usa `ICMS_ORIGEM_ESTADO`. |
| Representante | `REPRESENTANTE` | INTEGER |  |  | Código do representante. Obrigatório na gravação. Vem do pedido. |
| Razão Social / Nome do Representante | `NOME_REPRESENTANTE` | VARCHAR(50) | 50 |  | Nome do representante, copiado do pedido. |
| Frete | `VALOR_FRETE` | DOUBLE PRECISION |  |  | Valor do frete cobrado na nota. Entra no total e, quando a natureza não tem desconto de ICMS Suframa, também na base de ICMS. |
| Seguro | `VALOR_SEGURO` | DOUBLE PRECISION |  |  | Valor do seguro. Mesmo tratamento do frete no total e na base de ICMS. |
| Despesas | `VALOR_DESPESA` | DOUBLE PRECISION |  |  | Outras despesas acessórias. Mesmo tratamento do frete no total e na base de ICMS. |
| Peso Bruto | `PESO_BRUTO` | DOUBLE PRECISION |  |  | Peso bruto. No faturamento integral vem do pedido; no parcial é recalculado pelos itens. |
| Peso Líquido | `PESO_LIQUIDO` | DOUBLE PRECISION |  |  | Peso líquido, com a mesma regra do peso bruto. |
| Base ICMS | `BASE_ICMS` | DOUBLE PRECISION |  |  | Base de ICMS somada dos itens e ajustada no `BeforePost` pelas diferenças de frete, seguro e despesas, exceto quando a natureza tem `DESCONTO_ICMS_SUFRAMA = '2'`. Calculada, não digitada. |
| Valor ICMS | `VALOR_ICMS` | DOUBLE PRECISION |  |  | ICMS total, somado dos itens no lançamento. Calculado. |
| R$ Produtos | `TOTAL_PRODUTO` | DOUBLE PRECISION |  |  | Soma dos itens sem frete, seguro e despesas. Calculado. |
| R$ Total | `TOTAL` | DOUBLE PRECISION |  |  | Total da nota. Recalculado no `BeforePost`: soma dos produtos mais frete, seguro e despesas, menos o desconto, sempre pela diferença em relação aos valores anteriores. Calculado. |
| % Comissão | `COMISSAO` | DOUBLE PRECISION |  |  | Percentual de comissão do representante, copiado do pedido. É zerado quando a natureza de operação não gera comissão. |
| Redespacho | `REDESPACHO` | INTEGER |  |  | Código da transportadora de redespacho. Ao sair do campo traz nome e endereço do redespacho. |
| Razão Social / Nome da Transportadora | `NOME_REDESPACHO` | VARCHAR(50) | 50 |  | Nome da transportadora de redespacho (o rótulo repete o da transportadora principal). |
| Tipo de Frete | `TIPO_FRETE` | INTEGER |  |  | Código na tabela `TIPO_FRETE`. Obrigatório na gravação. Vem do pedido; o botão do campo abre a consulta de tipos de frete. |
| Descrição | `DESCRICAO_TIPO_FRETE` | VARCHAR(50) | 50 |  | Descrição do tipo de frete, preenchida pelo Exit do código. É por ela que o sistema reconhece o frete `CIF`, que exige valor de frete combinado no pedido. |
| Banco | `BANCO` | INTEGER |  |  | Banco de cobrança das duplicatas, copiado do pedido. |
| Nome do Banco | `NOME_BANCO` | VARCHAR(50) | 50 |  | Nome do banco, preenchido pelo Exit do código. |
| Instrução | `INSTRUCAO_COBRANCA` | INTEGER |  |  | Código da instrução de cobrança enviada ao banco, copiado do pedido. |
| Descrição da Instrução de Cobrança | `DESCRICAO_INSTRUCAO_COBRANCA` | VARCHAR(50) | 50 |  | Texto da instrução de cobrança, preenchido pelo Exit do código. |
| Base IPI | `BASE_IPI` | DOUBLE PRECISION |  |  | Base de cálculo do IPI, somada dos itens. Calculada. |
| Valor IPI | `VALOR_IPI` | DOUBLE PRECISION |  |  | IPI total da nota, somado dos itens. Calculado. |
| Volume | `VOLUME` | DOUBLE PRECISION |  |  | Quantidade de volumes. No faturamento integral vem do pedido; é ela que gera a numeração das etiquetas de embalagem. |
| Desc. ICMS | `DESCONTO_ICMS` | DOUBLE PRECISION |  |  | Desconto de ICMS, usado nas naturezas com desconto Suframa. |
| CNPJ / CPF | `CNPJ_CPF_CLIENTE` | VARCHAR(18) | 18 |  | CNPJ ou CPF do cliente, copiado do pedido. |
| Insc.Estadual / RG | `IE_RG_CLIENTE` | VARCHAR(18) | 18 |  | Inscrição estadual ou RG. Junto com o estado e o tipo de pessoa, decide qual alíquota de ICMS é aplicada. |
| Endereço | `ENDERECO_COMPLETO_CLIENTE` | VARCHAR(182) | 182 |  | Endereço, bairro, CEP, cidade e UF do cliente concatenados no SELECT. (calculado na consulta) |
| Fone | `FONE_CLIENTE` | VARCHAR(15) | 15 |  | Telefone do cliente, copiado do pedido. |
| Cubagem | `CUBAGEM` | DOUBLE PRECISION |  |  | Cubagem da carga. No faturamento integral vem do pedido. |
| Nota Fiscal de Entrada | `NOTA_ENTRADA` | VARCHAR(1) | 1 |  | Marcado equivale a `'2'`, desmarcado a `'1'`. Somente leitura: quem define é a natureza de operação, que grava `'2'` quando é do tipo Entrada. O `NewRecord` inicia em `'1'`. |
| Série **·chave** | `SERIE` | INTEGER |  |  | Série da nota, parte da chave primária (PK1). Preenchida com `PARSIS.NOTA_SERIE` no `NewRecord`. |
| Data Saída | `DATA_SAIDA` | TIMESTAMP |  |  | Data de saída da mercadoria. |
| Hora Saída | `HORA_SAIDA` | VARCHAR(5) | 5 |  | Hora de saída no formato HH:MM. |
| Placa | `PLACA` | VARCHAR(10) | 10 |  | Placa do veículo. |
| Marca | `MARCA` | VARCHAR(20) | 20 |  | Marca dos volumes. Iniciada com `PARSIS.NOTA_MARCA` no `NewRecord`. |
| Espécie | `ESPECIE` | VARCHAR(20) | 20 |  | Espécie dos volumes. Iniciada com `PARSIS.NOTA_ESPECIE` no `NewRecord`. |
| Contato | `CONTATO` | VARCHAR(25) | 25 |  | Contato do cliente, copiado do pedido. |
| UF | `UF_PLACA` | VARCHAR(2) | 2 |  | UF da placa do veículo. |
| Nome do Motorista | `NOME_MOTORISTA` | VARCHAR(50) | 50 |  | Nome do motorista. |
| Nr. Pedido | `NUMERO_PEDIDO` | INTEGER |  |  | Número do pedido de venda faturado. Teclar Enter aqui dispara a importação: pedido com `STATUS = 'Liberado'` é recusado (só se fatura pedido `Pendente` por esta tela) e pedido com tipo de frete `CIF` sem valor de frete combinado também é recusado. O botão do campo abre a consulta de pedidos. |
| Número | `NUMERO_NOTA` | VARCHAR(20) | 20 |  | Número da nota em texto, no bloco de transporte, para o formulário pré-impresso. |
| Venda a Consumidor Final | `VENDA_A_CONSUMIDOR_FINAL` | VARCHAR(1) | 1 |  | Marcado grava `'2'`, desmarcado `'1'`. O `NewRecord` inicia em `'1'` e a importação copia o valor do pedido. Com `'2'` a nota usa sempre a alíquota de ICMS de origem do estado. |
| N.S.U. Nota | `NSU_NOTA_FISCAL` | DOUBLE PRECISION |  |  | Número sequencial único da nota, atribuído pelo sistema no `NewRecord` a partir do último NSU da empresa. Somente leitura. |
| Nome Funcionário Embarque | `NOME_FUNCIONARIO_EMBARQUE` | VARCHAR(50) | 50 |  | Nome do funcionário responsável pelo embarque; na tela de embarque esse nome é preenchido pelo número do cartão ponto. |
| Frete Comb. | `VALOR_FRETE_COMBINADO` | DOUBLE PRECISION |  |  | Valor de frete combinado com a transportadora, copiado do pedido. É exigido no pedido quando o tipo de frete é `CIF`, sem ele o faturamento é recusado. Não entra no total da nota. |
| Nome do Contato | `NOME_CONTATO_FRETE_COMBINADO` | VARCHAR(25) | 25 |  | Nome da pessoa com quem o frete foi combinado, copiado do pedido. |
| `DBEdit1` | `CIDADE_CLIENTE` | VARCHAR(50) | 50 |  | Controle sem rótulo, ligado ao dataset do pedido (`PEDIDO_VENDA`) e não ao da nota. Está posicionado em Top 704 numa janela de 542 de altura, ou seja, fora da área visível: resíduo, sem função na tela. (calculado na consulta) |

### Grade `RxDBGrid1` — tabela IT_NOTA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto do item, trazido do pedido na importação. A grade está com `ReadOnly = True`: os itens vêm do pedido, não são digitados aqui. |
| Descrição do Produto | `DESCRICAO` | VARCHAR(150) | 150 | Descrição do produto gravada no item. |
| UN | `UNIDADE` | VARCHAR(3) | 3 | Unidade de medida do produto. |
| Lote | `LOTE` | INTEGER |  | Lote de produção usado no item. Validado na gravação: a referência do lote precisa bater com a do produto. Ao gravar, a quantidade é somada em `LOTE.FATURADO`, e trocar o lote devolve a quantidade ao lote anterior. |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade faturada do item. Alimenta `LOTE.FATURADO` e `IT_PEDIDO_VENDA.QUANTIDADE_FATURADA`. |
| Valor | `VALOR` | DOUBLE PRECISION |  | Valor unitário do item. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Quantidade multiplicada pelo valor unitário, recalculado a cada gravação do item. |



### Campos não descritos

Campos que existem na tela mas não receberam descrição na leitura do código. Tipo e tamanho vêm do banco; a função é o rótulo que aparece na tela, sem verificação no código.

| Campo | Coluna | Tipo | Tam. | Onde | Função |
| --- | --- | --- | --- | --- | --- |
| Redespacho | `TIPO_REDESPACHO` | VARCHAR(10) | 10 | campo da tela | Rótulo na tela: “Redespacho”. Função não verificada no código. |
| Finalidade NF-e | `FINALIDADE_EMISSAO_NFE` | VARCHAR(15) | 15 | campo da tela | Rótulo na tela: “Finalidade NF-e”. Função não verificada no código. |
| Forma Emissão NFE | `FORMA_EMISSAO_NFE` | VARCHAR(20) | 20 | campo da tela | Rótulo na tela: “Forma Emissão NFE”. Função não verificada no código. |

<a id="umov_nota_fiscal_venda_gerenciar_nfe"></a>

## `umov_nota_fiscal_venda_gerenciar_nfe` — Gerenciamento das Notas Fiscais Eletrônicas de Venda

Painel de trabalho da NF-e. Não cadastra nada: monta um SELECT sobre `NOTA` (LEFT JOIN em `CLIENTE` para e-mail e CNPJ e em `TRANSPORTADORA` para o e-mail da NF-e) e lista o resultado na grade única, de onde partem as ações — Enviar SEF, Consultar SEF, Imprimir, Enviar E-mail, Visualizar NFe, Enviar FTP e Inutilizar. Os radiobuttons à esquerda trocam a cláusula do filtro, um status por opção: F5 `Pendente`, F6 `NFE Gerada`, F7 `NFE Enviada`, F8 `NFE Autorizada`, F9 `Cancelada`, F10 `NFE Inutilizada`, F4 `NFE Denegada`, F11 autorizadas ainda não impressas (`IMPRESSAO_NFE = '1'` ou nulo) e a última opção, autorizadas cujo e-mail ainda não foi enviado (`ENVIO_EMAIL_NFE = '1'` ou nulo). O envio e a impressão trabalham por lote: pegam o `LOTE_NFE` da linha corrente e agem sobre todas as notas daquele lote.

### Grade `DBGrid1` — tabela NOTA

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Série **·chave** | `SERIE` | INTEGER |  | Série da nota fiscal. Parte da chave primária (PK1). |
| Número **·chave** | `NUMERO` | INTEGER |  | Número da nota fiscal. Parte da chave primária (PK2). |
| Emissão | `EMISSAO` | TIMESTAMP |  | Data de emissão da nota. |
| Código | `CLIENTE` | INTEGER |  | Código do cliente da nota. |
| Razão Social / Nome do Cliente | `NOME_CLIENTE` | VARCHAR(70) | 70 | Nome do cliente gravado na nota. |
| Total | `TOTAL` | DOUBLE PRECISION |  | Valor total da nota. |
| Lote NF'e | `LOTE_NFE` | INTEGER |  | Número do lote de envio da NF-e à SEFAZ. Atribuído pelo sistema no faturamento: reaproveita o maior lote que ainda esteja em `NFE Gerada` e, não havendo, abre `MAX(LOTE_NFE) + 1`. Agrupa as notas enviadas, impressas e arquivadas em XML juntas. Não é digitado. |
| Status NFE | `STATUS` | VARCHAR(25) | 25 | Situação da nota no ciclo da NF-e: `Pendente` (só gravada), `NFE Gerada` (XML montado), `NFE Enviada`, `NFE Autorizada` (protocolo recebido), `NFE Denegada`, `NFE Inutilizada` e `Cancelada`. Comanda o que cada botão aceita: enviar exige `NFE Gerada`; imprimir, consultar e mandar por e-mail exigem `NFE Autorizada`; cancelar exige `NFE Autorizada`; inutilizar só é permitido em `Pendente` ou `NFE Gerada`, e devolve o pedido de origem para `Pendente`. |
| Impressão | `IMPRESSAO_NFE` | VARCHAR(1) | 1 | Marca se o DANFE já foi impresso. Gravado como `'1'` (não impresso, valor inicial no faturamento) ou `'2'` (impresso, gravado pela rotina de impressão). A grade mostra `Sim` ou `Não`, convertidos por um CASE no próprio SELECT. |
| E-Mail | `ENVIO_EMAIL_NFE` | VARCHAR(1) | 1 | Marca se o XML e o DANFE já foram enviados por e-mail ao cliente. `'1'` ou nulo é não enviado, `'2'` é enviado, gravado pela rotina de envio. A grade mostra `Sim` ou `Não`, convertidos por um CASE no próprio SELECT. |

<a id="umov_pedido_venda_instrucao_montagem"></a>

## `umov_pedido_venda_instrucao_montagem` — Instrução da Montagem...

Janela auxiliar de uma única caixa de texto, aberta a partir do pedido de venda já gravado. Grava apenas a coluna `OBSERVACAO_PRODUCAO` da tabela `PEDIDO_VENDA`, do registro identificado por `EMPRESA` + `NUMERO` recebidos nas variáveis globais `vempresa` e `vnumero`. Não há cabeçalho nem grade: a tela abre o registro no FormShow, já em modo de edição, com o foco no memo.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Instrução de Montagem | `OBSERVACAO_PRODUCAO` | VARCHAR(240) | 240 |  | Texto livre com as instruções de montagem que acompanham o pedido na produção. Convertido para maiúsculas a cada tecla digitada. O Enter não sai do campo na primeira vez: só na segunda batida seguida o foco avança, o que permite quebrar linha dentro do texto. O botão Gravar (ou F10) dá `post` e comita a transação, fechando a janela. O mesmo conteúdo aparece no memo `meinstrucao_montagem` da aba Instruções Produção \ Observações do pedido de venda. |

`EMPRESA` e `NUMERO` vêm no SELECT apenas para localizar o registro; não têm controle na tela e não podem ser alterados aqui.

<a id="umov_planilha_custo_producao"></a>

## `umov_planilha_custo_producao` — Planilha de Custo da Produção...

Tela de apuração do custo de mão de obra de um lote de produção. Lê o lote na tabela `LOTE` (chave `EMPRESA` + `NUMERO`, com `PRODUTO` descrito por join em `PRODUTO`) e grava o resultado do rateio na própria `LOTE`, mais uma linha por máquina em `IT_LOTE_PLANILHA_CUSTO_MAQUINA`. Praticamente tudo é somente leitura: só o número do lote é digitado (para localizar o registro) e só a marca "Custo do Lote Incompleto" é editável. Os números de custo saem dos apontamentos de `CONTROLE_PRODUCAO_DIARIA` quando se clica em Encerrar.

O `ModifySQL` confirma o escopo da gravação: a tela só altera `DATA_INICIAL_PRODUCAO`, `DATA_FINAL_PRODUCAO`, `DIAS_UTEIS_PRODUCAO`, `TOTAL_HORAS_PRODUTIVAS`, `TOTAL_MAO_OBRA`, `MEDIA_MAO_OBRA`, `STATUS` e `CUSTO_LOTE_INCOMPLETO`. Todo o resto do lote é exibição.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| `edtstatus` | `STATUS` | VARCHAR(10) | 10 |  | Rótulo de status desenhado no alto da tela, sem legenda fixa (é um TDBText, nunca digitável). Assume `Pendente` (lote ainda sem custo apurado; é o valor posto no NewRecord) e `Encerrado` (custo já apurado e gravado). O botão Encerrar só aceita lote `Pendente`; o botão Estornar só aceita lote `Encerrado` — em qualquer outro caso avisa "se encontra <status>" e devolve o foco ao número. |
| Nº Lote **·chave** | `NUMERO` | INTEGER |  |  | Número do lote de produção, chave do registro e único campo digitado da tela. Ao ser informado, o `OnSetText` reabre a consulta por aquele número; se não existir, avisa "Nº do Lote de Produção não Informado ou Inexistente" e volta para o último lote. F4 (botão do campo) abre a consulta de lotes; F7 vai ao lote anterior, F8 ao próximo, F9 ao lote menor ou igual ao digitado. |
| Produto | `PRODUTO` | INTEGER |  |  | Código do produto fabricado no lote. Somente leitura. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 |  | Descrição do produto, trazida de `PRODUTO.DESCRICAO` pelo join. Somente leitura (calculado na consulta). |
| Quantidade | `QUANTIDADE` | INTEGER |  |  | Quantidade de peças do lote. Somente leitura. É o divisor do custo: a mão de obra unitária e as horas unitárias por máquina são divididas por ela. |
| Empenhada | `EMPENHADA` | INTEGER |  |  | Quantidade do lote já empenhada por itens de pedido de venda. Zerada no NewRecord. Somente leitura. |
| Previsão Entrega | `PREVISAO_ENTREGA` | TIMESTAMP |  |  | Data prevista de entrega do lote. Somente leitura. |
| Faturado | `FATURADO` | INTEGER |  |  | Quantidade do lote já faturada. Zerada no NewRecord. Somente leitura. |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data de abertura do lote. Somente leitura. |
| Nº Inicial | `NUMERO_INICIAL` | INTEGER |  |  | Primeiro número de série da faixa produzida no lote. Somente leitura. |
| Nº Final | `NUMERO_FINAL` | INTEGER |  |  | Último número de série da faixa produzida no lote. Somente leitura. |
| Referência | `REFERENCIA` | VARCHAR(18) | 18 |  | Referência do produto do lote. Somente leitura. Aparece no log do sistema quando o lote é encerrado ou estornado. |
| Data Final Prod. | `DATA_FINAL_PRODUCAO` | TIMESTAMP |  |  | Preenchido pelo Encerrar: última `EMISSAO` de `CONTROLE_PRODUCAO_DIARIA` do lote. Somente leitura; o Estornar limpa. |
| Data Inicial Prod. | `DATA_INICIAL_PRODUCAO` | TIMESTAMP |  |  | Preenchido pelo Encerrar: primeira `EMISSAO` de `CONTROLE_PRODUCAO_DIARIA` do lote. Somente leitura; o Estornar limpa. |
| Nº Dias Úteis | `DIAS_UTEIS_PRODUCAO` | INTEGER |  |  | Preenchido pelo Encerrar: `COUNT(DISTINCT EMISSAO)` dos apontamentos do lote, ou seja, em quantos dias diferentes se produziu. Somente leitura; o Estornar zera. |
| M. O. Unitária | `MEDIA_MAO_OBRA` | DOUBLE PRECISION |  |  | Preenchido pelo Encerrar: `TOTAL_MAO_OBRA` dividido por `QUANTIDADE` — o custo de mão de obra de uma peça. Somente leitura; o Estornar zera. |
| Total M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  |  | Preenchido pelo Encerrar: soma de horas e minutos apontados multiplicada pelo `VALOR_MAO_OBRA` de cada apontamento de `CONTROLE_PRODUCAO_DIARIA`, convertida para reais. Somente leitura; o Estornar zera. |
| Total Horas | `TOTAL_HORAS_PRODUTIVAS` | VARCHAR(10) | 10 |  | Preenchido pelo Encerrar: total de horas produtivas do lote, gravado como texto no formato `HH:MM` (não é número). Somente leitura; o Estornar grava `00:00`. |
| Custo do Lote Incompleto | `CUSTO_LOTE_INCOMPLETO` | VARCHAR(1) | 1 |  | Marcador de que o custo apurado se refere a um lote ainda não concluído. `'2'` = marcado, `'1'` = desmarcado. Único campo editável da tela. O botão Encerrar guarda o valor antes de reabrir a consulta e o regrava junto com o status, para que a marcação feita antes do clique não se perca. |

### Grade `dbmaquina` — tabela IT_LOTE_PLANILHA_CUSTO_MAQUINA

Nenhuma coluna é digitada. A grade inteira é apagada e reconstruída pelo botão Encerrar, agrupando `CONTROLE_PRODUCAO_DIARIA` por máquina; o botão Estornar exclui todas as linhas do lote.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código **·chave** | `MAQUINA` | INTEGER |  | Código da máquina que trabalhou no lote, vindo dos apontamentos diários. Faz parte da chave da tabela junto com `EMPRESA` e `LOTE`. |
| Descrição da Máquina | `DESCRICAO_MAQUINA` | VARCHAR(50) | 50 | Descrição da máquina, trazida de `MAQUINA.DESCRICAO` (calculado na consulta). Gravada também na própria linha no momento do encerramento. |
| Horas Unit. | `TEMPO_MEDIO_PRODUCAO` | VARCHAR(10) | 10 | Tempo daquela máquina por peça: total de minutos apontados dividido pela `QUANTIDADE` do lote, gravado como texto `HH:MM`. |
| Total Horas | `TOTAL_HORAS` | VARCHAR(10) | 10 | Total de horas apontadas naquela máquina no lote, gravado como texto `HH:MM`. |
| Custo M.O. | `TOTAL_MAO_OBRA` | DOUBLE PRECISION |  | Custo de mão de obra daquela máquina no lote: horas e minutos apontados multiplicados pelo `VALOR_MAO_OBRA` de cada apontamento. |

Colunas do SELECT sem controle na tela: `EMPRESA` (preenchida no NewRecord com a empresa logada) e `OBSERVACAO` do lote.

<a id="umov_saida_estoque_produto"></a>

## `umov_saida_estoque_produto` — Saída do Estoque dos Produtos...

Baixa de produtos acabados do estoque sem venda, sob responsabilidade de um funcionário. O cabeçalho fica em `SAIDA_ESTOQUE_PRODUTO`, chave `EMPRESA` + `NUMERO`, e os itens em `IT_SAIDA_ESTOQUE_PRODUTO`, na grade `RxDBGrid1`. É a tela irmã da Requisição de Materiais, com a mesma mecânica, mas trabalhando com produto em vez de material: cada item gravado baixa o estoque (`baixa_estoque_materia_prima`) e grava a data da última movimentação com o documento `'SE'`; excluir o item estorna a baixa.

### Campos

| Campo | Coluna | Tipo | Tam. | Obr. | Função |
| --- | --- | --- | --- | --- | --- |
| Número **·chave** | `NUMERO` | INTEGER |  |  | Sequencial da saída, chave junto com a empresa. A tela abre com o próximo número livre (`MAX(NUMERO) + 1` de `SAIDA_ESTOQUE_PRODUTO` na empresa). Digitar um número acima do último faz `frmselecao_cadastro_novo` perguntar se usa o próximo da sequência ou o número digitado. F4 consulta saídas, F7 anterior, F8 próximo, F9 posiciona. |
| Funcionário | `FUNCIONARIO` | INTEGER |  |  | Código do funcionário responsável pela retirada. Exigido no Gravar. F4 abre a consulta de funcionários, F3 abre o cadastro. Ao sair do campo, o sistema busca o cadastro e preenche o nome; código inexistente limpa código e nome. |
| Nome do Funcionário | `NOME_FUNCIONARIO` | VARCHAR(50) | 50 |  | Nome do funcionário, trazido do JOIN com `FUNCIONARIO`. Preenchido pelo Exit do código; não é digitado (calculado na consulta). |
| Emissão | `EMISSAO` | TIMESTAMP |  |  | Data da saída. Preenchida com a data de hoje no NewRecord; ao entrar no campo, se estiver vazia ou inválida, volta para a data de hoje. Precisa ser data válida no Gravar. É a data gravada como última movimentação do produto. |

### Grade `RxDBGrid1` — tabela IT_SAIDA_ESTOQUE_PRODUTO

Produtos retirados do estoque. A sequência (`SEQ`) é gerada pelo sistema como `MAX(SEQ) + 1` dentro da saída e não aparece na grade. Cada linha gravada baixa o estoque; alterar a quantidade movimenta apenas a diferença em relação à quantidade anterior.

| Coluna | Coluna no banco | Tipo | Tam. | Função |
| --- | --- | --- | --- | --- |
| Código | `PRODUTO` | INTEGER |  | Código do produto retirado, buscado no cadastro de matéria-prima. Só aceita cadastro com `TIPO_PRODUTO = '2'` (Produto) e `INATIVO = '1'` (ativo): item marcado como `'1'` (somente Material) é recusado com o aviso de configurá-lo como Produto, e item inativo é recusado com o aviso de que está inativo; em ambos os casos a linha é limpa. Aceito o código, a tela traz a descrição e a unidade e, se a quantidade estiver zerada, preenche com 1. Item cujo produto não existir é apagado no AfterPost. F4 abre a consulta de produtos. |
| Descrição do Produto | `DESCRICAO_PRODUTO` | VARCHAR(150) | 150 | Descrição do produto, trazida do cadastro quando o código é aceito. Não é digitada (calculado na consulta). |
| UN | `UNIDADE_PRODUTO` | VARCHAR(3) | 3 | Unidade do produto, vinda do cadastro. Não é digitada. (calculado na consulta) |
| Quantidade | `QUANTIDADE` | DOUBLE PRECISION |  | Quantidade retirada do estoque. Precisa ser maior que zero: quantidade zerada faz o item ser apagado logo após o post, com aviso. É esta quantidade que baixa o estoque do produto. |

