128 lines
3.3 KiB
Go
128 lines
3.3 KiB
Go
package contratos
|
|
|
|
import "time"
|
|
|
|
// Tipos centralizados do projeto.
|
|
//
|
|
// Regra: este arquivo concentra as tipagens (structs) usadas como contratos de
|
|
// dados entre camadas (backend, painel e widget/WASM), para manter consistência
|
|
// e facilitar auditoria.
|
|
|
|
// ------------------------------
|
|
// API do widget
|
|
// ------------------------------
|
|
|
|
type PedidoInput struct {
|
|
ProdutoNome string `json:"produto_nome"`
|
|
InquilinoCodigo string `json:"inquilino_codigo"`
|
|
InquilinoNome string `json:"inquilino_nome"`
|
|
UsuarioCodigo string `json:"usuario_codigo"`
|
|
UsuarioNome string `json:"usuario_nome"`
|
|
UsuarioTelefone string `json:"usuario_telefone"`
|
|
UsuarioEmail string `json:"usuario_email"`
|
|
}
|
|
|
|
type PedidoResponse struct {
|
|
PodeAbrir bool `json:"pode_abrir"`
|
|
Motivo string `json:"motivo,omitempty"`
|
|
ID string `json:"id,omitempty"`
|
|
// Produto normalizado retornado pelo backend para montar URL segura.
|
|
Produto string `json:"produto,omitempty"`
|
|
}
|
|
|
|
type PatchInput struct {
|
|
Nota *int `json:"nota,omitempty"`
|
|
Justificativa *string `json:"justificativa,omitempty"`
|
|
Finalizar bool `json:"finalizar,omitempty"`
|
|
}
|
|
|
|
type Registro struct {
|
|
// ProdutoNome é o nome original do produto como enviado pela integração/widget.
|
|
// Ele existe apenas para exibição ao usuário.
|
|
//
|
|
// Importante: a normalização (remoção de acentos/símbolos) é usada apenas
|
|
// para formar o nome da tabela no Postgres e o parâmetro {produto} da rota.
|
|
ProdutoNome string
|
|
ID string
|
|
Status string
|
|
Nota *int
|
|
Justificativa *string
|
|
PedidoCriadoEm time.Time
|
|
RespondidoEm *time.Time
|
|
}
|
|
|
|
// FormPageData é o payload para renderização do formulário no iframe.
|
|
type FormPageData struct {
|
|
Produto string
|
|
ID string
|
|
Reg Registro
|
|
}
|
|
|
|
// ------------------------------
|
|
// Painel
|
|
// ------------------------------
|
|
|
|
// NPSMensal representa o cálculo do NPS agregado por mês.
|
|
type NPSMensal struct {
|
|
Mes string
|
|
Detratores int
|
|
Neutros int
|
|
Promotores int
|
|
Total int
|
|
NPS int
|
|
}
|
|
|
|
// RespostaPainel representa uma resposta para listagem no painel.
|
|
type RespostaPainel struct {
|
|
ID string
|
|
RespondidoEm *time.Time
|
|
PedidoCriadoEm time.Time
|
|
UsuarioCodigo *string
|
|
UsuarioNome string
|
|
UsuarioEmail *string
|
|
Nota *int
|
|
Justificativa *string
|
|
}
|
|
|
|
type PainelDados struct {
|
|
Produto string
|
|
Produtos []string
|
|
Meses []NPSMensal
|
|
Respostas []RespostaPainel
|
|
Pagina int
|
|
SomenteBaixas bool
|
|
MsgErro string
|
|
}
|
|
|
|
type ListarRespostasFiltro struct {
|
|
SomenteNotasBaixas bool
|
|
Pagina int
|
|
PorPagina int
|
|
}
|
|
|
|
func (f *ListarRespostasFiltro) Normalizar() {
|
|
if f.Pagina <= 0 {
|
|
f.Pagina = 1
|
|
}
|
|
if f.PorPagina <= 0 || f.PorPagina > 200 {
|
|
f.PorPagina = 50
|
|
}
|
|
}
|
|
|
|
// ------------------------------
|
|
// Widget/WASM
|
|
// ------------------------------
|
|
|
|
// ConfigWidget representa as opções passadas para window.ELiNPS.init(...).
|
|
// No WASM lemos via syscall/js; aqui fica apenas a tipagem centralizada.
|
|
type ConfigWidget struct {
|
|
ProdutoNome string
|
|
InquilinoCodigo string
|
|
InquilinoNome string
|
|
UsuarioCodigo string
|
|
UsuarioNome string
|
|
UsuarioTelefone string
|
|
UsuarioEmail string
|
|
CooldownHours float64
|
|
DataMinimaAbertura string
|
|
}
|