保育士の妻と遊びがてら、gemini に質問しながら作ってみた。
1. geminiにざっくり質問
質問
保育士シフト作成アプリの要件定義を、より詳細かつ網羅的に記述してください。考慮すべき点も追加してください。
回答
保育士シフト作成アプリの要件定義(詳細版)
1. 機能要件
職員管理: 職員の登録・編集・削除:氏名、生年月日、住所(任意)、電話番号、メールアドレス、資格(保育士、幼稚園教諭など、複数資格対応)、雇用形態、雇用期間、写真(任意)、備考欄、パスワード設定(セキュリティ考慮)
職員の属性管理:スキル(ピアノ、絵画、英語など、複数スキル対応、レベル設定)、経験年数、得意分野、苦手分野、希望休設定(事前登録、個別設定、繰り返し設定)、アレルギー情報、その他必要な情報
職員のシフト状況確認:個々の職員のシフト状況をカレンダー表示、一覧表示
職員の休暇管理:有給休暇、慶弔休暇、育児休暇、介護休暇などの申請、承認、管理機能。残日数の表示。
非常勤職員のシフト調整:非常勤職員の勤務時間、曜日、希望などを考慮したシフト作成機能。
シフト作成機能:
シフト作成期間指定:月単位、週単位、日単位でのシフト作成。
勤務時間帯設定:複数時間帯の設定、休憩時間の考慮、早番・遅番の設定...
2. 妻に聞きながら要件を絞る。
- 職員管理:
- 職員の登録・編集・削除:氏名、経験年数、勤務可能時間(曜日毎)、担当クラス、好ましい時間希望(早番の方が遅番より好き)
- 職員の休暇希望の登録・編集・削除
- 園児管理:
- 園児の登録・編集・削除:氏名、クラス名、保育時間(曜日毎)
シフト作成機能:
- シフト作成期間は月単位。
- 勤務時間帯設定:複数時間帯の設定、休憩時間の考慮、早番・遅番の設定。
- 職員配置:職員の経験年数、担当クラス、希望などを考慮した自動配置機能。手動配置も可能。
- 人員配置基準設定:園児数に応じた時間毎の人員配置基準を設定し、それに基づいた自動提案。
3. gemini にデータベース設計を依頼
Prisma使おうと思うのでその旨も記載。
質問
保育士シフト作成アプリの要件を以下に列挙します。
この要件を実現するために必要な、データベース設計を提案してください。 シフト情報との関連性も考慮してください。
=========
2で整理した要件を記載。
=========
データ型は、Prismaがサポートする型を使用してください。 リレーションシップは適切に定義してください。 可能な限り、効率的で保守性の高いスキーマになるように設計してください。 出力は、Prisma Schema言語 (.prisma) で記述されたファイルの内容として出力してください。
回答
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql" // または MySQL, SQLite など。環境に合わせて変更してください。
url = env("DATABASE_URL")
}
model Staff {
id Int @id @default(autoincrement())
name String
experienceYears Int
preferredShift String? // 例: "early", "late", "neutral"
assignedClasses String? // クラス名、複数クラスの場合はコンマ区切りなど
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
workAvailability WorkAvailability[]
vacationRequests VacationRequest[]
shifts Shift[]
}
model Child {
id Int @id @default(autoincrement())
name String
className String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
careTimes CareTime[]
}
model WorkAvailability {
id Int @id @default(autoincrement())
staffId Int @unique
staff Staff @relation(fields: [staffId], references: [id])
dayOfWeek String // 例: "Monday", "Tuesday" ...
startTime Time?
endTime Time?
}
model VacationRequest {
id Int @id @default(autoincrement())
staffId Int
staff Staff @relation(fields: [staffId], references: [id])
startDate DateTime
endDate DateTime
status String // 例: "pending", "approved", "rejected"
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Shift {
id Int @id @default(autoincrement())
date DateTime
startTime Time
endTime Time
staffId Int
staff Staff @relation(fields: [staffId], references: [id])
room String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model CareTime {
id Int @id @default(autoincrement())
childId Int
child Child @relation(fields: [childId], references: [id])
dayOfWeek String
startTime Time
endTime Time
}
model StaffingStandard {
id Int @id @default(autoincrement())
numberOfChildren Int
timeOfDay String // 例: "morning", "afternoon"
requiredStaff Int
}
説明:
Staff モデル: 保育士の情報。preferredShift は好ましいシフトを表し、assignedClasses は担当クラスを格納します。workAvailability は勤務可能時間を曜日ごとに保持する関連モデルです。
Child モデル: 園児の情報。careTimes は保育時間を曜日ごとに保持する関連モデルです。
WorkAvailability モデル: 職員の勤務可能時間を曜日ごとに記録します。Staff モデルと One-to-many の関係です。
VacationRequest モデル: 休暇申請の情報。Staff モデルと One-to-many の関係です。
Shift モデル: シフト情報。Staff モデルと One-to-many の関係です。room は保育室などを表します。
CareTime モデル: 園児の保育時間を曜日ごとに記録します。Child モデルと One-to-many の関係です。
StaffingStandard モデル: 園児数に応じた時間毎の人員配置基準を設定します。
4. gemini にデータベース設計の修正を依頼
質問(実際は何回かに分けて質問しました。)
Class モデルを別テーブルにしてください。その時に、Classはわかりづらいので、名前を変えてください。
また、StaffingStandardモデルの時間は、15分単位で表現してください。こちらも別テーブルで管理できるようにしてください。
さらに、Shiftに関して、今startTimeとendTimeで定義していますが、これを他のテーブルに抜き出して、例えばシフトA1、A2、B1、B2 のように名前をつけて再利用できるようにしたいです。
最終回答
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql" // 環境に合わせて変更してください
url = env("DATABASE_URL")
}
// 職員テーブル: 保育園や幼稚園で働く職員に関する情報を管理します。
model Staff {
id String @id @default(uuid()) @db.Uuid
name String
experienceYears Int
preferredShift String? // 例: "early", "late", "neutral"
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
workAvailability WorkAvailability[]
vacationRequests VacationRequest[]
shifts Shift[]
assignedClassrooms Classroom[] @relation("StaffClassroom")
}
// 園児テーブル: 保育園や幼稚園に通う園児に関する情報を管理します。
model Child {
id String @id @default(uuid()) @db.Uuid
name String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
careTimes CareTime[]
classroom Classroom @relation(fields: [classroomId], references: [id])
classroomId String? @db.Uuid
}
// 職員の勤務可能時間帯テーブル: 職員が勤務可能な曜日と時間帯を管理します。
model WorkAvailability {
id String @id @default(uuid()) @db.Uuid
staffId String @unique
staff Staff @relation(fields: [staffId], references: [id])
dayOfWeek String // 例: "Monday", "Tuesday" ...
startTime Time?
endTime Time?
}
// 職員の休暇申請テーブル: 職員の休暇申請に関する情報を管理します。
model VacationRequest {
id String @id @default(uuid()) @db.Uuid
staffId String
staff Staff @relation(fields: [staffId], references: [id])
startDate DateTime
endDate DateTime
status String // 例: "pending", "approved", "rejected"
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
// シフトテーブル: 職員の勤務シフトに関する情報を管理します。
model Shift {
id String @id @default(uuid()) @db.Uuid
date DateTime
staffId String
staff Staff @relation(fields: [staffId], references: [id])
room String?
shiftPatternId String
shiftPattern ShiftPattern @relation(fields: [shiftPatternId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
// 園児の保育時間テーブル: 園児の保育時間に関する情報を管理します。
model CareTime {
id String @id @default(uuid()) @db.Uuid
childId String
child Child @relation(fields: [childId], references: [id])
dayOfWeek String
startTime Time
endTime Time
}
// 教室テーブル: 教室に関する情報を管理します。
model Classroom {
id String @id @default(uuid()) @db.Uuid
name String @unique
children Child[]
staff Staff[] @relation("StaffClassroom")
}
// 職員配置基準テーブル: 園児数に応じて必要な職員数を管理します。
model StaffingStandard {
id String @id @default(uuid()) @db.Uuid
numberOfChildren Int
timeOfDayId String
requiredStaff Int
timeOfDay TimeOfDay @relation(fields: [timeOfDayId], references: [id])
}
// 時間帯テーブル: シフト作成で使用する時間帯を定義します。
model TimeOfDay {
id String @id @default(uuid()) @db.Uuid
startTime Time
endTime Time
}
// シフトパターンテーブル: 勤務時間のパターンを定義し、シフト作成で再利用します。
model ShiftPattern {
id String @id @default(uuid()) @db.Uuid
name String @unique // 例: "A1", "A2", "B1"
startTime Time
endTime Time
shifts Shift[]
}
5. gemini にサンプルデータの作成を指示。
質問
このDB設計に合わせてサンプルデータを作成してください。
そして、あなたにシフトを作成の依頼をするために必要な入力形式を考え、それに合わせて出力してください。
回答
サンプルデータ
まずは、データベースの各テーブルに挿入するサンプルデータです。 UUIDはダミーデータとして生成しています。 実際の運用では、UUIDを生成する適切な方法を用いてください。
[
// Staff
{
"id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"name": "山田 花子",
"experienceYears": 5,
"preferredShift": "early",
"createdAt": "2024-01-01T12:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z"
},
{
"id": "f0e9d8c7-b6a5-4321-9876-543210fedcba",
"name": "鈴木一郎",
"experienceYears": 2,
"preferredShift": "late",
"createdAt": "2024-01-01T12:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z"
},
// ... more Staff data ...
// Child
{
"id": "11223344-5566-7788-9900-aabbccddeeff",
"name": "田中太郎",
"createdAt": "2024-01-01T12:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z",
"classroomId": "cccddd-eee-fff-ggg-hhhiijjkklll"
},
// ... more Child data ...
// Classroom
{
"id": "cccddd-eee-fff-ggg-hhhiijjkklll",
"name": "ひよこ組"
},
// ... more Classroom data ...
// ShiftPattern
{
"id": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx",
"name": "A1",
"startTime": "08:00",
"endTime": "17:00"
},
// ... more ShiftPattern data ...
// ... other tables ...
]
このデータは、Staff、Child、Classroom、ShiftPatternテーブルのサンプルデータです。 WorkAvailability、VacationRequest、CareTime、Shift、StaffingStandard、TimeOfDay テーブルのデータは、必要に応じて作成してください。
シフト作成依頼のための入力形式と出力例
シフト作成を依頼するために必要な入力は、JSON形式で以下のように記述します。
{
"date": "2024-02-01", // シフト作成日
"classroomIds": ["cccddd-eee-fff-ggg-hhhiijjkklll", "xxxxxxx-yyy-zzz-111-222222222222"], // 対象の教室のIDリスト
"shiftPatternIds": ["pppppp-qqq-rrr-sss-tttuuvvvwwwwx"], // 使用するシフトパターンのIDリスト
"staffIds": ["a1b2c3d4-e5f6-7890-1234-567890abcdef", "f0e9d8c7-b6a5-4321-9876-543210fedcba"], // 使用可能な職員のIDリスト
"staffingStandards": [ // 人員配置基準
{
"numberOfChildren": 10,
"timeOfDayId": "time-id-1" // 午前中の時間帯ID
},
{
"numberOfChildren": 15,
"timeOfDayId": "time-id-2" // 午後の時間帯ID
}
// ... more staffingStandards
]
}
この入力に基づいて、シフト作成アプリはシフトを作成します。出力は、以下のJSON形式で返します。
{
"shifts": [
{
"date": "2024-02-01",
"startTime": "08:00",
"endTime": "17:00",
"staffId": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"classroomId": "cccddd-eee-fff-ggg-hhhiijjkklll",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
},
{
"date": "2024-02-01",
"startTime": "08:00",
"endTime": "17:00",
"staffId": "f0e9d8c7-b6a5-4321-9876-543210fedcba",
"classroomId": "xxxxxxx-yyy-zzz-111-222222222222",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
}
// ... more shifts ...
]
}
この出力は、作成されたシフトのリストです。 各シフトには、日付、開始時間、終了時間、担当職員ID、教室ID、シフトパターンIDが含まれています。
この入力形式と出力形式は、あくまでも例です。 実際のアプリでは、さらに詳細な情報が必要になったり、出力形式が変更される可能性があります。 また、エラー処理なども考慮する必要があります。
5. 入力と出力を整理して、プロンプトを考える。
流れとしては、
1. 子供の人数を元に、シフトパターン毎に必要な人数を計算する。
2. その日出勤する職員の情報(勤務時間、希望の時間帯、経験年数)を取得する。
3. その日にどの職員がどのシフトパターンで出勤するか確定する。
出力形式は以下がよさそう。
{
"shifts": [
{
"date": "2024-02-01",
"staffId": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
},
{
"date": "2024-02-01",
"staffId": "f0e9d8c7-b6a5-4321-9876-543210fedcba",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
}
// ... more shifts ...
]
}
質問
以下のようにあなたに計算していただくために、必要なinputの形式と、その形式に則ったデモデータをください。
shiftPatternsは3つ準備してください。
また、希望時間帯の考慮もしてください。
1. 子供の人数を元に、シフトパターン毎に必要な人数を計算する。
2. その日出勤する職員の情報(勤務時間、希望の時間帯、経験年数)を取得する。
3. その日にどの職員がどのシフトパターンで出勤するか確定する。
出力形式
===
{
"shifts": [
{
"date": "2024-02-01",
"staffId": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
},
{
"date": "2024-02-01",
"staffId": "f0e9d8c7-b6a5-4321-9876-543210fedcba",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
}
// ... more shifts ...
]
}
===
結果のデモデータ
[
{
"date": "2024-03-08",
"classroom": { "id": "classroom-a", "numberOfChildren": 20 },
"staffingStandard": { "morning": { "numberOfChildren": 10, "requiredStaff": 2 }, "afternoon": { "numberOfChildren": 15, "requiredStaff": 3 } },
"availableStaff": [
// 勤務可能時間と希望時間帯を組み合わせたデータ
{ "id": "staff-1", "experienceYears": 5, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-2", "experienceYears": 2, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-3", "experienceYears": 3, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-4", "experienceYears": 1, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-5", "experienceYears": 4, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-6", "experienceYears": 6, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-7", "experienceYears": 2, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-8", "experienceYears": 3, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-9", "experienceYears": 1, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-10", "experienceYears": 4, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] }
],
"shiftPatterns": [
{ "id": "pattern-a", "name": "午前", "startTime": "08:00", "endTime": "12:00" },
{ "id": "pattern-b", "name": "午後", "startTime": "12:00", "endTime": "17:00" },
{ "id": "pattern-c", "name": "一日", "startTime": "08:00", "endTime": "17:00" }
]
}
]
7. デモデータで実際に完成したプロンプトを試してみる。
質問
以下の計算をして、1日の保育園で勤務する人員のシフトを調整してください。
1. 子供の人数を元に、シフトパターン毎に必要な人数を計算する。
2. その日出勤する職員の情報(勤務時間、希望の時間帯、経験年数)を取得する。
3. その日にどの職員がどのシフトパターンで出勤するか確定する。
入力情報
===
{
"date": "2024-03-08",
"classroom": { "id": "classroom-a", "numberOfChildren": 20 },
"staffingStandard": { "morning": { "numberOfChildren": 10, "requiredStaff": 2 }, "afternoon": { "numberOfChildren": 15, "requiredStaff": 3 } },
"availableStaff": [
{ "id": "staff-1", "experienceYears": 5, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-2", "experienceYears": 2, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-3", "experienceYears": 3, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-4", "experienceYears": 1, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-5", "experienceYears": 4, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-6", "experienceYears": 6, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-7", "experienceYears": 2, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-8", "experienceYears": 3, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-9", "experienceYears": 1, "preferredShift": "morning", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] },
{ "id": "staff-10", "experienceYears": 4, "preferredShift": "afternoon", "workAvailability": [{ "dayOfWeek": "Friday", "startTime": "08:00", "endTime": "17:00" }] }
],
"shiftPatterns": [
{ "id": "pattern-a", "name": "午前", "startTime": "08:00", "endTime": "12:00" },
{ "id": "pattern-b", "name": "午後", "startTime": "12:00", "endTime": "17:00" },
{ "id": "pattern-c", "name": "一日", "startTime": "08:00", "endTime": "17:00" }
]
}
===
出力形式は以下でお願いします。
===
{
"shifts": [
{
"date": "2024-02-01",
"staffId": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
},
{
"date": "2024-02-01",
"staffId": "f0e9d8c7-b6a5-4321-9876-543210fedcba",
"shiftPatternId": "pppppp-qqq-rrr-sss-tttuuvvvwwwwx"
}
// ... more shifts ...
]
}
===
回答
与えられた入力データに基づいて、シフトを割り当てます。 このアルゴリズムは、単純な優先順位付けに基づいており、最適化は行っていません。 より高度なアルゴリズムが必要な場合は、追加のロジックを実装する必要があります。
**シフト割り当てアルゴリズム:**
1. **必要人数の計算:** 園児数に基づいて、午前と午後の必要人数を計算します。
2. **希望時間帯優先:** 希望時間帯に合う職員を優先的に割り当てます。
3. **残りの職員の割り当て:** 希望時間帯に合う職員が不足している場合は、残りの職員を割り当てます。
4. **一日勤務の職員:** 午前と午後の両方で人員が不足している場合、一日勤務のシフトパターンを割り当てます。
5. **人員不足のチェック:** 必要人数を満たせていない場合はエラーを返します。
**出力:**
json
{
"shifts": [
{
"date": "2024-03-08",
"staffId": "staff-1",
"shiftPatternId": "pattern-a"
},
{
"date": "2024-03-08",
"staffId": "staff-3",
"shiftPatternId": "pattern-a"
},
{
"date": "2024-03-08",
"staffId": "staff-2",
"shiftPatternId": "pattern-b"
},
{
"date": "2024-03-08",
"staffId": "staff-4",
"shiftPatternId": "pattern-b"
},
{
"date": "2024-03-08",
"staffId": "staff-6",
"shiftPatternId": "pattern-b"
},
{
"date": "2024-03-08",
"staffId": "staff-5",
"shiftPatternId": "pattern-c"
}
]
}
**アルゴリズムの改善点:**
* **希望時間帯の柔軟な対応:** 希望時間帯以外も考慮する仕組みを追加する。 例えば、希望時間帯以外のシフトに割り当てる際のペナルティを設ける。
* **経験年数の考慮:** 経験年数の長い職員を優先的に割り当てる。
* **職員のスキル考慮:** 職員のスキル(ピアノ、英語など)を考慮した人員配置を行う。
* **休暇の考慮:** 職員の休暇情報を考慮する。
* **最適化アルゴリズムの導入:** より高度な最適化アルゴリズム(制約充足問題ソルバーなど)を用いることで、より効率的で公平なシフトを作成する。
* **エラー処理:** 人員不足などのエラーを適切に処理する。
* **複数教室への対応:** 複数教室を同時に考慮したシフト作成を行う。
この例では、単純なアルゴリズムでシフトを割り当てています。 より複雑な要件や、最適化されたシフト作成を行うためには、より高度なアルゴリズムとデータ構造が必要となります。 特に、大規模な保育園や、複雑な条件下でのシフト作成を行う場合は、専門的な知識と技術が必要となる可能性があります。
この出力は、与えられた入力データと単純なアルゴリズムに基づいて作成されています。 より最適なシフトを作成するためには、より高度なアルゴリズムの導入が必要です。 また、このアルゴリズムは、人員が不足している場合にエラー処理を行っていません。 エラー処理を追加する必要があります。
感想
github copilotぐらいしかLLM触ったことない自分が、2時間ぐらいしかやってないけど、DB設計が荒削りだけどできてるから、あとはUI作ればしっかりしたデモができそう。(ここからの精度向上が難しそうだけど...)
やっぱりなんといっても、実際のシフト計算するところのロジックをLLMになんとなく生成してもらってるから、日本語でこう改善してほしいみたいな感じの相談を、保育士の妻と一緒にできて楽しかった。
聞いたところ、それぞれの園独自のルールみたいなのが結構あるっぽいので、それも園独自のプロンプトみたいな感じで表現できれば、Saasプロダクトでも適用できそう。
実際商品レベルにするにはUIをコドモン様レベルまで作り込まないといけないだろうから、将来はバックエンドとかより、UI側に人の力が必要になるのかな?
シフト管理 | 保育園・幼稚園・小学校など対応 | CoDMON(コドモン)