diff --git a/CLAUDE.md b/CLAUDE.md index cc557f02..b9217b13 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -539,6 +539,216 @@ docker compose -f docker-compose.local.yml logs django --tail=100 curl -s "http://lvh.me:8000/api/resources/" | jq ``` +## Database Initialization & Seeding + +When resetting the database or setting up a fresh environment, follow these steps in order. + +### Step 1: Reset Database (if needed) + +```bash +cd /home/poduck/Desktop/smoothschedule/smoothschedule + +# Stop all containers and remove volumes (DESTRUCTIVE - removes all data) +docker compose -f docker-compose.local.yml down -v + +# Start services fresh +docker compose -f docker-compose.local.yml up -d +``` + +### Step 2: Create Activepieces Database + +The Activepieces service requires its own database: + +```bash +docker compose -f docker-compose.local.yml exec postgres psql -U FDuVLuQjfpYzGizTmaTavMcaimqpCMRM -d postgres -c "CREATE DATABASE activepieces;" +``` + +### Step 3: Initialize Activepieces Platform + +Create the initial Activepieces admin user (this auto-creates the platform): + +```bash +curl -s -X POST http://localhost:8090/api/v1/authentication/sign-up \ + -H "Content-Type: application/json" \ + -d '{"email":"admin@smoothschedule.com","password":"Admin123!","firstName":"Admin","lastName":"User","newsLetter":false,"trackEvents":false}' +``` + +**IMPORTANT:** Update `.envs/.local/.activepieces` with the returned IDs: +- `AP_PLATFORM_ID` - from the `platformId` field in response +- `AP_DEFAULT_PROJECT_ID` - from the `projectId` field in response + +Then restart containers to pick up new IDs: +```bash +docker compose -f docker-compose.local.yml restart activepieces django +``` + +### Step 4: Run Django Migrations + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py migrate +``` + +### Step 5: Seed Billing Catalog + +Creates subscription plans (free, starter, growth, pro, enterprise): + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py billing_seed_catalog +``` + +### Step 6: Seed Demo Data + +Run the reseed_demo command to create the demo tenant with sample data: + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py reseed_demo +``` + +This creates: +- **Tenant:** "Serenity Salon & Spa" (subdomain: `demo`) +- **Pro subscription** with pink theme branding +- **Staff:** 6 stylists/therapists with salon/spa themed names +- **Services:** 12 salon/spa services (haircuts, coloring, massages, facials, etc.) +- **Resources:** 4 treatment rooms +- **Customers:** 20 sample customers +- **Appointments:** 100 appointments respecting business hours (9am-5pm Mon-Fri) + +### Step 7: Create Platform Test Users + +The DevQuickLogin component expects these users with password `test123`: + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py shell -c " +from smoothschedule.identity.users.models import User + +# Platform users (public schema) +users_data = [ + ('superuser@platform.com', 'Super User', 'superuser', True, True), + ('manager@platform.com', 'Platform Manager', 'platform_manager', True, False), + ('sales@platform.com', 'Sales Rep', 'platform_sales', True, False), + ('support@platform.com', 'Support Agent', 'platform_support', True, False), +] + +for email, name, role, is_staff, is_superuser in users_data: + user, created = User.objects.get_or_create( + email=email, + defaults={ + 'username': email, + 'name': name, + 'role': role, + 'is_staff': is_staff, + 'is_superuser': is_superuser, + 'is_active': True, + } + ) + if created: + user.set_password('test123') + user.save() + print(f'Created: {email}') + else: + print(f'Exists: {email}') +" +``` + +### Step 8: Seed Automation Templates + +Seeds 8 automation templates to the Activepieces template gallery: + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py seed_automation_templates +``` + +Templates created: +- Appointment Confirmation Email +- SMS Appointment Reminder +- Staff Notification - New Booking +- Cancellation Confirmation Email +- Thank You + Google Review Request +- Win-back Email Campaign +- Google Calendar Sync +- Webhook Notification + +### Step 9: Provision Activepieces Connections + +Creates SmoothSchedule connections in Activepieces for all tenants: + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py provision_ap_connections --force +``` + +### Step 10: Provision Default Flows + +Creates the default email automation flows for each tenant: + +```bash +docker compose -f docker-compose.local.yml exec django python manage.py shell -c " +from smoothschedule.identity.core.models import Tenant +from smoothschedule.identity.core.signals import _provision_default_flows_for_tenant + +for tenant in Tenant.objects.exclude(schema_name='public'): + print(f'Provisioning default flows for: {tenant.name}') + _provision_default_flows_for_tenant(tenant.id) +print('Done!') +" +``` + +Default flows created per tenant: +- `appointment_confirmation` - Confirmation email when appointment is booked +- `appointment_reminder` - Reminder based on service settings +- `thank_you` - Thank you email after final payment +- `payment_deposit` - Deposit payment confirmation +- `payment_final` - Final payment confirmation + +### Quick Reference: All Seed Commands + +```bash +cd /home/poduck/Desktop/smoothschedule/smoothschedule + +# 1. Create Activepieces database +docker compose -f docker-compose.local.yml exec postgres psql -U FDuVLuQjfpYzGizTmaTavMcaimqpCMRM -d postgres -c "CREATE DATABASE activepieces;" + +# 2. Run migrations +docker compose -f docker-compose.local.yml exec django python manage.py migrate + +# 3. Seed billing plans +docker compose -f docker-compose.local.yml exec django python manage.py billing_seed_catalog + +# 4. Seed demo tenant with data +docker compose -f docker-compose.local.yml exec django python manage.py reseed_demo + +# 5. Seed automation templates +docker compose -f docker-compose.local.yml exec django python manage.py seed_automation_templates + +# 6. Provision Activepieces connections +docker compose -f docker-compose.local.yml exec django python manage.py provision_ap_connections --force + +# 7. Provision default flows (run in Django shell - see Step 10 above) +``` + +### Verifying Setup + +After seeding, verify everything is working: + +```bash +# Check all services are running +docker compose -f docker-compose.local.yml ps + +# Check Activepieces health +curl -s http://localhost:8090/api/v1/health + +# Test login +curl -s http://api.lvh.me:8000/auth/login/ -X POST \ + -H "Content-Type: application/json" \ + -d '{"email":"owner@demo.com","password":"test123"}' + +# Check flows exist in Activepieces +docker compose -f docker-compose.local.yml exec postgres psql -U FDuVLuQjfpYzGizTmaTavMcaimqpCMRM -d activepieces -c "SELECT id, status FROM flow;" +``` + +Access the application at: +- **Demo tenant:** http://demo.lvh.me:5173 +- **Platform:** http://platform.lvh.me:5173 + ## Git Branch Currently on: `feature/platform-superuser-ui` Main branch: `main` diff --git a/smoothschedule/.envs/.local/.activepieces b/smoothschedule/.envs/.local/.activepieces index 5e1993ba..f544fc04 100644 --- a/smoothschedule/.envs/.local/.activepieces +++ b/smoothschedule/.envs/.local/.activepieces @@ -10,8 +10,8 @@ AP_JWT_SECRET=aa8b396f27cee3d5d07961ca194e69889db699000bd998317b18402ad3358429 AP_ENCRYPTION_KEY=623d1d2592c77b81d16b060446288b32 # Project/Platform IDs (from Activepieces setup - visible in URL when logged in) -AP_DEFAULT_PROJECT_ID=bbwbSJskSKWTVSIJvvmrQ -AP_PLATFORM_ID=oOtq0ptJzbmMgzGn0RcU8 +AP_DEFAULT_PROJECT_ID=gbbRHAUGBSXj9tzTxg6in +AP_PLATFORM_ID=gEUao9SVJyQZtWX1Mu8Rz # Database (using same PostgreSQL as SmoothSchedule) AP_POSTGRES_HOST=postgres