After database verification, VBAL is a VIEW (not a table) that exists
in each company schema with a different structure than initially assumed.
Backend Changes:
- Updated models (trial_balance.py):
- Changed column names to match real VBAL VIEW
- CONT (account number)
- DENUMIRE (account description, not DCONT)
- PRECDEB/PRECCRED (previous balance, not SD_PREC/SC_PREC)
- RULDEB/RULCRED (monthly movement, not RD_LUNA/RC_LUNA)
- SOLDDEB/SOLDCRED (final balance, not SD_FINAL/SC_FINAL)
- Made DENUMIRE optional (can be NULL in VIEW)
- Updated router (trial_balance.py):
- Removed COD_FIRMA filter (not in VIEW)
- Query now uses: {schema}.VBAL WHERE AN = :an AND LUNA = :luna
- Fixed column names in SELECT (DENUMIRE instead of DCONT)
- Updated sort columns validation
- Fixed result processing to match new column order
Frontend Changes:
- Updated TrialBalanceView.vue:
- Changed field from 'dcont' to 'denumire' in DataTable column
Database Verification:
- VBAL VIEW confirmed in ROMFAST schema (24,217 records)
- Current data available up to November 2025
- Structure verified with 22 columns
- VIEW exists in all company schemas
Testing Notes:
- Backend endpoint ready for testing
- Frontend field names now match API response
- Ready for manual testing with real company data
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
17 KiB
Feature: Balanță de Verificare Sintetică (Trial Balance)
Branch: feature/trial-balance
Status: 📋 Planning
Created: 2025-11-20
Assigned to: Claude Code
📋 Overview
Implementare pagină nouă în frontend pentru afișarea balanței de verificare sintetice simplificate din tabelul Oracle VBAL, cu filtrare dinamică și integrare completă în aplicație.
🎯 Business Requirements
Functional Requirements
-
Afișare Date Balanță de Verificare:
- Solduri precedente (debit/credit)
- Rulaje lunare (debit/credit)
- Solduri finale (debit/credit)
- Cont contabil (cod)
- Denumire cont
-
Filtrare și Căutare:
- Filtrare după număr cont (ex: "512", "4111")
- Filtrare după denumire cont (căutare parțială, case-insensitive)
- Filtrare combinată (și după cont și după denumire)
- Clear filters option
-
Navigare și UX:
- Adăugare în meniul hamburger (secțiune Rapoarte / Reports)
- Ordonare pe coloane (ascendent/descendent)
- Paginare pentru volume mari de date
- Loading states și error handling
- Responsive design (mobile-friendly)
-
Date Contextualizate:
- Afișare pentru compania activă curentă
- Afișare pentru luna/anul curent (sau filtru de perioadă - opțional faza 2)
Non-Functional Requirements
- Performance: Răspuns API < 2s pentru 10,000 înregistrări
- Security: Autentificare JWT obligatorie
- Accessibility: Conform design system existent
- CSS: Respectare strictă a arhitecturii CSS (ONBOARDING_CSS.md, CSS_PATTERNS.md)
🏗️ Technical Architecture
Database Schema (Oracle VBAL table)
-- Structura tabelului VBAL (să fie verificată în Oracle)
SELECT
CONT, -- Număr cont contabil
DCONT, -- Denumire cont
SD_PREC, -- Sold precedent debit
SC_PREC, -- Sold precedent credit
RD_LUNA, -- Rulaj lunar debit
RC_LUNA, -- Rulaj lunar credit
SD_FINAL, -- Sold final debit
SC_FINAL, -- Sold final credit
COD_FIRMA, -- Cod firmă (pentru filtering)
LUNA, -- Luna (1-12)
AN -- An
FROM VBAL
WHERE COD_FIRMA = :cod_firma
AND AN = :an
AND LUNA = :luna
AND (CONT LIKE :cont_filter OR DCONT LIKE :denumire_filter)
ORDER BY CONT
Backend API Endpoint
Endpoint: GET /api/trial-balance
Request Parameters:
{
"cod_firma": "string (required, from JWT)",
"luna": "integer (1-12, optional, default: current month)",
"an": "integer (optional, default: current year)",
"cont_filter": "string (optional, partial match)",
"denumire_filter": "string (optional, partial match, case-insensitive)",
"sort_by": "string (optional, default: 'CONT')",
"sort_order": "string (optional, 'asc' | 'desc', default: 'asc')",
"page": "integer (optional, default: 1)",
"page_size": "integer (optional, default: 50)"
}
Response:
{
"success": true,
"data": {
"items": [
{
"cont": "4111",
"dcont": "Furnizori interni",
"sold_precedent_debit": 0.00,
"sold_precedent_credit": 15000.00,
"rulaj_lunar_debit": 5000.00,
"rulaj_lunar_credit": 8000.00,
"sold_final_debit": 0.00,
"sold_final_credit": 18000.00
}
],
"pagination": {
"total_items": 150,
"total_pages": 3,
"current_page": 1,
"page_size": 50
},
"filters_applied": {
"luna": 11,
"an": 2025,
"cont_filter": null,
"denumire_filter": "furnizori"
}
}
}
Error Responses:
401 Unauthorized: Missing/invalid JWT token403 Forbidden: User doesn't have access to company500 Internal Server Error: Database connection/query error
Frontend Architecture
Location: reports-app/frontend/src/views/TrialBalanceView.vue
Store: reports-app/frontend/src/stores/trialBalanceStore.js
Route: /trial-balance (added to router/index.js)
Menu Integration:
- Add to hamburger menu in
src/components/layout/HamburgerMenu.vue - Section: "Rapoarte" / "Reports"
- Icon: Calculator/Table icon (PrimeVue icon)
- Label: "Balanță de Verificare"
Component Structure:
<template>
<div class="trial-balance-view">
<!-- Page Header -->
<div class="roa-page-header">
<h1>Balanță de Verificare</h1>
<p class="roa-subtitle">Luna: {{ currentMonth }}/{{ currentYear }}</p>
</div>
<!-- Filters Section -->
<div class="roa-card roa-filters-card">
<!-- Cont filter -->
<!-- Denumire filter -->
<!-- Clear filters button -->
</div>
<!-- Data Table -->
<div class="roa-card">
<DataTable
:value="trialBalanceData"
:loading="loading"
paginator
:rows="50"
sortField="cont"
:sortOrder="1"
>
<!-- Columns definition -->
</DataTable>
</div>
<!-- Empty State / Error State -->
</div>
</template>
CSS Patterns to Use:
.roa-page-header- Page header (CSS_PATTERNS.md).roa-card- Card container (CSS_PATTERNS.md).roa-filters-card- Filters section (CSS_PATTERNS.md)- Design tokens from DESIGN_TOKENS.md (colors, spacing)
- NO
:deep()- Usesrc/assets/css/vendor/primevue/datatable.cssfor PrimeVue overrides
State Management (Pinia store):
// src/stores/trialBalanceStore.js
export const useTrialBalanceStore = defineStore('trialBalance', {
state: () => ({
trialBalanceData: [],
loading: false,
error: null,
filters: {
cont: '',
denumire: '',
luna: new Date().getMonth() + 1,
an: new Date().getFullYear()
},
pagination: {
totalItems: 0,
currentPage: 1,
pageSize: 50
}
}),
actions: {
async fetchTrialBalance() { /* ... */ },
async applyFilters(filters) { /* ... */ },
clearFilters() { /* ... */ }
}
})
📝 Implementation Plan (Phases)
✅ Phase 0: Preparation & Branch Setup
Status: 🔲 Not Started
Tasks:
- Create feature branch
feature/trial-balancefrommain - Verify Oracle
VBALtable structure and test queries - Review existing code patterns (InvoicesView, DashboardView)
- Read CSS documentation (ONBOARDING_CSS.md, CSS_PATTERNS.md)
Estimated Time: 30 minutes
✅ Phase 1: Backend API Implementation
Status: 🔲 Not Started
Tasks:
- Create Pydantic schema:
backend/app/schemas/trial_balance.pyTrialBalanceItemmodelTrialBalanceRequestmodelTrialBalanceResponsemodel
- Create router:
backend/app/routers/trial_balance.pyGET /api/trial-balanceendpoint- Query parameters validation
- Oracle stored procedure/query execution
- Pagination logic
- Filtering logic (cont, denumire)
- Sorting logic
- Register router in
backend/app/main.py - Test endpoint manually with Postman/curl
- Test with valid JWT token
- Test filtering by cont
- Test filtering by denumire
- Test pagination
- Test sorting
- Test error cases (invalid token, DB errors)
Files to Create/Modify:
reports-app/backend/app/schemas/trial_balance.py(NEW)reports-app/backend/app/routers/trial_balance.py(NEW)reports-app/backend/app/main.py(MODIFY)
Acceptance Criteria:
- ✅ API returns correct data from
VBALtable - ✅ Filtering works for cont and denumire
- ✅ Pagination returns correct page counts
- ✅ Sorting works for all columns
- ✅ Proper error handling and status codes
Estimated Time: 2-3 hours
✅ Phase 2: Frontend Store Implementation
Status: 🔲 Not Started
Tasks:
- Create Pinia store:
frontend/src/stores/trialBalanceStore.js- State definition (data, loading, error, filters, pagination)
fetchTrialBalance()action with AxiosapplyFilters()actionclearFilters()action- Getters for computed values
- Add API service:
frontend/src/services/trialBalanceService.js(optional) - Test store in browser DevTools
Files to Create:
reports-app/frontend/src/stores/trialBalanceStore.js(NEW)reports-app/frontend/src/services/trialBalanceService.js(NEW, optional)
Acceptance Criteria:
- ✅ Store successfully fetches data from API
- ✅ Filters update correctly
- ✅ Loading states work properly
- ✅ Error handling displays user-friendly messages
Estimated Time: 1-2 hours
✅ Phase 3: Frontend View Component
Status: 🔲 Not Started
Tasks:
- Create Vue component:
frontend/src/views/TrialBalanceView.vue- Page header with title and period info
- Filters card (cont input, denumire input, clear button)
- PrimeVue DataTable with columns:
- Cont
- Denumire Cont
- Sold Precedent (Debit/Credit)
- Rulaj Lunar (Debit/Credit)
- Sold Final (Debit/Credit)
- Loading spinner
- Empty state (no data)
- Error state
- Use existing CSS patterns (NO new custom CSS unless necessary)
.roa-page-header.roa-card.roa-filters-card- Design tokens (spacing, colors)
- Implement responsive design (mobile breakpoints)
- Add number formatting (Romanian locale, 2 decimals)
Files to Create:
reports-app/frontend/src/views/TrialBalanceView.vue(NEW)
Acceptance Criteria:
- ✅ Page displays correctly with data
- ✅ Filters work and update table
- ✅ Sorting on columns works
- ✅ Pagination works
- ✅ Loading/error states display correctly
- ✅ CSS follows design system (NO
:deep(), NO custom colors) - ✅ Responsive on mobile devices
Estimated Time: 3-4 hours
✅ Phase 4: Routing & Navigation
Status: 🔲 Not Started
Tasks:
- Add route in
frontend/src/router/index.js:{ path: '/trial-balance', name: 'TrialBalance', component: () => import('@/views/TrialBalanceView.vue'), meta: { requiresAuth: true } } - Add menu item in
frontend/src/components/layout/HamburgerMenu.vue:- Section: "Rapoarte"
- Icon:
pi-calculatororpi-table - Label: "Balanță de Verificare"
- Route:
/trial-balance
- Test navigation from menu
Files to Modify:
reports-app/frontend/src/router/index.js(MODIFY)reports-app/frontend/src/components/layout/HamburgerMenu.vue(MODIFY)
Acceptance Criteria:
- ✅ Route is accessible at
/trial-balance - ✅ Menu item appears in hamburger menu
- ✅ Clicking menu item navigates to page
- ✅ Auth guard prevents unauthorized access
Estimated Time: 30 minutes
✅ Phase 5: Testing & Refinement
Status: 🔲 Not Started
Tasks:
- Manual testing:
- Test with different companies
- Test with different date ranges
- Test filtering edge cases (empty results, special characters)
- Test sorting on all columns
- Test pagination with large datasets
- Test on mobile devices (responsive)
- Test error scenarios (API down, invalid token)
- Add Playwright E2E tests (optional, recommended):
frontend/tests/e2e/trial-balance/trial-balance.spec.js- Test navigation
- Test filtering
- Test data display
- Code review & refinement:
- Check CSS adherence (no
:deep(), use patterns) - Check error handling
- Check loading states
- Check accessibility (keyboard navigation, screen readers)
- Check CSS adherence (no
- Performance testing:
- Test with 10,000+ rows
- Check API response time
- Check frontend rendering performance
Files to Create (optional):
reports-app/frontend/tests/e2e/trial-balance/trial-balance.spec.js(NEW)
Acceptance Criteria:
- ✅ All manual tests pass
- ✅ E2E tests pass (if implemented)
- ✅ Performance benchmarks met (API < 2s)
- ✅ Code follows project conventions
- ✅ CSS follows design system strictly
Estimated Time: 2-3 hours
✅ Phase 6: Documentation & PR
Status: 🔲 Not Started
Tasks:
- Update
README.md- add Trial Balance to features list - Update
CLAUDE.md- add Trial Balance to documentation index (if needed) - Add API documentation in backend README
- Create PR from
feature/trial-balancetomain:- Title: "feat: Add Trial Balance (Balanță de Verificare) page"
- Description: Link to this feature file, list phases completed
- Screenshots of UI
- API endpoint documentation
- Request code review
- Address review comments
- Merge to
main
Acceptance Criteria:
- ✅ All documentation updated
- ✅ PR created with complete description
- ✅ Code review approved
- ✅ Branch merged successfully
Estimated Time: 1 hour
📊 Progress Tracking
Overall Progress
- Phase 0: 🔲 Not Started (0%)
- Phase 1: 🔲 Not Started (0%)
- Phase 2: 🔲 Not Started (0%)
- Phase 3: 🔲 Not Started (0%)
- Phase 4: 🔲 Not Started (0%)
- Phase 5: 🔲 Not Started (0%)
- Phase 6: 🔲 Not Started (0%)
Total Progress: 0% Complete
Status Legend
- 🔲 Not Started
- 🔄 In Progress
- ✅ Completed
- ⚠️ Blocked
- ❌ Cancelled
🚀 Getting Started
Prerequisites
- SSH tunnel running (
./ssh_tunnel.sh status) - Backend running (
cd reports-app/backend && uvicorn app.main:app --reload --port 8001) - Frontend running (
cd reports-app/frontend && npm run dev) - Valid JWT token for testing API
Starting Development
# 1. Create feature branch
git checkout main
git pull origin main
git checkout -b feature/trial-balance
# 2. Verify Oracle VBAL table
# Connect to Oracle and run:
# SELECT * FROM VBAL WHERE ROWNUM <= 10;
# 3. Start backend (Phase 1)
cd reports-app/backend
# Create schemas/trial_balance.py
# Create routers/trial_balance.py
# Test with curl/Postman
# 4. Start frontend (Phases 2-4)
cd reports-app/frontend
# Create stores/trialBalanceStore.js
# Create views/TrialBalanceView.vue
# Update router and menu
# 5. Test and refine (Phase 5)
# Manual testing
# E2E tests (optional)
# 6. Create PR (Phase 6)
git add .
git commit -m "feat: Add Trial Balance page with filtering and pagination"
git push origin feature/trial-balance
# Create PR on GitHub/GitLab
📚 Reference Documentation
MUST READ before coding:
docs/ONBOARDING_CSS.md- CSS quick start (5 min read)docs/CSS_PATTERNS.md- All available CSS patternsdocs/DESIGN_TOKENS.md- Colors, spacing, typographyreports-app/frontend/README.md- Frontend architecturereports-app/backend/README.md- Backend architecture
Similar implementations to reference:
reports-app/frontend/src/views/InvoicesView.vue- Table + filters patternreports-app/frontend/src/views/DashboardView.vue- Cards + data displayreports-app/backend/app/routers/invoices.py- API with filtering/pagination
⚠️ Important Notes
CSS Architecture Compliance
CRITICAL: This feature MUST follow the established CSS architecture:
✅ DO:
- Use existing
.roa-*patterns fromCSS_PATTERNS.md - Use design tokens (
var(--color-primary),var(--spacing-4)) - Use vendor overrides in
src/assets/css/vendor/primevue/for PrimeVue - Keep component styles minimal and semantic
- Follow BEM naming if creating new components
❌ DON'T:
- Use
:deep()in Vue components - Hardcode colors or spacing values
- Duplicate existing patterns
- Create custom CSS without checking patterns first
- Override PrimeVue styles in component
<style>blocks
Database Considerations
- Performance: Use indexes on
VBAL(COD_FIRMA, AN, LUNA, CONT) - Data Volume: Consider pagination for companies with many accounts
- Filters: Use Oracle
LIKEwith wildcards efficiently:CONT LIKE :cont || '%'
Security
- JWT Auth: Required for all API calls
- Company Access: Verify user has access to
cod_firmain request - SQL Injection: Use parameterized queries (
:paramsyntax)
Future Enhancements (Not in Initial Scope)
- Export to Excel/PDF
- Drill-down to account details (sold și rulaj pe luni)
- Comparison between periods (current vs previous month/year)
- Charts/visualizations (rulaj pe conturi)
- Advanced filters (by account class/category)
🐛 Known Issues / Risks
- Oracle VBAL table structure unknown: Verify column names and types in Phase 0
- Performance with large datasets: Monitor query performance, add indexes if needed
- Decimal precision: Ensure proper handling of Romanian decimal separator (comma vs dot)
- Company switching: Ensure data refreshes when user switches active company
📞 Support
For questions or blockers, refer to:
- Architecture:
docs/ARCHITECTURE_SCHEMA.md,docs/MICROSERVICES_GUIDE.md - CSS Issues:
docs/ONBOARDING_CSS.md,docs/STYLING_GUIDELINES.md - Backend Issues:
reports-app/backend/README.md,README.md(troubleshooting) - Frontend Issues:
reports-app/frontend/README.md
Last Updated: 2025-11-20 Feature Owner: Claude Code Reviewers: TBD