DEV-002 - Chamada Para API Do Hatchbank (VemCard)

ID: KB-DEV-002

Responsável: Thiago Amaral, TI

Status: Publicado

Última Atualização: 15/08/2025


Propósito

Instruir na chamada para API do Hatchbank. Um auxílio para a geração dos gabaritos para a Asset.

Aplica-se a

  • Hatchbank VemCard.

Pré-requisitos

  • Usuário com privilégio de administrador do site do originador.


Instruções

1. Criando O Token

  1. Utilize uma chamada POST para a criação do JWT Token.

    curl -X POST <https://backendvemcard.hatchbank.com.br/usuario/logar> \\
      -H "Content-Type: application/json" \\
      -d '{
            "username": "[email protected]",
            "password": "3s$25S%D5U@w",
            "verificationToken": "string",
            "web": true
          }'
    
  2. Consiga o resultado do token.

    eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0aGlhZ28uYW1hcmFsK3ZlbWNhcmRAZmljdG9yY29uc2lnLmNvbS5iciIsImlzcyI6IjEiLCJpYXQiOjE3NTUyNjgyODcsImV4cCI6MTc1NTI4ODY3MX0.YP6Fj-IgWrIqNucHjRC-Q4FSTbRCb7JImkV0jDTgokc
    

2. Conseguindo Informações Da API

  1. Utilize o método GET para a URL do backend do Hatch da VemCard.

    curl -X POST "<https://backendvemcard.hatchbank.com.br/proposta/gerarGabarito>" \\
      -H "Authorization: Bearer $TOKEN" \\
      -H "Content-Type: application/json" \\
      -d '{
        "dataInicio": "2024-01-01T10:00:00",
        "dataFim": "2025-08-15T14:00:00",
        "statusProposta": "CEDIDA"
      }' \\
      --output gabarito.xlsx
    

3. Automatizando

  1. Prepare um arquivo .env no mesmo diretório.

    [email protected]
    VEMCARD_PASSWORD=3s$25S%D5U@w
    
  2. Utilize o script Python para automatizar o envio.

    #!/usr/bin/env python3
    """
    Script para gerar gabarito de propostas
    Executa requisição POST e mostra se funcionou ou não
    """
    
    import requests
    import json
    import sys
    import os
    from typing import Optional
    
    # ========================================
    # 🔧 CONFIGURAÇÕES - MODIFIQUE AQUI
    # ========================================
    
    # Credenciais (obtidas de variáveis de ambiente)
    USERNAME = os.getenv("VEMCARD_USERNAME")
    PASSWORD = os.getenv("VEMCARD_PASSWORD")
    
    # URL base
    BASE_URL = "<https://backendvemcard.hatchbank.com.br>"
    
    # Parâmetros da requisição
    DATA_INICIO = "2024-01-01T10:00:00"
    DATA_FIM = "2025-08-15T14:00:00"
    STATUS_PROPOSTA = "CEDIDA"  # Opções: CEDIDA, FINALIZADA, PAGA
    
    # Configurações de timeout e debug
    REQUEST_TIMEOUT = 30
    SHOW_RESPONSE_DETAILS = True  # True para mostrar detalhes da resposta, False para apenas sucesso/erro
    
    # ========================================
    
    def validate_environment() -> bool:
        """
        Valida se as variáveis de ambiente necessárias estão definidas
    
        Returns:
            bool: True se todas as variáveis estão definidas, False caso contrário
        """
        missing_vars = []
    
        if not USERNAME:
            missing_vars.append("VEMCARD_USERNAME")
        if not PASSWORD:
            missing_vars.append("VEMCARD_PASSWORD")
    
        if missing_vars:
            print("❌ Missing required environment variables:")
            for var in missing_vars:
                print(f"   - {var}")
            print("\\n💡 Set them using:")
            print("   export VEMCARD_USERNAME='your_username'")
            print("   export VEMCARD_PASSWORD='your_password'")
            print("\\n   Or create a .env file (see README)")
            return False
    
        return True
    
    def get_auth_token() -> Optional[str]:
        """
        Obtém o token de autenticação
    
        Returns:
            str: Token de autenticação ou None se falhar
        """
        login_url = f"{BASE_URL}/usuario/logar"
    
        payload = {
            "username": USERNAME,
            "password": PASSWORD,
            "verificationToken": "string",
            "web": True
        }
    
        print("🔐 Authenticating...")
    
        try:
            response = requests.post(
                login_url,
                headers={"Content-Type": "application/json"},
                json=payload,
                timeout=REQUEST_TIMEOUT
            )
            response.raise_for_status()
    
            data = response.json()
            token = data.get("token")
    
            if not token or token == "null":
                print("❌ Authentication failed - No token received")
                return None
    
            print("✅ Authentication successful")
            return token
    
        except requests.exceptions.RequestException as e:
            print(f"❌ Authentication failed - Request error: {e}")
            return None
        except json.JSONDecodeError as e:
            print(f"❌ Authentication failed - Invalid JSON response: {e}")
            return None
    
    def generate_gabarito(token: str) -> bool:
        """
        Gera o gabarito com os parâmetros configurados
    
        Args:
            token: Token de autenticação
    
        Returns:
            bool: True se sucesso, False se falhou
        """
        gabarito_url = f"{BASE_URL}/proposta/gerarGabarito"
    
        payload = {
            "dataInicio": DATA_INICIO,
            "dataFim": DATA_FIM,
            "statusProposta": STATUS_PROPOSTA
        }
    
        print(f"\\n📊 Generating gabarito...")
        print(f"📅 Period: {DATA_INICIO} to {DATA_FIM}")
        print(f"📋 Status: {STATUS_PROPOSTA}")
    
        if SHOW_RESPONSE_DETAILS:
            print(f"\\n🔍 Request details:")
            print(f"URL: {gabarito_url}")
            print(f"Payload: {json.dumps(payload, indent=2)}")
    
        try:
            response = requests.post(
                gabarito_url,
                headers={
                    "Authorization": f"Bearer {token}",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=REQUEST_TIMEOUT
            )
    
            # Verificar se a requisição foi bem-sucedida
            if response.status_code == 200:
                print(f"✅ Gabarito generated successfully!")
    
                if SHOW_RESPONSE_DETAILS:
                    try:
                        response_json = response.json()
                        print(f"📄 Response: {json.dumps(response_json, indent=2, ensure_ascii=False)}")
                    except json.JSONDecodeError:
                        print(f"📄 Response (text): {response.text}")
    
                return True
            else:
                print(f"❌ Request failed with status code: {response.status_code}")
                if SHOW_RESPONSE_DETAILS:
                    print(f"📄 Error response: {response.text}")
                return False
    
        except requests.exceptions.Timeout:
            print(f"❌ Request timed out after {REQUEST_TIMEOUT} seconds")
            return False
        except requests.exceptions.RequestException as e:
            print(f"❌ Request failed: {e}")
            return False
    
    def main():
        """Função principal"""
        print("🚀 Starting gabarito generator...")
        print(f"🎯 Target: {BASE_URL}")
    
        # 0️⃣ Validar variáveis de ambiente
        if not validate_environment():
            sys.exit(1)
    
        # 1️⃣ Obter token
        token = get_auth_token()
        if not token:
            print("\\n💥 Execution failed - Could not authenticate")
            sys.exit(1)
    
        # 2️⃣ Gerar gabarito
        success = generate_gabarito(token)
    
        # 3️⃣ Resultado final
        if success:
            print("\\n🎉 Operation completed successfully!")
            sys.exit(0)
        else:
            print("\\n💥 Operation failed!")
            sys.exit(1)
    
    if __name__ == "__main__":
        main()
    

Resultado Esperado

Um arquivo com o gabarito e status correspondente deve ser gerado no bucket da S3.

Solução de Problemas

  • Não se aplica.

Artigos Relacionados

  • Não se aplica.

Anexos

  • Não se aplica.

Referências

  • Não se aplica.

Histórico de Revisões

Data

Versão

Autor

Descrição das Mudanças

19/09/2025

v1.0

Thiago Amaral

Confecção do documento

Last updated