Coding
PromptBeginner5 minmarkdown
Markdown Converter
Agent skill for markdown-converter
7
Este projeto, **EchoDental**, é um sucessor espiritual do OdontoClin. Suas ações de codificação DEVEM aderir estritamente a estas regras de arquitetura, workflow e robustez.
Sign in to like and favorite skills
Este projeto, EchoDental, é um sucessor espiritual do OdontoClin. Suas ações de codificação DEVEM aderir estritamente a estas regras de arquitetura, workflow e robustez.
A interação com o paciente é centralizada em 5 abas/telas:
[Ficha + Anamnese]: Dados cadastrais (com BrasilAPI para CEP) e Anamnese (com alertas de pendência/revalidação).[Odontograma Master] (3D): O hub clínico (Three.js) para diagnóstico. Salva dados na tabela AchadoClinico. Possui um "Catálogo de Serviços" (pesquisa) para adicionar itens avulsos (ex: Limpeza).[Planejamento Financeiro] (Orçamentos): A lista de PlanoTratamento. Mostra um Diagrama 2D-SVG (dinâmico) para cada plano.[Financeiro (Extrato)]: O extrato global do paciente, o "Carnê Cosmético" (ParcelaPrevista), e os botões de Admin (Ajustar Saldo, Estorno).[Histórico]: A timeline legível (vinda da tabela TimelineEvento).AchadoClinico (minimalista: paciente_id, dente, faces, diagnostico_cod) é a fonte da verdade do Odontograma Master.Paciente.odontograma_inicial_json armazena um snapshot JSON do primeiro diagnóstico, que SÓ PODE ser sobrescrito por um Admin.service DEVE suportar a criação de ItemPlano com dente=NULL e achado_clinico_id=NULL (vindos do "Catálogo de Serviços" na Tela 2).Saldo Devedor DEVE ser sempre um cálculo dinâmico: Plano.valor_total - SUM(Lancamentos.valor_pago).service DEVE permitir um Saldo Devedor negativo (ex: -R$ 50,00). A UI DEVE renderizar isso como "Crédito Disponível".PROPOSTO (Flexível): O service DEVE permitir a edição (via UI/HTMX) dos campos ItemPlano.procedimento_nome_historico e ItemPlano.valor_cobrado.APROVADO (Selado): O service DEVE bloquear a edição desses campos.service DEVE "congelar" (denormalizar) o preço e o nome no ItemPlano no momento da criação. O PlanoTratamento não será afetado por reajustes futuros (Regra "Orto").ParcelaPrevista é apenas um lembrete visual (sem status). A UI (Jinja) DEVE renderizar o status (Paga/Parcial/Pendente) dinamicamente, comparando SUM(Lancamentos.valor_pago) contra a lista de ParcelaPrevista.APROVADO. Ajustes DEVEM ser feitos criando um LancamentoFinanceiro com tipo_lancamento="AJUSET" e notas_motivo (obrigatório).parent_plan. Criar um PlanoTratamento (Orçamento) novo e independente, que pode conter itens de estorno (valor negativo).CANCELADO. A dívida é permanente. O Plano fica APROVADO (a menos que quitado via AJUSET).app/models.py: Um arquivo único para todos os modelos SQLAlchemy.app/services/: Pacote para toda lógica de negócio (ex: financeiro_service.py).app/blueprints/: Pacote para rotas "burras" (thin controllers) que chamam os services e renderizam templates.public: Contém tabelas de governança global (ex: Tenant, GlobalSetting) e tabelas de infraestrutura (ex: DeveloperLog). Modelos DEVEM ser marcados com __table_args__ = {"schema": "public"}.tenant_xxx (ex: tenant_default): Contém todos os dados de negócios isolados da clínica (ex: Paciente, Usuario, PlanoTratamento, LogAuditoria). Modelos DEVEM ser agnósticos de schema (não possuem __table_args__).app/__init__.py) DEVE interceptar todas as requisições (@app.before_request) e definir o search_path da sessão do banco de dados (ex: SET LOCAL search_path TO tenant_default, public).db.ForeignKey são mandatórias para garantir a integridade referencial dentro de cada schema (ex: Agendamento.dentista_id -> Usuario.id).flask dev-sync-db. Este comando é a fonte da verdade para DEV. Ele DEVE apontar para o DATABASE_URL principal (ex: echodent_dev).dev-sync-db:
DROP/CREATE SCHEMAS (public, tenant_default).db.create_all(): Constrói o schema instantaneamente a partir dos app/models.py. (Não usa flask_migrate.upgrade()).seeder.py: Popula os dados de teste.migrate): O comando flask db migrate DEVE ser configurado (via alembic.ini ou env.py) para apontar para um "Banco Sombra" (ex: SHADOW_DATABASE_URL=.../echodent_shadow). Este banco sombra nunca é tocado pelo dev-sync-db, permitindo que o Alembic calcule o diff correto entre os models.py e o estado de migração anterior.upgrade): O comando flask db upgrade DEVE usar a lógica "two-pass" (Public -> Tenants) para aplicar os scripts gerados no ambiente de produção.is_active=False) para Usuario e ProcedimentoMestre. Nunca excluir, para preservar o histórico.user_id e changes_json, armazenados no schema tenant.SQL UNION. Criar uma tabela TimelineEvento (dedicada) e populá-la (via escrita dupla) na camada de services/ para uma timeline legível e performática.Anamnese.status == "PENDENTE" ou Anamnese.data_atualizacao > 6 meses.services/ que escreve no DB DEVE usar try/commit/rollback para garantir transações atômicas.services/ DEVE usar uma função utils.sanitizar_input() em todos os campos de texto livre (Text, String) antes de salvar no DB.service de Estorno DEVE ser bloqueado se FechamentoCaixa.status == "Fechado", forçando o Admin a usar um AJUSET no dia atual.hx-post, hx-put, etc.) DEVE ser desabilitado via CSS (.htmx-request { pointer-events: none; }) durante a requisição.global.js DEVE implementar a flag window.isFormDirty (acionada por <form> e pelo three.js) e usar htmx:beforeRequest para disparar um window.confirm() e prevenir perda de dados.DateTime no DB DEVEM ser timezone=True (UTC).instance/media_storage/ com caminhos relativos. Não usar blobs. Não comprimir imagens de diagnóstico.@media print dedicado) em uma rota de impressão (ex: /imprimir/log/<id>). O service NÃO salva o PDF; a persistência é feita no LogEmissao (dados-chave JSON).style="..." ou <script>...</script>).global.css: Usar para Design Tokens (Variáveis CSS) e componentes (ex: .card)..ficha-paciente-container .tabela-especifica { ... })./__dev/login_as/... e scripts de purga (como purge_dev_users.py) são permitidos, mas DEVEM ser bloqueados se app.debug == False.pytest para mudanças visuais (CSS/JS) é aceitável; focar em testes visuais.