Ir para o conteúdo principal

integração FGTS <> SmartCityTec

Ferramenta em Bun para consultar a API. Serve como código de exemplo:

#!/usr/bin/env bun
import assert from "node:assert";
import { parseArgs } from "node:util";

function makeBody(contrato: string, cnpj: string): string {
  assert.match(contrato, /^\d+$/);
  assert.match(cnpj, /^\d{14}$/);
  return `
    <?xml version="1.0"?>
    <methodCall>
      <methodName>ConsultaCRF</methodName>
      <params>
        <param><value><i4>${contrato}</i4></value></param>
        <param><value><i4>1</i4></value></param>
        <param><value><array><data><value><string>1${cnpj}</string></value></data></array></value></param>
      </params>
    </methodCall>
  `.trim();
}

function parseDate(eightDigitString: string): Date {
  const match = eightDigitString.match(/^(\d{4})(\d{2})(\d{2})$/);
  assert(match);
  return new Date(...(match.slice(1).map(Number) as [number, number, number]));
}

async function parseXmlResponse(xml: string) {
  const match = xml.match(/<string>1(\d{14})(\d{8})(\d{8})(\d{24})<\/string>/);
  assert(match);
  const [, cnpj, rawEmissao, rawValidade, certificado] = match;
  return {
    cnpj,
    emissao: parseDate(rawEmissao),
    validade: parseDate(rawValidade),
    certificado,
  };
}

export async function queryCRFbyCNPJ(contrato: string, cnpj: string) {
  const url = "https://webp.caixa.gov.br/empresa/crf/consultalote/server.asp";
  const body = makeBody(contrato, cnpj);
  const response = await fetch(url, { body, method: "POST" });
  const xml = await response.text();
  return parseXmlResponse(xml);
}

if (import.meta.main) {
  try {
    const args = parseArgs({
      options: {
        contrato: { type: "string" },
        cnpj: { type: "string" },
      },
    });
    const { cnpj, contrato } = args.values;
    assert(cnpj, "missing --cnpj= argument");
    assert(contrato, "missing --contrato= argument");
    const result = await queryCRFbyCNPJ(contrato, cnpj);
    console.log(JSON.stringify(result));
  } catch (error) {
    console.error((error as Error).message);
  }
}

Sobre isso, eu deixei o "contrato" parametrizável. Meus testes agora não falharam com o valor 66, mas ontem sim, então convém perguntar à Caixa se precisa utilizar um número especial.

Publiquei no Gitlab como snippet. Só fiz uma alteração pertinente: contrato precisa ser number.

https://git.ciga.sc.gov.br/-/snippets/33se retornar not found, precisa verificar a permissão