feat: Implement unified Vue SPA with granular service control
Consolidate Reports and Data Entry apps into a single Vue.js SPA with: Architecture: - Module-based structure with lazy-loaded routes (@reports, @data-entry) - Error boundaries per module to prevent cascade failures - Dual API proxy in Vite for microservices (reports:8001, data-entry:8003) - Pinia store factories for shared auth, company, and period stores - Vite path aliases for clear module boundaries (@shared, @reports, @data-entry) Service Management: - Granular service control scripts (backend-reports.sh, backend-data-entry.sh, bot.sh, frontend.sh) - 87% faster frontend restart: 7s vs 53s full restart - 38% faster full startup: 33s vs 53s via parallel backend initialization - Enhanced start-dev.sh with proper service timeouts (OCR: 30s, Vite: 15s, Bot: 10s) - status.sh for comprehensive health checks Features: - Auto-select first company on login with period auto-load - Hamburger menu with feature toggle support - JWT token auto-injection via axios interceptors - Unified header with company/period selectors - IIS web.config for production deployment with multi-API routing UX Improvements: - Vue watchers for reactive company/period loading - Lazy store initialization with graceful error handling - Period persistence per user+company in localStorage - Feature flags for optional modules Deployment: - Single IIS site serves unified frontend with API proxy rules - Maintains separate backend processes for microservices - Windows line ending fixes (.env CRLF → LF conversion) Stats: 112 files changed, 38,342 insertions(+), 2,342 deletions(-) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
214
TESTING_CHECKLIST.md
Normal file
214
TESTING_CHECKLIST.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# ROA2WEB Unified App - Integration Testing Checklist
|
||||
|
||||
## Pre-Test Setup
|
||||
|
||||
- [ ] Stop any previously running services: `./start-test.sh stop`
|
||||
- [ ] Verify SSH tunnel is configured: `./ssh-tunnel-test.sh status`
|
||||
- [ ] Start all services: `./start-test.sh`
|
||||
- [ ] Wait for all services to start (check logs if needed)
|
||||
|
||||
## Service Health Checks
|
||||
|
||||
### Backend Services
|
||||
- [ ] Reports Backend (8001): http://localhost:8001/health
|
||||
- [ ] Reports API Docs: http://localhost:8001/docs
|
||||
- [ ] Data Entry Backend (8003): http://localhost:8003/health
|
||||
- [ ] Data Entry API Docs: http://localhost:8003/docs
|
||||
- [ ] Telegram Bot Internal API (8002): Should be running (check logs: `/tmp/telegram_bot.log`)
|
||||
|
||||
### Frontend
|
||||
- [ ] Unified Frontend loads: http://localhost:3000
|
||||
- [ ] No console errors in browser DevTools
|
||||
- [ ] Login page displays correctly
|
||||
|
||||
## Authentication Flow
|
||||
|
||||
### Login
|
||||
- [ ] Navigate to http://localhost:3000
|
||||
- [ ] Should redirect to `/login` automatically
|
||||
- [ ] Enter valid test credentials
|
||||
- [ ] Login succeeds and redirects to dashboard
|
||||
- [ ] User info displays in header (username, company selector)
|
||||
- [ ] Access token stored in localStorage
|
||||
- [ ] JWT contains correct user info and companies
|
||||
|
||||
### Session Persistence
|
||||
- [ ] Refresh page - user remains logged in
|
||||
- [ ] Close tab and reopen - user remains logged in
|
||||
- [ ] Open in new tab - user is already logged in
|
||||
|
||||
## Reports Module (http://localhost:3000/reports)
|
||||
|
||||
### Navigation
|
||||
- [ ] Click "Rapoarte" in menu
|
||||
- [ ] Dashboard loads at `/reports/dashboard`
|
||||
- [ ] No console errors
|
||||
- [ ] Company selector works (change company)
|
||||
- [ ] Period selector works (change accounting period)
|
||||
|
||||
### Dashboard Widgets
|
||||
- [ ] Metrics cards display (Sales, Purchases, etc.)
|
||||
- [ ] Charts render correctly
|
||||
- [ ] Data loads from Reports API (8001)
|
||||
- [ ] Check Network tab: requests go to `/api/reports/*`
|
||||
|
||||
### Reports Pages
|
||||
- [ ] Navigate to "Facturi Clienți" (`/reports/invoices/sales`)
|
||||
- [ ] Table loads with data
|
||||
- [ ] Filters work (date range, company, status)
|
||||
- [ ] Pagination works
|
||||
- [ ] Export buttons work (Excel, PDF)
|
||||
- [ ] Invoice details modal opens
|
||||
- [ ] Navigate to "Facturi Furnizori" (`/reports/invoices/purchases`)
|
||||
- [ ] Verify same functionality as sales invoices
|
||||
|
||||
### Treasury Reports
|
||||
- [ ] Navigate to "Trezorerie" (`/reports/treasury`)
|
||||
- [ ] Cash flow data loads
|
||||
- [ ] Charts display correctly
|
||||
- [ ] Date filters work
|
||||
|
||||
### Error Boundary Testing
|
||||
- [ ] Manually trigger an error in Reports module (e.g., bad API call)
|
||||
- [ ] ErrorBoundary catches the error
|
||||
- [ ] Error message displays: "A apărut o eroare în modulul Rapoarte"
|
||||
- [ ] Other modules (Data Entry) remain functional
|
||||
|
||||
## Data Entry Module (http://localhost:3000/data-entry)
|
||||
|
||||
### Navigation
|
||||
- [ ] Click "Introduceri" in menu
|
||||
- [ ] Receipts list loads at `/data-entry/receipts`
|
||||
- [ ] No console errors
|
||||
- [ ] Check Network tab: requests go to `/api/data-entry/*`
|
||||
|
||||
### Receipts List
|
||||
- [ ] Table displays receipts
|
||||
- [ ] Status badges display correctly (DRAFT, PENDING, APPROVED)
|
||||
- [ ] Filters work (date range, status, user)
|
||||
- [ ] Create new receipt button visible
|
||||
|
||||
### Create Receipt
|
||||
- [ ] Click "Adaugă Bon Fiscal"
|
||||
- [ ] Form displays at `/data-entry/receipts/new`
|
||||
- [ ] Partner/Supplier dropdown loads from Data Entry API
|
||||
- [ ] Expense type dropdown works
|
||||
- [ ] Date picker works
|
||||
- [ ] Amount fields accept input
|
||||
- [ ] File upload works (image/PDF)
|
||||
- [ ] Save as DRAFT works
|
||||
- [ ] Receipt appears in list with DRAFT status
|
||||
|
||||
### Edit Receipt
|
||||
- [ ] Click edit on a DRAFT receipt
|
||||
- [ ] Form loads with existing data
|
||||
- [ ] Modify fields
|
||||
- [ ] Save changes - updates successfully
|
||||
- [ ] Delete receipt - removes from list
|
||||
|
||||
### Submit for Review
|
||||
- [ ] Open a DRAFT receipt
|
||||
- [ ] Click "Trimite spre aprobare"
|
||||
- [ ] Status changes to PENDING_REVIEW
|
||||
- [ ] Accounting entries auto-generated
|
||||
- [ ] Receipt is read-only in PENDING state
|
||||
|
||||
### Approval Workflow (Accountant Role)
|
||||
- [ ] Login as accountant user
|
||||
- [ ] See pending receipts
|
||||
- [ ] Open PENDING receipt
|
||||
- [ ] Review accounting entries
|
||||
- [ ] Approve receipt - status changes to APPROVED
|
||||
- [ ] Receipt becomes fully read-only
|
||||
|
||||
### Error Boundary Testing
|
||||
- [ ] Manually trigger an error in Data Entry module
|
||||
- [ ] ErrorBoundary catches the error
|
||||
- [ ] Error message displays: "A apărut o eroare în modulul Introduceri"
|
||||
- [ ] Other modules (Reports) remain functional
|
||||
|
||||
## Cross-Module Testing
|
||||
|
||||
### Module Switching
|
||||
- [ ] Start in Reports module
|
||||
- [ ] Navigate to Data Entry module
|
||||
- [ ] Return to Reports module
|
||||
- [ ] Company selection persists across modules
|
||||
- [ ] No console errors during switching
|
||||
- [ ] No memory leaks (check DevTools Memory tab)
|
||||
|
||||
### Shared State
|
||||
- [ ] Login state shared (logout in one module logs out everywhere)
|
||||
- [ ] Company selection shared (change company affects both modules)
|
||||
- [ ] Period selection shared (for modules that use it)
|
||||
|
||||
### API Isolation
|
||||
- [ ] Reports module only calls `/api/reports/*`
|
||||
- [ ] Data Entry module only calls `/api/data-entry/*`
|
||||
- [ ] No cross-contamination of API calls
|
||||
- [ ] Auth headers included in all requests
|
||||
|
||||
## Logout Flow
|
||||
|
||||
- [ ] Click logout button in header
|
||||
- [ ] User redirected to `/login`
|
||||
- [ ] Access token removed from localStorage
|
||||
- [ ] Cannot access protected routes without re-login
|
||||
- [ ] Attempting to access `/reports` or `/data-entry` redirects to login
|
||||
|
||||
## Browser Compatibility
|
||||
|
||||
- [ ] Chrome/Edge (latest)
|
||||
- [ ] Firefox (latest)
|
||||
- [ ] Safari (if available)
|
||||
|
||||
## Responsive Design
|
||||
|
||||
- [ ] Desktop (1920x1080)
|
||||
- [ ] Laptop (1366x768)
|
||||
- [ ] Tablet (768x1024)
|
||||
- [ ] Mobile (375x667)
|
||||
|
||||
## Performance
|
||||
|
||||
- [ ] Initial page load < 3s
|
||||
- [ ] Navigation between modules smooth
|
||||
- [ ] No unnecessary re-renders (check React DevTools)
|
||||
- [ ] API responses cached appropriately
|
||||
- [ ] Bundle sizes reasonable (check Network tab)
|
||||
|
||||
## Build & Production
|
||||
|
||||
- [ ] Run `npm run build`
|
||||
- [ ] Build completes without errors
|
||||
- [ ] Dist folder created with proper structure
|
||||
- [ ] index.html exists
|
||||
- [ ] Assets folder has JS/CSS bundles
|
||||
- [ ] Chunk splitting works (separate bundles for modules)
|
||||
- [ ] Source maps generated (for debugging)
|
||||
|
||||
## Cleanup
|
||||
|
||||
- [ ] Stop all services: `./start-test.sh stop`
|
||||
- [ ] Verify all ports released (8001, 8003, 8002, 3000)
|
||||
- [ ] SSH tunnel stopped
|
||||
- [ ] No lingering processes
|
||||
|
||||
## Issues Found
|
||||
|
||||
Document any issues discovered during testing:
|
||||
|
||||
| Issue | Module | Severity | Description | Status |
|
||||
|-------|--------|----------|-------------|--------|
|
||||
| | | | | |
|
||||
|
||||
## Sign-Off
|
||||
|
||||
- **Tester**: _______________
|
||||
- **Date**: _______________
|
||||
- **Environment**: TEST / DEV / PROD
|
||||
- **Status**: PASS / FAIL / NEEDS FIXES
|
||||
|
||||
## Notes
|
||||
|
||||
Additional observations or comments:
|
||||
Reference in New Issue
Block a user