Last Updated: 2025-11-18
# Start everything (from root)
npm run dev
# Start individually
npm run dev:backend
npm run dev:frontend
# Install dependencies
npm run install:all
# Build frontend
npm run build
# Run tests
cd backend && npm test
# Check database
cd backend && npm run test:db
# Initialize database
cd backend && npm run init-dbfrontend/src/
├── App.tsx # Route definitions
├── types/api.ts # TypeScript interfaces (SINGLE SOURCE OF TRUTH)
├── contexts/
│ ├── AuthContext.tsx # User authentication
│ ├── WalletContext.tsx # XRPL wallet integration (600+ lines)
│ └── DataContext.tsx # NGO/worker data
├── components/
│ ├── AddWorkerModal.tsx # Add worker with QR scan
│ ├── CreatePaymentChannelModal.tsx # Create payment channel
│ ├── DeleteProfileModal.tsx # Worker deletion
│ ├── NGONotifications.tsx # Notification center
│ └── UnclaimedBalanceWarningModal.tsx # Unclaimed balance warnings
├── pages/
│ ├── NgoDashboard.tsx # NGO dashboard
│ ├── WorkerDashboard.tsx # Worker dashboard
│ ├── NgoSettings.tsx # NGO settings
│ └── EmployeeSettings.tsx # Worker settings (deletion trigger)
├── services/
│ └── api.ts # Centralized API client
└── utils/
├── walletTransactions.ts # Multi-wallet transaction handling
└── paymentChannels.ts # Payment channel utilities
backend/
├── server.js # Express server setup
├── database/
│ ├── db.js # PostgreSQL connection pool
│ └── migrations/
│ ├── 001_create_payment_channels.sql
│ ├── 002_add_closure_columns.sql
│ ├── 002_enhance_organizations_table.sql
│ └── 003_worker_deletion.sql # Worker deletion system (NEW)
├── routes/
│ ├── xaman.js # Xaman wallet integration
│ ├── users.js # User profile management
│ ├── organizations.js # NGO/employer management
│ ├── paymentChannels.js # Payment channel operations
│ └── workers.js # Worker management (add, delete, export)
├── jobs/
│ ├── hardDelete.js # Hourly hard delete job
│ └── inactivityDeletion.js # Daily inactivity job
└── tests/
├── workerDeletion.test.js # Unit tests (870+ lines)
└── workerDeletionIntegration.test.js # Integration tests (600+ lines)
POST /api/workers/add # Add worker to organization
GET /api/workers/list/:ngoWalletAddress # List organization's workers
GET /api/workers/:walletAddress/payment-channels # Worker's payment channels
GET /api/workers/deletion-eligibility # Check deletion eligibility
POST /api/workers/delete-profile # Initiate soft delete
POST /api/workers/cancel-deletion # Cancel deletion (48h window)
GET /api/workers/deletion-status # Check deletion status
GET /api/workers/export-data # Export worker data (PDF)
POST /api/payment-channels/create # Create payment channel
POST /api/payment-channels/:id/close # Initiate channel closure
POST /api/payment-channels/:id/close/confirm # Confirm closure after XRPL tx
GET /api/payment-channels/:id # Get channel details
GET /api/organizations/:walletAddress/stats # Organization statistics
POST /api/organizations/create # Create organization
GET /api/ngo-notifications # Fetch NGO notifications
PUT /api/ngo-notifications/:id/read # Mark notification as read
POST /api/xaman/sign-in # Xaman sign-in
GET /api/xaman/payload/:uuid # Payload status
POST /api/xaman/payload # Generic payload endpoint
users -- Wallet addresses, user types, profile data
├── deleted_at -- Soft delete timestamp (NEW)
├── deletion_reason -- Deletion reason (NEW)
└── last_login_at -- Track inactivity (NEW)
organizations -- NGO/employer organizations
employees -- Workers linked to organizations
payment_channels -- Payment channel records with closure tracking
work_sessions -- Clock in/out tracking
payments -- Payment history
sessions -- Authentication sessions
deletion_logs -- Audit trail of deletions (NEW)
ngo_notifications -- Notification system (NEW)Location: frontend/src/types/api.ts
OrgStats // Organization statistics
Worker // Worker information
WorkerForChannel // Worker details for payment channel dropdown
PaymentChannel // Active payment channel information
Activity // Recent activity feed entries
WorkSession // Individual work session tracking
WorkerEarnings // Aggregated earnings data
CancelChannelData // Payment channel cancellation response
ConfirmChannelData // Payment channel confirmation responseIMPORTANT: Always import from types/api.ts, never duplicate type definitions.
- File:
backend/jobs/hardDelete.js - Schedule: Runs hourly (
0 * * * *) - Function: Permanently deletes workers after 48h grace period
- File:
backend/jobs/inactivityDeletion.js - Schedule: Runs daily at 2 AM (
0 2 * * *) - Function: Soft-deletes inactive workers (14+ days no login)
VITE_BACKEND_URL=http://localhost:3001
VITE_XRPL_NETWORK=mainnet # or testnet# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=xahpayroll_dev
DB_USER=xahpayroll_user
DB_PASSWORD=your_secure_password_here
# Network
XRPL_NETWORK=mainnet # or testnet
# Xaman
XAMAN_API_KEY=your_xaman_api_key
XAMAN_API_SECRET=your_xaman_api_secret
# Server
PORT=3001
NODE_ENV=development
# JWT
JWT_SECRET=your_jwt_secret_here
JWT_EXPIRES_IN=7d- Create route handler in
backend/routes/[module].js - Add route to
backend/server.js - Add API client method in
frontend/src/services/api.ts - Add TypeScript interface in
frontend/src/types/api.ts - Use in component/page
- Create component in
frontend/src/components/ - Follow ALL CAPS convention for user-facing text
- Import types from
frontend/src/types/api.ts - Use API client from
frontend/src/services/api.ts
- Create migration SQL in
backend/database/migrations/ - Run migration:
cd backend && npm run init-db - Add TypeScript interface in
frontend/src/types/api.ts - Update backend routes to transform snake_case → camelCase
# All tests
cd backend && npm test
# Specific test file
cd backend && npx jest tests/workerDeletion.test.js
# Watch mode
cd backend && npm test -- --watch
# Coverage
cd backend && npm test -- --coverage# Check browser console (F12)
# Check Network tab for API calls
# Verify wallet extension is unlocked
# Check VITE_BACKEND_URL is correct
# Verify VITE_XRPL_NETWORK matches backend# Check logs: backend/logs/
# Test database: cd backend && npm run test:db
# Check environment variables: cat backend/.env
# Verify PostgreSQL is running: pg_isready
# Check port conflicts: lsof -i :3001# Verify wallet has sufficient XAH balance
# Check network setting (testnet vs mainnet)
# Verify wallet provider is connected
# Check browser console for XRPL errors
# Inspect payment_channels table in databaseALL user-facing text MUST use FULL CAPITALIZATION
✅ Correct:
alert('ORGANIZATION NAME AND WALLET ADDRESS REQUIRED')
<button>DELETE MY PROFILE</button>
<h2>⚠️ DANGER ZONE</h2>❌ Wrong:
alert('Organization name and wallet address required')
<button>Delete My Profile</button>
<h2>⚠️ Danger Zone</h2>- Frontend: camelCase (JavaScript/TypeScript convention)
- Backend: snake_case in database, transformed to camelCase in route handlers
- Database columns: snake_case
- API responses: camelCase
- Run tests:
cd backend && npm test - Build frontend:
npm run build - Check environment variables
- Test on testnet first
- Review database migrations
- Backup production database
- Deploy backend first
- Run database migrations
- Configure scheduled jobs (cron)
- Deploy frontend
- Test critical flows
- Monitor logs for errors
- Verify health check:
/health - Test wallet connections
- Test payment channel creation
- Monitor scheduled job execution
- Check error logs
- Revert to previous git commit
- Re-deploy previous version
- Restore database from backup if needed
- Check scheduled jobs are running
# Backup
pg_dump -U xahpayroll_user xahpayroll_dev > backup.sql
# Restore
psql -U xahpayroll_user xahpayroll_dev < backup.sql- GitHub: Repository URL
- Netlify: Frontend deployment dashboard
- PostgreSQL Docs: https://www.postgresql.org/docs/
- XRPL Docs: https://xrpl.org/
- Xahau Docs: https://docs.xahau.network/
- Xaman Docs: https://xumm.readme.io/
Quick Reference Guide Created: 2025-11-18
For Full Documentation: See CLAUDE.md and README.md