diff --git a/.auto-build-data/specs/unified-app/MIGRATION_CHECKLIST.md b/.auto-build-data/specs/unified-app/MIGRATION_CHECKLIST.md new file mode 100644 index 0000000..03cc403 --- /dev/null +++ b/.auto-build-data/specs/unified-app/MIGRATION_CHECKLIST.md @@ -0,0 +1,406 @@ +# Unified App Migration Checklist + +**Track your progress** as you implement the unified app. + +--- + +## Phase 1: Project Setup (0.5 days) + +### Directory Structure +- [ ] Create directory structure in root (`/mnt/e/proiecte/roa2web/`) +- [ ] Create `src/` subdirectories: + - [ ] `src/modules/reports/views/` + - [ ] `src/modules/reports/stores/` + - [ ] `src/modules/reports/services/` + - [ ] `src/modules/data-entry/views/receipts/` + - [ ] `src/modules/data-entry/components/ocr/` + - [ ] `src/modules/data-entry/stores/` + - [ ] `src/modules/data-entry/services/` + - [ ] `src/shared/components/` + - [ ] `src/shared/stores/` + - [ ] `src/shared/styles/` + - [ ] `src/config/` + - [ ] `src/router/` + - [ ] `src/assets/css/` + +### Core Configuration Files +- [ ] Create `package.json` (merge dependencies from both apps) +- [ ] Create `vite.config.js` (dual proxy + lazy loading) +- [ ] Create `src/main.js` (PrimeVue setup) +- [ ] Create `.env.example` (environment variables) +- [ ] Create `.gitignore` +- [ ] Create `README.md` + +### Copy Shared Resources +- [ ] Copy `shared/frontend/components/` → `src/shared/components/` +- [ ] Copy `shared/frontend/stores/` → `src/shared/stores/` +- [ ] Copy `shared/frontend/styles/` → `src/shared/styles/` +- [ ] Copy `reports-app/frontend/src/assets/css/` → `src/assets/css/` + +### Verification +- [ ] Run `npm install` - succeeds +- [ ] Run `npm run dev` - starts on port 3000 +- [ ] No console errors + +--- + +## Phase 2: Module Migration (1 day) + +### Reports Module - Views +- [ ] Copy `DashboardView.vue` → `src/modules/reports/views/` +- [ ] Copy `InvoicesView.vue` → `src/modules/reports/views/` +- [ ] Copy `BankCashRegisterView.vue` → `src/modules/reports/views/` +- [ ] Copy `TrialBalanceView.vue` → `src/modules/reports/views/` +- [ ] Copy `TelegramView.vue` → `src/modules/reports/views/` +- [ ] Copy `CacheStatsView.vue` → `src/modules/reports/views/` +- [ ] Update imports in all views (if needed) + +### Reports Module - Stores +- [ ] Copy `dashboard.js` → `src/modules/reports/stores/` +- [ ] Copy `invoices.js` → `src/modules/reports/stores/` +- [ ] Copy `treasury.js` → `src/modules/reports/stores/` +- [ ] Copy `trialBalance.js` → `src/modules/reports/stores/` +- [ ] Copy `cacheStore.js` → `src/modules/reports/stores/` +- [ ] Update imports in all stores (if needed) + +### Reports Module - Services +- [ ] Copy `api.js` → `src/modules/reports/services/` (in root) +- [ ] Update base URL to `/api/reports/` in api.js +- [ ] Test API calls route to localhost:8001 + +### Data Entry Module - Views +- [ ] Copy `ReceiptsListView.vue` → `src/modules/data-entry/views/receipts/` +- [ ] Copy `ReceiptCreateView.vue` → `src/modules/data-entry/views/receipts/` +- [ ] Update imports in views (if needed) + +### Data Entry Module - Components +- [ ] Copy `OCRUploadZone.vue` → `src/modules/data-entry/components/ocr/` +- [ ] Copy `OCRPreview.vue` → `src/modules/data-entry/components/ocr/` +- [ ] Copy `OCRConfidenceIndicator.vue` → `src/modules/data-entry/components/ocr/` +- [ ] Update imports in components (if needed) + +### Data Entry Module - Stores +- [ ] Copy `receiptsStore.js` → `src/modules/data-entry/stores/` +- [ ] Update imports in store (if needed) + +### Data Entry Module - Services +- [ ] Copy `api.js` → `src/modules/data-entry/services/` (in root) +- [ ] Update base URL to `/api/data-entry/` in api.js +- [ ] Test API calls route to localhost:8003 + +### CSS Merge +- [ ] Review `data-entry-app/frontend/src/assets/css/main.css` +- [ ] Merge unique styles into `src/assets/css/` (in root) +- [ ] Resolve any style conflicts +- [ ] Test responsive design + +### Verification +- [ ] All Reports views render without errors +- [ ] All Data Entry views render without errors +- [ ] No import errors in console +- [ ] CSS loads correctly +- [ ] No style conflicts + +--- + +## Phase 3: Routing & Navigation (0.5 days) + +### Router Configuration +- [ ] Create `src/router/index.js` (in root) +- [ ] Add `/login` route (eager loaded) +- [ ] Add `/reports/*` routes (lazy loaded) +- [ ] Add `/data-entry/*` routes (lazy loaded) +- [ ] Add redirect `/` → `/reports/dashboard` +- [ ] Add authentication guard +- [ ] Add 404 handling +- [ ] Test all routes work + +### Menu Configuration +- [ ] Create `src/config/menu.js` (in root) +- [ ] Define "Rapoarte" section +- [ ] Define "Introduceri Date" section +- [ ] Define "Sistem" section +- [ ] Export menu configuration + +### Feature Flags +- [ ] Create `src/config/features.js` (in root) +- [ ] Add reports.enabled flag +- [ ] Add dataEntry.enabled flag +- [ ] Add module-level flags +- [ ] Export isFeatureEnabled function + +### Root Component +- [ ] Create `src/App.vue` (in root) +- [ ] Integrate AppHeader with unified menu +- [ ] Integrate SlideMenu with menu sections +- [ ] Add router-view +- [ ] Add Toast and ConfirmDialog +- [ ] Test menu navigation + +### Verification +- [ ] Can navigate to all routes +- [ ] Menu highlights active route +- [ ] Authentication guard works +- [ ] Login redirects to dashboard +- [ ] 404 redirects work + +--- + +## Phase 4: Error Boundaries & Resilience (0.25 days) + +### Error Boundary Component +- [ ] Create `src/shared/components/ErrorBoundary.vue` (in root) +- [ ] Implement onErrorCaptured hook +- [ ] Add user-friendly error display +- [ ] Add retry functionality +- [ ] Add navigate away option +- [ ] Test with intentional error + +### Module Layouts +- [ ] Create `src/modules/reports/ReportsLayout.vue` (in root) +- [ ] Wrap with ErrorBoundary component +- [ ] Create `src/modules/data-entry/DataEntryLayout.vue` (in root) +- [ ] Wrap with ErrorBoundary component + +### Error Isolation Testing +- [ ] Introduce error in Reports module +- [ ] Verify Data Entry still works +- [ ] Introduce error in Data Entry module +- [ ] Verify Reports still works +- [ ] Test retry functionality +- [ ] Test navigate away functionality + +### Feature Flags Testing +- [ ] Disable Reports module +- [ ] Verify menu items hidden +- [ ] Disable Data Entry module +- [ ] Verify menu items hidden +- [ ] Re-enable all modules + +### Loading States +- [ ] Add loading spinner for lazy routes +- [ ] Test module switching loading +- [ ] Add skeleton screens (optional) + +### Verification +- [ ] Error boundary catches component errors +- [ ] User sees friendly error message +- [ ] Can retry or navigate away +- [ ] Module isolation works (error in one doesn't crash other) +- [ ] Feature flags work + +--- + +## Phase 5: Build & Deploy (0.25 days) + +### Production Build +- [ ] Run `npm run build` +- [ ] Build succeeds without errors +- [ ] Check `dist/` output +- [ ] Verify chunks created: + - [ ] vendor-core.[hash].js + - [ ] vendor-primevue.[hash].js + - [ ] vendor-utils.[hash].js + - [ ] reports.[hash].js (lazy) + - [ ] data-entry.[hash].js (lazy) + - [ ] main.[hash].js + - [ ] main.[hash].css + +### Bundle Analysis +- [ ] Install `rollup-plugin-visualizer` +- [ ] Analyze bundle sizes +- [ ] Verify total size ≤ sum of current apps +- [ ] Check for duplicate dependencies + +### Local Preview +- [ ] Run `npm run preview` +- [ ] Test all routes work +- [ ] Test API calls work +- [ ] Test error boundaries +- [ ] Test lazy loading + +### IIS Configuration +- [ ] Create `web.config` (in root) with URL rewrite rules +- [ ] Add SPA routing rule (all → index.html) +- [ ] Add proxy rule: `/api/reports/*` → `http://localhost:8001/api/*` +- [ ] Add proxy rule: `/api/data-entry/*` → `http://localhost:8003/api/*` +- [ ] Add proxy rule: `/uploads/*` → `http://localhost:8003/uploads/*` + +### Staging Deployment +- [ ] Deploy to staging IIS site +- [ ] Test all routes +- [ ] Test API calls +- [ ] Test error boundaries +- [ ] Test on different browsers +- [ ] Test on mobile devices + +### Production Deployment +- [ ] Backup current IIS configuration +- [ ] Backup current builds +- [ ] Deploy unified app +- [ ] Test all routes +- [ ] Test API calls +- [ ] Monitor error logs + +### Verification +- [ ] Build succeeds +- [ ] Chunks split correctly +- [ ] IIS deployment works +- [ ] API routing correct +- [ ] All features work in production + +--- + +## Testing Checklist + +### Manual Testing +- [ ] Login flow works +- [ ] Navigate to all Reports views +- [ ] Navigate to all Data Entry views +- [ ] Switch between modules +- [ ] Test company selector +- [ ] Test period selector +- [ ] Test logout +- [ ] Test on mobile (375px) +- [ ] Test on tablet (768px) +- [ ] Test on desktop (1920px) + +### E2E Tests +- [ ] Create `tests/e2e/login.spec.js` (in root) +- [ ] Create `tests/e2e/reports-navigation.spec.js` (in root) +- [ ] Create `tests/e2e/data-entry-navigation.spec.js` (in root) +- [ ] Create `tests/e2e/module-switching.spec.js` (in root) +- [ ] Create `tests/e2e/error-isolation.spec.js` (in root) +- [ ] Run all E2E tests - pass + +### Performance Testing +- [ ] Run Lighthouse audit +- [ ] Performance score ≥ 90 +- [ ] Initial load < 2 seconds +- [ ] Module switching < 500ms (cached) + +--- + +## Post-Implementation Checklist + +### Documentation Updates +- [ ] Update `CLAUDE.md` - Architecture section +- [ ] Update `CLAUDE.md` - Deployment section +- [ ] Update `README.md` - Quick start +- [ ] Update `README.md` - URL structure +- [ ] Update `DEPLOYMENT_GUIDE.md` - IIS configuration +- [ ] Update `docs/ARCHITECTURE_SCHEMA.md` - Diagrams +- [ ] Update `deployment/windows/README.md` - Deployment steps + +### Cleanup (After 1 Week) +- [ ] Archive `reports-app/frontend/` → `reports-app/frontend-archived/` +- [ ] Archive `data-entry-app/frontend/` → `data-entry-app/frontend-archived/` +- [ ] Update `start-test.sh` to use root directory +- [ ] Update `start-data-entry.sh` to use root directory +- [ ] Update CI/CD pipelines (if any) +- [ ] Document migration in CHANGELOG.md + +### Monitoring (First Week) +- [ ] Day 1: Review error logs +- [ ] Day 2: Review error logs +- [ ] Day 3: Review error logs +- [ ] Day 4: Review error logs +- [ ] Day 5: Review error logs +- [ ] Day 6: Review error logs +- [ ] Day 7: Review error logs + user feedback + +### Optimization (First Month) +- [ ] Week 2: Analyze bundle sizes +- [ ] Week 2: Optimize images/assets +- [ ] Week 3: Consider further code splitting +- [ ] Week 3: Add performance monitoring +- [ ] Week 4: Evaluate feature flag usage +- [ ] Week 4: Plan next improvements + +--- + +## Common Issues & Solutions + +### Issue: CSS Conflicts +**Solution**: Use CSS modules, check `docs/CSS_PATTERNS.md` + +### Issue: Import Errors +**Solution**: Update import paths, check alias configuration in vite.config.js + +### Issue: API Calls Failing +**Solution**: Verify proxy configuration, check backend is running + +### Issue: Error Boundary Not Catching +**Solution**: Check onErrorCaptured implementation, add global error handler + +### Issue: Large Bundle Size +**Solution**: Review manualChunks, enable tree shaking, lazy load more + +### Issue: IIS Routing Not Working +**Solution**: Check web.config URL rewrite rules, verify IIS URL Rewrite module installed + +### Issue: Store Contamination +**Solution**: Use module-scoped stores, check for global state + +### Issue: PrimeVue Theme Conflicts +**Solution**: Use single theme (saga-blue), override in vendor CSS + +--- + +## Progress Tracking + +**Phase 1: Setup** +- Started: ___________ +- Completed: ___________ +- Time Spent: ___________ hours + +**Phase 2: Migration** +- Started: ___________ +- Completed: ___________ +- Time Spent: ___________ hours + +**Phase 3: Routing** +- Started: ___________ +- Completed: ___________ +- Time Spent: ___________ hours + +**Phase 4: Error Boundaries** +- Started: ___________ +- Completed: ___________ +- Time Spent: ___________ hours + +**Phase 5: Build & Deploy** +- Started: ___________ +- Completed: ___________ +- Time Spent: ___________ hours + +**Total Time**: ___________ hours (Estimated: 20 hours) + +--- + +## Success Metrics + +### Deployment +- [ ] Single IIS site running (not 2) +- [ ] Single build process (not 2) +- [ ] Zero downtime during deployment + +### Performance +- [ ] Initial load < 2 seconds +- [ ] Module switching < 500ms +- [ ] Lighthouse score ≥ 90 +- [ ] Bundle size ≤ sum of old apps + +### Quality +- [ ] 100% feature parity +- [ ] All E2E tests passing +- [ ] Zero user-reported bugs (first week) +- [ ] Error isolation verified + +--- + +**Status**: ⬜ Not Started | 🔵 In Progress | ✅ Complete + +**Last Updated**: ___________ +**Completed By**: ___________ +**Production Deploy Date**: ___________ diff --git a/.auto-build-data/specs/unified-app/SUMMARY.md b/.auto-build-data/specs/unified-app/SUMMARY.md new file mode 100644 index 0000000..0c118f3 --- /dev/null +++ b/.auto-build-data/specs/unified-app/SUMMARY.md @@ -0,0 +1,346 @@ +# Unified App Specification - Executive Summary + +**Created**: 2025-12-22 +**Status**: Implementation-Ready +**Estimated Effort**: 2.5 days + +--- + +## What We're Building + +A single unified SPA that consolidates the Reports App and Data Entry App into one application with: +- Unified menu navigation between modules +- Module isolation via error boundaries +- Lazy loading for optimal performance +- Single build and deployment process + +--- + +## Key Requirements (Top 5) + +1. **Unified Navigation**: Single menu with Reports and Data Entry sections +2. **Module Isolation**: Error in one module doesn't crash the other +3. **Lazy Loading**: Modules loaded on-demand, not upfront +4. **Simplified Deployment**: Single IIS site instead of 2 +5. **Zero Backend Changes**: Both backends (8001, 8003) remain unchanged + +--- + +## Technical Approach + +### Architecture: Pragmatic Monolith + +**NOT using micro-frontends** because: +- Only 1 developer (not 20+ team) +- Weekly deploys (not multiple times per day) +- 1-5 concurrent users (not millions) +- Same tech stack (Vue 3 only) + +**Using instead**: +- Error boundaries for isolation (50-70% blast radius reduction) +- Lazy loading for performance +- Feature flags for module control +- Shared dependencies for smaller bundles + +### URL Structure + +``` +/login → Login +/ → Redirect to /reports/dashboard + +/reports/dashboard → Dashboard +/reports/invoices → Invoices +/reports/bank-cash → Bank/Cash +/reports/trial-balance → Trial Balance +/reports/telegram → Telegram Bot +/reports/cache-stats → Cache Stats + +/data-entry → Receipts List +/data-entry/create → New Receipt +/data-entry/:id → View Receipt +/data-entry/:id/edit → Edit Receipt +``` + +### API Routing + +**Vite Dev Proxy**: +- `/api/reports/*` → `http://localhost:8001/api/*` +- `/api/data-entry/*` → `http://localhost:8003/api/*` +- `/uploads/*` → `http://localhost:8003/uploads/*` + +**IIS Production Proxy**: +- Same routing via web.config URL rewrite rules + +--- + +## Critical Files (Top 10) + +### To Create (in root directory) + +1. `package.json` - Merged dependencies +2. `vite.config.js` - Dual proxy + lazy loading +3. `src/main.js` - App initialization +4. `src/App.vue` - Root with unified menu +5. `src/router/index.js` - Unified router +6. `src/config/menu.js` - Menu configuration +7. `src/shared/components/ErrorBoundary.vue` - Error isolation +8. `src/modules/reports/ReportsLayout.vue` - Reports wrapper +9. `src/modules/data-entry/DataEntryLayout.vue` - Data Entry wrapper +10. `web.config` - IIS configuration + +### To Migrate + +**Reports Module** (7 views, 5 stores, 1 service): +- Views: Dashboard, Invoices, BankCash, TrialBalance, Telegram, CacheStats +- Stores: dashboard, invoices, treasury, trialBalance, cacheStore +- Service: api.js (change base URL to `/api/reports/`) + +**Data Entry Module** (2 views, 3 components, 1 store, 1 service): +- Views: ReceiptsList, ReceiptCreate +- Components: OCRUploadZone, OCRPreview, OCRConfidenceIndicator +- Store: receiptsStore +- Service: api.js (change base URL to `/api/data-entry/`) + +**Shared** (5 components, 3 stores): +- Components: LoginView, AppHeader, SlideMenu, CompanySelector, PeriodSelector +- Stores: auth, companies, accountingPeriod (factories) + +**CSS**: Copy entire `reports-app/frontend/src/assets/css/` structure + +--- + +## Implementation Phases + +### Phase 1: Setup (0.5 days) +- Create directory structure +- Setup package.json, vite.config.js +- Copy shared components and CSS + +**Verify**: `npm install` and `npm run dev` work + +### Phase 2: Migration (1 day) +- Migrate all views, components, stores +- Update API service base URLs +- Merge CSS + +**Verify**: All views render, no import errors + +### Phase 3: Routing & Navigation (0.5 days) +- Create unified router with lazy loading +- Create menu configuration +- Create error boundaries +- Integrate AppHeader and SlideMenu + +**Verify**: Navigation works, lazy loading works + +### Phase 4: Error Boundaries & Resilience (0.25 days) +- Test error isolation +- Test feature flags +- Add loading states + +**Verify**: Error in one module doesn't crash other + +### Phase 5: Build & Deploy (0.25 days) +- Production build +- IIS configuration +- Deploy to staging +- Test all routes + +**Verify**: Build succeeds, IIS works, APIs route correctly + +--- + +## Expected Build Output + +``` +dist/ +├── index.html +├── assets/ +│ ├── vendor-core.[hash].js (~150KB) - Vue, Router, Pinia +│ ├── vendor-primevue.[hash].js (~200KB) - PrimeVue components +│ ├── vendor-utils.[hash].js (~80KB) - Axios, date-fns +│ ├── vendor-charts.[hash].js (~150KB) - Chart.js (lazy) +│ ├── vendor-export.[hash].js (~200KB) - XLSX, jsPDF (lazy) +│ ├── reports.[hash].js (~150KB) - Reports module (lazy) +│ ├── data-entry.[hash].js (~100KB) - Data Entry module (lazy) +│ ├── main.[hash].js (~50KB) - App shell +│ └── main.[hash].css (~80KB) - Global CSS +``` + +--- + +## Success Criteria + +### Must Have (Before Production) +- [ ] All Reports views work correctly +- [ ] All Data Entry views work correctly +- [ ] Navigation preserves auth and company/period +- [ ] Error in one module doesn't crash other +- [ ] Single IIS site deployment works +- [ ] API routing to both backends works + +### Performance Targets +- [ ] Initial load < 2 seconds +- [ ] Module switching < 500ms (cached) +- [ ] Bundle size ≤ sum of current apps +- [ ] Lighthouse score ≥ 90 + +### Testing +- [ ] E2E tests pass for login +- [ ] E2E tests pass for Reports navigation +- [ ] E2E tests pass for Data Entry navigation +- [ ] E2E tests pass for module switching +- [ ] E2E tests verify error isolation + +--- + +## Risks & Mitigations + +| Risk | Mitigation | +|------|------------| +| CSS conflicts | Use design tokens, test thoroughly | +| Large bundle size | Lazy loading, code splitting, tree shaking | +| Error boundary gaps | Test error scenarios, add global handler | +| IIS deployment complexity | Document config, test on staging first | +| Store contamination | Module-scoped stores, test isolation | + +--- + +## Rollback Plan + +**If deployment fails**: + +1. **Keep both apps running** (zero downtime) + - Leave `/roa2web/` and `/data-entry/` running + - Add unified app at `/unified/` for testing + +2. **Quick rollback** (15 minutes) + - Restore IIS config from backup + - Restore builds from `dist-backup/` + +3. **Git rollback** + - Tag before merge: `v1.0-pre-unified` + - Revert if needed: `git reset --hard v1.0-pre-unified` + +--- + +## Post-Implementation + +### After 1 Week of Stability + +**Archive old frontends**: +```bash +mv reports-app/frontend reports-app/frontend-archived +mv data-entry-app/frontend data-entry-app/frontend-archived +``` + +**Update documentation**: +- CLAUDE.md - Architecture and deployment +- DEPLOYMENT_GUIDE.md - IIS configuration +- README.md - Quick start and commands + +**Update scripts**: +- `./start-test.sh` - Point to root directory +- `./start-data-entry.sh` - Point to root directory + +### Monitoring (First Month) + +**Week 1**: Daily error log review +**Week 2-4**: Performance optimization +- Bundle size optimization +- Further code splitting +- Cache optimization + +--- + +## Open Questions & Recommendations + +### 1. PrimeVue Theme +**Question**: Use `saga-blue` (reports-app) or `lara-light-blue` (data-entry-app)? +**Recommendation**: `saga-blue` (reports-app is primary) + +### 2. Feature Flags +**Question**: Config file or environment variables? +**Recommendation**: Config file for simplicity, env vars for override + +### 3. Module Activation +**Question**: All active by default or opt-in? +**Recommendation**: All active by default (disable via config if needed) + +### 4. Monitoring +**Question**: Console logs only or add Sentry/similar? +**Recommendation**: Console logs for MVP, add monitoring later + +--- + +## Key Decisions Made + +1. **Architecture**: Pragmatic monolith (not micro-frontends) +2. **Error Isolation**: Error boundaries per module +3. **Code Splitting**: Lazy loading with manual chunks +4. **URL Structure**: `/reports/*` and `/data-entry/*` +5. **API Routing**: Proxy via Vite (dev) and IIS (prod) +6. **CSS System**: Use reports-app CSS structure +7. **PrimeVue Theme**: saga-blue (from reports-app) +8. **Shared Components**: Use existing from `shared/frontend/` +9. **Deployment**: Single IIS site at root `/` +10. **Backends**: No changes (remain at 8001, 8003) + +--- + +## Documentation Locations + +**Complete Spec**: `.auto-build-data/specs/unified-app/spec.md` +**Critical Files**: `.auto-build-data/specs/unified-app/critical-files.md` +**This Summary**: `.auto-build-data/specs/unified-app/SUMMARY.md` + +**Note**: All implementation files will be created in the project root directory (`.` or `/mnt/e/proiecte/roa2web/`) + +**Reference Docs**: +- `IMPLEMENTATION_PLAN_UNIFIED_APP.md` - Original plan +- `CLAUDE.md` - Project documentation (update after) +- `docs/ONBOARDING_CSS.md` - CSS system guide +- `docs/CSS_PATTERNS.md` - Available CSS patterns + +--- + +## Next Steps + +1. **Read the complete spec**: `spec.md` (detailed technical specification) +2. **Review critical files**: `critical-files.md` (files to migrate/create) +3. **Start Phase 1**: Project setup (0.5 days) +4. **Follow implementation plan**: 5 phases over 2.5 days +5. **Test thoroughly**: E2E tests before production +6. **Deploy to staging**: Test IIS configuration +7. **Deploy to production**: Single site deployment +8. **Monitor for 1 week**: Daily error log review +9. **Archive old apps**: After stability confirmed +10. **Update docs**: Complete documentation updates + +--- + +## Quick Stats + +- **Files to create**: ~15 +- **Files to migrate**: ~20 +- **CSS files to copy**: ~30 +- **Total files affected**: ~65 +- **Estimated time**: 2.5 days (20 hours) +- **Complexity**: Medium +- **Risk level**: Medium-Low (with mitigations) + +--- + +**Specification Status**: ✅ Implementation-Ready +**All Technical Decisions**: ✅ Made +**Rollback Plan**: ✅ Defined +**Success Criteria**: ✅ Defined + +**Ready to implement!** 🚀 + +--- + +**Version**: 1.0 +**Created**: 2025-12-22 +**Author**: Claude (Specification Agent) +**For**: ROA2WEB Unified App Feature diff --git a/.auto-build-data/specs/unified-app/critical-files.md b/.auto-build-data/specs/unified-app/critical-files.md new file mode 100644 index 0000000..80d63e8 --- /dev/null +++ b/.auto-build-data/specs/unified-app/critical-files.md @@ -0,0 +1,477 @@ +# Unified App - Critical Files Reference + +**Quick Reference**: Files that will be most affected during implementation + +--- + +## Files to Analyze (Before Implementation) + +### Configuration Files + +**Reports App**: +- `/mnt/e/proiecte/roa2web/reports-app/frontend/package.json` - Dependencies to merge +- `/mnt/e/proiecte/roa2web/reports-app/frontend/vite.config.js` - Proxy config, build settings +- `/mnt/e/proiecte/roa2web/reports-app/frontend/src/main.js` - PrimeVue setup + +**Data Entry App**: +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/package.json` - Dependencies to merge +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/vite.config.js` - Proxy config +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/main.js` - PrimeVue setup + +### Application Entry Points + +**Reports App**: +- `/mnt/e/proiecte/roa2web/reports-app/frontend/src/App.vue` - Root component, menu integration +- `/mnt/e/proiecte/roa2web/reports-app/frontend/src/router/index.js` - Router config + +**Data Entry App**: +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/App.vue` - Root component, menu integration +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/router/index.js` - Router config + +### Shared Components (Already Created) + +- `/mnt/e/proiecte/roa2web/shared/frontend/components/LoginView.vue` +- `/mnt/e/proiecte/roa2web/shared/frontend/components/layout/AppHeader.vue` +- `/mnt/e/proiecte/roa2web/shared/frontend/components/layout/SlideMenu.vue` +- `/mnt/e/proiecte/roa2web/shared/frontend/components/CompanySelector.vue` +- `/mnt/e/proiecte/roa2web/shared/frontend/components/PeriodSelector.vue` + +### Shared Stores (Factories) + +- `/mnt/e/proiecte/roa2web/shared/frontend/stores/auth.js` +- `/mnt/e/proiecte/roa2web/shared/frontend/stores/companies.js` +- `/mnt/e/proiecte/roa2web/shared/frontend/stores/accountingPeriod.js` + +--- + +## Views to Migrate + +### Reports Module (7 views) + +Source: `/mnt/e/proiecte/roa2web/reports-app/frontend/src/views/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/reports/views/` + +1. `DashboardView.vue` - Main dashboard with metrics +2. `InvoicesView.vue` - Invoices table and filters +3. `BankCashRegisterView.vue` - Bank and cash register transactions +4. `TrialBalanceView.vue` - Trial balance report +5. `TelegramView.vue` - Telegram bot management +6. `CacheStatsView.vue` - Cache statistics +7. ~~`LoginView.vue`~~ - USE SHARED VERSION + +### Data Entry Module (2 views + 3 components) + +**Views**: +Source: `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/views/receipts/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/data-entry/views/receipts/` + +1. `ReceiptsListView.vue` - List of receipts with filters +2. `ReceiptCreateView.vue` - Create/edit receipt form + +**Components**: +Source: `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/components/ocr/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/data-entry/components/ocr/` + +1. `OCRUploadZone.vue` - File upload zone for receipts +2. `OCRPreview.vue` - Preview uploaded receipt image +3. `OCRConfidenceIndicator.vue` - OCR confidence indicator + +--- + +## Stores to Migrate + +### Reports Module (5 stores) + +Source: `/mnt/e/proiecte/roa2web/reports-app/frontend/src/stores/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/reports/stores/` + +1. `dashboard.js` - Dashboard data and metrics +2. `invoices.js` - Invoices data and filters +3. `treasury.js` - Bank/cash register data +4. `trialBalance.js` - Trial balance data +5. `cacheStore.js` - Cache statistics + +**SKIP** (use shared): +- ~~`auth.js`~~ - Use `/mnt/e/proiecte/roa2web/shared/frontend/stores/auth.js` +- ~~`companies.js`~~ - Use `/mnt/e/proiecte/roa2web/shared/frontend/stores/companies.js` +- ~~`accountingPeriod.js`~~ - Use `/mnt/e/proiecte/roa2web/shared/frontend/stores/accountingPeriod.js` + +### Data Entry Module (1 store) + +Source: `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/stores/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/data-entry/stores/` + +1. `receiptsStore.js` - Receipts data and CRUD operations + +**SKIP** (use shared): +- ~~`auth.js`~~ - Use shared +- ~~`companies.js`~~ - Use shared +- ~~`accountingPeriod.js`~~ - Use shared + +--- + +## Services to Migrate + +### Reports Module + +Source: `/mnt/e/proiecte/roa2web/reports-app/frontend/src/services/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/reports/services/` + +1. `api.js` - **MODIFY**: Change base URL to `/api/reports/` + +**Current**: +```javascript +const api = axios.create({ + baseURL: '/api' +}) +``` + +**New**: +```javascript +const api = axios.create({ + baseURL: '/api/reports' +}) +``` + +### Data Entry Module + +Source: `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/services/` +Destination: `/mnt/e/proiecte/roa2web/src/modules/data-entry/services/` + +1. `api.js` - **MODIFY**: Change base URL to `/api/data-entry/` + +**Current**: +```javascript +const api = axios.create({ + baseURL: '/api' +}) +``` + +**New**: +```javascript +const api = axios.create({ + baseURL: '/api/data-entry' +}) +``` + +--- + +## CSS to Migrate + +### Reports Module CSS (COPY ENTIRE STRUCTURE) + +Source: `/mnt/e/proiecte/roa2web/reports-app/frontend/src/assets/css/` +Destination: `/mnt/e/proiecte/roa2web/src/assets/css/` + +**Copy ALL files** (this is the main CSS system): +- `core/` - Design tokens (colors, spacing, typography) +- `components/` - Reusable UI patterns (buttons, forms, cards, tables, stats) +- `patterns/` - Interactive patterns (animations, dashboard, interactive) +- `layout/` - Page structure (containers, grid, navigation) +- `utilities/` - Utility classes (colors, spacing, flex, text, display) +- `vendor/` - PrimeVue overrides +- `global.css` - Global styles +- `main.css` - Main entry point +- `mobile.css` - Mobile responsive styles + +### Data Entry Module CSS (MERGE) + +Source: `/mnt/e/proiecte/roa2web/data-entry-app/frontend/src/assets/css/` + +**Analyze and merge unique styles**: +- `main.css` - Merge with reports-app main.css +- Any component-specific styles - Integrate into unified system + +### Shared CSS + +Source: `/mnt/e/proiecte/roa2web/shared/frontend/styles/` +Destination: `/mnt/e/proiecte/roa2web/src/shared/styles/` + +1. `login.css` - Login page styles +2. `layout/header.css` - Header styles +3. `layout/navigation.css` - Navigation styles + +--- + +## Critical Implementation Files + +### 1. Package Configuration + +**File**: `/mnt/e/proiecte/roa2web/package.json` + +**Dependencies to merge**: +- From reports-app: axios, chart.js, date-fns, jspdf, jspdf-autotable, qrcode.vue, xlsx +- From data-entry-app: All covered by reports-app +- Shared: vue@^3.4.0, vue-router@^4.2.5, pinia@^2.1.7, primevue@^3.46.0 + +### 2. Vite Configuration + +**File**: `/mnt/e/proiecte/roa2web/vite.config.js` + +**Key sections**: +- Dual proxy for `/api/reports/` → `http://localhost:8001` +- Dual proxy for `/api/data-entry/` → `http://localhost:8003` +- Lazy loading configuration (manualChunks) +- Alias configuration (@, @shared, @reports, @data-entry) + +### 3. Application Entry + +**File**: `/mnt/e/proiecte/roa2web/src/main.js` + +**Key setup**: +- PrimeVue configuration (theme: saga-blue) +- Global components registration +- Router, Pinia, ToastService, ConfirmationService +- CSS imports + +### 4. Root Component + +**File**: `/mnt/e/proiecte/roa2web/src/App.vue` + +**Key elements**: +- AppHeader with unified menu +- SlideMenu with module sections +- router-view +- Toast, ConfirmDialog + +### 5. Router Configuration + +**File**: `/mnt/e/proiecte/roa2web/src/router/index.js` + +**Key routes**: +- `/login` - LoginView (eager loaded) +- `/reports/*` - ReportsLayout (lazy loaded) with children +- `/data-entry/*` - DataEntryLayout (lazy loaded) with children +- Authentication guard + +### 6. Menu Configuration + +**File**: `/mnt/e/proiecte/roa2web/src/config/menu.js` + +**Sections**: +- Rapoarte (Reports) +- Introduceri Date (Data Entry) +- Sistem (System) + +### 7. Feature Flags + +**File**: `/mnt/e/proiecte/roa2web/src/config/features.js` + +**Flags**: +- reports.enabled +- dataEntry.enabled +- Module-level flags + +### 8. Error Boundary Component + +**File**: `/mnt/e/proiecte/roa2web/src/shared/components/ErrorBoundary.vue` + +**Key features**: +- onErrorCaptured hook +- User-friendly error display +- Retry functionality +- Navigate away option + +### 9. Module Layouts + +**File**: `/mnt/e/proiecte/roa2web/src/modules/reports/ReportsLayout.vue` + +**Wrapper**: +```vue + + + +``` + +**File**: `/mnt/e/proiecte/roa2web/src/modules/data-entry/DataEntryLayout.vue` + +**Wrapper**: +```vue + + + +``` + +--- + +## Deployment Files + +### IIS Configuration + +**File**: `/mnt/e/proiecte/roa2web/web.config` + +**Key rules**: +- SPA routing (all routes → index.html) +- API proxy: `/api/reports/*` → `http://localhost:8001/api/*` +- API proxy: `/api/data-entry/*` → `http://localhost:8003/api/*` +- Uploads proxy: `/uploads/*` → `http://localhost:8003/uploads/*` + +### Environment Variables + +**File**: `/mnt/e/proiecte/roa2web/.env.example` + +**Variables**: +```bash +# API Endpoints (dev only, production uses IIS proxy) +VITE_REPORTS_API=http://localhost:8001 +VITE_DATA_ENTRY_API=http://localhost:8003 + +# Feature Flags +VITE_ENABLE_REPORTS=true +VITE_ENABLE_DATA_ENTRY=true +``` + +--- + +## Testing Files + +### E2E Tests + +**New files to create**: +- `/mnt/e/proiecte/roa2web/tests/e2e/login.spec.js` +- `/mnt/e/proiecte/roa2web/tests/e2e/reports-navigation.spec.js` +- `/mnt/e/proiecte/roa2web/tests/e2e/data-entry-navigation.spec.js` +- `/mnt/e/proiecte/roa2web/tests/e2e/module-switching.spec.js` +- `/mnt/e/proiecte/roa2web/tests/e2e/error-isolation.spec.js` + +**Existing tests to adapt**: +- `/mnt/e/proiecte/roa2web/reports-app/frontend/tests/` - Update routes +- `/mnt/e/proiecte/roa2web/data-entry-app/frontend/tests/` - Update routes + +--- + +## Documentation Files to Update + +### Primary Documentation + +1. **CLAUDE.md** (root) + - Update architecture diagram + - Add unified-app section + - Mark old apps as archived + - Update deployment instructions + +2. **README.md** (root) + - Update quick start + - Update deployment section + - Update URL structure + +3. **DEPLOYMENT_GUIDE.md** + - Update IIS configuration + - Update build process + - Add rollback instructions + +4. **docs/ARCHITECTURE_SCHEMA.md** + - Update architecture diagrams + - Document module structure + - Add error boundary architecture + +### Deployment Documentation + +5. **deployment/windows/README.md** + - Update deployment steps + - Update IIS configuration + - Update proxy rules + +6. **deployment/windows/docs/WINDOWS_DEPLOYMENT.md** + - Complete Windows guide updates + +--- + +## File Count Summary + +**To Create**: ~15 new files +- 9 core files (package.json, vite.config.js, main.js, App.vue, router, menu, features, ErrorBoundary, 2 layouts) +- 3 configuration files (.env.example, web.config, README.md) +- 3 documentation updates + +**To Migrate**: ~20 files +- 7 Reports views +- 2 Data Entry views +- 3 Data Entry components +- 5 Reports stores +- 1 Data Entry store +- 2 API services + +**To Copy**: ~30 CSS files +- Entire reports-app CSS structure + +**Total Files Affected**: ~65 files + +--- + +## Time Estimates per File Type + +| Task | Files | Avg Time | Total | +|------|-------|----------|-------| +| Create core files | 9 | 30 min | 4.5 hours | +| Migrate views | 9 | 20 min | 3 hours | +| Migrate components | 3 | 15 min | 45 min | +| Migrate stores | 6 | 20 min | 2 hours | +| Migrate services | 2 | 30 min | 1 hour | +| Copy CSS | 1 | 1 hour | 1 hour | +| Configuration | 3 | 30 min | 1.5 hours | +| Documentation | 6 | 30 min | 3 hours | +| Testing & fixes | - | - | 4 hours | + +**Total**: ~20 hours (~2.5 days) + +--- + +## Verification Checklist + +After migrating each category: + +### Configuration Files ✓ +- [ ] package.json has all dependencies +- [ ] vite.config.js has dual proxy +- [ ] main.js initializes correctly +- [ ] npm install succeeds +- [ ] npm run dev starts + +### Views ✓ +- [ ] All Reports views render +- [ ] All Data Entry views render +- [ ] No import errors +- [ ] Routes work + +### Stores ✓ +- [ ] All stores import correctly +- [ ] No duplicate store instances +- [ ] Shared stores work +- [ ] Module stores isolated + +### Services ✓ +- [ ] API calls route to correct backend +- [ ] /api/reports/ → :8001 +- [ ] /api/data-entry/ → :8003 +- [ ] Auth headers preserved + +### CSS ✓ +- [ ] No style conflicts +- [ ] Design tokens work +- [ ] PrimeVue theme consistent +- [ ] Responsive works + +### Router ✓ +- [ ] All routes accessible +- [ ] Lazy loading works +- [ ] Auth guard works +- [ ] 404 redirects + +### Error Boundaries ✓ +- [ ] Catches component errors +- [ ] Displays user message +- [ ] Module isolation works +- [ ] Can retry/navigate + +### Build ✓ +- [ ] npm run build succeeds +- [ ] Chunks split correctly +- [ ] Bundle size acceptable +- [ ] Preview works + +--- + +**Last Updated**: 2025-12-22 +**For**: Unified App Implementation +**Reference**: See spec.md for complete specification diff --git a/.auto-build-data/specs/unified-app/spec.md b/.auto-build-data/specs/unified-app/spec.md new file mode 100644 index 0000000..d86b782 --- /dev/null +++ b/.auto-build-data/specs/unified-app/spec.md @@ -0,0 +1,1114 @@ +# Feature: Unified App - Pragmatic Monolith Consolidation + +## Overview + +Consolidate the two separate frontend applications (Reports App and Data Entry App) into a single unified SPA with both modules accessible from one menu. This pragmatic monolith approach maintains module isolation while simplifying deployment and providing a unified user experience with a single build and single IIS site. + +**Status**: Implementation-Ready +**Complexity**: Medium +**Estimated Effort**: 2.5 days + +--- + +## Problem Statement + +### Current Issues +- Two separate frontend deployments in IIS (`/roa2web/` and `/data-entry/`) +- Complex deployment process (2 builds, 2 IIS configurations) +- CSS conflicts when using shared components (white text on white background) +- No unified navigation between modules +- Duplicate setup and configuration code + +### Benefits of Unification +- Simplified deployment (single build, single IIS site) +- Unified user experience with single menu +- Shared component consistency +- Module isolation preserved through error boundaries +- Optimized bundle loading via lazy loading + +--- + +## User Stories + +### Primary Users +- As a **user**, I want to access both Reports and Data Entry modules from a single menu so that I can navigate seamlessly between functionalities. +- As a **developer**, I want simplified deployment with a single build process so that I can reduce deployment complexity and maintenance overhead. +- As a **user**, I want the app to remain functional even if one module encounters an error so that my work is not interrupted. +- As an **administrator**, I want a single IIS site configuration so that I can manage deployment more easily. + +--- + +## Functional Requirements + +### Core Requirements + +#### 1. Unified Navigation +- Single top-level menu with sections for Reports and Data Entry modules +- Menu structure: + - **Rapoarte** (Reports) section with Dashboard, Invoices, Bank/Cash, Trial Balance + - **Introduceri Date** (Data Entry) section with Receipts List, New Receipt + - **Sistem** section with Telegram Bot, Cache Stats +- Active route highlighting +- Responsive slide menu (mobile + desktop) + +#### 2. Module Isolation +- Error boundary per module (Reports, Data Entry) +- Bug in one module does not crash the other +- Independent lazy loading per module +- Separate stores per module (no cross-contamination) + +#### 3. URL Structure +``` +/login → Login page +/ → Redirect to /reports/dashboard + +/reports/dashboard → Dashboard (Reports module) +/reports/invoices → Invoices view +/reports/bank-cash → Bank/Cash register view +/reports/trial-balance → Trial Balance view +/reports/telegram → Telegram Bot management +/reports/cache-stats → Cache statistics + +/data-entry → Receipts list (Data Entry module) +/data-entry/create → Create new receipt +/data-entry/:id → View receipt details +/data-entry/:id/edit → Edit receipt +``` + +#### 4. Shared Components Integration +- Use existing shared components from `shared/frontend/`: + - `LoginView.vue` - Login page + - `AppHeader.vue` - Top navigation bar + - `SlideMenu.vue` - Sidebar menu + - `CompanySelector.vue` - Company dropdown + - `PeriodSelector.vue` - Accounting period selector +- Maintain consistent styling and behavior across modules + +#### 5. Authentication & Authorization +- Unified JWT authentication +- Single login flow for both modules +- Preserve existing auth store factory pattern +- Session persistence across module navigation + +### Secondary Requirements + +#### 1. Feature Flags +- Ability to enable/disable modules via configuration +- Feature flag configuration in `src/config/features.js` +- UI hides disabled module menu items + +#### 2. Loading States +- Module-level loading spinners +- Skeleton screens for lazy-loaded routes +- Progress indication during module switching + +#### 3. Analytics & Monitoring +- Track module switching events +- Error boundary triggers logged +- Performance metrics per module + +--- + +## Technical Requirements + +### Project Structure + +``` +. +├── public/ +│ └── favicon.ico +├── src/ +│ ├── main.js # App entry point +│ ├── App.vue # Root component with unified menu +│ │ +│ ├── router/ +│ │ └── index.js # Unified router with lazy loading +│ │ +│ ├── modules/ +│ │ ├── reports/ # ISOLATED REPORTS MODULE +│ │ │ ├── ReportsLayout.vue # Error boundary wrapper +│ │ │ ├── views/ # Reports views (migrated) +│ │ │ │ ├── DashboardView.vue +│ │ │ │ ├── InvoicesView.vue +│ │ │ │ ├── BankCashRegisterView.vue +│ │ │ │ ├── TrialBalanceView.vue +│ │ │ │ ├── TelegramView.vue +│ │ │ │ └── CacheStatsView.vue +│ │ │ ├── stores/ # Module-specific stores +│ │ │ │ ├── dashboard.js +│ │ │ │ ├── invoices.js +│ │ │ │ ├── treasury.js +│ │ │ │ ├── trialBalance.js +│ │ │ │ └── cacheStore.js +│ │ │ └── services/ # Module API services +│ │ │ └── api.js # Reports API client +│ │ │ +│ │ └── data-entry/ # ISOLATED DATA ENTRY MODULE +│ │ ├── DataEntryLayout.vue # Error boundary wrapper +│ │ ├── views/ # Data Entry views (migrated) +│ │ │ └── receipts/ +│ │ │ ├── ReceiptsListView.vue +│ │ │ └── ReceiptCreateView.vue +│ │ ├── components/ # Module-specific components +│ │ │ └── ocr/ +│ │ │ ├── OCRUploadZone.vue +│ │ │ ├── OCRPreview.vue +│ │ │ └── OCRConfidenceIndicator.vue +│ │ ├── stores/ # Module-specific stores +│ │ │ └── receiptsStore.js +│ │ └── services/ # Module API services +│ │ └── api.js # Data Entry API client +│ │ +│ ├── shared/ # SHARED COMPONENTS & LOGIC +│ │ ├── components/ # Shared UI components +│ │ │ ├── layout/ +│ │ │ │ ├── AppHeader.vue +│ │ │ │ └── SlideMenu.vue +│ │ │ ├── LoginView.vue +│ │ │ ├── CompanySelector.vue +│ │ │ ├── PeriodSelector.vue +│ │ │ └── ErrorBoundary.vue # NEW: Error boundary component +│ │ ├── stores/ # Shared stores (factories) +│ │ │ ├── auth.js # Auth store factory +│ │ │ ├── companies.js # Companies store factory +│ │ │ └── accountingPeriod.js # Period store factory +│ │ └── styles/ # Shared CSS +│ │ ├── login.css +│ │ ├── layout/ +│ │ │ ├── header.css +│ │ │ └── navigation.css +│ │ └── shared.css +│ │ +│ ├── config/ +│ │ ├── menu.js # Unified menu configuration +│ │ └── features.js # Feature flags +│ │ +│ └── assets/ +│ └── css/ # Global CSS (from reports-app) +│ ├── core/ # Design tokens +│ ├── components/ # Reusable UI patterns +│ ├── patterns/ # Interactive patterns +│ ├── layout/ # Page structure +│ ├── utilities/ # Utility classes +│ └── vendor/ # PrimeVue overrides +│ +├── vite.config.js # Unified Vite config (root) +├── package.json # Merged dependencies (root) +├── .env.example # Environment template (root) +└── README.md # Unified app documentation (root) +``` + +### Files to Create + +| File | Purpose | +|------|---------| +| `package.json` | Merged dependencies from both apps | +| `vite.config.js` | Dual proxy config, lazy loading, base path `/` | +| `src/main.js` | App initialization, PrimeVue setup, global components | +| `src/App.vue` | Root component with unified menu | +| `src/router/index.js` | Unified router with lazy loading | +| `src/config/menu.js` | Menu configuration | +| `src/config/features.js` | Feature flags | +| `src/shared/components/ErrorBoundary.vue` | Error boundary component | +| `src/modules/reports/ReportsLayout.vue` | Reports error boundary wrapper | +| `src/modules/data-entry/DataEntryLayout.vue` | Data Entry error boundary wrapper | +| `.env.example` | Environment variables template | +| `README.md` | Documentation | + +### Files to Migrate + +#### From `reports-app/frontend/` + +**Views** (→ `modules/reports/views/`): +- DashboardView.vue +- InvoicesView.vue +- BankCashRegisterView.vue +- TrialBalanceView.vue +- TelegramView.vue +- CacheStatsView.vue +- ~~LoginView.vue~~ (use shared) + +**Stores** (→ `modules/reports/stores/`): +- dashboard.js +- invoices.js +- treasury.js +- trialBalance.js +- cacheStore.js +- ~~auth.js~~ (use shared) +- ~~companies.js~~ (use shared) +- ~~accountingPeriod.js~~ (use shared) + +**Services** (→ `modules/reports/services/`): +- api.js (adapt for `/api/reports/` prefix) + +**CSS** (→ `assets/css/`): +- Copy entire `src/assets/css/` directory structure +- All design tokens, components, patterns, utilities + +#### From `data-entry-app/frontend/` + +**Views** (→ `modules/data-entry/views/receipts/`): +- ReceiptsListView.vue +- ReceiptCreateView.vue +- ~~LoginView.vue~~ (use shared) + +**Components** (→ `modules/data-entry/components/`): +- ocr/OCRUploadZone.vue +- ocr/OCRPreview.vue +- ocr/OCRConfidenceIndicator.vue + +**Stores** (→ `modules/data-entry/stores/`): +- receiptsStore.js +- ~~auth.js~~ (use shared) +- ~~companies.js~~ (use shared) +- ~~accountingPeriod.js~~ (use shared) + +**Services** (→ `modules/data-entry/services/`): +- api.js (adapt for `/api/data-entry/` prefix) + +**CSS** (→ merge with `assets/css/`): +- main.css (merge with reports-app main.css) +- Any component-specific styles + +#### From `shared/frontend/` + +**Components** (→ `shared/components/`): +- LoginView.vue +- layout/AppHeader.vue +- layout/SlideMenu.vue +- CompanySelector.vue +- PeriodSelector.vue + +**Stores** (→ `shared/stores/`): +- auth.js (factory) +- companies.js (factory) +- accountingPeriod.js (factory) + +**Styles** (→ `shared/styles/`): +- login.css +- layout/header.css +- layout/navigation.css + +### Dependencies + +#### Unified package.json (root directory) + +Merge all dependencies from both apps: + +**From reports-app**: +- axios: ^1.6.2 +- chart.js: ^4.5.0 +- date-fns: ^2.30.0 +- jspdf: ^3.0.1 +- jspdf-autotable: ^5.0.2 +- pinia: ^2.1.7 +- primeicons: ^6.0.1 +- primevue: ^3.46.0 +- qrcode.vue: ^3.6.0 +- vue: ^3.4.0 +- vue-chartjs: ^5.3.2 +- vue-router: ^4.2.5 +- xlsx: ^0.18.5 + +**From data-entry-app**: +- All duplicates already covered +- Additional: @primevue/themes: ^4.0.0 (optional, may remove) + +**DevDependencies**: +- @playwright/test: ^1.54.2 +- @vitejs/plugin-vue: ^5.0.0 +- eslint: ^8.56.0 +- eslint-plugin-vue: ^9.20.0 +- prettier: ^3.1.1 +- vite: ^5.0.10 + +### API Routing + +#### Vite Dev Server Proxy + +```javascript +// vite.config.js +server: { + port: 3000, + proxy: { + '/api/reports': { + target: 'http://localhost:8001', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api\/reports/, '/api') + }, + '/api/data-entry': { + target: 'http://localhost:8003', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api\/data-entry/, '/api') + }, + '/uploads': { + target: 'http://localhost:8003', + changeOrigin: true + } + } +} +``` + +#### IIS Production Proxy + +```xml + + + + + + + + + + + + + + + +``` + +### Build Configuration + +#### Vite Config - Lazy Loading & Bundle Splitting + +```javascript +// vite.config.js +export default defineConfig({ + plugins: [vue(), htmlTimestampPlugin()], + base: process.env.NODE_ENV === 'production' ? '/' : '/', + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@shared': fileURLToPath(new URL('./src/shared', import.meta.url)), + '@reports': fileURLToPath(new URL('./src/modules/reports', import.meta.url)), + '@data-entry': fileURLToPath(new URL('./src/modules/data-entry', import.meta.url)) + }, + dedupe: ['vue', 'vue-router', 'pinia', 'primevue'] + }, + build: { + outDir: 'dist', + sourcemap: true, + rollupOptions: { + output: { + manualChunks: { + // Core vendors + 'vendor-core': ['vue', 'vue-router', 'pinia'], + 'vendor-primevue': ['primevue/config', 'primevue/button', 'primevue/datatable'], + 'vendor-utils': ['axios', 'date-fns'], + + // Charts (reports only) + 'vendor-charts': ['chart.js', 'vue-chartjs'], + + // Excel/PDF exports + 'vendor-export': ['xlsx', 'jspdf', 'jspdf-autotable'], + + // Module-specific chunks (lazy loaded) + // Reports module loaded via dynamic import + // Data Entry module loaded via dynamic import + }, + entryFileNames: `assets/[name].[hash].js`, + chunkFileNames: `assets/[name].[hash].js`, + assetFileNames: `assets/[name].[hash].[ext]` + } + } + } +}) +``` + +**Expected Build Output**: +``` +dist/ +├── index.html +├── assets/ +│ ├── vendor-core.[hash].js (~150KB) - Vue, Router, Pinia +│ ├── vendor-primevue.[hash].js (~200KB) - PrimeVue components +│ ├── vendor-utils.[hash].js (~80KB) - Axios, date-fns +│ ├── vendor-charts.[hash].js (~150KB) - Chart.js (lazy) +│ ├── vendor-export.[hash].js (~200KB) - XLSX, jsPDF (lazy) +│ ├── reports.[hash].js (~150KB) - Reports module (lazy) +│ ├── data-entry.[hash].js (~100KB) - Data Entry module (lazy) +│ ├── main.[hash].js (~50KB) - App shell +│ └── main.[hash].css (~80KB) - Global CSS +``` + +--- + +## Design Decisions + +### Approach: Pragmatic Monolith + +**Why NOT Micro-frontends (Module Federation / Single-SPA)?** + +| Micro-Frontend Criterion | ROA2WEB Reality | Justification | +|-------------------------|-----------------|---------------| +| 20+ developers on separate teams | 1 developer | Overkill - no team coordination needed | +| Deploy multiple times per day | Weekly deploys | No benefit from independent deployments | +| Millions of users, high scale | 1-5 concurrent users | No scaling justification | +| Different frameworks per team | Vue 3 only | No technical diversity | +| Independent release cycles | Single release cycle | Adds unnecessary complexity | + +**Pragmatic Monolith Benefits**: +- Simple build process (single `npm run build`) +- Shared dependencies (smaller bundle size) +- Error boundaries provide 50-70% isolation (close to separate apps) +- Lazy loading prevents loading unused modules +- Feature flags allow disabling modules without redeploy + +### Error Boundary Implementation + +**ErrorBoundary.vue Component**: +```vue + + + ⚠️ + {{ moduleName }} a întâmpinat o eroare + {{ error.message }} + + Reîncearcă + Mergi la Dashboard + + + + + + +``` + +**Usage in Module Layouts**: +```vue + + + + + + + + + + + + + +``` + +### Lazy Loading Strategy + +**Router Configuration**: +```javascript +const routes = [ + { + path: '/login', + name: 'Login', + component: LoginView, + meta: { requiresAuth: false } + }, + { + path: '/reports', + component: () => import('@/modules/reports/ReportsLayout.vue'), + children: [ + { + path: 'dashboard', + name: 'Dashboard', + component: () => import('@/modules/reports/views/DashboardView.vue'), + meta: { requiresAuth: true, title: 'Dashboard - ROA Reports' } + }, + { + path: 'invoices', + name: 'Invoices', + component: () => import('@/modules/reports/views/InvoicesView.vue'), + meta: { requiresAuth: true, title: 'Facturi - ROA Reports' } + }, + // ... more routes + ] + }, + { + path: '/data-entry', + component: () => import('@/modules/data-entry/DataEntryLayout.vue'), + children: [ + { + path: '', + name: 'ReceiptsList', + component: () => import('@/modules/data-entry/views/receipts/ReceiptsListView.vue'), + meta: { requiresAuth: true, title: 'Lista Bonuri' } + }, + // ... more routes + ] + }, + { + path: '/', + redirect: '/reports/dashboard' + } +] +``` + +### Menu Configuration + +**config/menu.js**: +```javascript +export const menuSections = [ + { + title: 'Rapoarte', + items: [ + { to: '/reports/dashboard', icon: 'pi pi-home', label: 'Dashboard' }, + { to: '/reports/invoices', icon: 'pi pi-file', label: 'Facturi' }, + { to: '/reports/bank-cash', icon: 'pi pi-money-bill', label: 'Casa și Banca' }, + { to: '/reports/trial-balance', icon: 'pi pi-calculator', label: 'Balanță de Verificare' } + ] + }, + { + title: 'Introduceri Date', + items: [ + { to: '/data-entry', icon: 'pi pi-list', label: 'Lista Bonuri' }, + { to: '/data-entry/create', icon: 'pi pi-plus', label: 'Bon Nou' } + ] + }, + { + title: 'Sistem', + items: [ + { to: '/reports/telegram', icon: 'pi pi-telegram', label: 'Telegram Bot' }, + { to: '/reports/cache-stats', icon: 'pi pi-chart-bar', label: 'Statistici Cache' } + ] + } +] +``` + +### Feature Flags + +**config/features.js**: +```javascript +export const features = { + reports: { + enabled: true, + modules: { + dashboard: true, + invoices: true, + bankCash: true, + trialBalance: true, + telegram: true, + cacheStats: true + } + }, + dataEntry: { + enabled: true, + modules: { + receipts: true, + ocr: true + } + } +} + +export function isFeatureEnabled(module, subModule = null) { + if (!features[module]?.enabled) return false + if (subModule && !features[module]?.modules?.[subModule]) return false + return true +} +``` + +### CSS Architecture + +**Preserve Reports App CSS System**: +- Use complete CSS structure from `reports-app/frontend/src/assets/css/` +- Design tokens in `core/tokens.css` +- Component patterns in `components/` +- PrimeVue overrides in `vendor/primevue-overrides.css` + +**Merge Data Entry CSS**: +- Extract unique data-entry styles +- Integrate into existing pattern system +- Ensure no conflicts with reports CSS + +**Shared Styles**: +- Import from `src/shared/styles/` for LoginView, AppHeader, SlideMenu +- Maintain consistency across modules + +--- + +## Acceptance Criteria + +### Functionality +- [ ] User can log in and access both Reports and Data Entry modules from unified menu +- [ ] All Reports views (Dashboard, Invoices, Bank/Cash, Trial Balance, Telegram, Cache Stats) work correctly +- [ ] All Data Entry views (Receipts List, Create Receipt, Edit Receipt) work correctly +- [ ] Navigation between modules preserves authentication and selected company/period +- [ ] Error in Reports module does not crash Data Entry module (and vice versa) +- [ ] Logout works correctly and clears all stores + +### Performance +- [ ] Initial page load < 2 seconds on 3G connection +- [ ] Module switching (Reports ↔ Data Entry) < 500ms (already loaded) or < 1s (first load) +- [ ] Build produces separate chunks for each module (reports.js, data-entry.js) +- [ ] Total bundle size ≤ sum of current apps (no regression) +- [ ] Lighthouse score ≥ 90 for Performance + +### Build & Deployment +- [ ] `npm run build` succeeds without errors +- [ ] Build output contains expected chunks (vendor-core, reports, data-entry) +- [ ] IIS deployment with single site works correctly +- [ ] API proxy routes correctly to both backends (8001, 8003) +- [ ] Production build works on Windows IIS +- [ ] Cache busting works (new builds force reload) + +### Error Handling +- [ ] Error boundary catches component errors +- [ ] Error boundary displays user-friendly message +- [ ] User can retry or navigate away from error +- [ ] Console logs error details for debugging +- [ ] Error in one module doesn't affect the other + +### Responsive Design +- [ ] Works on mobile (375px width) +- [ ] Works on tablet (768px width) +- [ ] Works on desktop (1920px width) +- [ ] Slide menu works on mobile +- [ ] Company/Period selectors work on mobile + +### Testing +- [ ] E2E tests pass for login flow +- [ ] E2E tests pass for Reports module navigation +- [ ] E2E tests pass for Data Entry module navigation +- [ ] E2E tests pass for module switching +- [ ] E2E tests verify error boundary isolation + +--- + +## Out of Scope + +The following are explicitly NOT included in this implementation: + +### Backend Changes +- No changes to `reports-app/backend/` (port 8001) +- No changes to `data-entry-app/backend/` (port 8003) +- Backends remain separate microservices + +### Shared Database +- Each backend keeps its own database (Oracle for Reports, SQLite for Data Entry) +- No database consolidation + +### API Consolidation +- APIs remain at separate ports (8001, 8003) +- No unified API gateway (using IIS/Vite proxy instead) + +### Telegram Bot +- Telegram bot remains in `reports-app/telegram-bot/` +- No changes to bot architecture + +### Advanced Features +- No server-side rendering (SSR) +- No progressive web app (PWA) features +- No offline mode +- No real-time updates (WebSockets) + +### Future Enhancements +- Module-level permissions (show/hide based on user role) +- Module analytics dashboard +- A/B testing framework +- Module versioning +- Micro-frontend migration (if team grows to 20+) + +--- + +## Risks and Mitigations + +| Risk | Likelihood | Impact | Mitigation | +|------|------------|--------|------------| +| **CSS conflicts between modules** | Medium | Medium | Use CSS modules or scoped styles; test thoroughly; maintain design token system from reports-app | +| **Large bundle size** | Medium | Medium | Implement aggressive code splitting; lazy load modules; use tree shaking; monitor with webpack-bundle-analyzer | +| **Error boundary not catching all errors** | Low | High | Test error scenarios thoroughly; add global error handler; log errors to monitoring service | +| **Deployment complexity on IIS** | Medium | High | Document IIS proxy configuration; create deployment scripts; test on staging first | +| **Store contamination between modules** | Low | High | Keep stores module-scoped; use namespaced modules; test isolation | +| **PrimeVue theme conflicts** | Low | Medium | Use single PrimeVue theme (saga-blue from reports-app); override in vendor CSS | +| **Breaking existing E2E tests** | High | Medium | Update test selectors; test both modules independently; add new tests for unified navigation | +| **Shared component changes breaking both modules** | Medium | High | Version shared components; add component tests; minimize changes to shared code | + +--- + +## Implementation Plan + +### Phase 1: Project Setup (0.5 days) + +**Tasks**: +1. Create directory structure in root (`.`) +2. Create `package.json` with merged dependencies +3. Create `vite.config.js` with dual proxy and lazy loading +4. Create `src/main.js` with PrimeVue setup +5. Create `.env.example` with environment variables +6. Copy `shared/frontend/` to `src/shared/` +7. Copy `reports-app/frontend/src/assets/css/` to `src/assets/css/` + +**Verification**: +- `npm install` succeeds +- `npm run dev` starts dev server on port 3000 +- No build errors + +### Phase 2: Module Migration (1 day) + +**Tasks**: +1. Create module structure (`modules/reports/`, `modules/data-entry/`) +2. Migrate Reports views to `modules/reports/views/` +3. Migrate Reports stores to `modules/reports/stores/` +4. Migrate Reports services, adapt API base URL to `/api/reports/` +5. Migrate Data Entry views to `modules/data-entry/views/` +6. Migrate Data Entry components to `modules/data-entry/components/` +7. Migrate Data Entry stores to `modules/data-entry/stores/` +8. Migrate Data Entry services, adapt API base URL to `/api/data-entry/` +9. Merge CSS from data-entry-app into main CSS system + +**Verification**: +- All views render without errors +- API calls route to correct backend +- No import errors + +### Phase 3: Routing & Navigation (0.5 days) + +**Tasks**: +1. Create unified router in `src/router/index.js` +2. Configure lazy loading for module layouts +3. Add authentication guard +4. Create `config/menu.js` with unified menu structure +5. Create `App.vue` with AppHeader and SlideMenu integration +6. Create `ReportsLayout.vue` with error boundary +7. Create `DataEntryLayout.vue` with error boundary +8. Create `ErrorBoundary.vue` component + +**Verification**: +- Navigation works between all routes +- Lazy loading chunks load correctly +- Error boundary catches and displays errors +- Menu highlights active route + +### Phase 4: Error Boundaries & Resilience (0.25 days) + +**Tasks**: +1. Test error boundary with intentional errors +2. Verify module isolation (error in one doesn't crash other) +3. Add global error handler +4. Test feature flags (enable/disable modules) +5. Add loading states for lazy-loaded routes + +**Verification**: +- Error boundary displays user-friendly message +- User can retry or navigate away +- Other module continues working +- Feature flags hide disabled modules + +### Phase 5: Build & Deployment (0.25 days) + +**Tasks**: +1. Run production build: `npm run build` +2. Verify bundle splitting (check `dist/assets/`) +3. Test production build locally: `npm run preview` +4. Create IIS web.config with URL rewrite rules +5. Deploy to staging IIS site +6. Test all routes and API calls on staging +7. Document deployment process + +**Verification**: +- Build succeeds without errors +- Separate chunks generated (vendor-core, reports, data-entry) +- IIS deployment works +- API proxy routes correctly +- All features work in production + +--- + +## Testing Strategy + +### Unit Tests +- Store actions and mutations +- Service API methods +- Utility functions +- Error boundary component + +### Integration Tests +- Router navigation +- Store integration with components +- API service integration +- Error boundary with child components + +### E2E Tests (Playwright) + +**Critical Paths**: +1. **Login Flow** + - Navigate to /login + - Enter credentials + - Verify redirect to /reports/dashboard + +2. **Reports Module Navigation** + - Navigate to each Reports view + - Verify data loads + - Test filters and actions + +3. **Data Entry Module Navigation** + - Navigate to receipts list + - Navigate to create receipt + - Verify form validation + +4. **Module Switching** + - Navigate from Reports to Data Entry + - Verify state persistence (company, period) + - Navigate back to Reports + +5. **Error Isolation** + - Trigger error in Reports module + - Verify Data Entry still works + - Retry error module + +6. **Logout** + - Logout from any module + - Verify redirect to login + - Verify stores cleared + +### Performance Tests +- Lighthouse audit (target: 90+ Performance) +- Bundle size analysis (webpack-bundle-analyzer) +- Load time measurement (initial load, module switching) + +--- + +## Rollback Plan + +### If Deployment Fails + +**Option 1: Keep Both Apps Running** (Zero Downtime) +- Leave existing `/roa2web/` and `/data-entry/` sites running +- Add new unified app at `/unified/` for testing +- Switch over when stable + +**Option 2: Quick Rollback** (15 minutes) +- Keep backup of current IIS configuration +- Keep backup of current builds in `dist-backup/` +- Restore IIS sites from backup +- Restore builds from backup + +### Git Strategy +- Create feature branch: `feature/unified-app-pragmatic-monolith` +- Tag last stable version before merge: `v1.0-pre-unified` +- Can revert to tag if needed: `git reset --hard v1.0-pre-unified` + +### Monitoring +- Check IIS logs: `C:\inetpub\logs\LogFiles\` +- Check application errors in browser console +- Monitor backend logs (both 8001 and 8003) +- Track user feedback in first 48 hours + +--- + +## Documentation Updates + +### Files to Create/Update + +1. **README.md** (in root directory) + - Project overview + - Setup instructions + - Development commands + - Deployment guide + - Architecture overview + +2. **CLAUDE.md** (root) + - Update architecture diagram + - Update deployment instructions + - Mark old apps as archived + - Document new root structure + +3. **DEPLOYMENT_GUIDE.md** + - Update IIS configuration + - Update build process + - Update URL structure + - Add rollback instructions + +4. **docs/ARCHITECTURE_SCHEMA.md** + - Update architecture diagrams + - Document module structure + - Add error boundary architecture + +5. **deployment/windows/README.md** + - Update deployment steps + - Update IIS configuration + - Update proxy rules + +--- + +## Post-Implementation Tasks + +### Archiving Old Apps + +After successful deployment and 1 week of stability: + +1. Archive old frontends: + ```bash + mv reports-app/frontend reports-app/frontend-archived + mv data-entry-app/frontend data-entry-app/frontend-archived + ``` + +2. Update start scripts to use root directory: + ```bash + # ./start-test.sh (update frontend path to root) + # ./start-data-entry.sh (update frontend path to root) + ``` + +3. Update CI/CD pipelines (if any) + +4. Document migration in CHANGELOG.md + +### Monitoring & Optimization + +**First Week**: +- Monitor error logs daily +- Track bundle load times +- Gather user feedback +- Fix critical bugs + +**First Month**: +- Optimize bundle sizes +- Add performance monitoring +- Consider further code splitting +- Evaluate feature flag usage + +--- + +## Dependencies on Other Work + +### Prerequisites +- None - can start immediately + +### Blocking +- No other work blocked by this + +### Nice to Have (Not Required) +- Updated E2E tests (can do after deployment) +- Performance monitoring setup (can add later) +- Analytics integration (can add later) + +--- + +## Success Metrics + +### Deployment Success +- ✅ Single IIS site running instead of 2 +- ✅ Single build command instead of 2 +- ✅ Zero downtime during deployment + +### User Experience +- ✅ 100% feature parity with old apps +- ✅ < 2s initial load time +- ✅ < 500ms module switching (cached) +- ✅ Zero user-reported bugs in first week + +### Technical +- ✅ Bundle size ≤ sum of old apps +- ✅ Error isolation working (test scenarios) +- ✅ All E2E tests passing +- ✅ Lighthouse score ≥ 90 + +--- + +## Open Questions + +1. **PrimeVue Theme Standardization**: Use `saga-blue` (reports-app) or `lara-light-blue` (data-entry-app)? + - **Recommendation**: Use `saga-blue` (reports-app is primary) + +2. **Feature Flag Storage**: Config file or environment variables? + - **Recommendation**: Config file for simplicity, env vars for production override + +3. **Module Activation Strategy**: All modules active by default or opt-in? + - **Recommendation**: All active by default (can disable via config) + +4. **Monitoring Solution**: Console logs only or add Sentry/similar? + - **Recommendation**: Console logs for MVP, add monitoring later + +5. **Progressive Enhancement**: Load Reports first (most used) or parallel? + - **Recommendation**: Load on-demand (lazy loading), whichever user navigates to first + +--- + +## Estimated Complexity + +**Medium Complexity** - Justification: + +**Factors Increasing Complexity**: +- Merging two apps with different structures +- Ensuring error isolation between modules +- CSS conflicts and PrimeVue theme differences +- IIS proxy configuration complexity +- Testing both modules thoroughly + +**Factors Decreasing Complexity**: +- No backend changes required +- Shared components already exist +- Clear architectural pattern (pragmatic monolith) +- Lazy loading well-supported by Vue Router +- Both apps use same tech stack (Vue 3, PrimeVue) + +**Time Estimate**: 2.5 days (as per implementation plan) + +--- + +## References + +### Related Documents +- `IMPLEMENTATION_PLAN_UNIFIED_APP.md` - Initial plan (this spec expands on it) +- `CLAUDE.md` - Project documentation (update after implementation) +- `docs/ONBOARDING_CSS.md` - CSS system guide +- `docs/CSS_PATTERNS.md` - Available CSS patterns +- `docs/ARCHITECTURE_SCHEMA.md` - Current architecture (update after) + +### Key Files to Reference During Implementation +- `reports-app/frontend/vite.config.js` - Proxy config, build settings (reference for new root `vite.config.js`) +- `reports-app/frontend/src/router/index.js` - Router patterns (reference for new `src/router/index.js`) +- `reports-app/frontend/src/App.vue` - AppHeader/SlideMenu integration (reference for new `src/App.vue`) +- `data-entry-app/frontend/src/App.vue` - Alternative integration pattern +- `shared/frontend/components/layout/AppHeader.vue` - Header API (copy to `src/shared/components/layout/`) +- `shared/frontend/components/layout/SlideMenu.vue` - Menu API (copy to `src/shared/components/layout/`) + +--- + +## Handover Notes + +This specification is **implementation-ready**. All technical decisions have been made. The implementation plan provides a clear path with verification steps at each phase. + +**Critical Files to Create First** (in root directory): +1. `package.json` - Merged dependencies +2. `vite.config.js` - Dual proxy config +3. `src/router/index.js` - Unified router with lazy loading +4. `src/shared/components/ErrorBoundary.vue` - Error isolation + +**After Implementation**: +- Archive old frontends after 1 week of stability +- Update all documentation (CLAUDE.md, DEPLOYMENT_GUIDE.md) +- Consider adding monitoring/analytics +- Optimize bundle sizes based on real usage + +--- + +**Specification Version**: 1.0 +**Created**: 2025-12-22 +**Status**: Ready for Implementation +**Estimated Effort**: 2.5 days diff --git a/.auto-build-data/specs/unified-app/status.json b/.auto-build-data/specs/unified-app/status.json new file mode 100644 index 0000000..44acf04 --- /dev/null +++ b/.auto-build-data/specs/unified-app/status.json @@ -0,0 +1,30 @@ +{ + "feature": "unified-app", + "status": "SPEC_COMPLETE", + "created": "2025-12-22T01:09:00Z", + "updated": "2025-12-22T01:13:00Z", + "complexity": "medium", + "estimated_effort": "2.5 days", + "history": [ + { + "status": "SPEC_DRAFT", + "at": "2025-12-22T01:09:00Z" + }, + { + "status": "SPEC_COMPLETE", + "at": "2025-12-22T01:13:00Z" + } + ], + "files": { + "spec": "spec.md", + "summary": "SUMMARY.md", + "critical_files": "critical-files.md", + "migration_checklist": "MIGRATION_CHECKLIST.md" + }, + "stats": { + "files_to_create": 15, + "files_to_migrate": 20, + "css_files_to_copy": 30, + "total_files_affected": 65 + } +} diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..4fbcad4 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,5 @@ +{ + "enabledPlugins": { + "ab@roa2web-tools": true + } +} diff --git a/.claude_settings.json b/.claude_settings.json new file mode 100644 index 0000000..023fc47 --- /dev/null +++ b/.claude_settings.json @@ -0,0 +1,32 @@ +{ + "sandbox": { + "enabled": true, + "autoAllowBashIfSandboxed": true + }, + "permissions": { + "defaultMode": "acceptEdits", + "allow": [ + "Read(./**)", + "Write(./**)", + "Edit(./**)", + "Glob(./**)", + "Grep(./**)", + "Bash(*)", + "mcp__puppeteer__puppeteer_connect_active_tab", + "mcp__puppeteer__puppeteer_navigate", + "mcp__puppeteer__puppeteer_screenshot", + "mcp__puppeteer__puppeteer_click", + "mcp__puppeteer__puppeteer_fill", + "mcp__puppeteer__puppeteer_select", + "mcp__puppeteer__puppeteer_hover", + "mcp__puppeteer__puppeteer_evaluate", + "mcp__context7__resolve-library-id", + "mcp__context7__get-library-docs", + "mcp__graphiti-memory__search_nodes", + "mcp__graphiti-memory__search_facts", + "mcp__graphiti-memory__add_episode", + "mcp__graphiti-memory__get_episodes", + "mcp__graphiti-memory__get_entity_edge" + ] + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index f90a944..6a0be70 100644 --- a/.gitignore +++ b/.gitignore @@ -510,3 +510,6 @@ TELEGRAM_EMAIL_AUTH_PLAN*.md secrets-backup/**/*.env secrets-backup/**/.env.* !secrets-backup/**/*.gpg + +.playwright-mcp/* +data-entry-app/backend/data/* \ No newline at end of file diff --git a/IMPLEMENTATION_PLAN_UNIFIED_APP.md b/IMPLEMENTATION_PLAN_UNIFIED_APP.md new file mode 100644 index 0000000..f7d589c --- /dev/null +++ b/IMPLEMENTATION_PLAN_UNIFIED_APP.md @@ -0,0 +1,285 @@ +# Plan: Consolidare ROA2WEB - Pragmatic Monolith + +> **Branch**: `feature/unified-app-pragmatic-monolith` +> **Status**: APROBAT - Ready for Implementation +> **Efort estimat**: ~2.5 zile + +--- + +## Context și Problema + +### Situația Curentă +- 2 aplicații frontend separate în IIS: `/roa2web/` și `/data-entry/` +- Deploy greoi (2 build-uri, 2 configurații IIS separate) +- Componentele shared cauzează probleme CSS cross-app (text alb pe fundal alb) +- Nu există meniu unificat între aplicații + +### Obiectiv +- Un singur meniu cu ambele aplicații (Reports + Data Entry) +- Deploy simplificat (un build, un site IIS) +- Izolare între module (bug în Reports să nu afecteze DataEntry) +- URL-uri pe root: `/reports/*`, `/data-entry/*` + +--- + +## Decizie Arhitecturală: Pragmatic Monolith + +### De ce NU Micro-frontends? +| Criteriu pentru MFE | ROA2WEB | Necesită MFE? | +|---------------------|---------|---------------| +| 20+ dezvoltatori | 1 dev | ❌ Nu | +| Deploy de multe ori/zi | Săptămânal | ❌ Nu | +| Milioane de utilizatori | 1-5 concurenți | ❌ Nu | +| Framework-uri diferite | Vue only | ❌ Nu | + +**Verdict**: Module Federation / Single-SPA = OVERKILL + +### Abordare Aleasă: Monolith cu Mecanisme de Izolare +- **Error Boundaries** per modul (bug în Reports nu strică DataEntry) +- **Lazy Loading** (bundle-uri separate, încărcate la nevoie) +- **Stores izolate** per modul +- **Feature flags** pentru control + +**Blast radius cu protecții: 50-70%** (aproape ca 2 apps separate!) + +--- + +## Arhitectura Finală + +``` +┌─────────────────────────────────────────────────────────────┐ +│ ROA2WEB Unified SPA │ +│ │ +│ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ +│ │ Reports Module │ │ DataEntry Module │ │ Shared │ │ +│ │ /reports/* │ │ /data-entry/* │ │ - Auth │ │ +│ │ (lazy loaded) │ │ (lazy loaded) │ │ - Company │ │ +│ │ │ │ │ │ - Period │ │ +│ │ ErrorBoundary │ │ ErrorBoundary │ │ - Header │ │ +│ └────────┬────────┘ └────────┬─────────┘ └──────────────┘ │ +│ │ │ │ +│ ┌────────┴────────────────────┴─────────┐ │ +│ │ Vue Router + Global Error Handler │ │ +│ └────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + │ + ┌─────────┴─────────┐ + │ IIS Proxy │ + └─────────┬─────────┘ + ┌───────────────┴───────────────┐ + │ │ + ┌────────▼────────┐ ┌──────────▼────────┐ + │ Reports Backend │ │ DataEntry Backend │ + │ port 8001 │ │ port 8003 │ + │ (Oracle RO) │ │ (SQLite + Oracle) │ + └─────────────────┘ └───────────────────┘ +``` + +--- + +## Structura Proiect Unified + +``` +roa2web/ +├── src/ +│ ├── main.js +│ ├── App.vue # Meniu unificat +│ ├── router/index.js # Rute unificate cu lazy loading +│ │ +│ ├── modules/ +│ │ ├── reports/ # MODUL IZOLAT +│ │ │ ├── ReportsLayout.vue # Error boundary pentru modul +│ │ │ ├── views/ +│ │ │ │ ├── DashboardView.vue +│ │ │ │ ├── InvoicesView.vue +│ │ │ │ ├── BankCashRegisterView.vue +│ │ │ │ ├── TrialBalanceView.vue +│ │ │ │ ├── TelegramView.vue +│ │ │ │ └── CacheStatsView.vue +│ │ │ ├── stores/ +│ │ │ └── services/ +│ │ │ +│ │ └── data-entry/ # MODUL IZOLAT +│ │ ├── DataEntryLayout.vue +│ │ ├── views/ +│ │ │ ├── ReceiptsListView.vue +│ │ │ └── ReceiptCreateView.vue +│ │ ├── stores/ +│ │ └── services/ +│ │ +│ ├── shared/ # Shared între module +│ │ ├── components/ # AppHeader, SlideMenu, CompanySelector, etc. +│ │ ├── stores/ # Auth, Company, Period +│ │ └── styles/ +│ │ +│ └── config/ +│ ├── menu.js # Configurație meniu unificat +│ └── features.js # Feature flags +│ +├── vite.config.js +└── package.json +``` + +--- + +## Pași Implementare + +### Faza 1: Setup Proiect (0.5 zile) +1. Creează directorul `roa2web/` +2. Setup `package.json` cu dependencies combinate din ambele apps +3. Setup `vite.config.js` cu: + - Dual proxy: `/api/reports/*` → `:8001`, `/api/data-entry/*` → `:8003` + - Lazy loading chunks configuration + - Base path `/` +4. Setup `main.js` cu Pinia, PrimeVue, Router + +### Faza 2: Migrare Module (1 zi) +1. Copiază views din `reports-app/frontend/src/views/` → `modules/reports/views/` +2. Copiază views din `data-entry-app/frontend/src/views/` → `modules/data-entry/views/` +3. Copiază stores specifice fiecărui modul +4. Creează `ReportsLayout.vue` și `DataEntryLayout.vue` cu error boundaries +5. Setup router unificat: + ```javascript + const routes = [ + { path: '/login', component: LoginView }, + { + path: '/reports', + component: () => import('./modules/reports/ReportsLayout.vue'), + children: [ + { path: 'dashboard', component: () => import('./modules/reports/views/DashboardView.vue') }, + { path: 'invoices', component: () => import('./modules/reports/views/InvoicesView.vue') }, + // ... + ] + }, + { + path: '/data-entry', + component: () => import('./modules/data-entry/DataEntryLayout.vue'), + children: [ + { path: '', component: () => import('./modules/data-entry/views/ReceiptsListView.vue') }, + { path: 'create', component: () => import('./modules/data-entry/views/ReceiptCreateView.vue') }, + ] + }, + { path: '/', redirect: '/reports/dashboard' } + ] + ``` + +### Faza 3: Izolare și Resilience (0.5 zile) +1. Implementează `ErrorBoundary.vue`: + ```vue + + + ⚠️ {{ moduleName }} a întâmpinat o eroare + {{ error.message }} + Reîncearcă + + + + ``` +2. Separă stores per modul (nu global) +3. Adaugă feature flags în `config/features.js` +4. Testează izolarea: introduce bug în Reports, verifică că DataEntry funcționează + +### Faza 4: Build & Deploy (0.5 zile) +1. Verifică bundle splitting cu `npm run build`: + ``` + dist/assets/ + ├── index-[hash].js # Shell + shared (~150KB) + ├── reports-[hash].js # Reports module (~200KB) + └── data-entry-[hash].js # DataEntry module (~100KB) + ``` +2. Update IIS web.config pentru SPA routing (toate rutele → index.html) +3. Update deployment scripts pentru single app +4. Test end-to-end pe server +5. Deploy în producție + +--- + +## Meniu Unificat + +```javascript +// config/menu.js +export const menuSections = [ + { + title: 'Rapoarte', + items: [ + { to: '/reports/dashboard', icon: 'pi pi-home', label: 'Dashboard' }, + { to: '/reports/invoices', icon: 'pi pi-file', label: 'Facturi' }, + { to: '/reports/bank-cash', icon: 'pi pi-money-bill', label: 'Casa și Banca' }, + { to: '/reports/trial-balance', icon: 'pi pi-calculator', label: 'Balanță' }, + ] + }, + { + title: 'Introduceri Date', + items: [ + { to: '/data-entry', icon: 'pi pi-list', label: 'Lista Bonuri' }, + { to: '/data-entry/create', icon: 'pi pi-plus', label: 'Bon Nou' }, + ] + }, + { + title: 'Sistem', + items: [ + { to: '/reports/telegram', icon: 'pi pi-telegram', label: 'Telegram' }, + { to: '/reports/cache-stats', icon: 'pi pi-chart-bar', label: 'Cache Stats' }, + ] + } +]; +``` + +--- + +## Fișiere de Referință + +### Fișiere Existente (sursă pentru copiere) +- `reports-app/frontend/src/views/*.vue` - Views Reports +- `reports-app/frontend/src/stores/*.js` - Stores Reports +- `reports-app/frontend/src/services/api.js` - API service Reports +- `data-entry-app/frontend/src/views/*.vue` - Views DataEntry +- `data-entry-app/frontend/src/stores/*.js` - Stores DataEntry +- `data-entry-app/frontend/src/services/api.js` - API service DataEntry +- `shared/frontend/components/` - Componente shared (AppHeader, SlideMenu, etc.) +- `shared/frontend/stores/` - Stores shared (auth, companies, accountingPeriod) + +### Configurații de Referință +- `reports-app/frontend/vite.config.js` - Pentru proxy și build config +- `reports-app/frontend/package.json` - Pentru dependencies +- `data-entry-app/frontend/vite.config.js` - Pentru proxy config +- `data-entry-app/frontend/package.json` - Pentru dependencies + +--- + +## URL-uri Finale + +| Path | Descriere | +|------|-----------| +| `/` | Redirect la `/reports/dashboard` | +| `/login` | Pagină login | +| `/reports/dashboard` | Dashboard principal | +| `/reports/invoices` | Facturi | +| `/reports/bank-cash` | Casa și Banca | +| `/reports/trial-balance` | Balanță de Verificare | +| `/reports/telegram` | Telegram Bot | +| `/reports/cache-stats` | Statistici Cache | +| `/data-entry` | Lista Bonuri | +| `/data-entry/create` | Bon Nou | +| `/data-entry/:id` | Detalii Bon | +| `/data-entry/:id/edit` | Editare Bon | + +--- + +## Note Importante + +1. **Backend-urile rămân separate** - port 8001 (Reports) și port 8003 (DataEntry) +2. **IIS proxy routing** - trebuie configurat pentru a ruta API calls corect +3. **Error Boundaries** - critice pentru izolarea modulelor +4. **Lazy Loading** - asigură bundle splitting corect +5. **Feature flags** - permit dezactivarea unui modul fără redeploy + +--- + +## Handover Notes + +Această implementare va înlocui cele 2 aplicații separate cu o aplicație unificată. +După implementare, directoarele `reports-app/frontend/` și `data-entry-app/frontend/` +pot fi arhivate/șterse, păstrând doar `unified-app/`. + +Backend-urile rămân neschimbate în `reports-app/backend/` și `data-entry-app/backend/`. diff --git a/data-entry-app/docs/igiena 14 decembrie five-holding.pdf b/data-entry-app/docs/igiena 14 decembrie five-holding.pdf new file mode 100644 index 0000000..66c5449 --- /dev/null +++ b/data-entry-app/docs/igiena 14 decembrie five-holding.pdf @@ -0,0 +1,2312 @@ +%PDF-1.3 +%âãÏÓ +1 0 obj +<> +endobj +2 0 obj +<> +endobj +3 0 obj +<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> +endobj +4 0 obj<>stream +q 264.0000 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2062 0.0000 0.0000 0.2062 0.0000 0.0000 cm BT +3 Tr +/Ft0 1 Tf +-0.035 Tc +32.688 0 0 45 1.13 3176 Tm +(NDS: ) Tj +40.701 0 0 45 78.57 3176 Tm +(1378448 ) Tj +31.8171 0 0 50 0.67 3128 Tm +(OPERATOR: ) Tj +30.037 0 0 50 173.85 3128 Tm +(DORINA ) Tj +27.8093 0 0 50 301.86 3128 Tm +(ROMULUS ) Tj +0.05 Tc +28.5108 0 0 27.5 -0.89 3064 Tm +(NR ) Tj +31.5197 0 0 27.5 57.85 3064 Tm +(POS:C3POS-CT2 ) Tj +-0.035 Tc +31.7547 0 0 65 263.85 3379 Tm +(BINE ) Tj +29.5748 0 0 65 354.94 3379 Tm +(ATI ) Tj +30.5222 0 0 65 427.92 3379 Tm +(VENIT ) Tj +32.8262 0 0 65 545.76 3379 Tm +(IN ) Tj +26.2087 0 0 65 600.87 3379 Tm +(MAGAZINUL ) Tj +31.8185 0 0 65 772.85 3379 Tm +(BRICK ) Tj +38.7006 0 0 66.2501 458.59 3311 Tm +(CIF: ) Tj +34.7092 0 0 66.2501 538.83 3311 Tm +(RO10562600 ) Tj +33.9852 0 0 57.5 0.64 2939 Tm +(CLIENT ) Tj +36.9025 0 0 57.5 135.6 2939 Tm +(C.U. ) Tj +55.3299 0 0 57.5 214.06 2939 Tm +(1./ ) Tj +43.0693 0 0 57.5 297.54 2939 Tm +(C.1.F. ) Tj +39.9795 0 0 57.5 393.97 2939 Tm +(:R01879855 ) Tj +36.1842 0 0 106.2501 6.68 1674 Tm +(TUTA ) Tj +37.3959 0 0 106.2501 119.78 1674 Tm +(LEI ) Tj +32.3647 0 0 62.5 423.85 3572 Tm +(FIVE-HOLDING ) Tj +37.8406 0 0 62.5 660.3 3572 Tm +(S.A. ) Tj +31.4745 0 0 63.75 316.81 3506 Tm +(JUD. ) Tj +29.6711 0 0 63.75 405.68 3506 Tm +(CONSTANTA, ) Tj +25.1272 0 0 63.75 608.88 3506 Tm +(MUN. ) Tj +28.5198 0 0 63.75 697.7 3506 Tm +(CONSTANTA ) Tj +32.4333 0 0 60 408.4 3443 Tm +(STR. ) Tj +28.3639 0 0 60 504.79 3443 Tm +(ION ) Tj +26.9722 0 0 60 572.87 3443 Tm +(ROATA ) Tj +28.698 0 0 60 681.12 3443 Tm +(NR. ) Tj +0 Tc +60 0 0 60 753.28 3443 Tm +(3 ) Tj +-0.035 Tc +30.3737 0 0 60 2.85 2814 Tm +(BURETE ) Tj +31.3595 0 0 60 135.42 2814 Tm +(SUPRAFETE ) Tj +31.8083 0 0 60 321.84 2814 Tm +(DELICATE ) Tj +31.0879 0 0 60 488.93 2814 Tm +(ARGINTI ) Tj +38.3719 0 0 50 1.94 2754 Tm +(UZ1024010809 ) Tj +39.7992 0 0 50 247.49 2754 Tm +(6422768014664 ) Tj +27.709 0 0 63.75 2.87 2691 Tm +(BANDA ) Tj +28.4138 0 0 63.75 116.86 2691 Tm +(MASCARE ) Tj +29.4468 0 0 63.75 267.82 2691 Tm +(25MNX45M ) Tj +39.0569 0 0 63.75 433.44 2691 Tm +(520703 ) Tj +26.3134 0 0 63.75 561.94 2691 Tm +(ANK ) Tj +36.7077 0 0 48.75 3.78 2632 Tm +(LVO501020402 ) Tj +39.5316 0 0 48.75 248.44 2632 Tm +(5948941004730 ) Tj +29.3877 0 0 61.25 2.86 2568 Tm +(PRONO ) Tj +32.2815 0 0 61.25 117.4 2568 Tm +(SACI ) Tj +32.363 0 0 61.25 225.4 2568 Tm +(SUPER ) Tj +34.2524 0 0 61.25 336.83 2568 Tm +(REZISTENTI ) Tj +45.236 0 0 61.25 537.46 2568 Tm +(35/15 ) Tj +38.5402 0 0 52.5 1.94 2507 Tm +(UZ2210109185 ) Tj +32.6734 0 0 52.5 250.84 2507 Tm +(BKOOO194086 ) Tj +27.9441 0 0 66.2501 3.87 2442 Tm +(PROMO ) Tj +36.4921 0 0 66.2501 124.32 2442 Tm +(SACI ) Tj +31.0004 0 0 66.2501 214.42 2442 Tm +(SUPER ) Tj +35.5626 0 0 66.2501 332.82 2442 Tm +(REZISTENTI ) Tj +42.8552 0 0 66.2501 527.48 2442 Tm +(35/15 ) Tj +38.5402 0 0 52.5 2.94 2383 Tm +(UZ2210109185 ) Tj +32.6734 0 0 52.5 251.84 2383 Tm +(BKOOO194086 ) Tj +30.9161 0 0 61.25 4.85 2316 Tm +(BURETE ) Tj +29.117 0 0 61.25 139.69 2316 Tm +(CANELAT ) Tj +27.9122 0 0 61.25 290.7 2316 Tm +(COLOR ) Tj +34.0652 0 0 61.25 399.81 2316 Tm +(10BUC/SET ) Tj +37.7115 0 0 61.25 582.55 2316 Tm +(33 ) Tj +38.4177 0 0 57.5 6.94 2254 Tm +(UZ102401100109 ) Tj +38.9735 0 0 57.5 290.5 2254 Tm +(6422768022638 ) Tj +31.2182 0 0 62.5 9.85 2188 Tm +(PROSOP ) Tj +34.6149 0 0 62.5 143.84 2188 Tm +(4STR. ) Tj +31.203 0 0 62.5 256.85 2188 Tm +(PROFESIONAL ) Tj +28.578 0 0 62.5 476.47 2188 Tm +(STAR ) Tj +38.4177 0 0 58.75 12.94 2124 Tm +(UZ434101137344 ) Tj +37.4359 0 0 58.75 295.52 2124 Tm +(64256670O0530 ) Tj +33.076 0 0 57.5 14.84 2062 Tm +(HARTIE ) Tj +33.787 0 0 57.5 151.82 2062 Tm +(1GIENICA ) Tj +32.1644 0 0 57.5 315.84 2062 Tm +(BRICK ) Tj +0 Tc +57.5 0 0 57.5 425.31 2062 Tm +(3 ) Tj +-0.035 Tc +29.7474 0 0 57.5 461.45 2062 Tm +(STRATURI ) Tj +37.6085 0 0 58.75 18.94 2000 Tm +(UZ9005335 ) Tj +38.6432 0 0 58.75 208.51 2000 Tm +(6425667001247 ) Tj +32.5007 0 0 58.75 23.84 1941 Tm +(HARTIE ) Tj +34.2 0 0 58.75 159.75 1941 Tm +(IGIENICA ) Tj +31.4727 0 0 58.75 320.85 1941 Tm +(BRICK ) Tj +0 Tc +58.75 0 0 58.75 429.29 1941 Tm +(3 ) Tj +-0.035 Tc +29.3131 0 0 58.75 464.46 1941 Tm +(STRATURI ) Tj +36.7288 0 0 42.5 21.95 1894 Tm +(UZ9005335 ) Tj +37.9827 0 0 42.5 209.52 1894 Tm +(6425667001247 ) Tj +30.5764 0 0 46.25 13.43 1841 Tm +(SUBTOTAL ) Tj +29.4406 0 0 57.5 4.69 1536 Tm +(CARD ) Tj +33.409 0 0 51.25 3.83 1479 Tm +(REST ) Tj +30.1519 0 0 53.75 5.73 1365 Tm +(TOTAL ) Tj +28.4619 0 0 53.75 122.75 1365 Tm +(TUA ) Tj +0.0299 Tc +53.75 0 0 53.75 198.88 1365 Tm +(A-) Tj +-0.035 Tc +32.1083 0 0 53.75 275.8 1365 Tm +(21% ) Tj +30.4727 0 0 51.25 5.73 1304 Tm +(TOTAL ) Tj +28.9701 0 0 51.25 121.74 1304 Tm +(TUA ) Tj +28.2402 0 0 51.25 198.86 1304 Tm +(BON ) Tj +31.249 0 0 50 6.13 1248 Tm +(NR. ) Tj +33.2069 0 0 50 83.84 1248 Tm +(POZ. ) Tj +31.8175 0 0 50 179.93 1248 Tm +(ART. ) Tj +31.8315 0 0 50 280.77 1248 Tm +(IN ) Tj +29.6408 0 0 50 331.86 1248 Tm +(BON: ) Tj +41.115 0 0 51.25 10.85 633 Tm +(Z:0217 ) Tj +40.7052 0 0 51.25 141.8 633 Tm +(BF:0126 ) Tj +43.7682 0 0 63.75 17.68 559 Tm +(ID ) Tj +34.816 0 0 63.75 67.83 559 Tm +(BF: ) Tj +-0.0088 Tc +37.5 0 0 37.5 9.3 449 Tm +(S/N:DB4700011007 ) Tj +-0.035 Tc +33.965 0 0 52.5 9.64 382 Tm +(CASIER ) Tj +44.7362 0 0 52.5 143.43 382 Tm +(1: ) Tj +34.631 0 0 42.5 442.63 827 Tm +(C3POS-CT2N1378448 ) Tj +0 Tc +65 0 0 65 835.72 2745 Tm +(1 ) Tj +-0.035 Tc +25.479 0 0 65 854.88 2745 Tm +(BUC ) Tj +0 Tc +65 0 0 65 926.86 2745 Tm +(X ) Tj +-0.035 Tc +45.643 0 0 65 961.45 2745 Tm +(3.99-) Tj +42.286 0 0 65 1074.49 2745 Tm +(3.99 ) Tj +0 Tc +65 0 0 65 1164.85 2745 Tm +(A ) Tj +63.75 0 0 63.75 839.76 2625 Tm +(1 ) Tj +-0.035 Tc +24.9694 0 0 63.75 856.88 2625 Tm +(BUC ) Tj +0 Tc +63.75 0 0 63.75 926.86 2625 Tm +(X ) Tj +-0.035 Tc +44.5517 0 0 63.75 962.2 2625 Tm +(8.14-) Tj +42.2387 0 0 63.75 1074.24 2625 Tm +(8.14 ) Tj +0 Tc +63.75 0 0 63.75 1165.86 2625 Tm +(A ) Tj +-0.035 Tc +25.2676 0 0 57.5 516.88 326 Tm +(BON ) Tj +28.5644 0 0 57.5 588.87 326 Tm +(FISCAL. ) Tj +0 Tc +61.25 0 0 61.25 479.61 265 Tm +(2 ) Tj +-0.035 Tc +37.7675 0 0 61.25 510.56 265 Tm +(9000221498 ) Tj +0 Tc +61.25 0 0 61.25 831.85 2506 Tm +(1 ) Tj +-0.035 Tc +30.5124 0 0 61.25 857.43 2506 Tm +(SET ) Tj +0 Tc +61.25 0 0 61.25 928.87 2506 Tm +(X ) Tj +-0.035 Tc +40.2265 0 0 61.25 964.27 2506 Tm +(8.37= ) Tj +41.6176 0 0 61.25 1075.25 2506 Tm +(8,37 ) Tj +0 Tc +61.25 0 0 61.25 1167.86 2506 Tm +(A ) Tj +62.5 0 0 62.5 841.81 2381 Tm +(1 ) Tj +-0.035 Tc +33.5038 0 0 62.5 867.38 2381 Tm +(SET ) Tj +0 Tc +62.5 0 0 62.5 930.87 2381 Tm +(X ) Tj +-0.035 Tc +40.2265 0 0 62.5 966.27 2381 Tm +(8.37= ) Tj +41.6176 0 0 62.5 1078.25 2381 Tm +(8.37 ) Tj +0 Tc +62.5 0 0 62.5 1169.86 2381 Tm +(A ) Tj +65 0 0 65 806.72 2252 Tm +(1 ) Tj +-0.035 Tc +25.9886 0 0 65 821.88 2252 Tm +(BUC ) Tj +0 Tc +65 0 0 65 895.86 2252 Tm +(X ) Tj +-0.035 Tc +44.5092 0 0 65 929.44 2252 Tm +(10.49-) Tj +42.6764 0 0 65 1058.5 2252 Tm +(10.49 ) Tj +0 Tc +65 0 0 65 1169.85 2252 Tm +(A ) Tj +63.75 0 0 63.75 796.76 2129 Tm +(1 ) Tj +-0.035 Tc +25.9886 0 0 63.75 820.88 2129 Tm +(BUC ) Tj +0 Tc +63.75 0 0 63.75 893.86 2129 Tm +(X ) Tj +-0.035 Tc +44.0812 0 0 63.75 927.46 2129 Tm +(19.55-) Tj +42.6764 0 0 63.75 1055.5 2129 Tm +(19,55 ) Tj +0 Tc +63.75 0 0 63.75 1164.86 2129 Tm +(A ) Tj +61.25 0 0 61.25 802.85 2007 Tm +(1 ) Tj +-0.035 Tc +25.9886 0 0 61.25 818.88 2007 Tm +(BUC ) Tj +0 Tc +61.25 0 0 61.25 890.87 2007 Tm +(X ) Tj +-0.035 Tc +43.6533 0 0 61.25 924.47 2007 Tm +(13.54-) Tj +42.6764 0 0 61.25 1050.5 2007 Tm +(13.54 ) Tj +0 Tc +61.25 0 0 61.25 1156.86 2007 Tm +(A ) Tj +51.25 0 0 51.25 794.2 1896 Tm +(1 ) Tj +-0.035 Tc +27.0078 0 0 51.25 817.87 1896 Tm +(BUC ) Tj +0 Tc +51.25 0 0 51.25 890.89 1896 Tm +(X ) Tj +-0.035 Tc +39.7414 0 0 51.25 924.61 1896 Tm +(13.54= ) Tj +43.6575 0 0 51.25 1050.47 1896 Tm +(13.54 ) Tj +0 Tc +51.25 0 0 51.25 1158.88 1896 Tm +(A ) Tj +-0.035 Tc +29.0011 0 0 55 331.86 521 Tm +(DATA: ) Tj +41.8264 0 0 55 440.53 521 Tm +(14-12-2025 ) Tj +28.3217 0 0 55 639.71 521 Tm +(ORA: ) Tj +42.9331 0 0 55 727.5 521 Tm +(13:02:56 ) Tj +43.3757 0 0 46.25 1092.22 1838 Tm +(85.99 ) Tj +43.3757 0 0 47.5 1095.22 1540 Tm +(85.99 ) Tj +43.1195 0 0 51.25 1114.54 1479 Tm +(0.00 ) Tj +24.9575 0 0 61.25 277.94 209 Tm +(VA ) Tj +25.1488 0 0 61.25 333.88 209 Tm +(RUGAM ) Tj +28.1352 0 0 61.25 444.48 209 Tm +(SA ) Tj +30.1242 0 0 61.25 498.85 209 Tm +(PASTRATI ) Tj +25.6067 0 0 61.25 659.88 209 Tm +(BONUL ) Tj +31.0688 0 0 61.25 764.85 209 Tm +(FISCAL ) Tj +0 Tc +61.25 0 0 61.25 888.96 209 Tm +(! ) Tj +-0.035 Tc +27.9179 0 0 60 221.93 145 Tm +(VOCEA ) Tj +33.798 0 0 60 334.64 145 Tm +(CLIENTULU|: ) Tj +37.6326 0 0 60 552.6 145 Tm +(08008 ) Tj +30.9568 0 0 60 659.85 145 Tm +(BRICK: ) Tj +37.0975 0 0 60 782.6 145 Tm +(0800827425 ) Tj +35.7981 0 0 67.5001 241.68 76 Tm +(TIPARIT ) Tj +31.3527 0 0 67.5001 391.84 76 Tm +(DIN ) Tj +32.6962 0 0 67.5001 471.65 76 Tm +(COGITO ) Tj +29.7288 0 0 67.5001 590.82 76 Tm +(ERP ) Tj +52.1135 0 0 67.5001 661.8 76 Tm +(W. ) Tj +30.2193 0 0 67.5001 730.68 76 Tm +(COGI ) Tj +32.8611 0 0 67.5001 805.71 76 Tm +(TO-ERP.RO ) Tj +44.148 0 0 51.25 1093.45 1362 Tm +(14.92 ) Tj +43.167 0 0 51.25 1092.49 1304 Tm +(14.92 ) Tj +-0.0276 Tc +37.5 0 0 37.5 604.56 593 Tm +(90002214982025121413025602170126 ) Tj +0 Tc +42.5 0 0 42.5 1162.23 1253 Tm +(8 ) Tj +-0.035 Tc +28.0603 0 0 56.25 958.12 651 Tm +(NR. ) Tj +32.5071 0 0 56.25 1011.93 651 Tm +(AMEF:0001 ) Tj +30.2126 0 0 47.5 974.73 471 Tm +(TD: ) Tj +38.303 0 0 47.5 1028.59 471 Tm +(00046924 ) Tj +31.5815 0 0 53.75 1029.66 409 Tm +(CASIER ) Tj +0 Tc +53.75 0 0 53.75 1154.12 409 Tm +(1 ) Tj +ET + Q +endstream +endobj +5 0 obj +<>stream + JFIF + + ++&.%#%.&D5//5DNB>BN_UU_wqw + + ++&.%#%.&D5//5DNB>BN_UU_wqw " 1 ~sxߺh@<@XkrZ*#|8H^+A0گZJJEzD֤ղFZ=kJzh%҉rCF=zV.J)z~Zyy:l慫Sʉ|%`5=p_]JpXxz.o;KJм-j^hMkbV(D5R0"CҴZ:z5cK"=vEM\w->OZ+eh!iEKE$3Ũba\"Aʗ@- +Ujע pUY5\`Q Ȣ,Drkr[[]\/N=l*I!-ʲH+,aج
{{ error.message }}