bo4e_core/enums/
invoice_status.rs

1//! Invoice status (Rechnungsstatus) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Status of an invoice in the processing lifecycle.
6///
7/// German: Rechnungsstatus
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[non_exhaustive]
10pub enum InvoiceStatus {
11    /// Unchecked - invoice created/received but not yet verified (Ungeprueft)
12    #[serde(rename = "UNGEPRUEFT")]
13    Unchecked,
14
15    /// Checked OK - invoice verified and found correct (Geprueft OK)
16    #[serde(rename = "GEPRUEFT_OK")]
17    CheckedOk,
18
19    /// Checked with errors - invoice has errors (Geprueft fehlerhaft)
20    #[serde(rename = "GEPRUEFT_FEHLERHAFT")]
21    CheckedWithErrors,
22
23    /// Booked - invoice recorded in accounting (Gebucht)
24    #[serde(rename = "GEBUCHT")]
25    Booked,
26
27    /// Paid - invoice has been settled (Bezahlt)
28    #[serde(rename = "BEZAHLT")]
29    Paid,
30}
31
32impl InvoiceStatus {
33    /// Returns the German name.
34    pub fn german_name(&self) -> &'static str {
35        match self {
36            Self::Unchecked => "Ungeprueft",
37            Self::CheckedOk => "Geprueft OK",
38            Self::CheckedWithErrors => "Geprueft fehlerhaft",
39            Self::Booked => "Gebucht",
40            Self::Paid => "Bezahlt",
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_serialize() {
51        assert_eq!(
52            serde_json::to_string(&InvoiceStatus::Unchecked).unwrap(),
53            r#""UNGEPRUEFT""#
54        );
55        assert_eq!(
56            serde_json::to_string(&InvoiceStatus::Paid).unwrap(),
57            r#""BEZAHLT""#
58        );
59    }
60
61    #[test]
62    fn test_deserialize() {
63        assert_eq!(
64            serde_json::from_str::<InvoiceStatus>(r#""UNGEPRUEFT""#).unwrap(),
65            InvoiceStatus::Unchecked
66        );
67        assert_eq!(
68            serde_json::from_str::<InvoiceStatus>(r#""GEPRUEFT_OK""#).unwrap(),
69            InvoiceStatus::CheckedOk
70        );
71    }
72
73    #[test]
74    fn test_roundtrip() {
75        for status in [
76            InvoiceStatus::Unchecked,
77            InvoiceStatus::CheckedOk,
78            InvoiceStatus::CheckedWithErrors,
79            InvoiceStatus::Booked,
80            InvoiceStatus::Paid,
81        ] {
82            let json = serde_json::to_string(&status).unwrap();
83            let parsed: InvoiceStatus = serde_json::from_str(&json).unwrap();
84            assert_eq!(status, parsed);
85        }
86    }
87}