[
  {
    "title": "Validação de telefone e benefício",
    "slug": "validacao-telefone-beneficio",
    "category": "validacao",
    "priority": 10,
    "version": 1,
    "rule": {
      "validations": [
        {
          "contexts": ["lead.store", "lead.update"],
          "fields": ["phone"],
          "constraints": {
            "required": true,
            "numeric": true,
            "min_length": 10,
            "max_length": 11
          },
          "message": "Informe um telefone com DDD contendo apenas dígitos (10 ou 11)."
        },
        {
          "contexts": ["lead.store", "lead.update"],
          "fields": ["finanto_inss.benefit_number"],
          "constraints": {
            "numeric": true,
            "min_length": 10,
            "max_length": 12
          },
          "message": "O número de benefício deve conter entre 10 e 12 dígitos."
        }
      ]
    }
  },
  {
    "title": "Janela de liberação financeira",
    "slug": "financeiro-horario-comercial",
    "category": "financeiro",
    "priority": 5,
    "version": 1,
    "rule": {
      "payment_windows": [
        {
          "contexts": ["loan.transition.funded", "loan.transition.paid"],
          "timezone": "America/Sao_Paulo",
          "allowed_days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
          "allowed_hours": { "start": "08:30", "end": "18:30" },
          "blocked_dates": ["2025-12-25", "2026-01-01"],
          "message": "Liberar pagamento apenas em horário comercial (08h30 às 18h30, dias úteis)."
        }
      ]
    }
  },
  {
    "title": "Tabela de comissão por volume",
    "slug": "comissao-volume-progressivo",
    "category": "comissao",
    "priority": 20,
    "version": 2,
    "rule": {
      "expressions": [
        {
          "contexts": ["loan.commission"],
          "when": {
            "commission_base_amount": { "min": 80000 }
          },
          "then": { "commission_percent": 0.018 }
        },
        {
          "contexts": ["loan.commission"],
          "when": {
            "commission_base_amount": { "min": 40000 }
          },
          "then": { "commission_percent": 0.014 }
        },
        {
          "contexts": ["loan.commission"],
          "when": {
            "created_at": { "min": "2025-07-01", "max": "2025-12-31" }
          },
          "then": { "commission_percent": 0.016 }
        }
      ],
      "default": { "commission_percent": 0.011 }
    }
  },
    {
      "title": "Validação de teto de proposta",
      "slug": "validacao-valor-proposta",
      "category": "validacao",
      "priority": 30,
      "version": 1,
      "rule": {
        "validations": [
          {
            "contexts": ["lead.store", "lead.update"],
            "fields": ["potential_value"],
            "constraints": {
              "max_value": 150000
            },
            "message": "Valores potenciais acima de R$150.000 exigem aprovação manual do financeiro."
          }
        ]
      }
  },

{
  "title": "BANRISUL - Regras completas",
  "slug": "banrisul-politica",
  "category": "banrisul_portability",
  "priority": 62,
  "version": 2,
  "rule": {
    "validations": [
      {
        "contexts": ["banrisul.portability", "banrisul.refin"],
        "fields": ["bank_code", "customer_age"],
        "constraints": {
          "required": true,
          "min_value": 18,
          "max_value": 75
        },
        "message": "Banrisul: idade permitida entre 18 e 75 anos completos."
      },
      {
        "contexts": ["banrisul.portability", "banrisul.refin"],
        "fields": ["contract_end_age"],
        "constraints": {
          "max_value": 77.99
        },
        "message": "Banrisul: contrato deve terminar antes de 77 anos, 11 meses e 29 dias."
      },
      {
        "contexts": ["banrisul.portability.refin"],
        "fields": ["released_value"],
        "constraints": {
          "min_value": 200
        },
        "message": "Banrisul: valor minimo de liberacao no refin e de R$ 200,00."
      },
      {
        "contexts": ["banrisul.portability", "banrisul.portability.refin"],
        "fields": ["debt_balance"],
        "constraints": {
          "min_value": 5000
        },
        "message": "Banrisul: saldo devedor minimo aceito e de R$ 5.000,00."
      },
      {
        "contexts": ["banrisul.portability.refin"],
        "fields": ["safety_margin"],
        "constraints": {
          "min_value": 1
        },
        "message": "Banrisul: mantenha ao menos R$ 1,00 de margem de seguranca apos o refin."
      }
    ],
    "expressions": [
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "origin_bank": { "in": ["PARATI", "BANRISUL_CORBAN", "BARIGUI"] }
        },
        "then": {
          "eligible": false,
          "blocked_reason": "Banrisul: banco de origem nao aceito para portabilidade."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "origin_bank": { "in": ["PAN"] },
          "installments_paid": { "min": 30 }
        },
        "then": {
          "eligible": true,
          "required_installments": 30,
          "notes": [
            "Banrisul: Pan exige 30 parcelas pagas antes de portar."
          ]
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "origin_bank": { "in": ["SAFRA", "INBURSA_CORBAN"] },
          "installments_paid": { "min": 12 }
        },
        "then": {
          "eligible": true,
          "required_installments": 12,
          "notes": [
            "Banrisul: Safra e Inbursa (corban) pedem 12 parcelas pagas."
          ]
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "origin_bank": { "in": ["ITAU_341", "INBURSA_REDE", "PARANA_REDE", "SANTANDER_REDE", "CREFISA_REDE", "MERCANTIL", "BANRISUL_REDE", "CIP_REDE"] },
          "installments_paid": { "min": 1 }
        },
        "then": {
          "eligible": true,
          "required_installments": 1,
          "notes": [
            "Banrisul: origens via rede listadas liberam com 1 parcela paga."
          ]
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "origin_bank": { "in": ["ITAU_029", "C6_626", "C6_336", "DAYCOVAL", "FACTA", "FINANTO", "AGIBANK", "BMG", "PARANA_CORBAN", "SANTANDER_CORBAN", "CREFISA_CORBAN", "ALFA", "ZEMA", "PAULISTA", "CIP_CORBAN"] }
        },
        "then": {
          "eligible": true,
          "required_installments": 0,
          "notes": [
            "Banrisul: grupo de bancos aceita portabilidade sem parcelas minimas.",
            "Contratos corban na CIP tambem entram neste grupo."
          ]
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "customer_age": { "min": 18, "max": 65 }
        },
        "then": {
          "max_amount_allowed": 70000,
          "message": "Banrisul: limite de R$ 70.000,00 para clientes de 18 a 65 anos."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "customer_age": { "min": 66, "max": 69 }
        },
        "then": {
          "max_amount_allowed": 50000,
          "message": "Banrisul: limite de R$ 50.000,00 para clientes de 66 a 69 anos."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "customer_age": { "min": 70, "max": 73 }
        },
        "then": {
          "max_amount_allowed": 40000,
          "message": "Banrisul: limite de R$ 40.000,00 para clientes de 70 a 73 anos."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "customer_age": { "min": 74, "max": 75 }
        },
        "then": {
          "max_amount_allowed": 15000,
          "message": "Banrisul: limite de R$ 15.000,00 para clientes de 74 a 75 anos."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "customer_age": { "min": 76 }
        },
        "then": {
          "eligible": false,
          "blocked_reason": "Banrisul: clientes com 76 anos ou mais nao sao elegiveis."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "portability_type": { "eq": "comum" },
          "installments_paid": { "min": 12 }
        },
        "then": {
          "portability_status": "allowed_common",
          "note": "Banrisul: portabilidade comum liberada apos 12 parcelas pagas e averbacao concluida."
        }
      },
      {
        "contexts": ["banrisul.portability"],
        "when": {
          "bank_code": { "eq": "041" },
          "portability_type": { "eq": "especial" },
          "days_since_origin": { "min": 360 },
          "return_balance": { "min": 5000 }
        },
        "then": {
          "portability_status": "allowed_special",
          "min_return_balance": 5000,
          "allow_without_margin_value": 10,
          "require_manual_ack": true,
          "note": "Banrisul: modalidade especial exige 360 dias de origem e retorno minimo de R$ 5.000,00."
        }
      },
      {
        "contexts": ["banrisul.portability.refin"],
        "when": {
          "bank_code": { "eq": "041" }
        },
        "then": {
          "min_refin_release": 200,
          "min_refin_balance": 5000,
          "max_contracts_to_unify": 5,
          "require_margin_safety": 1,
          "note": "Banrisul: refin unifica ate 5 contratos e so ocorre apos averbacao completa."
        }
      }
    ],
    "default": {
      "eligible": true,
      "portability_status": "pending_validation",
      "max_amount_allowed": 0
    }
  }
},
  {
    "title": "DAYCOVAL - Regras completas",
    "slug": "daycoval-portabilidade",
    "category": "daycoval_portability",
    "priority": 70,
    "version": 1,
    "rule": {
      "validations": [
        {
          "contexts": ["daycoval.portability"],
          "fields": ["installment_value"],
          "constraints": {
            "min_value": 20
          },
          "message": "Daycoval: parcela mínima para portar é de R$ 20,00."
        }
      ],
      "expressions": [
        {
          "contexts": ["daycoval.portability"],
          "when": {
            "origin_bank": { "in": ["PAN", "SAFRA"] },
            "installments_paid": { "min": 12 }
          },
          "then": {
            "eligible": true,
            "required_installments": 12,
            "policy": {
              "requires_min_installment": 20,
              "allows_rate_reduction": true,
              "no_min_debt_balance": true
            },
            "notes": [
              "Daycoval: Pan/Safra exigem 12 parcelas pagas.",
              "Redução de taxa liberada conforme tabela mínima e sistema."
            ]
          }
        },
        {
          "contexts": ["daycoval.portability"],
          "when": {
            "origin_bank": { "in": ["ITAU_029", "ITAU_341", "BMG", "SANTANDER_REDE", "SANTANDER_CORBAN", "CREFISA_REDE", "CREFISA_CORBAN", "MERCANTIL", "ZEMA", "BANRISUL_REDE", "BANRISUL_CORBAN", "PARANA_REDE", "PARANA_CORBAN", "PAULISTA", "CIP_CORBAN", "CIP_REDE"] },
            "installments_paid": { "min": 6 }
          },
          "then": {
            "eligible": true,
            "required_installments": 6,
            "policy": {
              "requires_min_installment": 20,
              "allows_rate_reduction": true,
              "no_min_debt_balance": true
            },
            "notes": [
              "Daycoval: grupo de bancos com 6 parcelas já atendidas.",
              "Sem saldo devedor mínimo exigido."
            ]
          }
        },
        {
          "contexts": ["daycoval.portability"],
          "when": {
            "origin_bank": { "in": ["FACTA", "FINANTO", "INBURSA_CORBAN", "INBURSA_REDE"] },
            "installments_paid": { "min": 13 }
          },
          "then": {
            "eligible": true,
            "required_installments": 13,
            "policy": {
              "requires_min_installment": 20,
              "allows_rate_reduction": true,
              "no_min_debt_balance": true
            },
            "notes": [
              "Daycoval: Facta, Finanto e Inbursa exigem 13 parcelas pagas.",
              "Redução de taxa depende da tabela mínima disponível."
            ]
          }
        },
        {
          "contexts": ["daycoval.portability"],
          "when": {
            "origin_bank": { "in": ["PARATI", "BARIGUI", "AGIBANK", "NUBANK", "BRB", "INBURSA_BLOCK", "C6_336", "C6_626", "PICPAY", "OLE", "FAIR_CC", "CCR_ABELA", "ITAU_BBA", "XP_SA", "BCO_C6", "BCO_XP", "BGN", "BANCO_ALFA"] }
          },
          "then": {
            "eligible": false,
            "blocked_reason": "Daycoval: banco de origem não aceito para portabilidade."
          }
        },
        {
          "contexts": ["daycoval.portability.refin"],
          "then": {
            "allow_margin_aggregation": true,
            "max_margin_aggregation_value": 10,
            "allow_release_without_margin": true,
            "allow_overdue_contracts": true,
            "requires_cip_return": true,
            "manual_analysis_on_overdue": true,
            "max_contracts_to_unify": 13,
            "requires_full_negative_offset": true,
            "max_installment_increase": 10,
            "min_cashback_percent": 2,
            "max_cashback_value": 100,
            "notes": [
              "Daycoval: agregação de margem apenas no refin.",
              "Unifique até 13 contratos usando Tabelão Único.",
              "Margem negativa deve ser abatida integralmente em uma única parcela.",
              "Troco mínimo de 2% limitado a R$ 100.",
              "Sem exclusividade de digitação; qualquer operador pode iniciar o refin."
            ]
          }
        },
        {
          "contexts": ["daycoval.portability.refin"],
          "when": {
            "customer_status": { "eq": "positive" }
          },
          "then": {
            "allow_installment_reduction": false,
            "note": "Daycoval: clientes positivos não podem reduzir parcela; sistema mantém o valor original."
          }
        },
        {
          "contexts": ["daycoval.portability.refin"],
          "when": {
            "customer_status": { "eq": "negative" }
          },
          "then": {
            "allow_installment_reduction": true,
            "require_reduction_amount_pre_applied": true,
            "note": "Daycoval: clientes negativos podem reduzir parcela se o valor já for digitado com o abatimento total."
          }
        }
      ],
      "default": {
        "eligible": false,
        "blocked_reason": "Daycoval: banco de origem não configurado ou parcelas mínimas não atendidas.",
        "notes": [
          "Aplicar parcela mínima de R$ 20,00, respeitar troco mínimo de 2% (até R$ 100) e agregação máxima de R$ 10,00."
        ]
      }
    }
  }
]

