"""Worklog model — immutable internal time-tracking records.""" import uuid from datetime import datetime from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Text, Index from sqlalchemy.dialects.postgresql import UUID, JSONB from sqlalchemy.orm import relationship from app.database import Base class Worklog(Base): """Internal worklog entry with integrity hash for audit compliance. Each worklog is tied to an Aegis entity (test, campaign, etc.) and optionally synced to Tempo. The ``integrity_hash`` is a SHA-256 of the immutable fields so tampering can be detected. """ __tablename__ = "worklogs" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) entity_type = Column(String(50), nullable=False) entity_id = Column(UUID(as_uuid=True), nullable=False) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) activity_type = Column(String(100), nullable=False) started_at = Column(DateTime, nullable=False) ended_at = Column(DateTime) duration_seconds = Column(Integer, nullable=False) description = Column(Text) tempo_synced = Column(DateTime) tempo_worklog_id = Column(String(100)) integrity_hash = Column(String(64)) created_at = Column(DateTime, default=datetime.utcnow) extra_metadata = Column("metadata", JSONB, default={}) user = relationship("User", foreign_keys=[user_id]) __table_args__ = ( Index("ix_worklogs_entity_id", "entity_id"), Index("ix_worklogs_user_id", "user_id"), Index("ix_worklogs_entity_type_entity_id", "entity_type", "entity_id"), )