evo360-types 1.3.552 → 1.3.555

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ // Tipos do CSQ 2.0 (Conversation Sales Quality) — feat-154.
3
+ // Schemas zod correspondentes ficam em src/apps/evo-csq/zod-schemas.ts;
4
+ // estes tipos sao escritos a mao e mantidos em paralelo (convencao do projeto:
5
+ // `apps/` = zod, `types/` = interfaces TS).
6
+ //
7
+ // Contrato de nomes/codigos: hub-medica-docs/features/feat-154-csq-2-0/report-spec.md
8
+ // (§2 estrutura, §3 indicadores, §4 rubrica, §5 claims, §6 alertas) e o
9
+ // "Adendo pos-parecer" do plan.md (§A–§I), que prevalece sobre o corpo do plano.
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.CSQ_DEFAULTS = exports.CSQ_RUBRIC_V1 = exports.CSQ_AUTO_FAIL_POLICY_SUBTYPES = exports.CSQ_AUTO_FAIL_ALERT_CODES = exports.CSQ_SALES_FLOW_SUBTYPES = exports.CSQ_POLICY_VIOLATION_SUBTYPES = exports.CSQ_ALERT_CODES = exports.CSQ_RUBRIC_VERSION = void 0;
26
+ __exportStar(require("./fb_collections"), exports);
27
+ // ───────── Versao da rubrica ─────────
28
+ /** Versao da rubrica da plataforma gravada em cada avaliacao. Pesos e criterios
29
+ * sao da plataforma (nao do tenant); mudar pesos exige nova versao. */
30
+ exports.CSQ_RUBRIC_VERSION = "v1";
31
+ // ───────── Catalogo de alertas (report-spec §6) ─────────
32
+ /** Codigos de alerta v1. Os subtipos de `POLITICA_VIOLADA` e
33
+ * `FLUXO_VENDA_NAO_SEGUIDO` vivem em `ICsqAlert.subtype`, nao como codigos. */
34
+ exports.CSQ_ALERT_CODES = [
35
+ "AGENDAMENTO_INFORMADO_NAO_REGISTRADO",
36
+ "AGENDAMENTO_DIVERGENTE",
37
+ "AGENDAMENTO_SOBREPOSTO",
38
+ "CONTRADICAO_PREMISSA_ANTERIOR",
39
+ "ORIENTACAO_CLINICA_INDEVIDA",
40
+ "POLITICA_VIOLADA",
41
+ "ULTIMA_MENSAGEM_SEM_RESPOSTA",
42
+ "PERGUNTA_NAO_RESPONDIDA",
43
+ "PROMESSA_NAO_CUMPRIDA",
44
+ "IDENTIDADE_ERRADA",
45
+ "DADO_JA_INFORMADO_RECOLETADO",
46
+ "DADO_OBRIGATORIO_NAO_COLETADO",
47
+ "FLUXO_VENDA_NAO_SEGUIDO",
48
+ "MOTIVO_ENCERRAMENTO_INCOMPATIVEL",
49
+ "SLA_RESPOSTA_ALTO",
50
+ "LEAD_QUENTE_SEM_FOLLOWUP",
51
+ "LEAD_ORIGEM_INCONSISTENTE",
52
+ "LEAD_QUALIFICACAO_INCONSISTENTE",
53
+ "AUTOMACAO_CONFLITANTE",
54
+ "DADO_SENSIVEL_SOLICITADO",
55
+ "URGENCIA_NAO_ENCAMINHADA",
56
+ "NF_NAO_ENVIADA",
57
+ "COBRANCA_NAO_ENVIADA",
58
+ ];
59
+ /** Subtipos de `POLITICA_VIOLADA` (report-spec §6). */
60
+ exports.CSQ_POLICY_VIOLATION_SUBTYPES = [
61
+ "valor",
62
+ "parcelamento",
63
+ "convenio",
64
+ "dia_horario",
65
+ "procedimento",
66
+ "modalidade",
67
+ ];
68
+ /** Subtipos de `FLUXO_VENDA_NAO_SEGUIDO` (report-spec §6). */
69
+ exports.CSQ_SALES_FLOW_SUBTYPES = [
70
+ "objecao_sem_argumento",
71
+ "sem_oferta_concreta",
72
+ "preco_antes_da_queixa",
73
+ ];
74
+ /** Alertas que forcam auto-fail (`status='Crítico'`, `score <= 49`,
75
+ * `escalate=true`). Para `POLITICA_VIOLADA` o auto-fail so vale nos subtipos
76
+ * de `CSQ_AUTO_FAIL_POLICY_SUBTYPES`; alertas de agenda so contam depois da
77
+ * rechecagem (`verification='confirmed'`, adendo §B). */
78
+ exports.CSQ_AUTO_FAIL_ALERT_CODES = [
79
+ "AGENDAMENTO_INFORMADO_NAO_REGISTRADO",
80
+ "AGENDAMENTO_DIVERGENTE",
81
+ "CONTRADICAO_PREMISSA_ANTERIOR",
82
+ "ORIENTACAO_CLINICA_INDEVIDA",
83
+ "POLITICA_VIOLADA",
84
+ "ULTIMA_MENSAGEM_SEM_RESPOSTA",
85
+ "DADO_SENSIVEL_SOLICITADO",
86
+ "URGENCIA_NAO_ENCAMINHADA",
87
+ ];
88
+ /** Subtipos de `POLITICA_VIOLADA` que caracterizam auto-fail (report-spec §4,
89
+ * auto-fail 4: valor/parcelamento/convenio contra a politica do roteiro). */
90
+ exports.CSQ_AUTO_FAIL_POLICY_SUBTYPES = [
91
+ "valor",
92
+ "parcelamento",
93
+ "convenio",
94
+ ];
95
+ /** Rubrica da plataforma v1. Pesos: 20/25/25/15/15 (report-spec §4).
96
+ * Os `code` sao contrato: aparecem em `ICsqCriterionScore.criterion` e no
97
+ * schema da tool de saida do juiz. */
98
+ exports.CSQ_RUBRIC_V1 = [
99
+ {
100
+ code: "coerencia_historico",
101
+ name: "Coerência com o histórico do lead",
102
+ weight: 20,
103
+ criteria: [
104
+ { code: "nao_contradiz_premissa", name: "Não contradiz premissa declarada (Estado do lead anterior + conversa)" },
105
+ { code: "nao_repergunta_dado_informado", name: "Não re-pergunta dado já informado" },
106
+ { code: "reconhece_contexto", name: "Reconhece o contexto (já é paciente, restrições)" },
107
+ { code: "nomes_corretos", name: "Trata lead e paciente pelos nomes certos" },
108
+ ],
109
+ },
110
+ {
111
+ code: "roteiro_conversao",
112
+ name: "Aderência ao roteiro & fluxo comercial",
113
+ weight: 25,
114
+ criteria: [
115
+ { code: "segue_fluxo_previsto", name: "Segue o fluxo previsto em binding.behavior" },
116
+ { code: "objecao_tratada_com_argumento", name: "Objeção tratada com o argumento do roteiro" },
117
+ { code: "dados_obrigatorios_coletados", name: "Dados obrigatórios (capture-data) coletados" },
118
+ { code: "motivo_fechamento_coerente", name: "Motivo de fechamento coerente com o desfecho (mcp_description)" },
119
+ { code: "abertura_encerramento_padrao", name: "Abertura e encerramento padrão" },
120
+ ],
121
+ },
122
+ {
123
+ code: "acuracidade",
124
+ name: "Acuracidade",
125
+ weight: 25,
126
+ criteria: [
127
+ { code: "fatos_e_politicas_corretos", name: "Fatos e políticas de channel_custom (valores, dias/horários, convênio, inclusos, parcelamento, endereço)" },
128
+ { code: "datas_horas_coerentes", name: "Datas e horas coerentes" },
129
+ { code: "agendamento_bate_com_agenda", name: "Agendamento informado bate com a agenda (crítico)" },
130
+ { code: "nao_promete_o_que_nao_controla", name: "Não promete o que não controla" },
131
+ ],
132
+ },
133
+ {
134
+ code: "responsividade",
135
+ name: "Responsividade",
136
+ weight: 15,
137
+ criteria: [
138
+ { code: "nenhuma_pergunta_sem_resposta", name: "Nenhuma pergunta sem resposta" },
139
+ { code: "tempos_dentro_do_limiar", name: "frt_min e max_gap_min dentro do limiar" },
140
+ { code: "retorno_apos_vou_verificar", name: "'Vou verificar' seguido de retorno efetivo" },
141
+ { code: "ultima_mensagem_respondida", name: "Última mensagem do lead respondida" },
142
+ ],
143
+ },
144
+ {
145
+ code: "cordialidade_linguagem",
146
+ name: "Cordialidade & linguagem da marca",
147
+ weight: 15,
148
+ criteria: [
149
+ { code: "persona_e_tom", name: "Persona e tom de channel.identity" },
150
+ { code: "lexico_obrigatorio_proibido", name: "Léxico obrigatório/proibido" },
151
+ { code: "clareza_objetividade", name: "Clareza e objetividade" },
152
+ { code: "ortografia", name: "Ortografia" },
153
+ { code: "empatia_momento_sensivel", name: "Empatia em momento sensível" },
154
+ ],
155
+ },
156
+ ];
157
+ // ───────── Limiares e orcamentos da plataforma ─────────
158
+ /** Limiares/orcamentos default do CSQ (plataforma, nao por tenant na F1). */
159
+ exports.CSQ_DEFAULTS = {
160
+ /** FRT liquido acima disso conta como atraso na rubrica (minutos). */
161
+ frt_min_warn: 15,
162
+ /** Maior espera acima disso gera SLA_RESPOSTA_ALTO severidade `media`. */
163
+ max_gap_min_medium: 60,
164
+ /** Maior espera acima disso gera SLA_RESPOSTA_ALTO severidade `alta`. */
165
+ max_gap_min_high: 240,
166
+ /** Tolerancia de horario ao comparar agendamento informado x agenda (min). */
167
+ appointment_time_tolerance_min: 15,
168
+ /** Janela de dias ao redor da data informada para procurar o agendamento. */
169
+ appointment_day_window: 1,
170
+ /** Janela da jornada considerada (dias). */
171
+ journey_days: 90,
172
+ /** Teto de tickets da jornada carregados por avaliacao. */
173
+ journey_max_tickets: 20,
174
+ /** Teto de mensagens do artefato de transcricao. */
175
+ transcript_max_messages: 500,
176
+ /** Teto de bytes do artefato de transcricao. */
177
+ transcript_max_bytes: 200000,
178
+ /** Atraso da rechecagem agendada da agenda (minutos apos closed_at). */
179
+ recheck_delay_min: 30,
180
+ };