"""System user document model for `scm_system_users` collection.""" from datetime import datetime from typing import Optional, Dict, Any from pydantic import BaseModel, Field, EmailStr from enum import Enum class UserStatus(str, Enum): """User account status options.""" ACTIVE = "active" INACTIVE = "inactive" SUSPENDED = "suspended" LOCKED = "locked" PENDING_ACTIVATION = "pending_activation" class SystemUserModel(BaseModel): """Represents a system user stored in MongoDB.""" user_id: str = Field(..., description="Unique business identifier (e.g. usr_xxx)") username: str = Field(..., description="Unique username", min_length=3, max_length=50) email: EmailStr = Field(..., description="User email address") password_hash: str = Field(..., description="Bcrypt hashed password") full_name: Optional[str] = Field(None, description="Full name of the user") role_id: Optional[str] = Field(None, description="Role identifier e.g. role_distributor_manager") merchant_id: Optional[str] = Field(None, description="Owning merchant id") merchant_type: Optional[str] = Field(None, description="Merchant type (ncnf, cnf, distributor, retail)") status: UserStatus = Field(default=UserStatus.ACTIVE, description="Account status") last_login: Optional[datetime] = Field(None, description="Timestamp of last successful login") created_by: str = Field(..., description="User id who created this record") created_at: datetime = Field(default_factory=datetime.utcnow, description="Creation timestamp") updated_by: Optional[str] = Field(None, description="User id who last updated this record") updated_at: Optional[datetime] = Field(None, description="Last update timestamp") metadata: Optional[Dict[str, Any]] = Field(None, description="Optional metadata bag") class Config: json_schema_extra = { "example": { "user_id": "user_Ob1gQvSwV1o", "username": "distmanager_delhi", "email": "delhi.manager@premiumbeauty.com", "password_hash": "b308f5bfd37e72c3d3a63d218000f0bf1eaf4efa7d11eaf9e61f76b88462d3f8", "full_name": "Vikram Singh", "role_id": "role_distributor_manager", "merchant_id": "dist_delhi_premium", "status": "active", "last_login": None, "created_by": "user_company_admin", "created_at": "2025-11-30T16:52:33.902Z" } }