Files
CRM_backup/backend/src/models/mod.rs
T

401 lines
12 KiB
Rust

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<String>,
pub is_active: bool,
pub is_locked: bool,
pub lock_reason: Option<String>,
pub password_change_required: bool,
pub email_verified_at: Option<DateTime<Utc>>,
pub last_login_at: Option<DateTime<Utc>>,
pub failed_login_attempts: i32,
pub locked_until: Option<DateTime<Utc>>,
pub preferences: Option<serde_json::Value>,
pub created_by: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Role {
pub id: Uuid,
pub name: String,
pub display_name: Option<String>,
pub description: Option<String>,
pub hierarchy_level: i32,
pub is_system: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Permission {
pub id: Uuid,
pub resource: String,
pub action: String,
pub description: Option<String>,
pub category: Option<String>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct UserRole {
pub user_id: Uuid,
pub role_id: Uuid,
pub assigned_by: Option<Uuid>,
pub assigned_at: DateTime<Utc>,
}
#[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<sqlx::types::ipnetwork::IpNetwork>,
pub user_agent: Option<String>,
pub is_active: bool,
pub expires_at: DateTime<Utc>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[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<Uuid>,
pub source: Option<String>,
pub notes: Option<String>,
pub tags: Option<Vec<String>>,
pub score: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct CustomerStatus {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub color: Option<String>,
pub sort_order: i32,
pub is_default: bool,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[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<String>,
pub date_of_birth: Option<chrono::NaiveDate>,
pub gender: Option<String>,
pub job_title: Option<String>,
pub company_name: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct CompanyCustomer {
pub customer_id: Uuid,
pub company_name: String,
pub registration_number: Option<String>,
pub tax_id: Option<String>,
pub website: Option<String>,
pub industry: Option<String>,
pub company_size: Option<String>,
pub annual_revenue: Option<rust_decimal::Decimal>,
pub founded_date: Option<chrono::NaiveDate>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[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<String>,
pub is_primary: bool,
pub is_verified: bool,
pub verified_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[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<String>,
pub city: String,
pub state: Option<String>,
pub postal_code: Option<String>,
pub country: String,
pub is_primary: bool,
pub latitude: Option<rust_decimal::Decimal>,
pub longitude: Option<rust_decimal::Decimal>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Lead {
pub id: Uuid,
pub source_id: Option<Uuid>,
pub stage_id: Uuid,
pub assigned_to: Option<Uuid>,
pub company_name: Option<String>,
pub contact_name: String,
pub email: Option<String>,
pub phone: Option<String>,
pub job_title: Option<String>,
pub budget_range: Option<String>,
pub interest_level: Option<String>,
pub notes: Option<String>,
pub score: i32,
pub converted_customer_id: Option<Uuid>,
pub converted_at: Option<DateTime<Utc>>,
pub converted_by: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct LeadSource {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct LeadStage {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub sort_order: i32,
pub probability: i32,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Opportunity {
pub id: Uuid,
pub customer_id: Uuid,
pub lead_id: Option<Uuid>,
pub stage_id: Uuid,
pub owner_id: Uuid,
pub name: String,
pub description: Option<String>,
pub estimated_revenue: Option<rust_decimal::Decimal>,
pub probability: Option<i32>,
pub expected_close_date: Option<chrono::NaiveDate>,
pub actual_close_date: Option<chrono::NaiveDate>,
pub loss_reason: Option<String>,
pub is_won: Option<bool>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct DealStage {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub sort_order: i32,
pub probability: i32,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Product {
pub id: Uuid,
pub category_id: Option<Uuid>,
pub name: String,
pub description: Option<String>,
pub sku: Option<String>,
pub unit_price: rust_decimal::Decimal,
pub cost_price: Option<rust_decimal::Decimal>,
pub currency: String,
pub is_active: bool,
pub is_service: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct ProductCategory {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub parent_id: Option<Uuid>,
pub is_active: bool,
pub sort_order: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Communication {
pub id: Uuid,
pub customer_id: Uuid,
pub opportunity_id: Option<Uuid>,
pub type_id: Uuid,
pub subject: Option<String>,
pub body: Option<String>,
pub direction: String,
pub created_by: Uuid,
pub started_at: Option<DateTime<Utc>>,
pub duration_minutes: Option<i32>,
pub outcome: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct CommunicationType {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub icon: Option<String>,
pub is_active: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Task {
pub id: Uuid,
pub customer_id: Option<Uuid>,
pub opportunity_id: Option<Uuid>,
pub communication_id: Option<Uuid>,
pub assigned_to: Option<Uuid>,
pub assigned_by: Option<Uuid>,
pub title: String,
pub description: Option<String>,
pub priority_id: Option<Uuid>,
pub status: String,
pub due_date: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub reminder_at: Option<DateTime<Utc>>,
pub reminder_sent: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct TaskPriority {
pub id: Uuid,
pub name: String,
pub color: Option<String>,
pub sort_order: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct Invoice {
pub id: Uuid,
pub customer_id: Uuid,
pub opportunity_id: Option<Uuid>,
pub status_id: Uuid,
pub invoice_number: String,
pub subtotal: rust_decimal::Decimal,
pub tax_percent: Option<rust_decimal::Decimal>,
pub tax_amount: Option<rust_decimal::Decimal>,
pub discount_percent: Option<rust_decimal::Decimal>,
pub discount_amount: Option<rust_decimal::Decimal>,
pub total_amount: rust_decimal::Decimal,
pub currency: String,
pub issued_date: chrono::NaiveDate,
pub due_date: chrono::NaiveDate,
pub paid_at: Option<DateTime<Utc>>,
pub notes: Option<String>,
pub created_by: Uuid,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[derive(Debug, FromRow, serde::Serialize, serde::Deserialize)]
pub struct InvoiceStatus {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
pub color: Option<String>,
pub sort_order: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[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<String>,
pub transaction_id: Option<String>,
pub status: String,
pub paid_at: Option<DateTime<Utc>>,
pub notes: Option<String>,
pub created_by: Uuid,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}
#[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<serde_json::Value>,
pub new_data: Option<serde_json::Value>,
pub changed_by: Option<Uuid>,
pub changed_at: DateTime<Utc>,
pub ip_address: Option<sqlx::types::ipnetwork::IpNetwork>,
pub user_agent: Option<String>,
pub session_id: Option<Uuid>,
}