integração FGTS
Ferramenta em Bun para consultar a API. Serve como código de exemplo.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.