Optimize PDF export layout with compact columns and more space for partner names. Add accounting period display to invoices matching Trial Balance format. Fix date filtering to use local timezone instead of UTC. Update invoice ordering to chronological sequence (DATAACT, NRACT, NUME). **Backend changes:** - Add accounting period query from calendar table - Add currency (valuta) and cont filter support - Change invoice ordering to chronological (DATAACT ASC, NRACT ASC, NUME) - Add accounting_period field to InvoiceListResponse model **Frontend changes:** - Optimize PDF column widths (37% for partner names, compact numeric columns) - Add custom column width support in exportUtils - Fix date conversion from UTC to local timezone (prevents day shift) - Add accounting period display in PDF exports - Enhance E2E test coverage **Cleanup:** - Remove obsolete Trial Balance feature documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
ROA Reports Frontend
Vue.js 3 frontend application for the ROA2WEB reports system.
🚀 Features
- Vue.js 3 with Composition API
- PrimeVue UI components with Aura theme
- Pinia for state management
- Vue Router with navigation guards
- Axios for API communication
- Responsive design for mobile and desktop
- JWT Authentication with token refresh
- TypeScript-ready architecture
📁 Project Structure
src/
├── main.js # Application entry point
├── App.vue # Root component
├── assets/
│ ├── css/
│ │ ├── global.css # Global styles and utilities
│ │ └── mobile.css # Mobile-specific styles
│ └── images/ # Static images
├── components/ # Reusable components
│ ├── layout/ # Layout components
│ ├── reports/ # Report-specific components
│ └── ui/ # Generic UI components
├── composables/ # Vue composables
│ ├── index.js # Composables exports
│ └── useResponsive.js # Responsive design utilities
├── router/
│ └── index.js # Vue Router configuration
├── services/
│ ├── api.js # API service with interceptors
│ └── index.js # Services exports
├── stores/ # Pinia stores
│ ├── auth.js # Authentication store
│ ├── companies.js # Companies management
│ ├── invoices.js # Invoices store
│ ├── payments.js # Payments store
│ └── index.js # Stores exports
├── utils/ # Utility functions
│ └── index.js # Utils exports
└── views/ # Page components
├── LoginView.vue # Authentication page
├── DashboardView.vue # Main dashboard
├── InvoicesView.vue # Invoices management
└── PaymentsView.vue # Payments management
🛠️ Development Setup
Prerequisites
- Node.js 16+ and npm 8+
- ROA2WEB Backend running on
http://localhost:8000
Installation
# Navigate to frontend directory
cd roa2web/reports-app/frontend/
# Install dependencies
npm install
# Start development server
npm run dev
# Application will be available at http://localhost:3000
Development Commands
# Development server with hot reload
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview
# Lint code
npm run lint
# Format code
npm run format
🔧 Configuration
Environment Variables
Create a .env file in the frontend directory:
# API Configuration
VITE_API_BASE_URL=http://localhost:8000/api
VITE_APP_TITLE=ROA Reports
VITE_APP_VERSION=1.0.0
# Development
VITE_DEV_MODE=true
VITE_LOG_LEVEL=debug
API Integration
The frontend communicates with the FastAPI backend through:
- Base URL:
/api(proxied tohttp://localhost:8000in development) - Authentication: JWT tokens with automatic refresh
- Error Handling: Global interceptors for error management
- Loading States: Integrated with Pinia stores
Responsive Design
The application uses a mobile-first approach with breakpoints:
- xs: < 640px (Small phones)
- sm: 640px+ (Large phones)
- md: 768px+ (Tablets)
- lg: 1024px+ (Desktop)
- xl: 1280px+ (Large desktop)
- 2xl: 1536px+ (Extra large)
🎨 UI Components
PrimeVue Components Used
- Navigation: Menubar, Menu
- Forms: InputText, Password, Dropdown, Calendar
- Data: DataTable, Column, Paginator
- Feedback: Toast, ConfirmDialog, ProgressSpinner
- Layout: Card, Badge, Tag, Button
- Overlay: Dialog
Custom Styling
- Global utilities in
global.css - Mobile optimizations in
mobile.css - Responsive composables for dynamic behavior
- CSS custom properties for consistent theming
📱 Mobile Features
- Touch-friendly interface with 44px minimum touch targets
- Swipe gestures support (prepared for future implementation)
- Responsive tables that stack on mobile
- Mobile navigation with hamburger menu
- Optimized forms with proper input types
- Accessible design following WCAG guidelines
🔐 Authentication
Login Flow
- User submits credentials to
/auth/login - Backend returns access and refresh tokens
- Tokens stored in localStorage
- API requests include JWT token in Authorization header
- Automatic token refresh on expiration
Route Protection
- Public routes:
/login - Protected routes: All others require authentication
- Navigation guards handle redirects
- Auto-logout on token expiry
📊 State Management
Pinia Stores
Auth Store (useAuthStore)
// Authentication state and actions
const authStore = useAuthStore()
authStore.login(credentials)
authStore.logout()
authStore.isAuthenticated
Companies Store (useCompanyStore)
// Company selection and management
const companyStore = useCompanyStore()
companyStore.loadCompanies()
companyStore.setSelectedCompany(company)
companyStore.selectedCompany
Invoices Store (useInvoicesStore)
// Invoice data and filtering
const invoicesStore = useInvoicesStore()
invoicesStore.loadInvoices(companyCode, filters)
invoicesStore.setFilters(newFilters)
invoicesStore.invoiceList
Payments Store (usePaymentsStore)
// Payment data and statistics
const paymentsStore = usePaymentsStore()
paymentsStore.loadPayments(companyCode, filters)
paymentsStore.totalAmount
paymentsStore.paymentList
🧩 Composables
useResponsive
const { isMobile, isTablet, isDesktop, screenSize } = useResponsive()
useResponsiveTable
const { shouldStackTable, defaultRows, getMobileColumns } = useResponsiveTable()
useResponsiveForm
const { shouldStackButtons, getFormClass } = useResponsiveForm()
useMobileNav
const { isMenuOpen, toggleMenu, closeMenu } = useMobileNav()
🚀 Production Build
Build Process
# Create production build
npm run build
# Build outputs to dist/ directory
# Static files ready for web server deployment
Build Optimization
- Code splitting for vendor libraries
- Tree shaking for unused code elimination
- Asset optimization with Vite
- Modern JS with automatic fallbacks
- Gzip compression ready
Deployment
The production build creates static files that can be served by:
- Nginx (recommended for production)
- Apache with URL rewriting
- Node.js static server
- CDN with SPA support
🔍 Debugging
Development Tools
- Vue DevTools browser extension
- Pinia DevTools for state inspection
- Network tab for API debugging
- Console logging with environment-based levels
Common Issues
- CORS errors: Ensure backend allows frontend origin
- 401 errors: Check token expiration and refresh logic
- Loading states: Verify store loading flags
- Responsive issues: Test with browser dev tools
📋 Testing
E2E Tests with Playwright
# Run all E2E tests (headless)
npm run test:e2e
# Run with browser UI visible
npm run test:e2e:headed
# Debug mode with step-through
npm run test:e2e:debug
# Interactive UI mode
npm run test:e2e:ui
# View test report
npm run test:e2e:report
Test Structure:
- Uses Page Object Model pattern
- Tests organized by feature:
tests/e2e/{auth,dashboard,invoices,payments,responsive}/ - Page objects in
tests/page-objects/ - Mocks all backend API calls for speed and reliability
See tests/README.md for detailed testing guide.
Testing on Real Android Devices
For accurate mobile testing, you can test the application on a real Android phone using ADB WiFi and Chrome DevTools MCP.
Quick Setup (Windows PowerShell):
# 1. Connect phone via WiFi (first time pairing)
adb pair 10.0.20.114:PAIRING_PORT # Use pairing code from phone
adb connect 10.0.20.114:MAIN_PORT # Connect to wireless debugging port
# 2. Run automated setup script
cd E:\proiecte\roa2web\roa2web\reports-app\frontend\scripts
.\android-test-setup.ps1
Start Application (WSL):
# Start backend and frontend
cd /mnt/e/proiecte/roa2web/roa2web
./start-dev.sh
# On phone Chrome: http://localhost:3000
Cleanup (WSL):
# Remove port forwarding when done
./scripts/android-disconnect.sh
Advantages over emulation:
- [OK] Real device performance and rendering
- [OK] Actual touch interactions
- [OK] True mobile experience on real hardware
- [OK] Claude Code can control your phone directly through MCP
- [OK] Screenshot capture from real device
Architecture:
- ADB WiFi connection (Android 10+) - no USB cable needed
- Windows PowerShell for all ADB operations (WSL cannot access Android devices)
- Multi-layer port forwarding: ADB forward + Windows port proxy + Firewall rules
- Chrome DevTools MCP configured with physical Windows IP (not localhost!)
Complete Guides:
- Quick Start (5 minutes):
ANDROID_QUICK_START.md - Full Setup Guide:
tests/ANDROID_TESTING_GUIDE.md - Scripts Documentation:
scripts/README_ANDROID.md
Requirements:
- Android phone (Android 10+) with Wireless Debugging
- Windows 10/11 with PowerShell
- ADB Platform Tools (install via
winget install Google.PlatformTools) - Phone and PC on same WiFi network
- Chrome DevTools MCP server configured in Claude Code
Unit Tests (Future Implementation)
# Unit tests with Vitest
npm run test
# Component tests
npm run test:component
🔄 API Endpoints
Authentication
POST /auth/login- User loginPOST /auth/refresh- Token refreshPOST /auth/logout- User logout
Companies
GET /companies- List user companies
Invoices
GET /invoices/{company_code}- Get company invoicesGET /invoices/{company_code}/{invoice_id}- Get invoice details
Payments
GET /payments/{company_code}- Get company paymentsGET /payments/{company_code}/{payment_id}- Get payment details
🎯 Browser Support
- Chrome 88+
- Firefox 84+
- Safari 14+
- Edge 88+
- Mobile browsers (iOS Safari 14+, Chrome Mobile 88+)
📝 Development Guidelines
Code Style
- Use Composition API for new components
- Follow Vue 3 best practices
- Use TypeScript-style prop definitions
- Implement responsive design patterns
Component Structure
<template>
<!-- Template with semantic HTML -->
</template>
<script setup>
// Composition API with proper imports
// Props, emits, lifecycle hooks
// Computed properties and methods
</script>
<style scoped>
/* Scoped styles with CSS custom properties */
/* Responsive breakpoints */
</style>
Performance
- Use v-memo for expensive renders
- Implement virtual scrolling for large lists
- Lazy load images and components
- Code split routes and features
ROA2WEB Frontend - Vue.js 3 application for modern ERP reporting