kintone
投稿日:

「派遣スタッフの契約更新、いつ満了か把握できていますか?」─ kintoneで派遣契約管理を構築する

皆さんこんにちは。kintoneアプリエンジニアのtomiokaです。

先日、人材派遣会社のお客様から「契約更新の連絡漏れがあった」と相談がありました。

登録スタッフ200名を超える規模の派遣会社で、契約期間や更新日をExcelで管理していたのですが、スタッフ数が増えてきて見落としが発生するようになったとのことです。特に問題だったのが抵触日の管理で、抵触日を超過すると派遣法違反になるため、担当者が常にプレッシャーを感じている状態でした。

今回は、派遣先企業・スタッフ・契約の3つのアプリを連携させて、更新期限のリマインドと抵触日のカウントダウンを自動化した事例を紹介します。登録スタッフ100〜500名規模の人材派遣会社で、契約管理をExcelで行っている管理部門の方に参考になる内容です。

派遣契約管理で起きる問題

Excelで派遣契約を管理していると、ほぼ必ずと言っていいほど以下の問題が発生します。

  • 契約更新の3ヶ月前に案内を送るはずが、気づいたら1週間前だった
  • 誰がどのスタッフの契約を担当しているか、担当者の頭の中にしかない
  • 抵触日がいつなのか、契約書を引っ張り出さないとわからない
  • 「今月対応すべき契約」の一覧が作れない

特に抵触日の管理は深刻です。派遣法では、事業所単位の抵触日(原則3年)と個人単位の抵触日(同一の組織単位で3年)の2種類があり、それぞれ管理が必要です。Excelだとこの2つを同時に追跡するのが難しい。

構築した3アプリの構成

今回は以下の3つのアプリを連携させました。

アプリ名役割主なフィールド
派遣先企業アプリ派遣先の企業情報と事業所単位の抵触日を管理企業名、事業所名、事業所抵触日、意見聴取日
スタッフアプリ登録スタッフの基本情報を管理氏名、スキル、稼働状況、連絡先
契約アプリ個別の派遣契約を管理。派遣先とスタッフを紐づけ派遣先(ルックアップ)、スタッフ(ルックアップ)、契約開始日、契約終了日、個人抵触日、更新回数

ポイントは、契約アプリが派遣先企業アプリとスタッフアプリの両方をルックアップで参照している構造です。これにより、1つの契約レコードから派遣先の事業所抵触日とスタッフの個人情報を同時に確認できます。

契約アプリのフィールド構成

フィールド名フィールドタイプフィールドコード備考
契約番号文字列(1行)contract_number自動採番
派遣先企業名文字列(1行)client_companyルックアップでコピー
事業所名文字列(1行)office_nameルックアップでコピー
スタッフ名文字列(1行)staff_nameルックアップでコピー
契約開始日日付contract_start
契約終了日日付contract_end
個人抵触日日付personal_limit_date同一組織単位での派遣開始日+3年
事業所抵触日日付office_limit_dateルックアップでコピー
残日数(個人)計算personal_remaining個人抵触日までの日数を自動計算
残日数(事業所)計算office_remaining事業所抵触日までの日数を自動計算
契約ステータスドロップダウンcontract_status契約中/更新予定/終了/抵触日超過警告
担当者ユーザー選択manager契約管理の担当CA
更新回数数値renewal_count
備考文字列(複数行)notes

「今月対応すべき契約」ビューの作成

お客様が一番求めていたのは「今月何をすべきかが一目でわかる画面」でした。kintoneの一覧設定画面で、以下の絞り込み条件を指定しました。

更新案内対象ビュー(契約終了3ヶ月前):

  • 契約終了日 が 今日以降
  • 契約終了日 が 今日から90日後 以前
  • 契約ステータス が 「契約中」

抵触日警告ビュー(個人抵触日60日前):

  • 個人抵触日 が 今日以降
  • 個人抵触日 が 今日から60日後 以前
  • 契約ステータス が 「契約中」

これにより、担当者はkintoneを開くだけで「今月更新案内を送るべき契約」と「抵触日が近い契約」を確認できます。

リマインド通知の自動化

kintoneのレコードの条件通知とリマインダーの条件通知を組み合わせて、以下の自動通知を設定しました。

契約終了90日前の通知(リマインダー):

  • 条件:契約終了日の90日前
  • 通知先:担当者フィールドのユーザー
  • メッセージ:「○○様(派遣先:△△)の契約が3ヶ月後に終了します。更新案内の準備をしてください。」

抵触日60日前の警告(リマインダー):

  • 条件:個人抵触日の60日前
  • 通知先:担当者フィールドのユーザー + 管理者グループ
  • メッセージ:「○○様(派遣先:△△)の個人抵触日まで60日です。対応方針を確認してください。」

これらはkintoneの標準機能で設定でき、カスタマイズコードは不要です。

抵触日カウントダウンの実装

契約の詳細画面を開いたとき、抵触日までの残日数を視覚的にわかるようにするカスタマイズです。

(function() {
  'use strict';

  kintone.events.on(['app.record.detail.show', 'app.record.edit.show'], function(event) {
    var record = event.record;

    var personalLimit = record.personal_limit_date.value;
    var officeLimit = record.office_limit_date.value;

    if (!personalLimit && !officeLimit) return event;

    var today = new Date();
    today.setHours(0, 0, 0, 0);

    var headerEl = kintone.app.record.getHeaderMenuSpaceElement();
    if (!headerEl) return event;

    // 既存の表示をクリア
    var existing = document.getElementById('limit-countdown');
    if (existing) existing.remove();

    var container = document.createElement('div');
    container.id = 'limit-countdown';
    container.style.cssText = 'display:flex;gap:16px;padding:8px 0;';

    if (personalLimit) {
      var pDate = new Date(personalLimit);
      var pDays = Math.ceil((pDate - today) / (1000 * 60 * 60 * 24));
      var pColor = pDays <= 30 ? '#e53e3e' : pDays <= 90 ? '#dd6b20' : '#38a169';

      var pEl = document.createElement('span');
      pEl.style.cssText = 'padding:4px 12px;border-radius:4px;font-size:13px;font-weight:bold;color:#fff;background:' + pColor;
      pEl.textContent = '個人抵触日まで ' + pDays + '日';
      container.appendChild(pEl);
    }

    if (officeLimit) {
      var oDate = new Date(officeLimit);
      var oDays = Math.ceil((oDate - today) / (1000 * 60 * 60 * 24));
      var oColor = oDays <= 30 ? '#e53e3e' : oDays <= 90 ? '#dd6b20' : '#38a169';

      var oEl = document.createElement('span');
      oEl.style.cssText = 'padding:4px 12px;border-radius:4px;font-size:13px;font-weight:bold;color:#fff;background:' + oColor;
      oEl.textContent = '事業所抵触日まで ' + oDays + '日';
      container.appendChild(oEl);
    }

    headerEl.appendChild(container);

    return event;
  });
})();

ヘッダーメニューのスペースに、抵触日までの残日数をバッジ表示しています。

  • 30日以内:赤(緊急)
  • 31〜90日:オレンジ(要注意)
  • 91日以上:緑(余裕あり)

kintone.app.record.getHeaderMenuSpaceElement()はkintoneが用意しているカスタマイズ用のスペースで、詳細画面・編集画面のヘッダー部分に要素を追加できます。

ハマりどころ

抵触日の2種類を混同しない

派遣法の抵触日には「事業所単位」と「個人単位」の2種類があります。

  • 事業所単位:同一事業所で派遣を受け入れられる期間(原則3年)。延長するには労働組合等への意見聴取が必要
  • 個人単位:同一の派遣スタッフが同一の組織単位で働ける期間(3年)。延長不可(別の組織単位への異動が必要)

最初、お客様は「抵触日」を1種類だと思っていて、アプリにも1つの日付フィールドしか用意していませんでした。ヒアリングの中で2種類あることを確認し、フィールドを追加しました、、、、これは設計段階で確認しておくべきでした。

日付計算のタイムゾーン

kintoneの日付フィールドはYYYY-MM-DD形式の文字列で返ってきます。new Date('YYYY-MM-DD')はECMAScript仕様上UTCの0時として解釈されるため、日本時間(UTC+9)との差で残日数が1日ずれることがあります。

今回のコードではtoday.setHours(0, 0, 0, 0)でローカル時間の0時を基準にしています。より確実にするならnew Date(personalLimit + 'T00:00:00')とローカル時間で解釈させる方法もあります。正直、最初はここでハマりました、、、、残日数が1日ずれて表示されて原因を探すのに時間がかかりました。

ルックアップの更新タイミング

派遣先企業アプリで事業所抵触日を変更しても、契約アプリ側のルックアップコピー値は自動で更新されません。ルックアップの値を更新するには、契約アプリ側でレコードを編集して「取得」ボタンを押す必要があります。

スタッフ数が多いとこの手動更新が大変なので、REST APIで一括更新するバッチ処理を別途用意しました。

導入結果

導入から2ヶ月後、お客様から以下のフィードバックをいただきました。

  • 契約更新の連絡漏れがゼロになった(導入前は月1〜2件あった)
  • 「今月対応すべき契約」の確認が、Excel検索の15分からkintoneのビュー切替1秒に短縮された
  • 抵触日の管理が属人化から脱却し、担当者が休んでも他の人が対応できるようになった
  • 労働局の監査で「記録管理が整っている」と評価された

お客様からは「Excelだと”見に行かないと気づかない”けど、kintoneだと”通知が来るから見落とさない”。この差が大きい」と言っていただけました。

まとめ

今回は、派遣契約管理をkintoneで構築した事例を紹介しました。

  • 派遣先企業・スタッフ・契約の3アプリ連携で、抵触日と契約更新を一元管理
  • kintone標準のリマインダー通知で、契約終了90日前と抵触日60日前に自動アラート
  • ヘッダーメニューに抵触日カウントダウンをバッジ表示し、緊急度を色で直感的に把握

派遣法の抵触日管理は「知らなかった」では済まない法令遵守の問題です。Excelで管理できる規模には限界があります。スタッフ数が100名を超えてきたら、仕組みで見落としを防ぐ段階だと考えています。

株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築を承っています。「派遣契約の管理を効率化したい」「抵触日の管理に不安がある」という方は、お問い合わせフォームからお気軽にご連絡ください。