feat(T06): Verkaufsmodul + Rechtsdokumente + DATEV-Export + Sales UI

This commit is contained in:
2026-07-17 01:58:34 +02:00
parent a38d340ddc
commit 6603e411e9
33 changed files with 3481 additions and 107 deletions
+50
View File
@@ -0,0 +1,50 @@
"""SQLAlchemy model for DATEV export records."""
import uuid
from datetime import date, datetime
from decimal import Decimal
from sqlalchemy import Date, DateTime, Numeric, String, func
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.database import Base
class DATEVExport(Base):
"""DATEV export record tracking CSV exports for accounting."""
__tablename__ = "datev_exports"
id: Mapped[uuid.UUID] = mapped_column(
UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4,
)
start_date: Mapped[date] = mapped_column(Date, nullable=False)
end_date: Mapped[date] = mapped_column(Date, nullable=False)
file_path: Mapped[str | None] = mapped_column(
String(500), nullable=True
)
total_amount: Mapped[Decimal] = mapped_column(
Numeric(14, 2), nullable=False, default=0
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False, server_default=func.now()
)
def __repr__(self) -> str:
return f"<DATEVExport id={self.id} start={self.start_date} end={self.end_date}>"
def to_dict(self) -> dict:
"""Serialize DATEV export for API responses."""
return {
"id": str(self.id),
"start_date": self.start_date.isoformat() if self.start_date else None,
"end_date": self.end_date.isoformat() if self.end_date else None,
"file_path": self.file_path,
"total_amount": (
float(self.total_amount) if self.total_amount is not None else None
),
"created_at": self.created_at.isoformat() if self.created_at else None,
}