use chrono::{DateTime, NaiveDate, Utc};
use rmcp::schemars;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SupplierStatus {
Prospect,
Active,
OnHold,
Suspended,
Disqualified,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum QualificationStatus {
Unqualified,
InQualification,
Qualified,
ConditionallyQualified,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Supplier {
pub id: String,
pub name: String,
pub category: String,
pub country: String,
pub status: SupplierStatus,
pub qualification: QualificationStatus,
pub approved_for_po: bool,
pub default_lead_time_days: u32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Contact {
pub id: String,
pub supplier_id: String,
pub name: String,
pub role: String,
pub email: String,
pub phone: Option<String>,
pub primary: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Certification {
pub id: String,
pub supplier_id: String,
pub standard: String,
pub certificate_number: String,
pub issued_by: String,
pub issued_on: NaiveDate,
pub expires_on: NaiveDate,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct CatalogItem {
pub id: String,
pub sku: String,
pub name: String,
pub category: String,
pub unit: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct SupplierItem {
pub id: String,
pub supplier_id: String,
pub item_id: String,
pub supplier_sku: String,
pub unit_price: f64,
pub currency: String,
pub min_order_qty: u32,
pub lead_time_days: u32,
pub available_qty: u32,
pub preferred: bool,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum PoStatus {
Draft,
Issued,
Acknowledged,
PartiallyReceived,
Received,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PoLine {
pub item_id: String,
pub description: String,
pub qty: u32,
pub unit_price: f64,
pub received_qty: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PurchaseOrder {
pub id: String,
pub supplier_id: String,
pub status: PoStatus,
pub currency: String,
pub lines: Vec<PoLine>,
pub total: f64,
pub need_by: Option<NaiveDate>,
pub created_by: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RfqStatus {
Open,
Awarded,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Rfq {
pub id: String,
pub item_id: String,
pub qty: u32,
pub status: RfqStatus,
pub need_by: Option<NaiveDate>,
pub invited_suppliers: Vec<String>,
pub awarded_supplier_id: Option<String>,
pub created_by: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Quote {
pub id: String,
pub rfq_id: String,
pub supplier_id: String,
pub unit_price: f64,
pub currency: String,
pub lead_time_days: u32,
pub valid_until: Option<NaiveDate>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum AuditResult {
Pass,
ConditionalPass,
Fail,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct AuditFinding {
pub severity: String, pub clause: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct QualityAudit {
pub id: String,
pub supplier_id: String,
pub audit_type: String, pub auditor: String,
pub conducted_on: NaiveDate,
pub score: f64, pub result: AuditResult,
pub findings: Vec<AuditFinding>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, schemars::JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ScarStatus {
Open,
ContainmentProvided,
RootCauseAccepted,
Closed,
Escalated,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct Scar {
pub id: String,
pub supplier_id: String,
pub audit_id: Option<String>,
pub title: String,
pub severity: String,
pub status: ScarStatus,
pub root_cause: Option<String>,
pub corrective_action: Option<String>,
pub due_date: Option<NaiveDate>,
pub created_by: String,
pub created_at: DateTime<Utc>,
pub closed_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct QualityEvent {
pub id: String,
pub supplier_id: String,
pub item_id: Option<String>,
pub po_id: Option<String>,
pub kind: String,
pub qty: u32,
pub defect_qty: u32,
pub on_time: bool,
pub note: String,
pub occurred_on: NaiveDate,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct RiskAssessment {
pub id: String,
pub supplier_id: String,
pub category: String,
pub likelihood: u8, pub impact: u8, pub note: String,
pub assessed_by: String,
pub assessed_on: NaiveDate,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct AuditEntry {
pub at: DateTime<Utc>,
pub actor: String,
pub action: String,
pub detail: String,
}