Consolidate 3 separate applications (reports-app, data-entry-app, telegram-bot) into a unified
architecture with single backend and frontend:
Backend Changes:
- Unified FastAPI backend at backend/ with modular structure
- Modules: reports, data_entry, telegram in backend/modules/
- Centralized config.py and main.py with all routers registered
- Single worker mode (--workers 1) for Telegram bot compatibility
- Shared Oracle connection pool and JWT authentication
- Unified requirements.txt and environment configuration
Frontend Changes:
- Single Vue.js SPA with module-based routing
- Unified frontend at src/ with modules in src/modules/{reports,data-entry}/
- Shared components and stores in src/shared/
- Error boundaries for module isolation
- Dual API proxy in Vite for module communication
Infrastructure:
- New unified startup scripts: start-prod.sh, start-test.sh, start-backend.sh
- Environment templates: .env.dev.example, .env.test.example, .env.prod.example
- Updated deployment scripts for Windows IIS
- Simplified SSH tunnel management
Documentation:
- Comprehensive CLAUDE.md with architecture overview
- Module-specific docs in docs/{data-entry,telegram}/
- Architecture decision records in docs/ARCHITECTURE-DECISIONS.md
- Deployment guides consolidated in deployment/windows/docs/
This migration reduces complexity, improves maintainability, and enables easier
deployment while maintaining all existing functionality.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
"""Nomenclature models for synced and local data."""
|
|
|
|
from typing import Optional
|
|
from datetime import datetime
|
|
from sqlmodel import SQLModel, Field
|
|
|
|
|
|
class SyncedSupplier(SQLModel, table=True):
|
|
"""Suppliers synced from Oracle NOM_PARTENERI."""
|
|
__tablename__ = "synced_suppliers"
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
oracle_id: int = Field(index=True) # Original Oracle ID
|
|
company_id: int = Field(index=True) # Company this supplier belongs to
|
|
name: str = Field(max_length=200)
|
|
fiscal_code: Optional[str] = Field(default=None, max_length=50, index=True) # CUI/CIF
|
|
address: Optional[str] = Field(default=None, max_length=500)
|
|
synced_at: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
|
|
class LocalSupplier(SQLModel, table=True):
|
|
"""Suppliers created locally from OCR (not in Oracle)."""
|
|
__tablename__ = "local_suppliers"
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
company_id: int = Field(index=True)
|
|
name: str = Field(max_length=200)
|
|
fiscal_code: Optional[str] = Field(default=None, max_length=50, index=True)
|
|
address: Optional[str] = Field(default=None, max_length=500)
|
|
created_by: str = Field(max_length=100) # Username who created it
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
# Flag to indicate if it should be synced to Oracle later
|
|
pending_oracle_sync: bool = Field(default=True)
|
|
|
|
|
|
class SyncedCashRegister(SQLModel, table=True):
|
|
"""Cash registers and bank accounts synced from Oracle."""
|
|
__tablename__ = "synced_cash_registers"
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
oracle_id: int = Field(index=True)
|
|
company_id: int = Field(index=True)
|
|
name: str = Field(max_length=100)
|
|
account_code: str = Field(max_length=20) # 5311, 5121, etc.
|
|
register_type: str = Field(max_length=10) # 'cash' or 'bank'
|
|
synced_at: datetime = Field(default_factory=datetime.utcnow)
|