feat(api,web): SAC de chamados sobre pedidos
Representante abre chamado a partir de um pedido e conversa com a empresa por thread de mensagens; o gerente responde e resolve. - API: `SacModule` com 5 rotas do rep (listar, detalhe, criar, responder, cancelar) e 4 da empresa (/ger/chamados: listar, detalhe, responder, resolver). Escopo do rep e por cod_vendedor; o da empresa, por id_empresa. - Modelos `Chamado` + `ChamadoMensagem` e migrations correspondentes. - O chamado pode referenciar tanto um pedido nascido no SAR (id_pedido + num_ped_sar) quanto um pedido historico do ERP (num_ped_erp) — dai id_pedido e num_ped_sar serem nullable. `nome_cliente` fica desnormalizado para evitar join em toda listagem. - Web: `ChamadosPage` (rep), `GerChamadosPage` (gerente) e `AbrirChamadoModal`, acessivel tambem pelo detalhe do pedido. Entradas "SAC" no menu do rep e do gerente. - `useOrderErpConsulta` ganha flag `enabled` para a busca de pedido ERP so disparar quando o modal esta aberto. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -197,6 +197,50 @@ model Oportunidade {
|
||||
@@map("oportunidades")
|
||||
}
|
||||
|
||||
// ─── Chamados SAC ────────────────────────────────────────────────────────────
|
||||
//
|
||||
// Chamado aberto pelo representante vinculado a um pedido SAR.
|
||||
// tipo: avaria | quantidade_divergente | produto_errado | prazo_entrega | outro
|
||||
// status: aberto | em_analise | aguardando_rep | resolvido | cancelado
|
||||
// resolucao: reposicao | desconto | cancelamento_item | sem_acao | outro
|
||||
|
||||
model Chamado {
|
||||
id Int @id @default(autoincrement())
|
||||
idEmpresa Int @map("id_empresa")
|
||||
codVendedor Int @map("cod_vendedor")
|
||||
idPedido String? @db.Uuid @map("id_pedido")
|
||||
numPedSar Int? @map("num_ped_sar")
|
||||
numPedErp Int? @map("num_ped_erp")
|
||||
idCliente Int @map("id_cliente")
|
||||
nomeCliente String? @db.VarChar(200) @map("nome_cliente")
|
||||
tipo String @db.VarChar(50)
|
||||
assunto String @db.VarChar(200)
|
||||
descricao String
|
||||
status String @default("aberto") @db.VarChar(30)
|
||||
resolucao String? @db.VarChar(50)
|
||||
notaResolucao String? @map("nota_resolucao")
|
||||
itensAfetados Json? @map("itens_afetados")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
mensagens ChamadoMensagem[]
|
||||
|
||||
@@index([idEmpresa, codVendedor])
|
||||
@@index([idEmpresa, status])
|
||||
@@map("chamados")
|
||||
}
|
||||
|
||||
model ChamadoMensagem {
|
||||
id Int @id @default(autoincrement())
|
||||
idChamado Int @map("id_chamado")
|
||||
autor String @db.VarChar(10)
|
||||
texto String
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
chamado Chamado @relation(fields: [idChamado], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([idChamado])
|
||||
@@map("chamado_mensagens")
|
||||
}
|
||||
|
||||
// ─── PushSubscription (C6) ───────────────────────────────────────────────────
|
||||
//
|
||||
// Subscription VAPID Web Push por usuário. endpoint é único por dispositivo/browser.
|
||||
|
||||
Reference in New Issue
Block a user