Spec — Comercial no App Gestão: alunos, contratos e vendas rápidas
Status: planejada, sem ciclo de implementação iniciado.
Data: 2026-10-08.
Escopo: extensão independente da spec principal do App Gestão.
Repositórios envolvidos: painel/API PHP e aplicativo Fluttercfcprodutivogestao-2026.
Esta spec amplia o papel Gestor com três fluxos comerciais separados:
- cadastro de aluno;
- criação de contrato;
- venda rápida baseada nas Ações rápidas já configuradas pelo CFC no painel.
Ela não reabre nem altera o percentual histórico de conclusão da
spec-app-gestao-telas.md. O escopo original
permanece concluído; esta é uma frente nova, com cronograma, histórico e
percentual próprios.
1. Decisão de vocabulário
Há dois conceitos que receberam o mesmo nome em momentos diferentes. A partir desta spec, eles ficam separados de modo obrigatório:
| Nome na interface/documentação | Significado | Não significa |
|---|---|---|
| Atalhos do Painel | Botões de entrada do dashboard do gestor, como Upload e Nova movimentação | O domínio comercial do painel |
| Ações rápidas | Configurações comerciais por CFC, existentes na ficha do aluno | Um conjunto genérico de botões do app |
| Venda rápida | A operação mobile que executa uma Ação rápida para um aluno | Cadastro de aluno ou criação de contrato |
| Movimentação dinâmica | Nome interno do domínio e das tabelas que sustentam uma venda rápida | Nome de interface para o usuário final |
Nos textos do app, a chamada de ação será Nova venda ou Venda rápida. O termo Ação rápida aparece apenas para identificar a configuração escolhida na venda.
2. Referências e fatos verificados
| Fonte | Fato relevante para este escopo |
|---|---|
fragmento de Ações rápidas |
O painel lista, dentro da ficha do aluno, as configurações ativas de clientes_financeiro_movimentacao_dinamica do próprio CFC. |
classe de movimentação dinâmica |
A inserção registra serviços, adiciona créditos ao saldo do aluno e cria a movimentação financeira vinculada. |
classe de contrato |
Contrato possui ciclo próprio: serviços, categorias, créditos, parcelas e movimentação financeira do documento de contrato. |
classe de aluno |
O cadastro aplica validação de CPF por CFC e cria os registros iniciais de saldo. |
formulário de aluno do painel |
Nome, CPF, origem e gênero são obrigatórios no cenário padrão; CEP pode ser obrigatório por configuração do CFC. O formulário também concentra dados complementares que podem ser oferecidos de forma progressiva no app. |
autorização do App Gestão |
Login e refresh já devolvem capacidades por ação; a extensão deve ser aditiva ao contrato atual. |
classe de contrato |
A criação canônica já recebe criarPendenciaAssinatura; quando a configuração de assinatura do CFC existe, ela cria a pendência pelo mesmo domínio do painel. A checagem atual é por existência, portanto o adaptador do app deve confirmar status = 1 antes de expor ou aceitar a opção, sem mudar o comportamento legado de outros consumidores. |
listagem de contratos do painel |
A pesquisa já considera nome, CPF e RENACH do aluno, sempre limitada ao CFC da sessão. |
spec principal |
Mantém as regras de identidade visual, sessão, papéis, commits locais e a referência visual em local-docs/design/prototipo/. |
2.1 Consequência arquitetural
O app reutiliza as classes de domínio, mas não chama nem espelha os AJAXs do painel. O AJAX atual de movimentação dinâmica depende da sessão web e aceita campos financeiros enviados pelo formulário. A API mobile deve construir no servidor o comando seguro e entregar à classe canônica apenas valores já validados.
3. Objetivo e resultado esperado
O gestor deve conseguir, pelo app e dentro do seu próprio CFC:
- cadastrar um novo aluno;
- registrar, quando necessário, os dados complementares do mesmo formulário de aluno já existente no painel;
- iniciar, com esse aluno ou com um aluno já existente, uma venda rápida configurada previamente no painel;
- criar um contrato pelo fluxo próprio de contratos;
- solicitar a assinatura do aluno quando a configuração do CFC permitir e acompanhar o respectivo status;
- localizar os contratos de um aluno por nome, CPF ou RENACH;
- visualizar confirmação clara do que foi criado, sem precisar abrir o painel para conferir os efeitos iniciais.
Cada fluxo produz um resultado diferente e não deve acionar os demais de forma implícita.
| Operação | Cria aluno | Cria contrato | Cria créditos | Cria financeiro |
|---|---|---|---|---|
| Cadastro de aluno | Sim | Não | Apenas saldos iniciais vazios | Não |
| Venda rápida | Não | Não | Sim, conforme serviço da ação | Sim, como movimentação dinâmica |
| Contrato | Não | Sim | Sim, conforme serviços do contrato | Sim, como documento de contrato |
4. Escopo e exclusões
4.1 Incluído
- Gestor puro e gestor de usuário com duplo papel, quando a capacidade estiver presente.
- Cadastro mínimo de aluno, com CPF validado no servidor.
- Busca e seleção de aluno no contexto comercial.
- Consulta e execução de Ações rápidas ativas do CFC.
- Criação de contratos pelo caminho canônico já utilizado pelo painel, delimitada pelos recursos que o backend conseguir expor com segurança.
- Rastro de usuário, tenant, horário, operação e identificador de repetição.
- Estados de carregamento, vazio, erro, indisponibilidade e confirmação para cada fluxo.
- DDLs versionados, idempotentes e documentados quando realmente necessários.
4.2 Fora do escopo desta etapa
- Edição, exclusão, estorno ou cancelamento de aluno, contrato ou venda pelo app.
- Mudança de preço, desconto, conta, categoria financeira ou unidade de custo de uma Ação rápida pelo app.
- Transformar uma Ação rápida em carrinho genérico de múltiplos itens.
- Assinar, aprovar, rejeitar, reenviar ou cancelar a assinatura pelo app. O app apenas pode solicitar a pendência no ato do contrato e consultar seu status.
- Impressão, envio manual do contrato ou upload documental dentro do fluxo inicial de contrato.
- Processar ou acionar CFC Pay/ND7 no primeiro recorte mobile.
- Mudanças nos cadastros/configurações de Ações rápidas, serviços, modelos de contrato ou permissões pelo aplicativo; isso continua no painel.
- Alterar o app do aluno, o app gêmeo ou consumidores externos da API.
5. Regras transversais e invariantes
5.1 Tenant, sessão e autorização
clientes_ideusuarios_idsão derivados somente do token de usuário já validado pela API. O aplicativo não envia nem escolhe esses identificadores.- Todo aluno, ação, serviço, conta, forma de pagamento e contrato consultado deve pertencer ao mesmo CFC do token.
- Capacidade ausente remove o ponto de entrada e também é revalidada no endpoint. Ocultar um botão nunca é a única proteção.
- O contrato de capacidades de login/refresh ganha apenas chaves aditivas; clientes antigos continuam entendendo seu payload atual.
5.2 Fonte de verdade comercial
- O painel é a única origem das configurações de serviços, Ações rápidas, categorias financeiras, contas e modelos de contrato.
- O servidor recarrega essas configurações imediatamente antes da escrita. Dados exibidos pelo app nunca autorizam uma gravação por si só.
- Valores monetários enviados pelo aplicativo são tratados como intenção de interface, não como autoridade comercial. Onde esta spec definir valor fixo, o servidor ignora qualquer tentativa de sobrescrevê-lo.
- A API retorna JSON UTF-8 normalizado. Nenhuma tela mobile recebe fragmento
HTML,
htmlentitiesou links do painel dentro de mensagens de domínio.
5.3 Escritas seguras
- Toda escrita recebe uma chave de idempotência aleatória, persistida no dispositivo até obter resposta conclusiva.
- A chave é única por CFC, usuário, tipo de operação e intenção de escrita. Repetir a mesma requisição devolve o resultado original; não duplica crédito, contrato, parcela ou movimentação.
- A camada adaptadora registra o usuário autenticado nas classes canônicas e nos registros financeiros/históricos resultantes.
- O ciclo de escrita deve comprovar atomicidade usando a mesma conexão de banco. Se uma classe legada impedir transação abrangente, o ciclo é bloqueado até haver adaptação segura ou reconciliação explicitamente aprovada; nunca se aceita sucesso parcial silencioso.
- Falhas retornam mensagem comum ao app e detalhe técnico apenas ao log local de diagnóstico.
5.4 Permissões propostas
Serão criadas ações próprias, com IDs definidos somente no preflight da migration, sem números arbitrários nesta spec:
| Capacidade no app | Ação de sistema proposta | Motivo |
|---|---|---|
cadastro_alunos |
Permitir cadastrar aluno pelo App Gestão | Não confundir cadastro mobile com edição ampla no painel |
vendas_rapidas |
Permitir venda rápida pelo App Gestão | A venda gera crédito e financeiro; não é mero lançamento manual |
contratos |
Permitir criar contrato pelo App Gestão | Contrato é domínio próprio, mais amplo que lançamento financeiro |
As permissões existentes de desconto em contratos ou Ações rápidas não serão habilitadas pelo app nesta versão: preço e rota financeira permanecem travados na configuração de origem.
6. Fluxo A — Cadastro de aluno
6.1 Objetivo
Cadastrar a identidade mínima de um aluno sem inferir venda, crédito ou contrato. O gestor também pode completar, na mesma jornada, os dados adicionais já aceitos pelo cadastro do painel. O resultado é um aluno disponível para os fluxos seguintes, sem criar dois cadastros ou duas regras de validação.
6.2 Entrada e navegação
- Entrada primária: Atalhos do Painel → Novo aluno.
- Entrada secundária: busca de aluno sem resultado → Cadastrar aluno.
- Após sucesso, a tela de confirmação oferece:
- Ver aluno;
- Fazer venda rápida;
- Criar contrato;
- Concluir.
Nenhuma dessas ações seguintes é automática.
6.3 Tela e campos
A tela usa o padrão visual de formulário do protótipo: cabeçalho institucional, faixa laranja, campos com rótulo acima e botão primário fixo no rodapé.
| Bloco | Conteúdo e regra |
|---|---|
| Cadastro rápido | Nome completo, CPF, origem e gênero. CPF é formatado na tela, normalizado somente no transporte e validado novamente pelo domínio. A origem pode vir pré-selecionada quando o CFC possuir padrão válido; caso contrário, é uma escolha simples. |
| Exigências condicionais | CEP só é exigido quando a configuração canônica do CFC assim determinar. A API devolve ao app os campos obrigatórios reais e suas opções válidas antes da submissão; o Flutter não replica regras em código próprio. |
| Cadastro avançado | Link Adicionar mais dados expande grupos opcionais do formulário do painel: identificação complementar (RENACH, número de registro, processo e documentos), filiação e contato, perfil, endereço completo, dados complementares e observações. Foto e qualquer campo que dependa de recurso ainda não suportado pelo app ficam explicitamente indisponíveis, sem impedir o cadastro básico. |
| Conferência | O app mostra o nome e CPF antes de gravar; não apresenta dados de outros alunos em caso de duplicidade. |
| Ação | Cadastrar aluno; fica disponível somente com os campos obrigatórios válidos. |
O contrato de API de cadastro deve expor metadados de campo — rótulo, tipo, obrigatoriedade, opções e grupo rápido/avançado — derivados da mesma configuração e validação canônicas do painel. A submissão é única: ela aceita somente campos oferecidos pelo preflight e grava tudo pela classe de aluno existente. Não será inventado um segundo conjunto de regras no Flutter.
6.4 Regras e mensagens
- CPF inválido: “Informe um CPF válido.”
- CPF já cadastrado neste CFC: “Já existe um aluno com este CPF neste CFC.”
- Campo avançado inválido: o app aponta o campo e preserva todo o restante do formulário, sem descartar o cadastro rápido já preenchido.
- Erro de rede: preserva o formulário e oferece Tentar novamente.
- Sem permissão: o atalho não aparece e o endpoint responde sem vazar dados.
- Sucesso: “Aluno cadastrado. Agora você pode iniciar uma venda ou contrato.”
7. Fluxo B — Venda rápida por Ação rápida
7.1 Conceito
Venda rápida é a execução de uma configuração ativa de
clientes_financeiro_movimentacao_dinamica para um aluno existente. Ela cria
uma movimentação dinâmica, inclui o serviço escolhido, credita o aluno e cria
o efeito financeiro correspondente.
Não cria registro de contrato, não gera assinatura e não representa uma versão abreviada de contrato.
7.2 Semântica inicial preservada
Uma Ação rápida pode relacionar mais de um serviço. A tela atual do painel permite escolher um serviço dentre os serviços dessa ação antes de concluir a operação. A primeira versão do app preserva exatamente isso:
- uma confirmação executa um serviço elegível da Ação rápida;
- a ação continua sendo o limitador de quais serviços podem ser vendidos;
- o aplicativo não transforma, por conta própria, todos os serviços de uma ação em uma venda conjunta.
Uma futura “venda de pacote indivisível” exigirá spec própria, pois mudaria créditos, preço, financeiro, reversão e auditoria em comparação ao painel.
7.3 Jornada mobile
Aluno → Ação rápida → Serviço e quantidade → Condições → Conferência → Sucesso
| Etapa | Interface | Regra de negócio |
|---|---|---|
| 1. Aluno | Busca por nome ou CPF, resultado com nome e CPF formatado | Resultado sempre limitado ao CFC do token |
| 2. Ação rápida | Lista somente ações ativas e completas do CFC | Ação sem serviço válido não é exibida |
| 3. Serviço | Quando houver mais de um, o gestor escolhe um dos serviços da ação; quantidade segue limites retornados pela API | Serviço fora da ação é recusado no servidor |
| 4. Condições | Situação Pago agora ou Pendente, forma de pagamento e data/vencimento conforme situação | Conta, categoria, unidade de custo e preço configurado são somente leitura |
| 5. Conferência | Aluno, ação, serviço, quantidade, créditos previstos, preço, conta, categoria, forma e efeito financeiro | Valores são recarregados pela API antes de confirmar |
| 6. Sucesso | Resumo com créditos incluídos e situação financeira | Oferece Ver aluno, Ver financeiro e Nova venda |
7.4 Campos que o app pode e não pode editar
| Campo | Comportamento no app |
|---|---|
| Aluno | Escolhido pelo gestor, validado por tenant |
| Ação rápida | Escolhida entre as configurações ativas do CFC |
| Serviço | Escolhido somente entre os serviços autorizados pela ação |
| Quantidade | Editável somente se a política retornada para o serviço permitir; padrão vindo da ação |
| Situação, forma e vencimento | Editáveis dentro das opções devolvidas pela API |
| Preço | Exibido como resumo, não editável |
| Conta, categoria financeira e unidade de custo | Exibidas como resumo, não editáveis |
| Desconto e acréscimo comercial | Fora da v1 |
7.5 CFC Pay e integrações externas
Se a forma de pagamento selecionada exigir integração CFC Pay/ND7, a ação não fica concluível no primeiro recorte. A tela explica:
“Esta forma de pagamento deve ser concluída pelo painel neste momento.”
O motivo é evitar uma venda que entregue créditos antes de a integração externa ter seu resultado confirmado. A operação presencial, paga ou pendente, segue disponível nas formas já suportadas pelo domínio local.
7.6 Contrato da API proposto
Os nomes de rota serão confirmados no ciclo de fundação segundo o roteador existente. Para a spec, o contrato lógico é:
| Operação | Entrada mínima | Saída esperada |
|---|---|---|
| Listar ações para aluno | aluno_id |
Ações ativas, serviços permitidos, regras de quantidade e resumo somente leitura |
| Prévia de venda | aluno, ação, serviço, quantidade, situação, forma, data | Créditos, total, classificação financeira, validações e bloqueios |
| Confirmar venda | Dados da prévia + Idempotency-Key |
IDs da movimentação dinâmica/financeira, créditos efetivados e resumo de sucesso |
| Preflight de cadastro | — | Campos rápidos e avançados permitidos/obrigatórios para o CFC, opções e capacidades de cada campo |
| Criar aluno | Campos autorizados pelo preflight + Idempotency-Key |
Identidade do aluno, campos normalizados e saldos iniciais canônicos |
| Buscar contratos por aluno | termo ou aluno_id |
Alunos do CFC e, após seleção, contratos com situação de assinatura já agregada |
| Prévia/confirmar contrato | Dados canônicos + intenção de assinatura + Idempotency-Key |
Prévia e contrato final, incluindo se a pendência de assinatura foi criada e seu status inicial |
O endpoint de confirmação deve ignorar ou rejeitar campos de valor, conta, categoria e unidade de custo enviados pelo cliente quando divergirem da ação recarregada no servidor.
8. Fluxo C — Contratos
8.1 Objetivo
O contrato continua sendo a contratação completa do aluno. Ele utiliza o domínio existente de contrato para gerar serviços, categorias, créditos, parcelas e movimentação financeira com documento do tipo contrato.
8.2 Jornada prevista
Aluno → Configuração comercial → Cobrança → Assinatura → Conferência → Sucesso
| Etapa | Responsabilidade da API | Responsabilidade do app |
|---|---|---|
| Aluno | Validar posse no CFC e retornar contexto comercial | Escolher aluno ou receber o recém-cadastrado |
| Configuração comercial | Retornar somente modelos, serviços, categorias e combinações canônicas disponíveis | Exibir opções permitidas; nunca montar serviços livres |
| Cobrança | Simular parcelas, entrada, forma e vencimentos conforme regras já existentes | Mostrar a prévia e coletar apenas opções liberadas |
| Assinatura | Informar se o CFC possui configuração de assinatura ativa e validar o pedido no momento da criação | Exibir a opção Exigir assinatura do aluno somente quando estiver disponível; o gestor decide se quer criar a pendência neste contrato |
| Conferência | Recalcular todos os efeitos antes da escrita | Exibir contrato, serviços, créditos e calendário financeiro |
| Confirmação | Criar contrato pelos serviços canônicos e, se solicitado/configurado, registrar a pendência canônica de assinatura | Informar sucesso, atalhos de continuidade e o status inicial de assinatura |
8.3 Limites iniciais
- A tela não expõe desconto manual, valor livre ou edição de serviço fora das combinações que o painel já reconhece.
- Se a configuração de assinatura estiver ativa (
status = 1), o app oferece a flag Exigir assinatura do aluno. Ela é enviada somente como intenção e é reconfirmada pelo backend com leitura da configuração ativa; a criação usacriarPendenciaAssinaturano domínio canônico. Se a configuração não estiver ativa, a opção não aparece. - O app não coleta assinatura, não abre assinatura embutida e não altera os status. Ele apenas exibe Assinatura não exigida, Pendente, Assinado, Aprovado, Rejeitado ou Cancelado de acordo com a fonte canônica.
- Emissão documental, impressão e cobrança integrada continuam fora deste primeiro fluxo.
- O ciclo de fundação deve inventariar os campos de contrato obrigatórios e as possibilidades realmente suportadas pelo domínio. Caso o painel não disponha de modelo/configuração suficiente para uma seleção segura, o ponto de entrada de contrato fica indisponível até o requisito ser formalizado.
8.4 Prevenção de duplicidade
Além da chave de idempotência, a API preserva a regra canônica de intervalo para novos contratos do mesmo aluno. A resposta ao app deve explicar em termos operacionais que existe um contrato recente, sem expor dados de outro usuário ou CFC.
8.5 Busca e acompanhamento de contratos
A entrada Contratos começa por uma busca de aluno reutilizável. O gestor pode pesquisar por nome, CPF ou RENACH, com normalização de acentos e números compatível com os seletores já existentes do App Gestão. Cada resultado é restrito ao CFC do token e apresenta nome, CPF formatado e RENACH quando houver.
Depois da seleção, a tela exibe os contratos daquele aluno em ordem decrescente, com: número/data, resumo de serviços, total, situação financeira/documental canônica e situação de assinatura. Um contrato sem registro de assinatura mostra Assinatura não exigida; o app não oferece ações de assinatura nessa lista.
As ações disponíveis são Novo contrato e Ver resumo. Reenvio, aprovação, cancelamento, impressão e edição continuam no painel. A API deve buscar os contratos e as pendências de assinatura em lote, evitando consulta adicional por card quando a lista tiver vários itens.
9. Navegação e apresentação visual
9.1 Pontos de entrada
O Painel ganha uma seção nomeada Operação comercial, distinta dos Atalhos do Painel já existentes. Ela só aparece quando existir ao menos uma capacidade comercial.
| Capacidade disponível | Entrada renderizada |
|---|---|
cadastro_alunos |
Novo aluno |
vendas_rapidas |
Nova venda |
contratos |
Novo contrato |
Quando houver pouco espaço, a seção abre uma folha inferior “Operação comercial”, sem reusar o rótulo Ações rápidas para os atalhos.
9.2 Componentes
Os três fluxos reutilizam os componentes já consolidados no app:
- cabeçalho institucional em duas faixas;
- seletor com busca de aluno e CPF formatado;
- cards brancos de canto arredondado e sombra leve;
- resumo financeiro com valor, rótulo e status textual;
- botão primário fixo no rodapé, com espaçamento de rolagem suficiente para não encobrir o último campo;
- estados de carregamento, vazio, erro e sem conexão conforme a spec principal.
As referências visuais deste escopo ficam em
local-docs/design/prototipo/cadastro-e-venda/: a tela de cadastro evidencia
o acesso progressivo aos dados avançados; a tela de contrato evidencia a opção
de exigir assinatura; e uma tela de consulta mostra busca por aluno e status
das assinaturas. Elas são referência de composição, não regra de banco nem
contrato de API.
Como o protótipo atual não possui telas próprias para esses três fluxos, a
primeira etapa visual deve produzir uma composição de referência alinhada aos
tokens, tipografia e espaçamentos de local-docs/design/prototipo/, antes de
consolidar as telas Flutter.
9.3 Microcopy inicial
| Contexto | Texto |
|---|---|
| Sem ações configuradas | “Não há ações rápidas disponíveis para este CFC.” |
| Venda com preço travado | “Preço definido pela configuração desta ação.” |
| Venda pendente | “Será criada uma pendência financeira para este aluno.” |
| Venda concluída | “Venda registrada e créditos adicionados ao aluno.” |
| Contrato concluído | “Contrato criado. Confira as parcelas e créditos do aluno.” |
| Cadastro concluído | “Aluno cadastrado. Escolha o próximo passo.” |
| Assinatura disponível | “Este CFC permite solicitar a assinatura pelo aplicativo.” |
| Assinatura pendente | “A assinatura do aluno está pendente.” |
| Sem contratos | “Este aluno ainda não possui contratos.” |
| Sem permissão | Controle ausente; não há mensagem de botão bloqueado |
10. Persistência, DDL e compatibilidade
10.1 Alterações previstas
| Item | Necessidade | Regra |
|---|---|---|
| Ações e permissões do sistema | Necessária | Migration idempotente, com IDs obtidos por preflight e carga inicial explicitamente documentada |
| Capacidades no login/refresh | Necessária | Aditiva; chaves novas com false seguro para quem não receber a permissão |
| Idempotência comercial | Necessária para vendas e contratos | Tabela própria do domínio comercial, com tenant, usuário, tipo, chave, hash, estado, resultado e datas |
| Tabelas de aluno, contrato, créditos e financeiro | Não previstas | Reuso das estruturas canônicas existentes |
| Assinaturas de contrato | Não prevista | Reuso de clientes_alunos_contratos_assinaturas; o app não cria tabela paralela nem novo status |
| Ações rápidas configuradas pelo painel | Não previstas | Apenas leitura; nenhuma alteração de configuração pelo app |
10.2 Migration e documentação obrigatórias
Antes de aplicar qualquer DDL:
- executar leitura de
SHOW TABLES,SHOW COLUMNS,SHOW INDEXe dos IDs disponíveis para definir nomes/índices e ações sem colisão; - criar migration versionada em
docker/local/db/migrations/; - executar a migration duas vezes no MySQL local, comprovando idempotência;
- documentar o DDL, pré-requisitos e rollback seguro em um novo arquivo de
local-docs/implementacoes/; - só então habilitar os endpoints dependentes da estrutura.
Nenhum DDL será aplicado em ambiente externo como consequência desta spec. Uma promoção de ambiente exige autorização posterior e específica.
10.3 Auditoria
As operações devem permitir responder, sem ambiguidade:
- qual usuário vendeu, cadastrou ou criou o contrato;
- em qual CFC;
- quando ocorreu;
- qual ação/configuração originou a venda;
- quais créditos, contrato e movimentação financeira resultaram;
- se a resposta foi uma repetição idempotente.
11. Critérios de aceite e validações
11.1 Cadastro de aluno
- CPF inválido e CPF duplicado no mesmo CFC são recusados.
- O mesmo CPF em outro CFC não interfere na criação do tenant atual.
- O aluno criado recebe os saldos iniciais canônicos, sem crédito comprado.
- O formulário rápido exige somente os campos obrigatórios devolvidos pelo preflight; o avançado aceita os campos suportados pelo painel sem criar regra diferente no app.
- Repetir uma solicitação após queda de rede não cria aluno duplicado.
11.2 Venda rápida
- Ação inativa, inexistente, de outro CFC ou sem serviço válido não pode ser consultada ou executada.
- Serviço fora da ação é recusado, mesmo se o app for manipulado.
- Preço, conta, categoria e unidade de custo enviados de forma adulterada não alteram o resultado configurado da ação.
- A venda cria os créditos esperados, uma movimentação dinâmica e o efeito financeiro correto para pago ou pendente.
- Repetir a mesma chave devolve o mesmo resultado, sem segundo crédito nem segunda movimentação.
- O painel continua exibindo a venda e os créditos como operação canônica.
11.3 Contratos
- O contrato usa os serviços, categorias, créditos e parcelas retornados pela prévia canônica.
- Tentativas de serviço/preço fora do contrato são recusadas.
- Um retry não cria segundo contrato ou segunda cobrança.
- A regra existente de contrato recente permanece aplicada.
- A flag de assinatura só é exibida e aceita quando a configuração do CFC está
ativa (
status = 1). Quando marcada, cria uma única pendência canônica; quando desmarcada, o contrato não recebe pendência. - A busca por nome, CPF ou RENACH não retorna aluno de outro CFC e os contratos retornados mostram o status atual de assinatura sem permitir sua alteração.
11.4 Regressão e dispositivos
- Lint PHP, verificadores de contrato e harnesses de tenant/autorização aprovados no ambiente local.
flutter analyze, testes de repositório, estados de tela e serialização de idempotência aprovados no app novo.- Smoke manual local: criar aluno, vender ação rápida, conferir saldo/crédito, criar contrato de cenário permitido e conferir parcelas.
- Nenhum teste chama CFC Pay, ND7, e-mail, storage externo, homologação ou produção.
12. Cronograma vivo
O avanço desta extensão é medido em nove ciclos de mesmo peso. Um ciclo só fica concluído quando seus critérios de aceite passam, seu histórico é registrado e há commit local coerente em cada repositório realmente alterado.
| Ciclo | Entrega verificável | Depende de | Estado inicial |
|---|---|---|---|
| C0 | Contratos de API, composição visual de referência, preflight de ações/DDL, inventário dos campos de aluno e da assinatura canônica, e matriz de permissões | — | Planejado |
| C1 | Fundação de autorização comercial, capacidades aditivas, migration e harness de DDL | C0 | Planejado |
| C2 | Busca comercial e cadastro rápido/avançado de aluno ponta a ponta | C1 | Planejado |
| C3 | Leitura/prévia segura de Ações rápidas, sem escrita | C1, C2 | Planejado |
| C4 | Confirmação idempotente de venda rápida, crédito, financeiro e auditoria | C3 | Planejado |
| C5 | Interface Flutter de venda rápida e entradas de Operação comercial | C2, C4 | Planejado |
| C6 | Busca/listagem de contratos, leitura de assinatura e prévia canônica de contratos | C1, C2 | Planejado |
| C7 | Escrita idempotente de contrato pelo adaptador seguro, incluindo pedido opcional de assinatura | C6 | Planejado |
| C8 | Interface Flutter de contratos, status de assinatura, integração comercial e regressão ponta a ponta | C5, C7 | Planejado |
12.1 Ordem e paralelismo permitido
- C2 e C3 podem ter preparação técnica em paralelo somente depois de C1, mas C3 não é dado como concluído sem a seleção de aluno de C2 disponível.
- C6 pode avançar como leitura/inventário após C2, sem aguardar a escrita da venda rápida.
- C4, C5, C7 e C8 não podem pular seus predecessores.
- Se uma dependência expor decisão de produto não resolvida, o ciclo fica Bloqueado; não se substitui a decisão por comportamento inventado.
12.2 Regra de atualização do cronograma
Ao abrir um ciclo, atualizar a tabela para Em andamento, descrevendo o objetivo real. Ao concluí-lo, registrar somente fatos verificados: arquivos, DDL, testes, limitações e hashes de commit. Reordenação é permitida apenas para respeitar dependência técnica, sem modificar as regras desta spec.
13. Histórico incremental
| Data | Ciclo | Estado | Registro factual |
|---|---|---|---|
| 2026-10-08 | Planejamento | Concluído | Spec criada para separar cadastro de aluno, contratos e venda rápida baseada em movimentação dinâmica. Nenhuma implementação, migration, commit, deploy ou publicação foi realizada nesta etapa. |
| 2026-10-08 | Refinamento | Concluído | Cadastro rápido/avançado, pedido opcional de assinatura canônica e busca/listagem de contratos por aluno foram incorporados ao plano. Nenhuma implementação, migration, commit, deploy ou publicação foi realizada nesta etapa. |
Em cada ciclo de implementação concluído, acrescentar uma linha nesta tabela e um registro detalhado em:
local-docs/historico/AAAA-MM-DD-app-gestao-comercial-alunos-vendas.md
O registro detalhado deve conter escopo, decisões, arquivos alterados, DDLs, validações, pendências, hashes e a declaração de que não houve push/publicação quando isso permanecer verdadeiro.
14. Política de execução e commits
- Cada ciclo altera somente o necessário para a entrega especificada.
- Antes do commit, revisar
git status, diffs e alterações preexistentes; nada alheio ao ciclo entra no commit. - Validar primeiro; registrar histórico e cronograma em seguida; criar commit local por último.
- Quando backend e Flutter forem alterados, cada repositório recebe seu commit local próprio, com hash registrado no histórico.
- Não haverá
git push, PR, tag, merge remoto, publicação em loja ou deploy como consequência automática de um ciclo. Qualquer atualização de ambiente remoto ou build distribuível precisa de solicitação explícita posterior. - O app legado continua somente como referência de compatibilidade. Nenhum commit é feito nele.
Formato recomendado de mensagem:
(cfc-p) entrega C4 — venda rápida idempotente
(cfc-p-app-gestao-2026) entrega C5 — fluxo de venda rápida
15. Decisões fechadas e decisões condicionais
15.1 Fechadas
- Ações rápidas são o domínio comercial
movimentacao dinamicado painel. - Venda rápida, cadastro de aluno e contrato são fluxos diferentes.
- Venda rápida inicial preserva a semântica atual de um serviço elegível por confirmação.
- O app não edita preço, descontos ou classificação financeira da Ação rápida.
- O fluxo comercial é exclusivo do contexto Gestor.
- O cadastro rápido e o avançado gravam pelo mesmo domínio canônico; campos obrigatórios continuam sendo definidos pelo CFC/servidor.
- A assinatura do aluno é solicitada opcionalmente no app somente quando a configuração já existir no painel; assinatura e mudanças de status seguem fora do app.
- A consulta de contratos é por aluno e aceita nome, CPF ou RENACH, sempre limitada ao CFC do token.
- Todo ciclo terá validação, cronograma vivo, histórico incremental e commits somente locais.
15.2 Condicionais a validar no C0/C6
| Tema | Regra provisória segura |
|---|---|
| Campos obrigatórios de cadastro | O backend canônico define; o Flutter não cria regras próprias |
| Quantidade editável na venda | Só aparece se a política/serviço canônico permitir |
| Modelos e composição de contrato | Só são expostos quando houver configuração canônica suficiente para prévia segura |
| Assinatura pendente | Só é criada se a configuração de assinatura do CFC estiver válida |
| CFC Pay | Bloqueado neste recorte; será analisado em extensão específica |
16. Riscos e contenções
| Risco | Contenção obrigatória |
|---|---|
| App manipulado altera preço ou conta | Servidor reconstitui valores da Ação rápida e rejeita divergências |
| Reenvio por rede instável duplica crédito | Chave de idempotência persistida e resultado reaproveitado |
| Classe legada grava parcialmente | Teste de falha e transação/reconciliação antes de liberar POST |
| Ação configurada de modo incompleto | Não exibir ou devolver bloqueio explicativo; nunca aplicar fallback financeiro |
| Configuração de assinatura desativada ainda tem registro no banco | O preflight e a escrita conferem explicitamente status = 1; não reutilizar a checagem legada apenas por existência para liberar a flag no app |
| Permissão de financeiro libera venda indevida | Capacidade comercial separada e revalidada no endpoint |
| Confusão entre contrato e venda | Nomes, entradas, confirmações e recibos distintos |
| Regressão no painel | Reusar classes canônicas, não alterar rotas AJAX existentes e executar smoke no painel |
17. Condição de encerramento
Esta extensão fica concluída somente quando os nove ciclos estiverem em Concluído, os testes definidos tiverem evidência no histórico, o app preservar os fluxos já existentes e cada operação comercial puder ser conferida no painel sem divergência de crédito, financeiro, contrato ou autoria.
Não há autorização implícita nesta spec para publicar, enviar builds, alterar ambiente externo ou integrar CFC Pay.