pix_brcode/
qr_dinamico.rs

1use std::borrow::Cow;
2
3use emv_qrcps::EmvEncoder;
4
5#[derive(EmvEncoder, Clone, Debug)]
6pub struct AdditionalData<'a> {
7    #[encoder(id = "05")]
8    /// Default de "***"
9    /// Não deve ser preenchido no dinâmico, caso seja, deve ser ignorado.
10    txid: Cow<'a, str>,
11}
12
13#[derive(EmvEncoder, Clone, Debug)]
14pub struct MerchantAccountInformation<'a> {
15    /// Defaults to "br.gov.bcb.pix"
16    #[encoder(id = "00")]
17    pub merchant_gui: Cow<'a, str>,
18
19    /// Não deve conter o prefixo de procolo, ex: http.
20    /// Acesso deve ser após validações, e exclusivamente em HTTPS.
21    #[encoder(id = "25")]
22    pub merchant_location_url: Cow<'a, str>,
23}
24
25#[derive(EmvEncoder, Clone, Debug)]
26pub struct PixDinamicoSchema<'a> {
27    /// Versão do Payload QRCPS-MPM. Default em "01"
28    #[encoder(id = "00")]
29    pub format_indicator: Cow<'a, str>,
30
31    /// Está presente para indicar que não deve ser iniciado mais de um pagamento com este mesmo QR Code.
32    /// Defaults em "12".
33    #[encoder(id = "01")]
34    pub point_of_initiation_method: Option<Cow<'a, str>>,
35
36    #[encoder(id = "26")]
37    pub merchant_account_information: MerchantAccountInformation<'a>,
38
39    #[encoder(id = "52")]
40    /// Defaults to "0000"
41    pub merchant_category_code: Cow<'a, str>,
42
43    /// Defaults to "968", as BRL.
44    #[encoder(id = "53")]
45    pub transaction_currency: Cow<'a, str>,
46
47    #[encoder(id = "54")]
48    pub transaction_amount: Option<Cow<'a, str>>,
49
50    /// ISO3166-1 alpha 2 Country Code
51    /// Defaults to "BR"
52    #[encoder(id = "58")]
53    pub country_code: Cow<'a, str>,
54
55    /// Recipient's name
56    #[encoder(id = "59")]
57    pub merchant_name: Cow<'a, str>,
58
59    /// City where transaction occurred
60    #[encoder(id = "60")]
61    pub merchant_city: Cow<'a, str>,
62
63    #[encoder(id = "61")]
64    pub postal_code: Option<Cow<'a, str>>,
65
66    #[encoder(id = "62")]
67    pub additional_data: AdditionalData<'a>,
68}
69
70impl<'a> PixDinamicoSchema<'a> {
71    /// Creates the most basic version of the QR Code, with every possible field with its default.
72    pub fn standard<MA, MC, TA, L>(merchant_name: MA, merchant_city: MC, transaction_amount: TA, location: L) -> Self
73    where
74        MA: Into<Cow<'a, str>>,
75        MC: Into<Cow<'a, str>>,
76        TA: Into<Cow<'a, str>>,
77        L: Into<Cow<'a, str>>,
78    {
79        let merchant = MerchantAccountInformation {
80            merchant_gui: "br.gov.bcb.pix".into(),
81            merchant_location_url: location.into(),
82        };
83
84        let additional_data = AdditionalData { txid: "***".into() };
85
86        Self {
87            format_indicator: "01".into(),
88            point_of_initiation_method: Some("12".into()),
89
90            merchant_account_information: merchant,
91            merchant_category_code: "0000".into(),
92            transaction_currency: "986".into(),
93            transaction_amount: Some(transaction_amount.into()),
94            country_code: "BR".into(),
95            merchant_name: merchant_name.into(),
96            merchant_city: merchant_city.into(),
97            postal_code: None,
98            additional_data,
99        }
100    }
101}