defmodule ApiBrasil.Data.Consulta do @moduledoc """ Consultas por crédito (`POST /consulta/{servico}/credits` e afins). Não usam `DeviceToken` — debitam o saldo/créditos da conta. O campo `tipo` do body define o produto consultado (ex: `lista-socios`, `serasa-score-pf`, `spc-serasa`); os tipos conhecidos estão em `ApiBrasil.Generated.Catalog.consulta_tipos/0`. {:ok, cpf} = ApiBrasil.Data.Consulta.cpf(client, %{"cpf" => "00000000000"}) ApiBrasil.Core.CreditResponse.balance(cpf) ApiBrasil.Core.CreditResponse.data(cpf) Use `ApiBrasil.Consulta` para montar o body, inclusive em modo homologação: alias ApiBrasil.{Consulta, Data} "lista-socios" |> Consulta.new() |> Consulta.field("cnpj", "00000000000000") |> then(&Data.Consulta.cnpj(client, &1)) # modo homologação (sandbox, sem cobrança) "serasa-score-pj" |> Consulta.new() |> Consulta.homolog(true) |> Consulta.field("cnpj", "00000000000000") |> then(&Data.Consulta.cnpj(client, &1)) Além das consultas nomeadas, `generic/4` chama qualquer serviço do catálogo (`ApiBrasil.Generated.Catalog.consulta_servicos/0`) e `credits/3` devolve os créditos disponíveis: Data.Consulta.generic(client, "cnh", %{"cpf" => "00000000000"}) Data.Consulta.credits(client, "cpf") """ use ApiBrasil.Core.Service, credit: true credit(:cpf, "cpf", "Consulta um CPF: `POST /consulta/cpf/credits`.") credit( :cnpj, "cnpj", "Consulta um CNPJ: `POST /consulta/cnpj/credits` (ex: `tipo` = `lista-socios`)." ) credit(:cnh, "cnh", "Consulta uma CNH: `POST /consulta/cnh/credits`.") credit(:cep, "cep", "Consulta um CEP: `POST /consulta/cep/credits`.") credit(:veiculos, "veiculos", "Consulta veicular: `POST /consulta/veiculos/credits`.") credit( :vehicles, "vehicles", "Consulta veicular na rota em inglês: `POST /consulta/vehicles/credits`." ) credit( :telefone, "telefone", "Consulta a operadora de um telefone: `POST /consulta/telefone/credits`." ) credit( :ddd_anatel, "ddd-anatel", "Consulta o DDD na Anatel: `POST /consulta/ddd-anatel/credits`." ) credit(:geoip, "geoip", "Consulta a base de IPs: `POST /consulta/geoip/credits`.") credit(:rastreio, "rastreio", "Rastreia uma encomenda: `POST /consulta/rastreio/credits`.") credit(:crm, "crm", "Consulta um registro no CRM: `POST /consulta/crm/credits`.") credit(:crbm, "crbm", "Consulta um registro no CRBM: `POST /consulta/crbm/credits`.") credit(:cro, "cro", "Consulta um registro no CRO: `POST /consulta/cro/credits`.") credit( :weather, "weather-api", "Consulta a previsão do tempo: `POST /consulta/weather-api/credits`." ) credit( :emissao_notas, "emissao-notas", "Emite notas fiscais: `POST /consulta/emissao-notas/credits`." ) credit(:frete_antt, "frete-antt", "Calcula o frete ANTT: `POST /consulta/frete-antt/credits`.") credit(:api_rntrc, "api-rntrc", "Consulta o RNTRC: `POST /consulta/api-rntrc/credits`.") @doc "Consulta o birô Quod: `POST /quod/cnpj/credits`." @spec quod(Client.t(), term(), keyword()) :: {:ok, CreditResponse.t()} | {:error, Error.t()} def quod(client, body \\ nil, opts \\ []) do Service.credit_post(client, "quod/cnpj/credits", body, opts) end @doc "Como `quod/3`, mas levanta `ApiBrasil.Core.Error` em caso de falha." @spec quod!(Client.t(), term(), keyword()) :: CreditResponse.t() def quod!(client, body \\ nil, opts \\ []) do Service.unwrap!(quod(client, body, opts)) end @doc """ Consulta as bases veiculares dedicadas: `POST /vehicles/base/000/{base}` (base: `dados` | `fipe`). """ @spec veiculos_base(Client.t(), String.t(), term(), keyword()) :: {:ok, CreditResponse.t()} | {:error, Error.t()} def veiculos_base(client, base, body \\ nil, opts \\ []) do path = "vehicles/base/000/#{Service.encode_path(base)}" Service.credit_post(client, path, body, opts) end @doc "Como `veiculos_base/4`, mas levanta `ApiBrasil.Core.Error` em caso de falha." @spec veiculos_base!(Client.t(), String.t(), term(), keyword()) :: CreditResponse.t() def veiculos_base!(client, base, body \\ nil, opts \\ []) do Service.unwrap!(veiculos_base(client, base, body, opts)) end @doc "Calcula a distância entre CEPs: `POST /cep/distancia/calcular`." @spec cep_distancia(Client.t(), term(), keyword()) :: {:ok, CreditResponse.t()} | {:error, Error.t()} def cep_distancia(client, body \\ nil, opts \\ []) do Service.credit_post(client, "cep/distancia/calcular", body, opts) end @doc "Como `cep_distancia/3`, mas levanta `ApiBrasil.Core.Error` em caso de falha." @spec cep_distancia!(Client.t(), term(), keyword()) :: CreditResponse.t() def cep_distancia!(client, body \\ nil, opts \\ []) do Service.unwrap!(cep_distancia(client, body, opts)) end @doc "Consulta o proxy seller: `POST /proxy/seller/credits`." @spec proxy_seller(Client.t(), term(), keyword()) :: {:ok, CreditResponse.t()} | {:error, Error.t()} def proxy_seller(client, body \\ nil, opts \\ []) do Service.credit_post(client, "proxy/seller/credits", body, opts) end @doc "Como `proxy_seller/3`, mas levanta `ApiBrasil.Core.Error` em caso de falha." @spec proxy_seller!(Client.t(), term(), keyword()) :: CreditResponse.t() def proxy_seller!(client, body \\ nil, opts \\ []) do Service.unwrap!(proxy_seller(client, body, opts)) end end