【介護DX×プログラミング】訪問介護事業所向けタイムスタディアプリ開発企画

簡単、というわけではないのですが、訪問介護事業所向けストレスチェック・アプリは、ほとんどフロントエンドで構成されていて、バックエンドは、フロントエンドでjavascriptで計算した結果を受検者と実施事務従事者にメールで送信するだけです。セキュリティ対策も、クロスサイトスクリプティング対策や非公開ファイルの設定など限られています。ディレクトリ構成もシンプルです。

で、例えば、訪問介護事業所向けタイムスタディ・アプリは、勤務開始から勤務終了までの間、作業ごとの時間を計測しなければなりません。職員ごとに計測しなければならないので、ログイン設定が必要で、計測時間は都度、データベースに保存する必要があります。そして、計測実施期間が終了したら出力しなければなりません。訪問介護事業所向けストレスチェック・アプリとは次元が違う複雑さが求められます。

検索エンジンにインディックスしない設定をして職員にURLを配布して実施するなど、一般公開するものではないためセキュリティ対策は不十分で良いのかもしれませんが、それでも基本的なセキュリティ対策は必須です。

どう作ったら良いのか分からないところも多々あるので、AIに相談してみました。まずは、『生産性向上推進体制加算』で求められている「業務時間の見える化」で必要な項目を見てみます。訪問系ではかなり項目を変えないといけないですね。

A.直接介護
 1.移動・移乗・体位交換
 2.排泄介助・支援
 3.入浴・整容・更衣
 4.利用者とのコミュニケーション
 5.日常生活自立支援
 6.行動上の問題への対応
 7.食事支援
 8.機能訓練・リハビリテーション・医療的処置
 9.その他の直接介護
B.間接業務
 10.巡回・移動
 11.記録・文書作成・連絡調整等
 12.利用者のアセスメント・情報収集・介護計画の作成・見直し
 13.見守り機器の使用・確認
 14.介護ロボット・ICT機器の準備・調整・片付け
 15.他の職員に対する指導・教育
 16.食事・おやつの配膳・下膳等
 17.入浴業務の準備等
 18.リネン交換・ベッドメイク
 19.居室清掃・片付け
 20.消毒などの感染症対応
 21.その他の間接業務
C.休憩
 22.休憩・待機・仮眠
D.その他
 23.その他
E.余裕時間
 24.余裕時間(突発でのケアや対応ができる状態)
00.備考・補足等

で、Google Gemini Pro2.5に『訪問介護事業所向けタイムスタディ・アプリ』の開発の相談をしてみました。そもそもタイムスタディ調査して「業務時間の見える化」をやる意味は、意味のない「プルシットジョブ」を無くしたり、デジタル化を進めたらどのくらい効率化ができるのか、協働化をしたらどのくらい間接業務を減らすことができるのか、ケアプランデータ連携システムを導入したら何時間作業時間を減らすことができるのか。。。等などを把握するために実施するものです。なので、把握する項目を何にするのかは「肝」になります。「生産性向上委員会」とかで、皆でワイワイ話しながら決めてゆくと、実行性が高いものになるでしょう。

「プルシットジョブ」とは、実質的な価値を持たず、存在そのものが独自の自己主張で成り立っているような職務を指します。例えば、誰も目を通さない報告書の作成や、進展のない会議を重ねる行為が挙げられます。一部の従事者は、自身が携わる職務の本質的な意義にさえ疑念を抱くかもしれません。それでも、こうした役割が未だに多くの企業で健在であることは、ある種の逆説的な現代の縮図とも言えるでしょう。このような仕事に、努力と時間を注ぐ姿勢には、皮肉な輝きさえ感じられます。社会システムの枠組みが「意味を装う」ことを奨励し、それが一方で個々の労働者を窮地に追いやる状況を作り出しているからです。そして、深刻な労働力不足に直面する現在においても、これらの「無益な役割」が存続し続けていることが、社会全体としての選択ミスを象徴していると言えます。まるで自ら貧困への道を選び取っているようなものではないでしょうか。

中小企業ゆえの社長の気まぐれからくる「プルシットジョブ」や、生産性向上の名の元に全く結果にコミットしない「プルシットジョブ」が蔓延してしまう現実を憂います。介護や福祉の法制度に文句を言っている社長や管理者がいる組織におそらく未来はないと思います(毒舌ですが。。。)
で、AIに開発の相談をしてみました。

管理者
管理者

訪問介護事業所用のタイムスタディwebアプリの開発を企画しています。スマホの画面に各種作業のアイコンが20個くらい並んでいる感じにしたいと思います。まず、職員ごとにIDとパスワードを入力して職員後のと画面に移ります。勤務開始アイコンを押すと時間計測がスタートし、作業①ボタンを押すと作業①の時間計測が開始され、作業②ボタンを押すと作業①の時間計測が終わり、時間数が保存されます。このように一日のタイムスタディをおこない、最後に勤務終了ボタンを押すと計測が終了します。例えば、作業①は一日の中でも何回かあります。計測された各作業ごとの時間は、職員ごとにCSVかJSON形式で出力でき、Excelのワークシートに転記できるようにします。このような開発を進めていくには、フロントエンドとバックエンドをどのように設計すると良いか、アイデアを出してください。

Gemini
Gemini

訪問介護事業所向けタイムスタディWebアプリ開発企画:設計案

訪問介護事業所向けのタイムスタディWebアプリ開発、素晴らしい企画ですね。職員様の業務負担を軽減し、正確なデータ収集を実現するための具体的な設計案を、フロントエンドとバックエンドに分けて提案します。


1. 全体像と設計方針

まず、プロジェクト全体の成功に向けた重要な設計方針をいくつか挙げます。

  • モバイルファースト: 職員の方々は主にスマートフォンで操作するため、すべての画面設計はスマートフォンの画面サイズを最優先で考えます。PCでの閲覧は管理者向けのデータ確認画面などを想定します。
  • 直感的なUI/UX: ITに不慣れな方でも迷わず使えるよう、アイコンは大きく、操作は「タップするだけ」で完結するようにシンプルさを追求します。
  • データの信頼性: 時間の記録は非常に重要です。時刻のずれを防ぐため、タイムスタンプは「ボタンを押した瞬間にスマートフォンの時刻を記録する」のではなく、「ボタンを押したリクエストをサーバーが受信した時刻」を正式な記録とします。これにより、端末ごとの時刻のずれや不正な操作を防ぎます。
  • 拡張性: 将来的に「利用者ごとの記録」や「詳細なレポート機能」などを追加できるよう、シンプルな構成から始めつつも、拡張しやすいデータベース設計を心がけます。

2. フロントエンド設計案 (ユーザーが見る画面側)

フロントエンドは、ユーザー体験の核となる部分です。シンプルさと応答性を重視します。

技術スタック(推奨)

  • フレームワーク:Vue.js または React
    • 理由: 状態管理(どの職員がログインしているか、どのタスクが実行中かなど)が容易になり、UIの部品化(コンポーネント化)によって、アイコンボタンなどの再利用やメンテナンスがしやすくなります。どちらもモバイルアプリ開発で豊富な実績があります。
  • UIライブラリ:Material-UI (MUI)VuetifyTailwind CSS
    • 理由: 美しく、レスポンシブデザインに対応したコンポーネント(ボタン、フォームなど)が最初から用意されており、開発スピードを向上させます。

画面構成

  1. ログイン画面 (/login)
    • 要素:
      • 事業所ロゴ
      • 職員ID入力フィールド
      • パスワード入力フィールド
      • ログインボタン
    • 機能: 入力されたIDとパスワードをバックエンドのAPIに送信し、認証結果を受け取ります。
  2. メイン画面 / ダッシュボード (/dashboard)
    • 要素:
      • ヘッダー: ログイン中の職員名、現在の時刻
      • 勤務開始ボタン: 大きく目立つボタン。
      • タスクアイコン群 (グリッド表示):
        • ご要望の約20個の作業アイコンを格子状に配置します。(例: 4列 x 5行)
        • 各アイコンには「身体介護」「移動」「書類作成」などのタスク名を表示します。
        • 現在実行中のタスクのアイコンは、色を変えたり、枠線で囲ったりして視覚的に分かるようにします。(例: 実行中のタスクは青く光る)
      • 勤務終了ボタン: 誤操作を防ぐため、「本当に終了しますか?」といった確認ダイアログを表示するのが親切です。
    • 機能:
      • 勤務開始: ボタンをタップすると、バックエンドに「勤務開始」を通知します。その後、タスクアイコンが操作可能になります。
      • タスク選択: いずれかのタスクアイコンをタップすると、バックエンドに「どのタスクを開始したか」を通知します。フロントエンド側では、タップされたアイコンを「実行中」のデザインに変更し、他のアイコンは「待機中」のデザインに戻します。
      • 勤務終了: ボタンをタップすると、バックエンドに「勤務終了」を通知します。
  3. データ出力画面 (/export)
    • 要素:
      • 日付範囲選択(例: 今日のデータ、昨日のデータ、期間指定)
      • 「CSVでダウンロード」ボタン
      • 「JSONでダウンロード」ボタン
    • 機能: 選択された条件でバックエンドにデータ出力をリクエストし、返ってきたファイルをダウンロードさせます。

状態管理

フロントエンド内で、以下の情報を常に管理する必要があります。

  • ログインしている職員のID (userId)
  • 勤務中かどうか (isWorking)
  • 現在実行中のタスクのID (activeTaskId) とその開始時刻 (activeTaskStartTime)

これらの情報をVuex (Vue.js) や Redux (React) といった状態管理ライブラリで一元管理することで、アプリケーションの動作が安定します。


3. バックエンド設計案 (サーバー側の処理)

バックエンドは、データの保存、認証、ビジネスロジックを担当します。信頼性とセキュリティが最重要です。

技術スタック(推奨)

  • 言語/フレームワーク:Node.js + Express
    • 理由: フロントエンドと同じJavaScriptで開発できるため、学習コストが比較的低いです。リアルタイム通信の親和性も高く、将来的な機能拡張にも柔軟に対応できます。Python (Django/Flask) や Ruby (Rails) も良い選択肢です。
  • データベース:PostgreSQL または MySQL
    • 理由: ユーザー、タスク、時間記録といった構造化されたデータを扱うのに適したリレーショナルデータベースです。データの整合性を保ちやすく、信頼性が高いです。

データベース設計(テーブル構成案)

  1. staffs (職員) テーブル
    • id (主キー, 自動採番)
    • username (職員ID, 文字列, ユニーク)
    • password_hash (ハッシュ化されたパスワード, 文字列)
    • full_name (職員氏名, 文字列)
    • created_at, updated_at (作成/更新日時)
  2. tasks (タスク) テーブル
    • id (主キー, 自動採番)
    • task_name (タスク名, 例: 「移動」「身体介護」, 文字列)
    • icon_name (フロントで表示するアイコン名, 文字列)
    • sort_order (表示順序, 整数)
  3. time_logs (時間記録) テーブル
    • id (主キー, 自動採番)
    • staff_id (職員ID, staffsテーブルへの外部キー)
    • task_id (タスクID, tasksテーブルへの外部キー)
    • start_time (開始時刻, タイムスタンプ)
    • end_time (終了時刻, タイムスタンプ)

APIエンドポイント設計 (フロントとの通信口)

  • POST /api/auth/login
    • 機能: 職員IDとパスワードを受け取り、認証してトークン(ログイン証明書)を返す。
  • POST /api/timestamps/start_work
    • 機能: 勤務開始を記録。内部的には「勤務」という特殊なタスクの開始として time_logsstart_time のみ記録するなどの実装が考えられます。
  • POST /api/timestamps/log_task
    • 機能: 新しいタスクの開始を記録する最も重要なAPI。
    • リクエストボディ: { "staffId": 123, "newTaskId": 5 }
    • 処理ロジック:
      1. staffId で、直前に実行していたタスク(end_time がNULL)を time_logs から探す。
      2. 見つかったら、そのレコードの end_time を現在時刻で更新する。
      3. staffIdnewTaskId を使って、time_logs に新しいレコードを start_time を現在時刻として挿入する。
  • POST /api/timestamps/end_work
    • 機能: 勤務終了を記録。
    • 処理ロジック: 最後に実行していたタスクの end_time を現在時刻で更新する。
  • GET /api/export
    • 機能: 指定された職員、期間のタイムスタディデータを出力する。
    • クエリパラメータ: ?staffId=123&format=csv&startDate=2025-06-24&endDate=2025-06-24
    • 処理ロジック:
      1. パラメータを元に time_logs テーブルを検索。
      2. 各ログの duration (end_timestart_time) を計算。
      3. タスクごとに合計時間を集計。
      4. 指定されたフォーマット(CSVまたはJSON)に整形してレスポンスとして返す。

データ出力の形式例

CSV出力例 (export.csv)

職員名,タスク名,合計時間(分)
山田太郎,身体介護,65
山田太郎,移動,30
山田太郎,書類作成,15

JSON出力例

{
  "staffName": "山田太郎",
  "date": "2025-06-24",
  "summary": [
    {
      "taskName": "身体介護",
      "totalMinutes": 65
    },
    {
      "taskName": "移動",
      "totalMinutes": 30
    },
    {
      "taskName": "書類作成",
      "totalMinutes": 15
    }
  ]
}

4. 開発の進め方(推奨ステップ)

  1. 要件定義とプロトタイピング:
    • 全タスクの洗い出しとアイコンのデザインを決定します。
    • Figmaなどのツールで簡単な画面遷移のプロトタイプを作成し、実際の職員の方に触ってもらい、フィードバックを得ます。
  2. DB設計とAPI設計: 本提案のような内容をより詳細に固めます。
  3. バックエンド開発: まずはAPIとデータベースを先に開発します。PostmanなどのツールでAPIが正しく動作するかをテストします。
  4. フロントエンド開発: バックエンドのAPIに接続しながら、画面を実装していきます。
  5. 結合テストと実証実験: 実際に数名の職員の方にテスト運用してもらい、使い勝手やバグを洗い出します。
  6. 本番展開と運用: 全職員へ展開し、運用を開始します。

この設計案が、具体的な開発計画を立てる上での一助となれば幸いです。ご不明な点があれば、さらに深掘りしてご提案します。

管理者
管理者

デプロイ環境にはfirebaseを使いたいと思います。もっと簡単でシンプルな実装方法はありますか?

Gemini
Gemini

はい、承知いたしました。デプロイ環境にFirebaseを使いたいというご要望、素晴らしいです。Firebaseを活用することで、前回ご提案したような伝統的なサーバー/DB構成よりも、さらにシンプルで迅速に開発できる「サーバーレスアーキテクチャ」 を組むことが可能です。

こちらの方が、インフラ管理の手間が大幅に削減され、小規模から始めるプロジェクトには特におすすめです。

Firebaseを活用した、よりシンプルな実装案

この構成の最大のメリットは、自前でサーバー(バックエンドアプリケーション)を常時稼働させる必要がないことです。必要な時だけ呼び出される「Cloud Functions」がサーバーの役割を担います。


1. 利用するFirebaseサービス

サービス名役割従来案からの置き換え
Firebase Hostingフロントエンドの置き場所Webサーバー(Nginx等)のホスティング
Firebase Authenticationログイン・認証機能自作のログインAPIとstaffsテーブル
Cloud FirestoreデータベースPostgreSQL / MySQLサーバー
Cloud Functionsサーバー処理(ロジック)Node.js+Express等の常時稼働サーバー

2. 新しい設計案の詳細

A. フロントエンド (変更点は少ない)

  • 技術スタック: ReactやVue.jsはそのまま活用できます。
  • Firebase SDKの導入: フロントエンドのコードにFirebaseのSDK(Software Development Kit)を導入します。これにより、数行のコードで認証やデータベースへのアクセスが可能になります。
  • API通信先の変更:
    • 前回案: 自作の/api/...エンドポイントを呼び出す。
    • 今回案: Firebase SDKを通して、直接AuthenticationやFirestore、Cloud Functionsを呼び出す。

B. 認証 (Firebase Authentication)

  • 実装:
    • 「メールアドレスとパスワードによる認証」を有効にします。(職員IDの代わりにメールアドレスを使うのが一般的ですが、ID形式も可能です)
    • フロントエンドからsignInWithEmailAndPassword()のようなSDKの関数を呼び出すだけで、ログイン機能が実装できます。
    • ログインしたユーザーの情報(UIDというユニークID)はSDKが自動で管理してくれるため、非常に簡単です。
  • メリット: パスワードのハッシュ化やセキュアな管理を全てFirebaseに任せられるため、安全で実装も楽になります。

C. データベース (Cloud Firestore)

FirestoreはNoSQLデータベースなので、テーブルではなく「コレクション」と「ドキュメント」でデータを管理します。

  • データ構造案:
    1. tasks コレクション: (タスク一覧。これは前回と同じ考え方)
      • ドキュメントID: task_01, task_02
      • データ: { taskName: "身体介護", iconName: "body_care", sortOrder: 1 }
    2. time_logs コレクション: (タイムスタンプの記録)
      • ドキュメントID: (自動生成)
      • データ: JSON{ "staffUid": "xxxxxxxxx", // Firebase AuthenticationのユーザーUID "staffName": "山田太郎", // 記録時に保存 "taskId": "task_01", "taskName": "身体介護", "startTime": "2025-06-24T10:00:00Z", // Timestamp型 "endTime": "2025-06-24T10:30:00Z" // Timestamp型 }

D. 中核ロジック (Cloud Functions)

タイムスタンプの信頼性を担保するためのサーバー処理と、データ出力処理をCloud Functionsで実装します。

  1. logTask 関数 (タスク記録用)
    • トリガー: フロントエンドからの直接呼び出し(Callable Function)
    • 処理の流れ:
      1. フロントエンドでタスクアイコンがタップされる。
      2. フロントエンドが logTask({ newTaskId: "task_02" }) のようにCloud Functionを呼び出す。
      3. (ここからCloud Function内の処理)
      4. 呼び出したユーザーのUID(staffUid)を取得。
      5. time_logsコレクションから、そのstaffUidの最新ログ(endTimeがまだ無いもの)を探す。
      6. もし見つかれば、そのログにサーバー時刻endTimeをセットして更新。
      7. 新しいnewTaskIdstaffUidで、サーバー時刻startTimeとして新しいログを作成。
    • ポイント: startTimeendTimeは、信頼できるサーバー時刻 (FieldValue.serverTimestamp()) を使うことで、データの正確性を保証します。
  2. exportData 関数 (データ出力用)
    • トリガー: HTTPリクエスト(HTTPS Function)
    • 処理の流れ:
      1. フロントエンドから https://.../exportData?format=csv のようなURLでアクセス。
      2. (ここからCloud Function内の処理)
      3. 関数内でユーザー認証情報を確認し、権限をチェック。
      4. 指定されたユーザーのtime_logsをFirestoreから取得。
      5. データを集計・加工する。(例: タスクごとの合計時間を計算)
      6. CSVまたはJSON形式の文字列に変換する。
      7. HTTPレスポンスとしてファイル(export.csvなど)を返す。

3. まとめ:従来構成との違いとメリット

項目従来構成Firebase構成 (シンプル案)
サーバー常時稼働するサーバーが必要不要(サーバーレス)
インフラ管理サーバーの監視、OSアップデート等不要(Firebaseに任せる)
認証機能自前でセキュアに実装Firebase Authenticationで簡単実装
DB管理DBのインストール、バックアップ等不要(Firestoreに任せる)
リアルタイム性追加実装が必要Firestoreが標準で得意(UIに即時反映が可能)
スケーラビリティ事前のサーバー設計が必要自動でスケール(アクセス増に強い)
コストサーバーの固定費従量課金制(無料枠が大きく、小規模なら無料の範囲で収まる可能性も)

結論

Firebaseを採用することで、インフラの構築・管理という専門的で時間のかかる作業を大幅にショートカットできます。特に、「認証」「データベース」「サーバーレス関数」が一体となって提供されているため、フロントエンド開発に集中でき、より迅速にMVP(Minimum Viable Product: 実用最小限の製品)を開発することが可能になります。

今回のタイムスタディアプリの要件であれば、Firebaseはまさに最適な選択肢と言えるでしょう。

firebase、すごっ。。。で、結局ベースとなるのが基本です。とりあえず基本の勉強。。。です。も一度、Node.jsとフレームワークの基礎、学び直まぁ~す!

コメント