← Worksへ戻る

No.006 / Apps / —

ShiftScanner — シフト表を勤務予定へ変えるiOSアプリ

画像やPDF・Excelのシフト表を取り込み、確認・修正、Appleカレンダー連携、給与見込みまでを一つにつなぐiOSアプリ。

ShiftScannerのライトモード用アプリアイコン
ShiftScannerのライトモード用アプリアイコン
ShiftScanner — シフト表を勤務予定へ変えるiOSアプリ App Icon

Project facts

Role
iOSアプリ/解析・給与バックエンド
Deliverable
iOSアプリ / シフト表解析API / 給与計算API / UI/UXデザイン
Industry
シフト・給与管理
Capability
iOSアプリ開発 / バックエンド開発 / API設計 / データモデリング / UX設計 / UI設計
Technology
SwiftUI / EventKit / Gemini API / Express / Swift / iOS / JavaScript / Node.js / Python / Adobe PDF Services / PostgreSQL / AJV / Sharp / SheetJS / UIKit / PDFKit / Combine / Swift Testing
Audience
紙・画像・PDF・Excel・CSVで勤務シフトを受け取るアルバイト・パート従業員 / 深夜・曜日・交通費などを含む給与見込みを事前に確認したい利用者 / 勤務予定と個人予定をAppleカレンダーでまとめて確認したいiPhone利用者

課題

勤務先ごとに形式が異なるシフト表は予定の転記と勤務時間の集計に手間がかかり、深夜・曜日・交通費などの条件が重なると、給与見込みの把握や個人予定との照合も複雑になる。

解決策

画像やファイルからシフト表を取り込み、AI・OCRで勤務予定へ構造化する。利用者が結果を日付ごとに確認・修正したうえで端末へ保存し、Appleカレンダー同期と給与条件を組み合わせた期間別の見込み確認までを一続きのiOS体験へまとめた。

主要機能・工夫

  • 複数形式のシフト取り込み

    カメラ、写真、PDF、CSV、Excelからシフト表を取り込む。

  • AI・OCRによる構造化

    ファイル変換、画像処理、AI解析を組み合わせて日付と勤務時刻へ整理する。

  • 解析結果の確認・編集

    自動抽出した日付と時刻を確認し、編集や削除を行ってから保存する。

  • 処理状態とキャンセル

    解析中の進捗と注意事項を示し、必要に応じて処理を中止できるようにする。

  • Appleカレンダー差分同期

    勤務先別カレンダーへアプリが管理する予定だけを差分反映する。

  • アプリ内保存と外部同期の分離

    カレンダー同期に失敗しても確認済み勤務予定の端末保存を成立させる。

  • 手当を含む給与見込み

    休憩、深夜、曜日・特定日、交通費、時給・日給をルールとして計算する。

  • 給与計算API

    単一シフト、期間、一括計算と給与条件プロファイルをAPIとして扱う。

  • APIキーと機能フラグ

    加入者ごとの認証、利用可能機能、プラン、使用量を管理する。

  • 解析経路のフォールバック

    解析結果が得られない場合に別経路やPDFの画像化へ切り替える。

  • 日本語・英語の表示資源

    主要な画面文言とアプリ情報に日本語・英語の表示資源を用意する。

  • アクセシビリティ補助

    主要操作へ音声読み上げ用のラベルやヒントを設定する。

成果・変化

  • 取り込みから確認・保存までの操作経路を実装

    複数形式の入力、解析中表示、日付単位の確認・編集、端末保存を一続きの画面へまとめた。

  • 給与条件を独立した計算ルールとして実装

    休憩、深夜、曜日・特定日、交通費、時給・日給、日跨ぎを個別の条件として扱えるようにした。

  • アプリ内保存とカレンダー同期を分離

    外部カレンダー連携に失敗した場合も、確認済みの勤務予定を端末へ保存できる構成にした。

  • 給与APIのアクセス境界を実装

    APIキー、機能フラグ、加入者状態、プラン、利用量を組み合わせたアクセス制御を構成した。

届いたシフト表を、確認できる勤務予定へ

形態
Native iOS Application
入力
Image / PDF / CSV / Excel
連携
AI Analysis / Apple Calendar / Payroll API
確認状態
Implementation Reviewed / Distribution Unconfirmed

シフトの転記・予定調整・給与確認を一つに

勤務先ごとに形式が異なるシフト表は、紙や画像、表計算ファイルから個人の勤務予定を転記する手間が発生します。深夜、曜日、特定日、休憩、交通費などの条件が重なると、給与見込みの計算と個人予定との照合も複雑になります。

ShiftScannerはシフト表を勤務予定のデータへ変換し、利用者が内容を確認・修正してから端末へ保存します。必要に応じてAppleカレンダーへ同期し、勤務先ごとの条件を組み合わせた給与見込みまで確認できます。

主な体験

  • カメラ・写真・PDF・CSV・Excelからシフト表を取り込む
  • 対象人物、対象年、除外条件を指定して解析する
  • 処理中の進捗を確認し、必要に応じてキャンセルする
  • 抽出された勤務予定を日付ごとに確認・編集する
  • 確認済みの予定をアプリ内へ保存する
  • 勤務先別のAppleカレンダーへ差分同期する
  • 手動で勤務予定を追加する
  • 勤務条件を設定して期間別の給与見込みを確認する

自動抽出を、そのまま確定しない

利用者は入力ファイルと対象人物を指定して解析を開始します。処理中は進捗と注意事項、キャンセル操作を表示し、完了後は抽出された勤務予定をカレンダー形式で確認できます。

解析結果は最終データではなく確認用の下書きとして扱い、日付ごとの時刻を編集し、不要な予定を削除してから保存します。自動化と人による最終確認を同じ操作経路へ組み込んでいます。

ファイル変換・画像処理・AI解析を段階化

バックエンドはNode.jsとExpressで構成し、PDFやExcel、CSVを共通の表データへ変換したうえで、決定的な前処理とAIによる構造化を組み合わせます。

画像入力には解像度、傾き、コントラスト、表領域を考慮する複数の処理候補があり、構造化後は日付・時刻形式の検証、重複除去、補正を行います。解析精度を示す未検証の数値は使用しません。

失敗を前提に解析経路を切り替える

通信エラーや解析結果が得られない場合に備え、別の解析経路やPDFページの画像化へ切り替えるフォールバックを実装しています。

複数のOCR・画像処理候補がコードと設定に含まれますが、すべての経路が現在の配置で安定稼働することは確認していません。公開内容では、複数経路の実装と現在の検証境界を分けて扱います。

Appleカレンダーへ差分だけを同期

勤務先ごとにカレンダーを取得または作成し、既存イベントとの差分を計算して勤務予定を作成・更新・削除します。日をまたぐ勤務時刻にも対応します。

アプリが作成したイベントを識別して処理対象を絞り、通常の差分同期では利用者が既に持つ予定を保護します。カレンダー権限はOS世代ごとのAPI差異を考慮しています。

勤務条件を分けて給与見込みを計算

給与条件は時給・日給、勤務時間に応じた休憩、深夜帯、曜日・特定日の手当、交通費と上限に分けて管理します。

勤務が深夜帯や翌日にまたがる場合も、時間帯の重なりを計算して期間別の集計へ反映します。法制度や年度に依存する具体的な基準額は公開説明へ固定しません。

給与計算をAPIとして分離

給与計算は単一シフト、期間集計、一括処理のAPIとしても実装し、給与条件をプロファイルとして扱います。

加入者ごとのAPIキー、機能フラグ、プラン、月次利用量を管理し、利用可能な機能と使用量の境界をデータモデルと認証処理へ反映しています。本番DB接続、負荷試験、監視の成立は確認していません。

端末保存と外部処理の境界を明示

勤務先設定と確認済みシフトは主に端末側へ保存します。一方、シフト解析や給与APIを利用する際は、処理に必要な人物指定、シフト表、勤務条件をサーバーへ送信する構成です。

公開・運用時には、送信対象、第三者処理、保持期間、削除方法を実際の設定と照合して案内する必要があります。端末保存データについて、確認できていない暗号化を保証しません。

外部同期に失敗しても端末保存を残す

確認済みの勤務予定はアプリ内保存を先に成立させ、カレンダー権限がない場合や同期に失敗した場合は、同期エラーだけを利用者へ知らせます。

解析、確認、端末保存、外部同期の責務を分けることで、一部の外部連携が失敗しても確認済みデータを失わない操作設計にしています。

状態の分かるUIとアクセシビリティ

初期設定、ダッシュボード、シフト分析、カレンダー、給与計算、設定をSwiftUIで構成し、色、文字、余白、ボタン状態を共通の視覚ルールへまとめています。

主要な画像選択、カレンダー操作、閉じる操作には音声読み上げ用のラベルやヒントを設定し、日本語・英語の表示資源も用意しています。一部の固定文言が残るため、完全な多言語・アクセシビリティ対応とは扱いません。

テスト資産と今回の検証範囲

給与計算には通常勤務、休憩、深夜、手当、日給、日跨ぎ勤務のテストケースがあり、シフト抽出には初期状態、キャンセル、サイズ制限、読込失敗を対象とするテストソースがあります。

今回の調査ではiOSアプリのビルドとSwiftテストを実行していないため、テストケースの存在と実行成功を分けて記載します。App Storeの配布状態も確認していません。

現在の実装境界

複数勤務先を想定したモデルと画面はありますが、永続化には単一勤務先を前提とする箇所が残ります。データの入出力と解析履歴からの再同期にも、画面または下地のみの機能が含まれます。

給与APIの本番接続・負荷試験・監視と、複数のOCR経路の実行配置は未確認です。実装済みのコード、検証済みの動作、本番運用の成立をそれぞれ分けて扱います。

異なる入力を一つの勤務予定へ収束させる

入力形式、表レイアウト、対象人物の特定、日跨ぎ時刻、複数の給与条件、カレンダー重複という異なる問題を、一貫した勤務予定データへ収束させる点が中心的な技術課題です。

自動抽出を確認可能な下書きとして扱い、端末保存と外部同期を分離し、給与条件を独立したルールにすることで、不確実な解析結果をそのまま確定データにしない構成へ整理しています。