nipify
Version:
Fetch Polish company details by NIP (VAT number) from official GUS registry
144 lines • 5.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCompanyDetailsByNip = getCompanyDetailsByNip;
const DEFAULT_API_URL = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc';
const DEFAULT_TEST_API_URL = 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc';
/**
* Get company details by NIP (Polish VAT identification number)
* Fetches company information from the Polish GUS registry (Główny Urząd Statystyczny)
*
* @param nip - Polish VAT identification number (10 digits)
* @param options - Configuration options including API key
* @returns Promise with company details
* @throws Error if NIP is missing, API key is missing, or if API requests fail
*/
async function getCompanyDetailsByNip(nip, options) {
if (!nip) {
throw new Error('NIP is required');
}
if (!options.apiKey) {
throw new Error('API key is required');
}
const baseApiUrl = options.testMode
? (options.apiUrl || DEFAULT_TEST_API_URL)
: (options.apiUrl || DEFAULT_API_URL);
// Use CORS proxy if provided
const apiUrl = options.corsProxy
? `${options.corsProxy}${baseApiUrl}`
: baseApiUrl;
try {
const rawLoginXml = `<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns="http://CIS/BIR/PUBL/2014/07">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:To>${baseApiUrl}</wsa:To>
<wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
</soap:Header>
<soap:Body>
<ns:Zaloguj>
<ns:pKluczUzytkownika>${options.apiKey}</ns:pKluczUzytkownika>
</ns:Zaloguj>
</soap:Body>
</soap:Envelope>`;
const sidResponse = await fetch(apiUrl, {
method: "POST",
body: rawLoginXml,
headers: {
"Content-Type": "application/soap+xml;charset=UTF-8",
},
});
if (!sidResponse.ok) {
throw new Error(`Failed to login to the API. Status: ${sidResponse.status}`);
}
const sidResponseText = await sidResponse.text();
const sid = parseSidString(sidResponseText);
if (sid === -1) {
throw new Error('Failed to parse session ID from API response');
}
const rawFindXml = `<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns="http://CIS/BIR/PUBL/2014/07" xmlns:dat="http://CIS/BIR/PUBL/2014/07/DataContract">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:To>${baseApiUrl}</wsa:To>
<wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajPodmioty</wsa:Action>
</soap:Header>
<soap:Body>
<ns:DaneSzukajPodmioty>
<ns:pParametryWyszukiwania>
<dat:Nip>${nip}</dat:Nip>
</ns:pParametryWyszukiwania>
</ns:DaneSzukajPodmioty>
</soap:Body>
</soap:Envelope>`;
const findCompanyResponse = await fetch(apiUrl, {
method: "POST",
body: rawFindXml,
headers: {
"Content-Type": "application/soap+xml;charset=UTF-8",
sid: sid.toString(),
},
});
if (!findCompanyResponse.ok) {
throw new Error(`Failed to fetch company data. Status: ${findCompanyResponse.status}`);
}
const companyData = await findCompanyResponse.text();
const parsedCompanyData = parseCompanySoapDataToJson(companyData);
return { company: parsedCompanyData };
}
catch (error) {
if (error instanceof Error) {
throw new Error(`Company finding error: ${error.message}`);
}
throw new Error('Unknown error occurred while fetching company data');
}
}
/**
* Parse session ID from SOAP response
*
* @param sidResponse - SOAP response text containing the session ID
* @returns Session ID string or -1 if not found
* @internal
*/
function parseSidString(sidResponse) {
const startIndex = sidResponse.indexOf("<ZalogujResult>") + "<ZalogujResult>".length;
const endIndex = sidResponse.indexOf("</ZalogujResult>");
if (startIndex !== -1 && endIndex !== -1) {
const result = sidResponse.substring(startIndex, endIndex);
return result;
}
return -1;
}
/**
* Parse company data from SOAP response
*
* @param soapCompanyData - SOAP response text containing company data
* @returns Parsed company details object
* @internal
*/
function parseCompanySoapDataToJson(soapCompanyData) {
const companyNameRegex = /Nazwa>([^<&]+)</;
const companyNameMatch = companyNameRegex.exec(soapCompanyData);
const companyName = companyNameMatch ? companyNameMatch[1] : undefined;
const cityRegex = /Miejscowosc>([^<&]+)</;
const cityMatch = cityRegex.exec(soapCompanyData);
const city = cityMatch ? cityMatch[1] : undefined;
const postalCodeRegex = /KodPocztowy>([^<&]+)</;
const postalCodeMatch = postalCodeRegex.exec(soapCompanyData);
const postalCode = postalCodeMatch ? postalCodeMatch[1] : undefined;
const streetRegex = /Ulica>([^<&]+)</;
const streetMatch = streetRegex.exec(soapCompanyData);
const street = streetMatch ? streetMatch[1] : undefined;
const addressOneRegex = /NrNieruchomosci>([^<&]+)</;
const addressOneMatch = addressOneRegex.exec(soapCompanyData);
const addressOne = addressOneMatch ? addressOneMatch[1] : undefined;
const addressTwoRegex = /NrLokalu>([^<&]+)</;
const addressTwoMatch = addressTwoRegex.exec(soapCompanyData);
const addressTwo = addressTwoMatch ? addressTwoMatch[1] : undefined;
return {
companyName,
city,
postalCode,
street,
addressOne,
addressTwo,
};
}
//# sourceMappingURL=index.js.map