kintone
投稿日:

「裁判期日、いつだっけ?」をなくす ─ kintoneで士業事務所の案件管理と期日アラートを構築する

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

先日、法律事務所のお客様から「案件の期日管理がもう限界です」と相談がありました。

弁護士3名、司法書士2名、事務員4名の事務所で、常時80〜100件の案件を並行して処理しているとのこと。裁判期日や書類提出期限をExcelと紙の手帳で二重管理していたのですが、案件数が増えるにつれて確認漏れが出てきたそうです。特に怖いのが「期日徒過」。裁判の期日を見落とすと、答弁書を出せないまま欠席判決になってしまう可能性があります。依頼者の利益に直結する問題なので、担当弁護士の先生方もかなり神経を使っていたようです。

今回は、案件管理・期日管理・依頼者連絡の3つのアプリを連携させて、期日の自動アラートと進捗共有を仕組み化した事例を紹介します。弁護士・司法書士事務所で案件数が50件を超えてきた方、事務員の方が期日管理に追われているという方に参考になる内容です。

士業事務所の期日管理で起きている問題

法律事務所や司法書士事務所の期日管理は、一般企業のタスク管理とは少し性質が異なります。裁判所が指定する期日は変更がきかない「絶対的な締切」であり、1日でも遅れると取り返しがつかないケースがあるんです。

お客様の事務所では、以下のような問題を抱えていました。

  • 弁護士ごとに期日の管理方法がバラバラ(Excel、Googleカレンダー、紙の手帳)で、事務員が全体を把握できない
  • 月に約20件ある裁判期日や書類提出期限を、事務員が毎朝Excelを目視チェックして確認していた
  • 依頼者への進捗報告のタイミングが属人化しており、「報告がない」とクレームになることがあった
  • 弁護士の先生が出張や法廷で不在のとき、他の人が案件の状況を確認できなかった

ある事務員の方は「朝一番にExcelを開いて今週の期日を確認するのですが、フィルタの設定を間違えて表示されないことがあって怖いんです」とおっしゃっていました。月に約20件の期日をExcelの目視確認で管理するのは、正直なところリスクが高い状態です。

構築した3アプリの構成

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

アプリ名役割主なフィールド
案件管理アプリ案件の基本情報と進捗ステータスを管理案件番号、依頼者名、相手方、案件種別(民事訴訟・登記申請等)、担当弁護士/司法書士、ステータス
期日管理アプリ各案件に紐づく期日(裁判期日・提出期限)を管理案件番号(ルックアップ)、期日種別、期日、場所、対応内容、期日ステータス
依頼者連絡アプリ依頼者への報告履歴を記録案件番号(ルックアップ)、依頼者名、連絡日、連絡手段、報告内容、次回連絡予定日

ポイントは、期日管理アプリと依頼者連絡アプリの両方が案件管理アプリをルックアップで参照している構造です。案件番号をキーにして、1つの案件に対する期日と連絡履歴をそれぞれ別アプリで管理しています。

士業事務所の場合、1つの案件に対して複数の期日が発生します。たとえば民事訴訟なら、第1回口頭弁論期日、準備書面の提出期限、証拠の提出期限と、1つの案件だけで3〜5件の期日が並行して走ることも珍しくありません。案件管理アプリのサブテーブルで期日を管理する方法も検討しましたが、期日ごとにステータスやリマインドを個別に設定したかったので、別アプリとして独立させました。

期日管理アプリのフィールド構成

フィールド名フィールドタイプフィールドコード備考
期日ID文字列(1行)deadline_id自動採番
案件番号文字列(1行)case_numberルックアップでコピー
案件名文字列(1行)case_nameルックアップでコピー
担当者ユーザー選択assigned_lawyerルックアップでコピー
期日種別ドロップダウンdeadline_type裁判期日/書類提出期限/登記申請期限/相談予定/その他
期日日付deadline_date
開始時刻時刻start_time裁判期日の場合に使用
場所文字列(1行)location裁判所名・支部名など
対応内容文字列(複数行)action_detail当日までに準備すべき内容
期日ステータスドロップダウンdeadline_status未対応/対応準備中/7日前/3日前/当日/完了
対応メモ文字列(複数行)action_memo完了後の記録
備考文字列(複数行)notes

期日ステータスの「7日前」「3日前」「当日」は、JavaScriptカスタマイズで自動更新される値です。一覧画面でこのステータスを色分け表示することで、どの期日が直近に迫っているかを一目で把握できるようにしました。

期日ステータス自動更新と色分け表示の実装

今回のカスタマイズの中心となる部分です。一覧画面が表示されたときに、各レコードの期日と今日の日付を比較し、ステータスを自動更新します。さらに、ステータスに応じて行の背景色を変えることで、視覚的に緊急度がわかるようにしています。

(function() {
  'use strict';

  // 一覧画面表示時に期日ステータスを自動更新し、行を色分け
  kintone.events.on('app.record.index.show', function(event) {
    var records = event.records;
    var today = new Date();
    today.setHours(0, 0, 0, 0);

    var updateTargets = [];

    for (var i = 0; i < records.length; i++) {
      var record = records[i];
      var deadlineValue = record.deadline_date.value;
      var currentStatus = record.deadline_status.value;

      if (!deadlineValue || currentStatus === '完了') continue;

      var deadline = new Date(deadlineValue + 'T00:00:00');
      var diffDays = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));

      var newStatus = '';
      if (diffDays <= 0) {
        newStatus = '当日';
      } else if (diffDays <= 3) {
        newStatus = '3日前';
      } else if (diffDays <= 7) {
        newStatus = '7日前';
      }

      // ステータス更新が必要な場合、APIで更新
      if (newStatus && newStatus !== currentStatus) {
        updateTargets.push({
          id: record.$id.value,
          record: {
            deadline_status: { value: newStatus }
          }
        });
      }

      // 行の背景色を変更
      var rowEl = document.querySelector(
        'tr[data-recordid="' + record.$id.value + '"]'
      );
      if (!rowEl) continue;

      if (diffDays <= 0) {
        rowEl.style.backgroundColor = '#fee2e2';
      } else if (diffDays <= 3) {
        rowEl.style.backgroundColor = '#fff3cd';
      } else if (diffDays <= 7) {
        rowEl.style.backgroundColor = '#e0f2fe';
      }
    }

    // ステータスの一括更新
    if (updateTargets.length > 0) {
      var body = {
        app: kintone.app.getId(),
        records: updateTargets
      };
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', body)
        .then(function() {
          console.log('期日ステータスを ' + updateTargets.length + ' 件更新しました');
        })
        .catch(function(error) {
          console.error('ステータス更新エラー:', error);
        });
    }

    return event;
  });
})();

処理の流れを整理すると、以下のようになります。

  • 一覧画面を開くと、各レコードの期日と今日の差分日数を計算
  • 差分が0日以下なら「当日」、3日以内なら「3日前」、7日以内なら「7日前」にステータスを自動更新
  • ステータスが変更されたレコードはREST APIで一括更新
  • 行の背景色を赤(当日)・黄(3日前)・青(7日前)に変更

色分けの基準をまとめると次のとおりです。

残日数背景色意味
0日以下赤(#fee2e2)当日または超過。すぐに確認が必要
1〜3日黄(#fff3cd)直前。最終準備を確認
4〜7日青(#e0f2fe)1週間以内。準備に着手
8日以上なし通常表示

この色分けが事務員の方に好評でした。「朝kintoneを開くだけで、今日対応が必要なものが赤で目に飛び込んでくるので安心です」と言っていただけました。

ハマりどころ

一覧画面のDOM操作が効くタイミング

app.record.index.showイベントで行の背景色を変更しているのですが、kintoneの一覧画面はイベント発火時にDOMが完全に描画されていないことがあります、、、、特にレコード数が多いとき、document.querySelectorで対象の行が取得できずにnullが返ることがありました。

今回はif (!rowEl) continue;で空振りをスキップする処理を入れていますが、より確実にするならsetTimeoutで少し遅延させる方法もあります。ただし遅延時間の設定が環境依存になるため、今回はシンプルにスキップする方式を採用しました。

REST APIの同時リクエスト数制限

一覧画面を開くたびにステータス更新のAPIを呼ぶ設計にしていますが、kintone REST APIには同時リクエスト数の制限があります、、、、1ドメインあたり同時10リクエストが上限です。

今回は一括更新API(/k/v1/records.jsonのPUT)を使っているので1回のリクエストで済みますが、1回のリクエストで更新できるレコード数は最大100件です。月に約20件の期日であれば問題ありませんが、将来的に期日数が増えた場合は100件を超えないよう注意が必要です。

依頼者連絡アプリとの使い分け

お客様から「期日管理アプリに依頼者への報告も記録したい」と要望がありました。気持ちはわかるのですが、期日管理と依頼者連絡は性質が異なります。期日は「いつまでに何をするか」、連絡は「何を伝えたか」です。1つのアプリにまとめると、期日一覧に連絡履歴が混在して見にくくなります、、、、ここは別アプリにして案件番号で紐づける設計にしました。

導入結果

導入から3ヶ月後、以下の変化がありました。

  • 期日の見落としがゼロになった(導入前の3ヶ月で2件の「ギリギリ気づいた」事案があった)
  • 事務員の方の朝のExcelチェック作業(毎朝15〜20分)がなくなった
  • 弁護士の先生が外出中でも、事務員が案件の進捗と次の期日をkintoneで即答できるようになった
  • 依頼者への月次報告を依頼者連絡アプリの履歴から作成できるようになり、報告書の作成時間が半分に短縮された
  • 「報告がない」という依頼者からのクレームがなくなった

事務所の所長からは「期日管理を仕組み化できたことで、案件を増やしても安心感がある。事務員の精神的な負担も減った」とフィードバックをいただきました。

まとめ

今回は、法律事務所の案件管理と期日アラートをkintoneで構築した事例を紹介しました。

士業事務所の期日管理は、「うっかり忘れました」が許されない業務です。Excel管理でも案件が少ないうちは回りますが、常時80件を超えてくると人の注意力だけでカバーするのは難しくなります。今回のカスタマイズのポイントを振り返ります。

  • 案件管理・期日管理・依頼者連絡の3アプリを案件番号で連携し、情報を一元化した
  • 期日の7日前・3日前・当日にステータスを自動更新し、一覧画面の色分けで緊急度を可視化した
  • 依頼者連絡アプリで報告履歴を蓄積し、「いつ何を伝えたか」を事務所全体で共有できるようにした

仕組みで見落としを防ぐことで、担当者の安心感にもつながります。「毎朝のExcelチェックが怖い」という状態から脱却できたのは、お客様にとって大きな変化だったようです。

株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築を承っています。お問い合わせフォームからお気軽にご連絡ください。