---
id: imobiliario/vendas-estoque-distratos-empreendimento
industria: Imobiliário
uso: comum
esforco: médio
grao: Reserva por unidade e empreendimento; parcela por cliente para a carteira
---

# Vendas, estoque e distratos por empreendimento

Unidades vendidas, distratadas e em estoque de cada empreendimento, com VSO e a carteira de recebíveis do mesmo comprador, cruzando o CRM comercial com o ERP.

## Resumo executivo

**Para quem:** Incorporadoras e construtoras que vendem unidades na planta e usam CV CRM no comercial e Sienge ou UAU no financeiro.

**O que resolve**

- Venda, distrato, cancelamento e reserva vencida param de ser misturados no mesmo número.
- O mesmo empreendimento tem um id único no comercial e no financeiro.
- A carteira vencida por empreendimento e por cliente sai com o valor certo e sem venda contada duas vezes.

**Por que importa:** Distrato é receita contratada que volta, e é a perda mais cara da incorporadora. Se ele entra junto com cancelamento ou some do VGV, a velocidade de venda e o % vendido ficam otimistas e a decisão de lançar a próxima fase ou ajustar preço sai errada. Do lado financeiro, uma carteira inflada ou subcontada muda a cobrança e o fluxo de caixa da SPE.

**Perguntas de negócio que responde**

- Quantas unidades vendemos, distratamos e temos em estoque em cada empreendimento?
- Qual a velocidade de vendas (VSO) de cada empreendimento desde o lançamento?
- Qual o VGV líquido do mês, descontando os distratos?
- Quanto está vencido por empreendimento e por imobiliária, e em que faixa de atraso?
- Quais clientes acumulam mais parcelas vencidas e devem ser cobrados primeiro?
- Quanto tempo leva da reserva até a venda em cada empreendimento?

**O que você precisa**

- CV CRM e Sienge (ou UAU) conectados na Nekt
- A lista de empreendimentos com o nome em cada sistema
- A data oficial de lançamento de cada empreendimento, se existir

**O que você recebe**

- Uma tabela de reservas com situação normalizada e empreendimento canônico
- Uma tabela de estoque por empreendimento com % vendido e VSO
- Uma tabela de parcelas da carteira com status e faixa de atraso
- Um agente de IA que diferencia venda, distrato e proposta perdida

## Detalhado

### O problema

O CRM comercial guarda reservas com dezenas de situações e o ERP guarda contratos e parcelas com outros nomes para o mesmo empreendimento. Quem conta reservas sem normalizar a situação mistura venda com distrato e proposta perdida. No ERP, campos de saldo que vêm vazios e tabelas que espelham vendas vivas fazem a carteira e o total de vendas saírem errados sem nenhum erro aparente.

### Regras de negócio

1. **Normalize a situação da reserva.** Venda é situacao = 'VENDIDA', com valor em valor_contrato. Distrato é a venda efetivada e depois desfeita (situacao = 'DISTRATO'). Cancelada é a proposta que caiu antes de virar venda e vencida é a reserva que expirou: as duas são proposta perdida. O resto é em andamento. Use só reservas ativas (ativo = 'S'). (Evite: Contar distrato e cancelamento como uma coisa só, ou contar todas as reservas como venda.)
2. **Empreendimento tem um id canônico.** O CRM e o ERP escrevem o mesmo empreendimento de forma diferente (nome comercial de um lado, sigla e nome em maiúsculas do outro). Mantenha uma dimensão de empreendimentos com id canônico, nome em cada sistema e uma flag de presença no ERP. Lançamento recente pode ainda não existir no ERP. (Evite: Juntar CRM e ERP pelo nome do empreendimento.)
3. **Normalize os textos do CRM.** Imobiliária, unidade, bloco, empreendimento e corretor chegam com espaços extras e caixa variável. Aplique maiúsculas, trim e espaço único antes de agrupar. As chaves idunidade, idreserva e idempreendimento são locais de cada conta do CRM: em multiempresa, use sempre junto do id da conta. (Evite: Agrupar pelo texto cru e ver a mesma imobiliária em três linhas.)
4. **Unidade vendida segue uma lista fechada.** No estoque, conte como vendida a unidade cuja reserva está em venda ou nas etapas que vêm depois dela (confecção de contrato, envio ao ERP). Unidade bloqueada é uma categoria própria, nem vendida nem disponível. Em revenda, a situação mais recente da revenda sobrepõe a situação original da unidade. (Evite: Contar só a situação vendida e deixar unidades em contrato como disponíveis.)
5. **VSO usa os meses de oferta.** VSO = unidades vendidas acumuladas / (unidades totais x meses de oferta). Meses de oferta vão do lançamento até o mês de referência, contados de forma inclusiva. Se o estoque zerou, o fim é o mês da última venda. Sem data oficial de lançamento, use a primeira venda como proxy e marque o número como proxy. (Evite: Dividir vendas do mês por unidades totais sem considerar o tempo de oferta.)
6. **Venda líquida desconta o distrato.** VGV líquido = VGV vendido menos VGV distratado. Declare a data do distrato usada (data do evento, de cadastro ou da situação atual). Mostre volume e VGV de distrato em separado e diga quando o distrato do mês se refere a uma venda de outro mês. (Evite: Reportar só o VGV vendido, ou subtrair distrato sem dizer de quando é.)
7. **No UAU, filtre o espelho de vendas.** A venda viva fica em Vendas (Status_Ven = 0). Quitadas e distratadas passam para VendasRecebidas (Status_VRec 3 e 1). VendasRecebidas também guarda um espelho com Status_VRec = 0 de toda venda viva. O universo de vendas é Vendas com status 0 mais VendasRecebidas com status 1 ou 3. A chave é empresa + obra + número da venda. (Evite: Unir as duas tabelas sem filtro de status e contar cada venda viva duas vezes.)
8. **Inadimplência pelo valor e status da parcela.** No Sienge, sienge_customer_debt_balance traz um array installments com status por parcela: Paga, Vencida ou A vencer. Vencido em aberto = soma de originalValue com status Vencida. currentBalance vem vazio ou zerado e não é saldo. Se quiser o valor corrigido (correctedValue), declare e use sempre o mesmo. (Evite: Somar currentBalance, ou misturar valor original e corrigido entre relatórios.)
9. **Cobrança prioriza parcelas acumuladas.** Ordene clientes pelo número de parcelas vencidas acumuladas e depois pelo valor. Acúmulo identifica melhor quem parou de pagar do que uma parcela grande atrasada. Distribua o vencido em faixas: acima de 180, 91 a 180, 61 a 90, 31 a 60 e 1 a 30 dias. (Evite: Ranking só pelo maior valor vencido.)
10. **Ponte comercial e financeiro pelo cliente.** O cliente do CRM liga ao do ERP pelo código integrado (idpessoa_int) ou, sem ele, pelo CPF ou nome normalizado. A carteira do ERP também tem sacados que não são compradores de unidade (órgãos públicos, empresas): marque e tire da inadimplência de clientes. (Evite: Tratar todo devedor da carteira como comprador de unidade.)

### Situação da reserva e da parcela

CV CRM no comercial, Sienge na carteira.

- **VENDIDA** → Venda (`situacao = 'VENDIDA'`)
- **DISTRATO** → Distrato: receita contratada que voltou (`situacao = 'DISTRATO'`)
- **CANCELADA** → Proposta perdida antes da venda (`situacao = 'CANCELADA'`)
- **VENCIDA** → Proposta perdida: reserva expirou (`situacao = 'VENCIDA'`)
- **Demais situações** → Em andamento (`ativo = 'S'`)
- **Parcela Vencida** → Inadimplência (`installments.status = 'Vencida'`)
- **Parcela A vencer** → Carteira a receber (`installments.status = 'A vencer'`)
- **Parcela Paga** → Já recebido (`installments.status = 'Paga'`)

### Definições

| Métrica | Definição |
|---|---|
| Vendas | reservas ativas distintas com situação vendida, pela data da venda, por empreendimento e mês |
| VGV vendido | soma de valor_contrato das vendas do período |
| Distratos | reservas distintas com situação distrato pela data do distrato declarada; VGV distratado = soma de valor_contrato delas |
| Proposta perdida | reservas canceladas mais reservas vencidas no período |
| % vendido | unidades vendidas / unidades totais do empreendimento na data de referência, sem contar bloqueadas como vendidas |
| VSO | unidades vendidas acumuladas / (unidades totais x meses de oferta desde o lançamento, contagem inclusiva) |
| Dias de ciclo | dias entre a criação da reserva e a data da venda, por reserva vendida |
| Inadimplência | soma de originalValue das parcelas com status Vencida na data de corte, por empreendimento e cliente |

### Armadilhas

- **Vendas em dobro no UAU.** O union de Vendas com VendasRecebidas sem filtro contou cada venda viva duas vezes, porque toda venda viva tem espelho com status 0. Como evitar: Use só Vendas status 0 e VendasRecebidas status 1 e 3.
- **Inadimplência zerada.** A carteira somada por currentBalance deu quase zero em empreendimentos com muitos atrasos. Como evitar: Some originalValue pelo status da parcela.
- **Empreendimento sem par.** Um lançamento novo existia no CRM e ainda não no ERP, e o cruzamento comercial e financeiro o descartava. Como evitar: Mantenha a flag de presença no ERP e use left join a partir do CRM.
- **Distrato zero por fonte errada.** O agente respondeu zero distratos porque olhou só as reservas, e o distrato estava na tabela própria de distratos. Como evitar: Antes de dizer zero, consulte a fonte de distratos da conta.
- **Posição passada perdida.** A carteira do ERP mostra só o hoje e ninguém conseguia reproduzir o vencido do fechamento anterior. Como evitar: Grave snapshot mensal append-only da carteira, com a versão do fechamento.
- **Dado pessoal no painel.** Nome, CPF e renda do comprador acabaram em painel aberto para a equipe de vendas. Como evitar: Deixe dado pessoal só na tabela de detalhe com acesso restrito.

### Teste de aceitação

- [ ] Para um empreendimento, vendas + distratos + canceladas + vencidas + em andamento = total de reservas ativas.
- [ ] Unidades vendidas + bloqueadas + disponíveis = unidades totais de cada empreendimento.
- [ ] O vencido de um empreendimento bate com o relatório de inadimplência do ERP na mesma data de corte (diferença abaixo de 1%).
- [ ] Nenhuma venda aparece duas vezes pela chave empresa + obra + número (UAU) ou idreserva (CRM).
- [ ] Todo empreendimento do CRM tem id canônico; os que não existem no ERP aparecem com a flag de ausência.

### Context document

```text
Vendas, estoque e distratos por empreendimento
- Venda = reserva ativa (ativo = 'S') com situacao 'VENDIDA'; valor = valor_contrato.
- Distrato = venda efetivada e depois desfeita (situacao 'DISTRATO'). Não é cancelamento.
- Proposta perdida = situacao 'CANCELADA' (caiu antes da venda) + 'VENCIDA' (reserva expirou).
- Use sempre o id canônico de empreendimento da dimensão de-para CRM e ERP. Nunca junte pelo nome.
- VGV líquido = VGV vendido - VGV distratado; diga qual data de distrato foi usada.
- VSO = unidades vendidas acumuladas / (unidades totais x meses de oferta). Sem data oficial de lançamento, a primeira venda é o proxy e o VSO é marcado como proxy.
- Unidade bloqueada não é vendida nem disponível.
- UAU: universo de vendas = Vendas com Status_Ven 0 + VendasRecebidas com Status_VRec 1 (distrato) ou 3 (quitada). Nunca una sem filtro.
- Sienge: inadimplência = soma de installments.originalValue com status 'Vencida'. Não use currentBalance.
- Cobrança: ordene por número de parcelas vencidas acumuladas, depois por valor.
- Antes de responder zero distratos, consulte a tabela de distratos.
- Não exponha nome, CPF ou renda de comprador em respostas agregadas.
Exceções por cliente:
- <cliente>: situações que contam como vendida no estoque: <lista>.
- <cliente>: data oficial de lançamento de <empreendimento> = <data>.
- <cliente>: valor da carteira reportado = <original ou corrigido>.
- <cliente>: venda válida só no bloco <bloco>; bloco <bloco> é de obra e fica fora.
```

### Variações

- **SLA de repasse:** Dias entre a venda do repasse (cvcrm_repasses.data_venda) e a entrada na etapa em que o banco libera o valor, com teto definido pela incorporadora.
- **Funil MCMV e médio padrão:** MCMV: lead, agenda, visita, análise de crédito, crédito aprovado, venda. Médio e alto padrão: lead, agenda, visita, proposta, venda.
- **Perfil de distrato:** Distratos por imobiliária, corretor, faixa de renda e tempo desde a venda, com o motivo do distrato.
