use chrono::{DateTime, Utc}; use sqlx::FromRow; use uuid::Uuid; #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct User { pub id: Uuid, pub username: String, pub email: String, #[serde(skip_serializing)] pub password_hash: String, pub first_name: String, pub last_name: String, pub phone: Option, pub is_active: bool, pub is_locked: bool, pub lock_reason: Option, pub password_change_required: bool, pub email_verified_at: Option>, pub last_login_at: Option>, pub failed_login_attempts: i32, pub locked_until: Option>, pub preferences: Option, pub created_by: Option, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Role { pub id: Uuid, pub name: String, pub display_name: Option, pub description: Option, pub hierarchy_level: i32, pub is_system: bool, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Permission { pub id: Uuid, pub resource: String, pub action: String, pub description: Option, pub category: Option, pub created_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct UserRole { pub user_id: Uuid, pub role_id: Uuid, pub assigned_by: Option, pub assigned_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Session { pub id: Uuid, pub user_id: Uuid, #[serde(skip_serializing)] pub token_hash: String, pub ip_address: Option, pub user_agent: Option, pub is_active: bool, pub expires_at: DateTime, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Customer { pub id: Uuid, pub customer_type: String, pub status_id: Uuid, pub owner_id: Option, pub source: Option, pub notes: Option, pub tags: Option>, pub score: i32, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct CustomerStatus { pub id: Uuid, pub name: String, pub description: Option, pub color: Option, pub sort_order: i32, pub is_default: bool, pub is_active: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct IndividualCustomer { pub customer_id: Uuid, pub first_name: String, pub last_name: String, pub middle_name: Option, pub date_of_birth: Option, pub gender: Option, pub job_title: Option, pub company_name: Option, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct CompanyCustomer { pub customer_id: Uuid, pub company_name: String, pub registration_number: Option, pub tax_id: Option, pub website: Option, pub industry: Option, pub company_size: Option, pub annual_revenue: Option, pub founded_date: Option, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct ContactInformation { pub id: Uuid, pub customer_id: Uuid, pub r#type: String, pub value: String, pub label: Option, pub is_primary: bool, pub is_verified: bool, pub verified_at: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Address { pub id: Uuid, pub customer_id: Uuid, pub address_type: String, pub address_line1: String, pub address_line2: Option, pub city: String, pub state: Option, pub postal_code: Option, pub country: String, pub is_primary: bool, pub latitude: Option, pub longitude: Option, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Lead { pub id: Uuid, pub source_id: Option, pub stage_id: Uuid, pub assigned_to: Option, pub company_name: Option, pub contact_name: String, pub email: Option, pub phone: Option, pub job_title: Option, pub budget_range: Option, pub interest_level: Option, pub notes: Option, pub score: i32, pub converted_customer_id: Option, pub converted_at: Option>, pub converted_by: Option, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct LeadSource { pub id: Uuid, pub name: String, pub description: Option, pub is_active: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct LeadStage { pub id: Uuid, pub name: String, pub description: Option, pub sort_order: i32, pub probability: i32, pub is_active: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Opportunity { pub id: Uuid, pub customer_id: Uuid, pub lead_id: Option, pub stage_id: Uuid, pub owner_id: Uuid, pub name: String, pub description: Option, pub estimated_revenue: Option, pub probability: Option, pub expected_close_date: Option, pub actual_close_date: Option, pub loss_reason: Option, pub is_won: Option, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct DealStage { pub id: Uuid, pub name: String, pub description: Option, pub sort_order: i32, pub probability: i32, pub is_active: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Product { pub id: Uuid, pub category_id: Option, pub name: String, pub description: Option, pub sku: Option, pub unit_price: rust_decimal::Decimal, pub cost_price: Option, pub currency: String, pub is_active: bool, pub is_service: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct ProductCategory { pub id: Uuid, pub name: String, pub description: Option, pub parent_id: Option, pub is_active: bool, pub sort_order: i32, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Communication { pub id: Uuid, pub customer_id: Uuid, pub opportunity_id: Option, pub type_id: Uuid, pub subject: Option, pub body: Option, pub direction: String, pub created_by: Uuid, pub started_at: Option>, pub duration_minutes: Option, pub outcome: Option, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct CommunicationType { pub id: Uuid, pub name: String, pub description: Option, pub icon: Option, pub is_active: bool, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Task { pub id: Uuid, pub customer_id: Option, pub opportunity_id: Option, pub communication_id: Option, pub assigned_to: Option, pub assigned_by: Option, pub title: String, pub description: Option, pub priority_id: Option, pub status: String, pub due_date: Option>, pub completed_at: Option>, pub reminder_at: Option>, pub reminder_sent: bool, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct TaskPriority { pub id: Uuid, pub name: String, pub color: Option, pub sort_order: i32, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Invoice { pub id: Uuid, pub customer_id: Uuid, pub opportunity_id: Option, pub status_id: Uuid, pub invoice_number: String, pub subtotal: rust_decimal::Decimal, pub tax_percent: Option, pub tax_amount: Option, pub discount_percent: Option, pub discount_amount: Option, pub total_amount: rust_decimal::Decimal, pub currency: String, pub issued_date: chrono::NaiveDate, pub due_date: chrono::NaiveDate, pub paid_at: Option>, pub notes: Option, pub created_by: Uuid, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct InvoiceStatus { pub id: Uuid, pub name: String, pub description: Option, pub color: Option, pub sort_order: i32, pub created_at: DateTime, pub updated_at: DateTime, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct Payment { pub id: Uuid, pub invoice_id: Uuid, pub amount: rust_decimal::Decimal, pub payment_method: Option, pub transaction_id: Option, pub status: String, pub paid_at: Option>, pub notes: Option, pub created_by: Uuid, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)] pub struct AuditLog { pub id: Uuid, pub table_name: String, pub record_id: Uuid, pub action: String, pub old_data: Option, pub new_data: Option, pub changed_by: Option, pub changed_at: DateTime, pub ip_address: Option, pub user_agent: Option, pub session_id: Option, }