253 lines
7.6 KiB
Markdown
253 lines
7.6 KiB
Markdown
# Meal Planner for Elderly Care Homes
|
|
|
|
A digital meal ordering system for elderly care homes, built with Payload CMS 3.x and Next.js 15. This application digitizes the paper-based workflow where caregivers collect meal preferences from residents and kitchen staff prepare meals.
|
|
|
|
## Features
|
|
|
|
- **Multi-tenant architecture**: Each care home operates as a separate tenant with isolated data
|
|
- **Role-based access control**: Super-admin, tenant admin, caregiver, and kitchen staff roles
|
|
- **Meal order management**: Support for breakfast, lunch, and dinner with customizable options
|
|
- **Kitchen dashboard**: Aggregated ingredient reports for meal preparation
|
|
- **Tablet-friendly caregiver interface**: Touch-optimized UI for creating meal orders
|
|
- **Resident management**: Track dietary requirements, aversions, and special notes
|
|
|
|
## Tech Stack
|
|
|
|
- **Next.js 15** - React framework with App Router
|
|
- **Payload CMS 3.65** - Headless CMS with admin panel
|
|
- **SQLite** - Database (easily upgradeable to PostgreSQL)
|
|
- **TypeScript** - Type safety
|
|
- **SCSS** - Styling
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js 18+
|
|
- pnpm (recommended) or npm
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone <repository-url>
|
|
cd meal-planner
|
|
|
|
# Install dependencies
|
|
pnpm install
|
|
|
|
# Copy environment variables
|
|
cp .env.example .env
|
|
|
|
# Start development server with seeding
|
|
SEED_DB=true pnpm dev
|
|
```
|
|
|
|
The application will be available at `http://localhost:3000`.
|
|
|
|
### Default Users
|
|
|
|
The seed script creates the following users:
|
|
|
|
| Email | Password | Role | Access |
|
|
|------------------------|----------|-------------|-------------------------------------|
|
|
| admin@example.com | test | Super Admin | Full system access |
|
|
| caregiver@example.com | test | Caregiver | Create/view meal orders |
|
|
| kitchen@example.com | test | Kitchen | View orders, update status, reports |
|
|
|
|
## Application Structure
|
|
|
|
### URLs
|
|
|
|
- `/admin` - Payload CMS admin panel
|
|
- `/admin/kitchen-dashboard` - Kitchen ingredient report dashboard
|
|
- `/caregiver/login` - Caregiver login page
|
|
- `/caregiver/dashboard` - Caregiver main dashboard
|
|
- `/caregiver/orders/new` - Create new meal order
|
|
- `/caregiver/orders` - View meal orders
|
|
- `/caregiver/residents` - View residents list
|
|
|
|
## Data Model
|
|
|
|
### Collections
|
|
|
|
#### Tenants (Care Homes)
|
|
- `name` - Care home name
|
|
- `slug` - URL-friendly identifier
|
|
- `domain` - Optional custom domain
|
|
- `address` - Physical address
|
|
- `phone` - Contact phone
|
|
|
|
#### Users
|
|
Global roles:
|
|
- `super-admin` - Full system access
|
|
- `user` - Standard user (access based on tenant roles)
|
|
|
|
Tenant roles:
|
|
- `admin` - Full access within tenant
|
|
- `caregiver` - Create and manage meal orders
|
|
- `kitchen` - View orders, update status, generate reports
|
|
|
|
#### Residents
|
|
- `name` - Full name
|
|
- `room` - Room number
|
|
- `table` - Table assignment
|
|
- `station` - Ward/station
|
|
- `highCaloric` - High caloric diet flag
|
|
- `aversions` - Food aversions
|
|
- `notes` - Additional notes
|
|
- `active` - Active status
|
|
|
|
#### Meal Orders
|
|
Core fields:
|
|
- `resident` - Reference to resident
|
|
- `date` - Order date
|
|
- `mealType` - breakfast, lunch, or dinner
|
|
- `status` - pending, preparing, or prepared
|
|
- `createdBy` - User who created the order
|
|
|
|
Conditional meal options (based on mealType):
|
|
- **Breakfast**: Bread types, spreads, beverages, additions
|
|
- **Lunch**: Portion size, soup, dessert, special preparations
|
|
- **Dinner**: Bread, spreads, soup, beverages, additions
|
|
|
|
## Access Control Matrix
|
|
|
|
| Operation | Super Admin | Tenant Admin | Caregiver | Kitchen |
|
|
|-----------------|-------------|--------------|-------------------|--------------------|
|
|
| Manage users | All | Own tenant | No | No |
|
|
| Manage tenants | All | Own tenant | No | No |
|
|
| View residents | All | Own tenant | Own tenant | Own tenant |
|
|
| Manage residents| All | Own tenant | No | No |
|
|
| Create orders | All | Own tenant | Own tenant | No |
|
|
| View orders | All | Own tenant | Own tenant | Own tenant |
|
|
| Update orders | All | Own tenant | Own pending only | Status only |
|
|
| Delete orders | All | Own tenant | No | No |
|
|
| Kitchen reports | All | Own tenant | No | Own tenant |
|
|
|
|
## Kitchen Dashboard
|
|
|
|
The kitchen dashboard (`/admin/kitchen-dashboard`) provides:
|
|
|
|
1. Date and meal type selection
|
|
2. Aggregated ingredient counts for all orders
|
|
3. Portion size breakdown (for lunch)
|
|
4. Total order count
|
|
|
|
### API Endpoint
|
|
|
|
```
|
|
GET /api/meal-orders/kitchen-report?date=YYYY-MM-DD&mealType=breakfast|lunch|dinner
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"date": "2024-01-15",
|
|
"mealType": "breakfast",
|
|
"totalOrders": 45,
|
|
"ingredients": {
|
|
"breadRoll": 32,
|
|
"butter": 40,
|
|
"coffee": 38
|
|
},
|
|
"labels": {
|
|
"breadRoll": "Bread Roll (Brötchen)",
|
|
"butter": "Butter",
|
|
"coffee": "Coffee (Kaffee)"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Caregiver Interface
|
|
|
|
The tablet-optimized caregiver interface provides:
|
|
|
|
1. **Dashboard**: Today's order statistics and quick actions
|
|
2. **New Order Flow**:
|
|
- Step 1: Select date and meal type
|
|
- Step 2: Select resident
|
|
- Step 3: Configure meal options
|
|
- Step 4: Review and submit
|
|
3. **Orders List**: Filter by date and meal type
|
|
4. **Residents List**: Search and view dietary requirements
|
|
|
|
## Development
|
|
|
|
### Scripts
|
|
|
|
```bash
|
|
pnpm dev # Start development server
|
|
pnpm build # Build for production
|
|
pnpm start # Start production server
|
|
pnpm seed # Run database seed
|
|
pnpm generate:types # Generate TypeScript types
|
|
```
|
|
|
|
### Database
|
|
|
|
The application uses SQLite by default (`payload.db`). To migrate to PostgreSQL:
|
|
|
|
1. Install the PostgreSQL adapter: `pnpm add @payloadcms/db-postgres`
|
|
2. Update `payload.config.ts`:
|
|
```typescript
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
db: postgresAdapter({
|
|
pool: { connectionString: process.env.DATABASE_URI }
|
|
}),
|
|
```
|
|
3. Set `DATABASE_URI` in `.env`
|
|
|
|
### Environment Variables
|
|
|
|
```env
|
|
PAYLOAD_SECRET=your-secret-key-here
|
|
SEED_DB=true # Set to seed database on startup
|
|
```
|
|
|
|
## Domain-Based Tenant Selection
|
|
|
|
For domain-based tenant routing, add entries to `/etc/hosts`:
|
|
|
|
```
|
|
127.0.0.1 sunny-meadows.localhost
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
src/
|
|
├── access/ # Access control utilities
|
|
├── app/
|
|
│ ├── (app)/ # Caregiver frontend
|
|
│ │ ├── caregiver/
|
|
│ │ │ ├── login/ # Login page
|
|
│ │ │ ├── dashboard/ # Dashboard
|
|
│ │ │ ├── orders/ # Orders list and create
|
|
│ │ │ └── residents/ # Residents list
|
|
│ │ └── index.scss # Frontend styles
|
|
│ └── (payload)/ # Payload admin
|
|
│ └── admin/views/ # Custom admin views
|
|
├── collections/
|
|
│ ├── Tenants/ # Care homes
|
|
│ ├── Users/ # Users with roles
|
|
│ ├── Residents/ # Resident information
|
|
│ └── MealOrders/ # Meal orders
|
|
├── utilities/ # Helper functions
|
|
├── payload.config.ts # Payload configuration
|
|
└── seed.ts # Database seeding
|
|
```
|
|
|
|
## Seed Data
|
|
|
|
The seed script creates:
|
|
- 1 care home (Sunny Meadows Care Home)
|
|
- 3 users (admin, caregiver, kitchen)
|
|
- 8 residents with varied dietary requirements
|
|
- 24 meal orders across different dates and meal types
|
|
|
|
## License
|
|
|
|
MIT
|