use crate::common::contact::ContactMedium;
use crate::common::money::Money;
use crate::common::note::Note;
use crate::common::related_party::RelatedParty;
use crate::common::tmf_error::TMFError;
use crate::tmf620::category::CategoryRef;
#[cfg(feature = "build-V4")]
use crate::tmf620::product_offering::ProductOfferingRef;
#[cfg(feature = "build-V5")]
use crate::tmf620::product_offering_v5::ProductOfferingRef;
use crate::tmf620::product_specification::ProductSpecificationRef;
use crate::tmf620::{ChannelRef, MarketSegmentRef};
use super::MOD_PATH;
use crate::{DateTime, HasId, HasName, HasNote, HasValidity, TimePeriod, Uri};
use tmflib_derive::{HasId, HasName, HasNote, HasValidity};
use serde::{Deserialize, Serialize};
const CLASS_PATH: &str = "salesLead";
const LEAD_VALID: u64 = 30;
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum SalesLeadPrioityType {
Low,
#[default]
Medium,
High,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum SalesLeadStateType {
#[default]
Accepted,
Acknowledged,
Cancelled,
InProgress,
Pending,
Rejected,
}
#[derive(Clone, Debug, Default, Deserialize, HasId, HasValidity, HasNote, HasName, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SalesLead {
#[serde(skip_serializing_if = "Option::is_none")]
id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
creation_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
rating: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
referred_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
status_change_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
status_change_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
estimated_revenue: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
priority: Option<SalesLeadPrioityType>,
status: Option<SalesLeadStateType>,
#[serde(skip_serializing_if = "Option::is_none")]
valid_for: Option<TimePeriod>,
#[serde(skip_serializing_if = "Option::is_none")]
prospect_contact: Option<Vec<ContactMedium>>,
#[serde(skip_serializing_if = "Option::is_none")]
category: Option<CategoryRef>,
#[serde(skip_serializing_if = "Option::is_none")]
channel: Option<ChannelRef>,
#[serde(skip_serializing_if = "Option::is_none")]
market_segment: Option<MarketSegmentRef>,
#[serde(skip_serializing_if = "Option::is_none")]
note: Option<Vec<Note>>,
#[serde(skip_serializing_if = "Option::is_none")]
product_offering: Option<ProductOfferingRef>,
#[serde(skip_serializing_if = "Option::is_none")]
product_specification: Option<ProductSpecificationRef>,
#[serde(skip_serializing_if = "Option::is_none")]
related_party: Option<Vec<RelatedParty>>,
}
impl SalesLead {
pub fn new(name: impl Into<String>) -> SalesLead {
let mut sl = SalesLead::create();
sl.name = Some(name.into());
sl.status = Some(SalesLeadStateType::default());
sl.priority = Some(SalesLeadPrioityType::default());
sl.valid_for = Some(TimePeriod::period_days(LEAD_VALID));
sl
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SalesLeadRef {
href: Uri,
id: String,
name: String,
}
impl From<SalesLead> for SalesLeadRef {
fn from(value: SalesLead) -> Self {
SalesLeadRef {
href: value.get_href(),
id: value.get_id(),
name: value.get_name(),
}
}
}
#[cfg(test)]
mod test {
use super::SalesLead;
use super::{HasId, HasName};
const SL_NAME: &str = "My Sales Lead";
#[test]
fn sales_lead_create_id() {
let sl = SalesLead::new(SL_NAME);
assert_eq!(sl.id.is_some(), true);
}
#[test]
fn sales_lead_create_href() {
let sl = SalesLead::new(SL_NAME);
assert_eq!(sl.href.is_some(), true);
}
#[test]
fn sales_lead_create_href_matches_id() {
let sl = SalesLead::new(SL_NAME);
let id = sl.get_id();
let href = sl.get_href();
assert!(href.contains(&id));
}
#[test]
fn sales_lead_create_name() {
let sl = SalesLead::new(SL_NAME);
assert_eq!(sl.get_name(), SL_NAME.to_string());
}
}