Qualified Invoice Issuer Web-API: Search Name with ID
Searches the Qualified Invoice Issuer’s name, address, history, etc, with the registrated number, accessing to the Qualified Invoice Issuer System Web-API by National Tax Agency Japan. “Application ID” is required in advance.

Configs
  • C1:Set Application ID for Qualified Invoice Issuer Web-API *#{EL}
  • C2: Set “T” + 13-digit Registrated Number *#{EL}
  • C3:Select DATE(YMD) type item for last update date.
  • C4:Select STRING type item for name of issuer.
  • C5:Select STRING type item for japanese kana of issuer’s name.
  • C6:Select DATE(YMD) type item for registrated date.
  • C7:Select DATE(YMD) type item for update date.
  • C8:Select STRING type item for process category.
  • C9:Select STRING type item for sole prop/corporation category.
  • C10:Select STRING type item for country category.
  • C11:Select STRING type item for address of head office.
  • C12:Select STRING type item for trade name.
  • C13:Select STRING type item for popular name or previous name.
  • C14: Select STRING DATA that stores change history TSV.
  • C15:Select STRING DATA for Detail URL.
Script (click to open)
// GraalJS Script (engine type: 2)
main();

function main(){

    const applicationId = configs.get('conf_applicationId');
    const conf_registratedNumber = configs.get('conf_registratedNumber');
    const registratedNumber = checkRegistratedNumber(conf_registratedNumber);

    if(registratedNumber === null){
      throw '登録番号が適切ではありません。(' + conf_registratedNumber + ')';
    }

    const issuer = searchIssuer(applicationId, registratedNumber);
    setIssuerData(issuer);

}

/*
@param {string} 適格請求書発行事業者の登録番号
@return {string} Registrated Number
- 入力された登録番号が "T" + 13 桁の数字で構成されるかどうかをチェックする。
- 登録番号が "T" で始まらない場合、先頭に "T" を付与してからチェックする。
*/
function checkRegistratedNumber(number){

    //number が T で始まらない場合、先頭に T を付与
    if( ! number.startsWith('T') ){
        number = 'T' + number;
    }
    if( ! new RegExp('^T[0-9]{13}$').test(number) ){
      return null;
    }else{
      return number;
    }

}


/*
- 適格請求書発行事業者の情報をプロセスデータにセット。
- Sets information of qualified invoice issuer to process data.
@param {object} 適格請求書発行事業者JSON / qualified invoice issuer JSON
@return {void}
*/
function setIssuerData(issuer){

    const PROCESS_ARR = {"01":"新規", "02":"公表内容の変更", "03":"登録の失効", "04":"登録の取消", "99":"削除"};
    const KIND_ARR = {"1":"個人", "2":"法人"};
    const COUNTRY_ARR = {"1":"国内事業者", "2":"特定国外事業者", "3":"特定国外事業者以外の国外事業者"};
    const LATEST_ARR = {"0":"過去情報", "1":"最新情報"};
    const historyArr = [];

    const conf_lastUpdateDate = configs.get('conf_lastUpdateDate');
    if(conf_lastUpdateDate !== ''){
        engine.setDataByNumber(conf_lastUpdateDate, java.sql.Date.valueOf(issuer.lastUpdateDate));
    }

    for( let i = 0 ; i < issuer.count ; i++){

        const announcement = issuer.announcement[i];
        const addressInfo = getAddressInfo(announcement);

        let historyText = announcement.sequenceNumber + '\t';
        historyText += announcement.name + '\t';
        historyText += announcement.kana + '\t';
        historyText += PROCESS_ARR[announcement.process] + '\t';
        historyText += announcement.registrationDate  + '\t';
        historyText += announcement.updateDate  + '\t';
        historyText += announcement.disposalDate  + '\t';
        historyText += announcement.expireDate  + '\t';
        historyText += KIND_ARR[announcement.kind] + '\t';
        historyText += COUNTRY_ARR[announcement.country] + '\t';
        historyText += addressInfo[0] + '\t';
        historyText += LATEST_ARR[announcement.latest] + '\t';
        historyText += announcement.tradeName + '\t';
        historyText += announcement.popularName_previousName;

        historyArr.push(historyText);

        //最新履歴の場合
        if(announcement.latest === '1'){
            const conf_name = configs.get('conf_name');
            if(conf_name !== ''){
                engine.setDataByNumber(conf_name, announcement.name);
            }
            const conf_kana = configs.get('conf_kana');
            if(conf_kana !== ''){
                engine.setDataByNumber(conf_kana, announcement.kana);
            }
            const conf_registrationDate = configs.get('conf_registrationDate');
            if(conf_registrationDate !== ''){
                engine.setDataByNumber(conf_registrationDate, java.sql.Date.valueOf(announcement.registrationDate));
            }
            const conf_updateDate = configs.get('conf_updateDate');
            if(conf_updateDate !== ''){
                engine.setDataByNumber(conf_updateDate, java.sql.Date.valueOf(announcement.updateDate));
            }
            const conf_process = configs.get('conf_process');
            if(conf_process !== ''){
                engine.setDataByNumber(conf_process, PROCESS_ARR[announcement.process]);
            }
            const conf_kind = configs.get('conf_kind');
            if(conf_kind !== ''){
                engine.setDataByNumber(conf_kind, KIND_ARR[announcement.kind]);
            }
            const conf_country = configs.get('conf_country');
            if(conf_country !== ''){
                engine.setDataByNumber(conf_country, COUNTRY_ARR[announcement.country]);
            }
            const conf_address = configs.get('conf_address');
            if(conf_address !== ''){
                engine.setDataByNumber(conf_address, addressInfo[0]);
            }
            const conf_tradeName = configs.get('conf_tradeName');
            if(conf_tradeName !== ''){
                engine.setDataByNumber(conf_tradeName, announcement.tradeName);
            }
            const conf_popularName = configs.get('conf_popularName');
            if(conf_popularName !== ''){
                engine.setDataByNumber(conf_popularName, announcement.popularName_previousName);
            }
            const conf_url = configs.get('conf_url');
            if(conf_url !== ''){
                engine.setDataByNumber(conf_url, 'https://www.invoice-kohyo.nta.go.jp/regno-search/detail?selRegNo=' + announcement.registratedNumber.substring(1));
            }

        }

    }

    const conf_history = configs.get('conf_history');
    if(conf_history !== '' && historyArr.length > 0){
        engine.setDataByNumber(conf_history, historyArr.join('\n'));
    }

}

/*
- 人格区分、国内外区分から住所情報を取得します。
- Gets address information from corporate/individual category and country category.
@param {object} 適格請求書発行事業者JSONの要素 Announcement / the element 'Announcement' of qualified invoice issuer JSON
@return {string array} 住所情報 / address information
*/
function getAddressInfo(announcement){

    const kind = announcement.kind;
    const country = announcement.country;
    let address, addressPrefectureCode, addressCityCode;

    //国内事業者
    if(country === '1'){

        //法人("人格を持たない社団等" を除く)
        if(kind === '2' && announcement.address !== ''){
            address = announcement.address;
            addressPrefectureCode = announcement.addressPrefectureCode;
            addressCityCode = announcement.addressCityCode;

        //個人 又は 法人("人格を持たない社団等")は公表住所(addressRequest)を持つ場合がある
        }else{
            address = announcement.addressRequest;
            addressPrefectureCode = announcement.addressRequestPrefectureCode;
            addressCityCode = announcement.addressRequestCityCode;
        }

    //特定国外事業者
    }else if(country === '2'){

        //自国の住所(address)
        address = announcement.address;
        addressPrefectureCode = announcement.addressPrefectureCode;
        addressCityCode = announcement.addressCityCode;

    //特定国外事業者以外の国外事業者
    }else if(country === '3'){

        //日本国内の住所(addressInside)
        address = announcement.addressInside;
        addressPrefectureCode = announcement.addressInsidePrefectureCode;
        addressCityCode = announcement.addressInsideCityCode;

        //個人で、さらに公表住所(addressRequest)を持つ場合、/(slash) を付けて追加
        if(kind === '1' && announcement.addressRequest !== ''){
            address += '/' + announcement.addressRequest;
            addressPrefectureCode += '/' + announcement.addressRequestPrefectureCode;
            addressCityCode += '/' + announcement.addressRequestCityCode;

        //法人
        }else if(kind === '2'){

            //さらに自国の住所(address)を持つ場合、/(slash) を付けて追加
            if(announcement.address !== ''){

                address += '/' + announcement.address;
                addressPrefectureCode += '/' + announcement.addressPrefectureCode;
                addressCityCode += '/' + announcement.addressCityCode;

            //さらに公表住所(addressRequest)を持つ場合、/(slash) を付けて追加 (人格のない法人の場合、ありえるとして想定)
            }else if(announcement.addressRequest !== ''){
                address += '/' + announcement.addressRequest;
                addressPrefectureCode += '/' + announcement.addressRequestPrefectureCode;
                addressCityCode += '/' + announcement.addressRequestCityCode;
            }

        }

    }

    return [address, addressPrefectureCode, addressCityCode];

}

/*
- 登録番号で適格請求書発行事業者情報を検索。国税庁の適格請求書発行事業者公表システム Web-API にアクセス。
- Searches the qualified invoice issuer information with the registrated Number, accessing to the Qualified Invoice Issuer System Web-API by National Tax Agency Japan.
@param {string} Web-API のアプリケーションID / application ID for Web-API
@param {string} 登録番号 / registrated number
@return {object} 適格請求書発行事業者オブジェクト(JSON) / qualified invoice issuer object(JSON)
*/
function searchIssuer(applicationId, registratedNumber){

    let request = httpClient.begin();
    request = request.queryParam('id', applicationId);
    request = request.queryParam('number',registratedNumber);
    request = request.queryParam('type','21'); // 21: 応答形式 = JSON形式
    request = request.queryParam('history','1'); // 1: 履歴情報あり
    const response = request.get('https://web-api.invoice-kohyo.nta.go.jp/1/num');
    //const response = request.get('https://kensyo.invoice-kohyo.nta.go.jp/1/num');

    const httpStatus = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    engine.log("HTTP Status: " + String(httpStatus));
    engine.log(responseStr);

    if(httpStatus!==200){
        throw "HTTP Status was not 200.";
    }

    const issuer = JSON.parse(responseStr);
    engine.log(issuer.count + " histories.");

    if(issuer.count === '0'){
        throw "No Issuer with '" + registratedNumber + "' was found.";
    }

    return issuer;

}
/*
- Note
    - Change history TSV format is bellow.
        - sequence number, name, kana, process category, registration date, update date, disposal date, expire date, sole proprietor/corporation category, country category, address, latest, trade name, popular name or previous name
    - candidate value for item
        - process category: "新規"(new) "公表内容の変更"(update) "登録の失効"(expire) "登録の取消"(disposal) "削除"(delete)
        - sole proprietor/corporation category: "個人"(sole proprietor) "法人"(corporation)
        - country category: "国内事業者"(Japanese business operator) "特定国外事業者"(non Japanese business operator which has no office in Japan) "特定国外事業者以外の国外事業者" (non Japanese business operator which has office in Japan)
        - latest: "過去情報"(past information) "最新情報"(current information)
- Note(ja)
    - 履歴(TSV)のフォーマットは次の通りです。
        - 一連番号, 氏名又は名称、氏名又は名称の日本語(カナ), 事業者処理区分, 登録年月日, 更新年月日, 取消年月日, 失効年月日, 人格区分, 国内外区分, 本店又は主たる事務所の所在地, 最新履歴, 主たる屋号, 通称・旧姓
    - 検索結果がゼロ件の場合、この自動処理工程はエラー終了します。
    - 国内外区分が "特定国外事業者" の事業者は "本店又は主たる事務所の所在地" を持ちません。
    - 人格区分が "個人" の事業者は、希望する場合のみ次の項目が公表されます。
        - "主たる屋号" "主たる事務所の所在地" "通称・旧姓"
        - ("通称・旧姓" は「氏名の代わりに」または「氏名と併記して」公表されます)
    - 人格区分が "法人" の事業者のうち、人格のない社団等は、希望する場合のみ次の項目が公表されます。
        - "本店又は主たる事務所の所在地"
    - 項目の取り得る値
        - 事業者処理区分: "新規" "公表内容の変更" "登録の失効" "登録の取消" "削除"
        - 人格区分: "個人" "法人"
        - 国内外区分: "国内事業者" "特定国外事業者" "特定国外事業者以外の国外事業者"
        - 最新履歴: "過去情報" "最新情報"
    - 国税庁適格請求書発行事業者公表システム Web-API 機能を利用して取得した情報をもとに作成しています。
        - Addon の内容は国税庁によって保証されたものではありません。
*/

Download

2022-12-03 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/addons/qualified-invoice-issuer-web-api-search-name-with-id/
The Addon-import feature is available with Professional edition.
Freely modifiable JavaScript (ECMAScript) code. No warranty of any kind.

Notes

  • The format of the history (TSV) is as follows.
    • sequence number, name, kana, process category, registration date, update date, disposal date, expiry date, sole proprietor/corporation category, country category, address, latest, trade name, common name or previous name
  • If there are zero results, this Auto-Step will terminate with an error.
  • Businesses classified as “Specified foreign business” do not have a head office or principal office address.
  • Businesses classified as individuals will have the following items published only if they wish to do so.
    • Principal trade name, location of principal office, common name/past name
    • (Aliases and maiden names will be published in place of or together with the full name)
  • For corporations, the following information will be published only if the business entity has a legal personality and wishes to have it published.
    • Address of head office or principal office
  • Candidate values for items
    • Process category: “新規” (new), “公表内容の変更” (update), “登録の失効” (expire), “登録の取消” (disposal), “削除” (delete)
    • Sole proprietor/corporation category: “個人” (sole proprietor), “法人” (corporation)
    • Country category: “国内事業者” (Japanese business operator), “特定国外事業者” (non Japanese business operator which has no office in Japan), “特定国外事業者以外の国外事業者” (non Japanese business operator which has office in Japan)
    • Latest: “過去情報” (past information), “最新情報” (current information)

Capture

See also

%d bloggers like this: