konduto/types/orders/
status.rs

1use crate::supports::enums;
2use serde::{Deserialize, Serialize};
3use std::fmt::Display;
4
5/// Status de um pedido na Konduto
6#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
7#[serde(rename_all = "snake_case")]
8pub enum OrderStatus {
9    /// Aprovado: pedido é considerado legítimo para o algoritmo. Baixa possibilidade de fraude.
10    /// Se houver saldo no cartão, a compra pode ser liberada.
11    Approved,
12
13    /// Pendente: esse status quer dizer que o pedido está aguardando a revisão manual
14    /// da equipe, pois o algoritmo não tinha certeza sobre a aprovação.
15    Pending,
16
17    /// Negado: pedido foi rejeitado por suspeita de fraude e deve ser considerado
18    /// negativamente pelo algoritmo.
19    Declined,
20
21    /// Não Aprovado: pedido teve o pagamento negado pela operadora de cartão e deve
22    /// ser ignorado pelo algoritmo.
23    /// Esse pedido não será analisado pela Konduto desde que ao enviá-lo, adicione a flag
24    /// analyze=false no corpo da sua integração.
25    NotAuthorized,
26
27    /// Cancelado: pedido foi cancelado por questões operacionais e deve ser ignorado
28    /// pelo algoritmo.
29    /// Ofereça ao seu cliente refazer o pedido ou outra forma de pagamento.
30    Canceled,
31
32    /// Fraude: pedido teve fraude confirmada e deve ser considerado negativamente
33    /// pelo algoritmo.
34    /// Esse status sinaliza que você recebeu um chargeback.
35    Fraud,
36
37    /// Não Analisado: pedido não foi analisado pelo algoritmo e não há recomendação de
38    /// risco (exemplo: outros meios de pagamento - débito, boleto, etc).
39    /// Todos os pedidos enviados com a flag analyze=false ou com formas de pagamento
40    /// diferentes de Cartão de crédito, terão esse status na API de Pedidos.
41    NotAnalyzed,
42}
43
44impl<'de> Deserialize<'de> for OrderStatus {
45    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
46    where
47        D: serde::Deserializer<'de>,
48    {
49        let s = String::deserialize(deserializer)?;
50        match s.to_lowercase().as_str() {
51            "approved" => Ok(OrderStatus::Approved),
52            "pending" => Ok(OrderStatus::Pending),
53            "declined" => Ok(OrderStatus::Declined),
54            "not_authorized" => Ok(OrderStatus::NotAuthorized),
55            "canceled" => Ok(OrderStatus::Canceled),
56            "fraud" => Ok(OrderStatus::Fraud),
57            "not_analyzed" => Ok(OrderStatus::NotAnalyzed),
58            _ => Err(serde::de::Error::custom(format!("Invalid status: {}", s))),
59        }
60    }
61}
62
63impl OrderStatus {
64    pub fn name(&self) -> String {
65        enums::to_string_infallible(self)
66    }
67}
68
69impl Display for OrderStatus {
70    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71        write!(f, "{}", self.name())
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78    use serde_json::json;
79
80    #[test]
81    fn test_status_deserialization_case_insensitive() {
82        let status: OrderStatus = serde_json::from_value(json!("approved")).unwrap();
83        assert_eq!(status, OrderStatus::Approved);
84        let status: OrderStatus = serde_json::from_value(json!("APPROVED")).unwrap();
85        assert_eq!(status, OrderStatus::Approved);
86        let status: OrderStatus = serde_json::from_value(json!("Approved")).unwrap();
87        assert_eq!(status, OrderStatus::Approved);
88    }
89
90    #[test]
91    fn test_all_statuses() {
92        let test_cases = vec![
93            ("approved", OrderStatus::Approved),
94            ("pending", OrderStatus::Pending),
95            ("declined", OrderStatus::Declined),
96            ("not_authorized", OrderStatus::NotAuthorized),
97            ("canceled", OrderStatus::Canceled),
98            ("fraud", OrderStatus::Fraud),
99            ("not_analyzed", OrderStatus::NotAnalyzed),
100        ];
101
102        for (input, expected) in test_cases {
103            let status: OrderStatus = serde_json::from_value(json!(input)).unwrap();
104            assert_eq!(status, expected);
105        }
106    }
107
108    #[test]
109    fn test_status_serialization() {
110        let status = OrderStatus::Approved;
111        let json = serde_json::to_value(&status).unwrap();
112        assert_eq!(json, json!("approved"));
113
114        let status = OrderStatus::NotAuthorized;
115        let json = serde_json::to_value(&status).unwrap();
116        assert_eq!(json, json!("not_authorized"));
117    }
118
119    #[test]
120    fn test_invalid_status() {
121        let result: Result<OrderStatus, _> = serde_json::from_value(json!("invalid_status"));
122        assert!(result.is_err());
123    }
124}