use chrono::{DateTime, NaiveDate, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MaintenanceCompleted {
pub visit_id: Uuid,
pub company_id: Uuid,
pub asset_id: Uuid,
pub journal_id: Option<Uuid>,
pub labor_cost: Decimal,
pub parts_cost: Decimal,
pub total_cost: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MaintenanceRequestStageChanged {
pub request_id: Uuid,
pub company_id: Uuid,
pub from_stage_id: Option<Uuid>,
pub to_stage_id: Uuid,
pub close_date: Option<NaiveDate>,
pub spawned_successor_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SuccessorSpawned {
pub source_request_id: Uuid,
pub successor_request_id: Uuid,
pub company_id: Uuid,
pub next_schedule_date: Option<DateTime<Utc>>,
pub next_schedule_end: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum MaintenanceEvent {
MaintenanceCompleted(MaintenanceCompleted),
MaintenanceRequestStageChanged(MaintenanceRequestStageChanged),
SuccessorSpawned(SuccessorSpawned),
}
pub trait MaintenanceEventSink: Send + Sync {
fn publish(&self, event: &MaintenanceEvent);
}
#[derive(Debug, Default, Clone)]
pub struct LoggingSink;
impl MaintenanceEventSink for LoggingSink {
fn publish(&self, event: &MaintenanceEvent) {
tracing::info!(?event, "maintenance event");
}
}