name: contestacao_tool
version: 2
start: registrar_protocolo

nodes:
  # 1. Registrar protocolo — primeiro passo ao entrar em contestação
  - id: registrar_protocolo
    action: registrar_protocolo
    input:
      msisdn: $.input.msisdn
      social_sec_no: $.input.social_sec_no
      scenario: "contestacao"
      request_status: "Aberto"
      status: "OPENED"

  # 3. Enviar SMS com código do boleto
  - id: enviar_sms
    action: enviar_sms
    input:
      msisdn: $.input.msisdn
      message: $.input.mensagem_sms

  # 3.1 Consultar status da fatura (CompleteInvoices). Reaproveita o payload
  # do prefetch da sessão quando disponível (evita 2ª chamada à API).
  - id: check_invoice_status
    action: check_invoice_status
    input:
      msisdn: $.input.msisdn
      invoice_id: $.input.invoice_id
      current_invoice_number: $.input.current_invoice_number
      complete_invoices_payload: $.input.complete_invoices_payload

  # 4. Abrir contestação no serviço dedicado
  - id: abrir_contestacao_cliente
    action: abrir_contestacao_cliente
    input:
      msisdn: $.input.msisdn
      social_sec_no: $.input.social_sec_no
      customer_id: $.input.customer_id
      current_invoice_number: $.input.current_invoice_number
      invoice_id: $.input.invoice_id
      current_invoice_due_date: $.input.current_invoice_due_date
      servico: $.input.servico
      valor: $.input.valor
      descricao: $.input.descricao
      items: $.input.items
      protocolo_id: $.vars.registrar_protocolo.protocolo_id
      customer_type: $.input.customer_type
      customer_status: $.input.customer_status
      invoice_status: $.vars.check_invoice_status.invoice_status
      invoice_amount_open: $.input.invoice_amount_open
      invoice_amount: $.input.invoice_amount
      contestation_type: $.input.contestation_type
      adjust_reason: $.input.adjust_reason
      refund_option: $.input.refund_option
      manual_conta_certa_indicator: $.input.manual_conta_certa_indicator
      double_refund: $.input.double_refund
      user_id: $.input.user_id
      message_id: $.input.message_id
      client_id: $.input.client_id
      tipo_atendimento: $.input.tipo_atendimento
      skip_invoice_item_validation: $.input.skip_invoice_item_validation

  # 5. Consultar contrato para verificar data de corte. Em plano família,
  # dependent_invoice_item=true força Conta Certa Manual obrigatória.
  - id: consultar_contrato_corte
    action: consultar_contrato_corte
    input:
      msisdn: $.input.msisdn
      current_invoice_due_date: $.input.current_invoice_due_date
      dependent_invoice_item: $.input.dependent_invoice_item

  # 6. Abrir SR de Conta Certa Manual (quando após data de corte)
  - id: abrir_sr_conta_certa_manual
    action: abrir_sr_conta_certa_manual
    input:
      msisdn: $.input.msisdn
      social_sec_no: $.input.social_sec_no
      dia_vencimento: $.vars.consultar_contrato_corte.dia_vencimento
      request_status: "Encaminhado"
      status: "Encaminhado"

  # 7. Atualizar status do protocolo principal — último passo
  - id: atualizar_status_sr
    action: atualizar_status_sr
    input:
      msisdn: $.input.msisdn
      social_sec_no: $.input.social_sec_no
      protocolo_id: $.vars.registrar_protocolo.protocolo_id
      dia_vencimento: $.vars.abrir_sr_conta_certa_manual.dia_vencimento
      scenario: "contestacao"
      channel: "AIAGENTCR"
      status: "Fechado"
      client_id: "AIAGENTCR"

  # 8. Atualiza status do protocolo principal após Conta Certa Manual
  - id: atualizar_status_sr_registro
    action: atualizar_status_sr
    input:
      msisdn: $.input.msisdn
      social_sec_no: $.input.social_sec_no
      protocolo_id: $.vars.abrir_sr_conta_certa_manual.sr_conta_certa_id
      scenario: "conta_certa_manual"
      status: "Encaminhado"
      client_id: "AIAGENTCR"

edges:
  # Protocolo registrado → reutiliza o CompleteInvoices do prefetch
  - from: registrar_protocolo
    to: check_invoice_status

  # Todas as formas → abrir contestação
  - from: check_invoice_status
    to: abrir_contestacao_cliente
    priority: 10

  # Guardrail/validação financeira bloqueou a contestação: encerrar sem
  # executar SMS, contrato ou SR. O MCP propaga success=false ao agente.
  - from: abrir_contestacao_cliente
    to: END
    priority: 1
    when:
      eq: [$.vars.abrir_contestacao_cliente.success, false]

  # Após contestação: quando necessário, enviar SMS
  - from: abrir_contestacao_cliente
    to: enviar_sms
    priority: 10
    when:
      all:
        - exists: $.vars.abrir_contestacao_cliente.barcode
        - neq: [$.vars.abrir_contestacao_cliente.barcode, ""]

  # Após contestação (sem SMS) → verificar data de corte
  - from: abrir_contestacao_cliente
    to: consultar_contrato_corte
    priority: 99

  # Após SMS → verificar data de corte
  - from: enviar_sms
    to: consultar_contrato_corte

  # Abrir SR Conta Certa Manual: após data de corte (regra padrão) OU
  # contestação de item de fatura de dependente (plano família, obrigatória)
  - from: consultar_contrato_corte
    to: abrir_sr_conta_certa_manual
    priority: 10
    when:
      any:
        - all:
            - eq: [$.vars.consultar_contrato_corte.apos_data_corte, true]
            - eq: [$.vars.consultar_contrato_corte.contestation_success, true]
            - any:
                - eq: [$.input.manual_conta_certa_indicator, true]
                - eq: [$.vars.abrir_contestacao_cliente.manual_conta_certa_indicator, true]
        - all:
            - eq: [$.vars.consultar_contrato_corte.dependent_invoice_item, true]
            # contestação registrada no portal (CRIAR ou ENVIADA): a SR manual
            # de item de dependente não depende do portal pedir criação
            - eq: [$.vars.consultar_contrato_corte.contestation_registered, true]

  # Sem Conta Certa Manual elegível → atualiza tracking e fecha protocolo
  - from: consultar_contrato_corte
    to: atualizar_status_sr
    priority: 99

  # Após SR manual → fechar protocolo
  - from: abrir_sr_conta_certa_manual
    to: atualizar_status_sr_registro
    priority: 10

  # Protocolo principal de contestação atualizado após Conta Certa Manual → END
  - from: atualizar_status_sr_registro
    to: END

  # Protocolo atualizado → END
  - from: atualizar_status_sr
    to: END
