use chrono::NaiveDate;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::super::graph_properties::{GraphPropertyValue, ToNodeProperties};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum BidStatus {
#[default]
Submitted,
UnderEvaluation,
Accepted,
Rejected,
Withdrawn,
Disqualified,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BidLineItem {
pub item_number: u16,
#[serde(with = "crate::serde_decimal")]
pub unit_price: Decimal,
pub quantity: Decimal,
#[serde(with = "crate::serde_decimal")]
pub total_amount: Decimal,
pub lead_time_days: u32,
pub notes: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupplierBid {
pub bid_id: String,
pub rfx_id: String,
pub vendor_id: String,
pub company_code: String,
pub status: BidStatus,
pub submission_date: NaiveDate,
pub line_items: Vec<BidLineItem>,
#[serde(with = "crate::serde_decimal")]
pub total_amount: Decimal,
pub validity_days: u32,
pub payment_terms: String,
pub delivery_terms: Option<String>,
pub technical_summary: Option<String>,
pub is_on_time: bool,
pub is_compliant: bool,
}
impl ToNodeProperties for SupplierBid {
fn node_type_name(&self) -> &'static str {
"supplier_bid"
}
fn node_type_code(&self) -> u16 {
322
}
fn to_node_properties(&self) -> HashMap<String, GraphPropertyValue> {
let mut p = HashMap::new();
p.insert(
"bidId".into(),
GraphPropertyValue::String(self.bid_id.clone()),
);
p.insert(
"rfxId".into(),
GraphPropertyValue::String(self.rfx_id.clone()),
);
p.insert(
"vendorId".into(),
GraphPropertyValue::String(self.vendor_id.clone()),
);
p.insert(
"entityCode".into(),
GraphPropertyValue::String(self.company_code.clone()),
);
p.insert(
"status".into(),
GraphPropertyValue::String(format!("{:?}", self.status)),
);
p.insert(
"submissionDate".into(),
GraphPropertyValue::Date(self.submission_date),
);
p.insert(
"bidAmount".into(),
GraphPropertyValue::Decimal(self.total_amount),
);
p.insert(
"validityDays".into(),
GraphPropertyValue::Int(self.validity_days as i64),
);
p.insert("isOnTime".into(), GraphPropertyValue::Bool(self.is_on_time));
p.insert(
"isCompliant".into(),
GraphPropertyValue::Bool(self.is_compliant),
);
p
}
}