Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Google Apps Script(GAS)+スプレッドシートで動いていた N-PAS 勤怠管理システムを、 Cloudflare Workers + Cloudflare D1 に移したものです。 スタッフ用の画面は、今の見た目と操作をそのまま引き継いでいます(変わったのはログイン画面の PIN 入力欄の追加だけです)。
現在の状態
- 本番環境を Vercel に公開済み:https://npas-attendance.vercel.app/ (本物のデータ用。テスト用アカウントは無効)
- テスト環境(試用版):https://npas-attendance-trial.vercel.app/ (テスト用データのみ)
- どちらも開くには Vercel へのログインが必要(後述)。ログインは「名前を選ぶだけ」(AUTH_MODE=name)。
- 本番用の構成(Cloudflare Workers + D1)のコードも完成済み。Cloudflare への公開は、あなたのアカウントでの操作が必要です(4章)。
https://npas-attendance.vercel.app/admin.html を開き、「初期設定」で最初の管理者を作る(合言葉は別途お伝えしたもの)。毎日 3:00(日本時間)にデータベース全体を自動保存します(30日分)。管理画面から一覧・ダウンロード・復元ができます。
| 画面 | URL |
|---|---|
| スタッフ画面 | https://npas-attendance-trial.vercel.app/ |
| 管理画面 | https://npas-attendance-trial.vercel.app/admin.html |
| ボタン1つの動作確認 | https://npas-attendance-trial.vercel.app/selftest.html |
testadmin・test-password-1234)。platform/vercel/handler.mjs)。書き込みは「誰も更新していないときだけ保存」する条件付き書き込みで、同時に更新された場合は最新を読み直してやり直すため、取りこぼしや二重登録は起きません。main に送ると、自動で公開し直されます。設定 AUTH_MODE で切り替えます。name=名前を選ぶだけ(旧システムと同じ。現在の設定)、pin=名前+PIN。
名前を選ぶだけの方式は本人確認ではありません(誰でも他人の名前で打刻・申請できます)。操作はすべて操作履歴に残り、記録の変更・削除は管理者の承認が必要です。
スタッフ画面の「打刻修正」で記録を選び、「修正理由」に理由を書いて「この記録の削除を申請する」。管理者が「修正・削除申請」で承認すると削除され、削除前の内容は操作履歴に残ります。
| 部分 | 使う技術 | 役割 |
|---|---|---|
| 画面 | Workers の静的アセット(public/) | HTML・画像・JavaScript を世界中の拠点から配信 |
| サーバー処理 | Cloudflare Workers(src/) | 勤怠の保存・取得・認証などの API |
| データベース | Cloudflare D1(SQLite) | スタッフ・勤怠・申請・履歴を保存 |
選んだ理由(指示書の選定基準に沿って比較しました)
検討して選ばなかったもの:スプレッドシートをそのまま DB として使い続ける(指示書で禁止・遅さの原因)、Supabase など別の DB サービス(Workers と組み合わせると設定と費用が増える)、Durable Objects(D1 で足りるため)。
public/index.html)は、旧 Index.html を機械的に変換して作りました(変換スクリプト:tools/convert-original-html.py)。| 旧(GAS の関数) | 新(API) | 主な改善 |
|---|---|---|
listStaff | GET /api/staff | — |
| (なし) | POST /api/login | PIN による本人確認を追加 |
clockStatus | GET /api/clock/status | — |
clockIn | POST /api/clock/in | 二重出勤を DB の一意制約で防止 |
clockOut | POST /api/clock/out | 保存と出勤解除を1つのトランザクションで。再送しても二重登録しない |
saveAttendance | POST /api/attendance | 再送しても二重登録しない |
getHistory | GET /api/history | 全件読み込み → この人・この月だけをインデックスで取得 |
npasSaveBulkAttendance | POST /api/bulk | 重複チェックと登録を1つのSQL文で(同時実行でも重複しない) |
npasSubmitCorrection | POST /api/corrections | 「申請中は1記録1件」を DB が保証 |
npasUpdateSummaryNow など | (不要) | 集計表を保存せず、表示のたびに元データから計算(下記) |
| 月別集計シート・個人別シート | 管理画面 | 管理者用の新しい画面(もともと画面がなかったため新規) |
| 打刻修正の承認(シートを手で直す) | 管理画面の「承認」ボタン | 変更前・変更後を操作履歴に自動記録 |
月別集計の考え方:旧版は「保存 → 別の通信で集計シートを更新」でした。新版は集計表を持たず、表示するときに元の勤怠記録から計算します。インデックスのおかげで1か月・100人分でも数ミリ秒です。これで「保存は成功したが集計が古い」「集計の失敗で保存が失敗扱いになる」ということが起きなくなりました。画面側の集計更新の呼び出しは、通信せずに成功を返すようにしています(見た目と動きはそのまま)。
勤怠計算のルールは旧版と完全に同じです(日付・時刻の形式、翌日退勤、休憩 0〜1439分、小数第2位の丸め、手当の上限100万円、業務内容200文字、24時間以上の打刻は管理者へ連絡)。エラーメッセージも同じ文言です。 ただし 業務内容は必須 です(2026-10-29 変更)。スタッフの勤怠申請・一括申請・修正申請・退勤打刻で空欄だと「業務内容を入力してください」と表示して保存しません。管理者による記録の追加・修正と、旧データの移行では空欄も受け付けます。
Cloudflare のアカウントがなくても、パソコン上で動かして確認できます(ローカル模擬環境。本物の Cloudflare ではありません)。
npm start
テスト用アカウント(ローカルとテスト環境だけ。本番では使えません)
| 画面 | 入力するもの |
|---|---|
| スタッフ画面 | 学年「1年生」→ 名前「テスト 一郎」→ PIN 1234 |
| 管理画面 | ログインID testadmin / パスワード test-password-1234 |
データは .local/dev.sqlite に保存されます。最初からやり直したいときは、このファイルを削除してから npm start してください。止めるときはターミナルで Ctrl + C を押します。
This is the beginning of the README. Read the rest at the original. Read the full README ↗