部門APIを利用した組織図の取得について

freee人事労務APIに追加された 部門APIを利用すると、freee人事労務に設定されている部門情報を一覧取得することが可能です。部門の階層レベルや親部門なども取得することができます。

このAPIを利用して、組織図に沿ったJSONデータを出力してみましょう。

部門APIを利用したJSON例

下記のような組織階層がfreee人事労務に設定されているとします。freee人事労務では階層構造になっています。

├── 親部門
│   ├── 子1部門
│   │   └── 孫部門
│   └── 子2部門
└── 独立部門

この階層データをfreee人事労務API経由で取得すると、各部門が並列なデータとして返ってきます。

以下は、部門APIを利用して取得したJSONのデータ例です。JSONのプロパティ「groups」内に、配列データで各部門の情報が並列に含まれているのが分かります。

{
  "groups": [
    {
      "id": 1, 
      "name": "親部門",
      "code": "001", 
      "level": 1,
      "parent_group_id": null,
      "parent_group_code": null,
      "parent_group_name": null,
    },
    {
      "id": 2, 
      "name": "子1部門",
      "code": "002", 
      "level": 2,
      "parent_group_id": 1,
      "parent_group_code": "001",
      "parent_group_name": "親部門"
    },
    {
      "id": 3, 
      "name": "子2部門",
      "code": "003", 
      "level": 2,
      "parent_group_id": 1,
      "parent_group_code": "001",
      "parent_group_name": "親部門"
    },
    {
      "id": 4, 
      "name": "孫部門",
      "code": "004", 
      "level": 3,
      "parent_group_id": 2,
      "parent_group_code": "",
      "parent_group_name": "子1部門"
    },
    {
      "id": 5, 
      "name": "独立部門",
      "code": "005", 
      "level": 1,
      "parent_group_id": null,
      "parent_group_code": null,
      "parent_group_name": null
    }
  ],
  "total_count": 5
}

このJSONデータを、実際の組織構造に沿った形でJSONに出力し直してみましょう。

組織図を出力するサンプルコード

以下はJavaScriptによるサンプルコードです。ここでは、APIから取得したデータを「input」という変数に格納しているものとします。

const input = {
  "groups": [
    {
      "id": 1, 
      "name": "親部門",
      "code": "001", 
      "level": 1,
      "parent_group_id": null,
      "parent_group_code": null,
      "parent_group_name": null,
    },
    {
      "id": 2, 
      "name": "子1部門",
      "code": "002", 
      "level": 2,
      "parent_group_id": 1,
      "parent_group_code": "001",
      "parent_group_name": "親部門"
    },
    {
      "id": 3, 
      "name": "子2部門",
      "code": "003", 
      "level": 2,
      "parent_group_id": 1,
      "parent_group_code": "001",
      "parent_group_name": "親部門"
    },
    {
      "id": 4, 
      "name": "孫部門",
      "code": "004", 
      "level": 3,
      "parent_group_id": 2,
      "parent_group_code": "",
      "parent_group_name": "子1部門"
    },
    {
      "id": 5, 
      "name": "独立部門",
      "code": "005", 
      "level": 1,
      "parent_group_id": null,
      "parent_group_code": null,
      "parent_group_name": null
    }
  ],
  "total_count": 5
}

function findChildren(group) {
  return input.groups.filter(g => g.parent_group_id === group.id) 
}

function makeGroupProp(group) {
  return {
    ...group,
    children_groups: findChildren(group).map(g => makeGroupProp(g))
  }
}

const topGroups = input.groups.filter(g => g.parent_group_id === null)
const resultByTree = topGroups.map(g => makeGroupProp(g))
console.log(JSON.stringify(resultByTree, null, 2))

関数「findChildren」では、引数で指定した部門を親階層に持つ、子部門リストを取得しています。

関数「makeGroupProp」では、引数で指定した部門の子部門リストを見つけプロパティ「children_group」に格納する処理を、再帰的に行っています。

変数「topGroups」には、親階層を持たない部門、つまり階層構造のトップに位置する部門を格納しています。

これらの関数・変数を組み合わせ、トップグループから順番に階層構造を作成しています。

上記のコードを実行した結果は、以下のようになります。実際の階層構造に沿った形で、データを生成しています。

[
  {
    "id": 1,
    "name": "親部門",
    "code": "001",
    "level": 1,
    "parent_group_id": null,
    "parent_group_code": null,
    "parent_group_name": null,
    "children_groups": [
      {
        "id": 2,
        "name": "子1部門",
        "code": "002",
        "level": 2,
        "parent_group_id": 1,
        "parent_group_code": "001",
        "parent_group_name": "親部門",
        "children_groups": [
          {
            "id": 4,
            "name": "孫部門",
            "code": "004",
            "level": 3,
            "parent_group_id": 2,
            "parent_group_code": "",
            "parent_group_name": "子1部門",
            "children_groups": []
          }
        ]
      },
      {
        "id": 3,
        "name": "子2部門",
        "code": "003",
        "level": 2,
        "parent_group_id": 1,
        "parent_group_code": "001",
        "parent_group_name": "親部門",
        "children_groups": []
      }
    ]
  },
  {
    "id": 5,
    "name": "独立部門",
    "code": "005",
    "level": 1,
    "parent_group_id": null,
    "parent_group_code": null,
    "parent_group_name": null,
    "children_groups": []
  }
]