- Remove /approval route and ReceiptApprovalView.vue - Add checkbox selection column to receipts DataTable - Add bulk actions bar with "Validează selectate" button - Add visual indicator (underline) for active status filter - Update CLAUDE.md with test environment instructions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
245 lines
7.5 KiB
Markdown
245 lines
7.5 KiB
Markdown
# CLAUDE.md - Data Entry App
|
|
|
|
## IMPORTANT - Reguli pentru Claude
|
|
|
|
- **Pentru teste folosește DOAR `./start-data-entry-test.sh`** (server TEST 10.0.20.121)
|
|
- **NU folosi `./start-data-entry-dev.sh`** decât la instrucțiuni explicite de la utilizator (server PRODUCȚIE 10.0.20.36)
|
|
|
|
## Scop
|
|
|
|
Aplicatie pentru introducere date in ERP (bonuri fiscale, chitante) cu workflow de aprobare.
|
|
|
|
## Documentatie de Referinta
|
|
|
|
- **Cerinte**: `docs/data-entry/REQUIREMENTS.md`
|
|
- **Arhitectura**: `docs/data-entry/ARCHITECTURE.md`
|
|
- **Quick Start**: `README.md`
|
|
|
|
## Decizii Tehnice
|
|
|
|
- **ORM**: SQLModel (Pydantic + SQLAlchemy)
|
|
- **Migrari**: Alembic
|
|
- **Database**: SQLite (Faza 1) → Oracle (Faza 2)
|
|
- **Frontend**: Vue.js 3 + PrimeVue (consistent cu reports-app)
|
|
|
|
## Workflow Bonuri
|
|
|
|
```
|
|
1. DRAFT → utilizator completeaza + upload poza
|
|
2. PENDING_REVIEW → sistem genereaza note contabile
|
|
3. APPROVED/REJECTED → contabil aproba sau respinge
|
|
4. SYNCED → (Faza 2) date in Oracle
|
|
```
|
|
|
|
## Structura Directoare
|
|
|
|
```
|
|
data-entry-app/
|
|
├── backend/ # FastAPI API (port 8003)
|
|
│ ├── app/
|
|
│ │ ├── db/ # SQLModel models + CRUD
|
|
│ │ ├── schemas/ # Pydantic schemas
|
|
│ │ ├── services/ # Business logic
|
|
│ │ └── routers/ # API endpoints
|
|
│ ├── migrations/ # Alembic migrations
|
|
│ └── data/ # SQLite DB + uploads
|
|
├── frontend/ # Vue.js UI (port 3010)
|
|
│ └── src/
|
|
│ ├── views/ # Page components
|
|
│ ├── components/ # Reusable components
|
|
│ └── stores/ # Pinia stores
|
|
└── docs/ # Documentatie specifica
|
|
```
|
|
|
|
## Componente Partajate
|
|
|
|
### Backend
|
|
- `shared/database/oracle_pool.py` - Conexiune Oracle pentru nomenclatoare si autentificare
|
|
- `shared/auth/` - JWT authentication (middleware, routes, service)
|
|
|
|
### Frontend
|
|
- `shared/frontend/components/LoginView.vue` - Componenta login partajata
|
|
- `shared/frontend/stores/auth.js` - Pinia auth store factory
|
|
- `shared/frontend/styles/login.css` - Stiluri login
|
|
|
|
## Servere Oracle (Producție vs Test)
|
|
|
|
**IMPORTANT**: Există două servere Oracle separate. Verifică întotdeauna la care ești conectat!
|
|
|
|
| Server | IP Oracle | Tunel SSH | Schema Verificare | Company ID |
|
|
|--------|-----------|-----------|-------------------|------------|
|
|
| **PRODUCȚIE** | `10.0.20.36` | `./ssh_tunnel.sh` | `ROMFAST` | 114 |
|
|
| **TEST** | `10.0.20.121` | `./ssh-tunnel-test.sh` | `MARIUSM_AUTO` | 110 |
|
|
|
|
### Scripturi de Pornire
|
|
|
|
**IMPORTANT**: Folosește scriptul corespunzător mediului dorit!
|
|
|
|
```bash
|
|
# Pentru PRODUCȚIE (10.0.20.36)
|
|
./start-data-entry-dev.sh # Pornește tot (tunel + backend + frontend)
|
|
./start-data-entry-dev.sh stop # Oprește tot
|
|
./start-data-entry-dev.sh status # Verifică status
|
|
|
|
# Pentru TEST (10.0.20.121)
|
|
./start-data-entry-test.sh # Pornește tot (tunel + backend + frontend)
|
|
./start-data-entry-test.sh stop # Oprește tot
|
|
./start-data-entry-test.sh status # Verifică status
|
|
```
|
|
|
|
Scripturile fac automat:
|
|
1. Opresc tunelul celuilalt mediu (dacă rulează)
|
|
2. Pornesc tunelul corect
|
|
3. Copiază `.env.prod` sau `.env.test` în `.env`
|
|
4. Rulează migrările pe baza de date corectă
|
|
5. Pornesc frontend și backend
|
|
|
|
### Fișiere .env
|
|
|
|
| Fișier | Server | Database | Schema Test |
|
|
|--------|--------|----------|-------------|
|
|
| `.env.prod` | PRODUCȚIE (10.0.20.36) | `receipts_prod.db` | ROMFAST (id=114) |
|
|
| `.env.test` | TEST (10.0.20.121) | `receipts_test.db` | MARIUSM_AUTO (id=110) |
|
|
|
|
### Verificare conexiune
|
|
|
|
```bash
|
|
# Verifică la ce server ești conectat
|
|
./ssh_tunnel.sh status # Dacă rulează = PRODUCȚIE
|
|
./ssh-tunnel-test.sh status # Dacă rulează = TEST
|
|
|
|
# Verifică schema disponibilă (din backend/)
|
|
python3 -c "
|
|
import asyncio
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
import sys; sys.path.insert(0, '../../shared')
|
|
from database.oracle_pool import oracle_pool
|
|
|
|
async def check():
|
|
await oracle_pool.initialize()
|
|
async with oracle_pool.get_connection() as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute('SELECT SCHEMA, NUME FROM CONTAFIN_ORACLE.V_NOM_FIRME ORDER BY NUME')
|
|
for row in cur.fetchall()[:10]:
|
|
print(f'{row[0]}: {row[1]}')
|
|
asyncio.run(check())
|
|
"
|
|
```
|
|
|
|
### Sincronizare Nomenclatoare
|
|
|
|
Query-ul pentru furnizori folosește `CORESP_TIP_PART`:
|
|
- `id_tip_part = 17` → Furnizori
|
|
- `id_tip_part = 22` → Casa LEI
|
|
- `id_tip_part = 23` → Casa Valută
|
|
- `id_tip_part = 24` → Bancă LEI
|
|
- `id_tip_part = 25` → Bancă Valută
|
|
|
|
```sql
|
|
-- Exemplu query furnizori pentru schema MARIUSM_AUTO (TEST)
|
|
SELECT B.ID_PART, B.DENUMIRE, B.COD_FISCAL, B.ADRESA
|
|
FROM MARIUSM_AUTO.CORESP_TIP_PART A
|
|
INNER JOIN MARIUSM_AUTO.VNOM_PARTENERI B ON A.ID_PART = B.ID_PART
|
|
WHERE A.ID_TIP_PART = 17 AND (B.INACTIV = 0 OR B.INACTIV IS NULL)
|
|
ORDER BY B.DENUMIRE;
|
|
```
|
|
|
|
## Comenzi Dezvoltare
|
|
|
|
```bash
|
|
# Backend
|
|
cd data-entry-app/backend
|
|
pip install -r requirements.txt
|
|
alembic upgrade head
|
|
uvicorn app.main:app --reload --port 8003
|
|
|
|
# Frontend
|
|
cd data-entry-app/frontend
|
|
npm install
|
|
npm run dev -- --port 3010
|
|
|
|
# Migrari
|
|
cd data-entry-app/backend
|
|
alembic revision --autogenerate -m "description"
|
|
alembic upgrade head
|
|
```
|
|
|
|
## Tipuri Cheltuieli (hardcoded in Faza 1)
|
|
|
|
| Cod | Tip | Cont | TVA |
|
|
|-----|-----|------|-----|
|
|
| FUEL | Combustibil | 6022 | 19% |
|
|
| MATERIALS | Materiale | 6028 | 19% |
|
|
| OFFICE | Rechizite | 6024 | 19% |
|
|
| PHONE | Telefonie | 626 | 19% |
|
|
| PARKING | Parcare | 6022 | 19% |
|
|
| FOOD | Alimentatie | 6028 | 0% |
|
|
| TRANSPORT | Transport | 624 | 19% |
|
|
| OTHER | Altele | 628 | 19% |
|
|
|
|
## Integrare Oracle (Faza 2)
|
|
|
|
Vezi `docs/PACK_CONTAFIN.pck` pentru procedurile stocate:
|
|
- `pack_contafin.init_scriere_act_rul_local()`
|
|
- `INSERT INTO ACT_TEMP (...)`
|
|
- `pack_contafin.finalizeaza_scriere_act_rul()`
|
|
|
|
## API Endpoints Summary
|
|
|
|
### Receipts CRUD
|
|
- `POST /api/receipts/` - Create
|
|
- `GET /api/receipts/` - List (filterable)
|
|
- `GET /api/receipts/{id}` - Detail
|
|
- `PUT /api/receipts/{id}` - Update (DRAFT only)
|
|
- `DELETE /api/receipts/{id}` - Delete (DRAFT only)
|
|
|
|
### Workflow
|
|
- `POST /api/receipts/{id}/submit` - Send for review
|
|
- `POST /api/receipts/{id}/approve` - Approve
|
|
- `POST /api/receipts/{id}/reject` - Reject
|
|
- `POST /api/receipts/{id}/resubmit` - Resubmit after rejection
|
|
|
|
### Attachments
|
|
- `POST /api/receipts/{id}/attachments` - Upload
|
|
- `GET /api/attachments/{id}/download` - Download
|
|
- `DELETE /api/attachments/{id}` - Delete
|
|
|
|
### Nomenclatures
|
|
- `GET /api/receipts/partners` - Partners from Oracle
|
|
- `GET /api/receipts/accounts` - Accounts from Oracle
|
|
- `GET /api/receipts/cash-registers` - Cash registers from Oracle
|
|
- `GET /api/receipts/expense-types` - Expense types (hardcoded)
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
# Backend tests
|
|
cd backend && pytest
|
|
|
|
# Frontend tests
|
|
cd frontend && npm run test
|
|
```
|
|
|
|
## Common Issues
|
|
|
|
### Nomenclatoare goale / furnizori lipsă
|
|
- Verifică la ce server Oracle ești conectat: `./ssh_tunnel.sh status`
|
|
- Verifică dacă schema firmei selectate există pe acel server
|
|
- Sincronizează manual: `POST /api/nomenclature/sync/all`
|
|
|
|
### Conectat la serverul greșit
|
|
- PRODUCȚIE are schema `ROMFAST`, TEST are schema `MARIUSM_AUTO`
|
|
- Oprește tunelul curent și pornește cel corect (vezi secțiunea "Servere Oracle")
|
|
|
|
### SQLite locked
|
|
- Asigura-te ca nu ai multiple procese care acceseaza DB-ul
|
|
|
|
### Upload fails
|
|
- Verifica permisiuni pe `data/uploads/`
|
|
- Verifica MIME type (doar image/*, application/pdf)
|
|
|
|
### Migration errors
|
|
- `alembic downgrade -1` pentru rollback
|
|
- Sterge migration file si regenereaza
|