use chrono::NaiveDate;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use turnframe_core::ids::AttachmentId;
use turnframe_core::operation::Money;
use crate::workflows::claim::state::{ClaimField, ProposedField, RecordedField};
pub mod operations {
pub const CREATE_DRAFT: &str = "claim.create_draft";
pub const SET_REFERENCE: &str = "claim.set_reference";
pub const ATTACH_RECEIPT: &str = "claim.attach_receipt";
pub const REVISE_PROPOSED_FIELD: &str = "claim.revise_proposed_field";
pub const ACCEPT_PROPOSAL: &str = "claim.accept_proposal";
pub const ABANDON_REVIEW: &str = "claim.abandon_review";
pub const DISCARD_RECEIPT: &str = "claim.discard_receipt";
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum ClaimCommand {
CreateDraft,
SetReference {
value: String,
},
AttachReceipt {
attachment_id: AttachmentId,
},
ProposeFields {
attachment_id: AttachmentId,
fields: Vec<ProposedField>,
},
ReviseProposedField {
field: ClaimField,
value: String,
},
AcceptProposal,
AbandonReview,
DiscardReceipt,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum ClaimEvent {
DraftCreated,
ReferenceSet {
value: String,
},
ReceiptAttached {
attachment_id: AttachmentId,
},
FieldsProposed {
attachment_id: AttachmentId,
fields: Vec<ProposedField>,
},
ProposedFieldRevised {
field: ClaimField,
#[serde(default, skip_serializing_if = "Option::is_none")]
previous: Option<String>,
value: String,
},
ProposalAccepted {
attachment_id: AttachmentId,
fields: Vec<RecordedField>,
},
ProposalAbandoned {
attachment_id: AttachmentId,
},
ReceiptDiscarded,
}
impl ClaimEvent {
#[must_use]
pub const fn event_type(&self) -> &'static str {
match self {
Self::DraftCreated => "claim.draft_created",
Self::ReferenceSet { .. } => "claim.reference_set",
Self::ReceiptAttached { .. } => "claim.receipt_attached",
Self::FieldsProposed { .. } => "claim.fields_proposed",
Self::ProposedFieldRevised { .. } => "claim.proposed_field_revised",
Self::ProposalAccepted { .. } => "claim.proposal_accepted",
Self::ProposalAbandoned { .. } => "claim.proposal_abandoned",
Self::ReceiptDiscarded => "claim.receipt_discarded",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ReferenceArgs {
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct AttachArgs {
pub attachment_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ReviseArgs {
pub field: ClaimField,
#[serde(default)]
pub merchant: Option<String>,
#[serde(default)]
pub total: Option<Money>,
#[serde(default)]
pub date: Option<NaiveDate>,
}