Files
agent_contas/workflows/invoice_explanation.v2.yaml
2026-08-26 10:15:59 -03:00

171 lines
4.4 KiB
YAML

name: invoice_explanation
version: 2
start: preparar
nodes:
- id: preparar
action: preparar_invoice_explanation
input:
msisdn: $.input.msisdn
customer_id: $.input.customer_id
current_invoice_number: $.input.current_invoice_number
past_invoice_number: $.input.past_invoice_number
current_invoice_due_date: $.input.current_invoice_due_date
past_invoice_due_date: $.input.past_invoice_due_date
channel: $.input.channel
tentativa_anterior: $.vars.preparar.tentativa
invoice_explanation_base: $.input.invoice_explanation_base
- id: formatar
action: formatar_invoice_explanation
input:
explicacao_base: $.vars.preparar.explicacao_base
invoice_detail: $.input.invoice_detail
# A pausa faz parte do contrato do workflow, não da action de formatação.
# Depois de apresentar a explicação, sempre aguardamos SIM/NAO antes de
# entrar em `decisao`. A action `formatar_invoice_explanation` permanece
# responsável apenas por montar a mensagem.
pause:
enabled: true
return_from: $.output.mensagem
expected_input:
key: resposta_usuario
allowed_values: ["SIM", "NAO"]
normalize: upper_strip
resume_from: decisao
- id: checar_tentativa
action: checar_tentativa_cvn
input:
tentativa: $.vars.preparar.tentativa
- id: texto_intencao_invalida
action: montar_resposta_texto
input:
dados:
texto_usuario: "Não consegui validar sua solicitação. Pode informar novamente sobre a sua fatura?"
- id: fim_intencao_invalida
action: montar_resposta_texto
input:
dados:
texto_usuario: "Não foi possível validar sua solicitação neste momento."
- id: resposta_falha_servico
action: montar_resposta_texto
input:
dados:
texto_usuario: "Para continuar com a sua solicitação, aguarde um instante."
- id: decisao
action: no_op
input: {}
- id: registrar_sim
action: registrar_atendimento_invoice_explanation
input:
resposta_usuario: SIM
- id: registrar_protocolo_aceite
action: registrar_protocolo_inicio
input:
msisdn: $.input.msisdn
scenario: invoice_explanation_aceite_fechado
request_status: Fechado
status: CLOSED
- id: registrar_nao
action: registrar_atendimento_invoice_explanation
input:
resposta_usuario: NAO
# A variação foi causada por VAS avulso ou estratégico? Sem VAS variado não há nada que
# o bot resolva, e insistir com o orquestrador só gasta turno (SPEC §9 "Explicação da variação recusada").
- id: checar_vas_variacao
action: checar_vas_variado
input:
invoice_variation: $.input.invoice_variation
invoice_detail: $.input.invoice_detail
# Nó só para nomear o last_node: o backend o mapeia para nao_resolvido em
# auto_finalize_status_map, e a fala vem do NAO_RESOLVIDO_CLOSING.
- id: finalizar_nao_resolvido
action: no_op
input: {}
edges:
- from: preparar
to: formatar
priority: 10
when:
eq: [$.vars.preparar.success, true]
- from: preparar
to: resposta_falha_servico
priority: 20
when:
eq: [$.vars.preparar.service_failed, true]
- from: preparar
to: checar_tentativa
priority: 30
when:
eq: [$.vars.preparar.success, false]
- from: checar_tentativa
to: fim_intencao_invalida
priority: 10
when:
eq: [$.vars.checar_tentativa.limite_excedido, true]
- from: checar_tentativa
to: texto_intencao_invalida
priority: 20
- from: formatar
to: decisao
- from: decisao
to: registrar_sim
priority: 10
when:
eq: [$.input.resposta_usuario, SIM]
- from: decisao
to: registrar_nao
priority: 20
when:
eq: [$.input.resposta_usuario, NAO]
- from: registrar_sim
to: registrar_protocolo_aceite
- from: registrar_protocolo_aceite
to: END
- from: registrar_nao
to: checar_vas_variacao
- from: checar_vas_variacao
to: finalizar_nao_resolvido
priority: 10
when:
eq: [$.vars.checar_vas_variacao.tem_vas_variado, false]
# Tem VAS variado (ou não deu para saber): devolve ao orquestrador, como sempre.
- from: checar_vas_variacao
to: END
priority: 20
- from: finalizar_nao_resolvido
to: END
- from: texto_intencao_invalida
to: END
- from: fim_intencao_invalida
to: END
- from: resposta_falha_servico
to: END