Skip to main content

nfe_parser/base/
transporte.rs

1//! Transporte da Nota Fiscal Eletrônica (Grupo `<transp>`)
2//!
3//! Este módulo contém as estruturas para representar as informações
4//! de transporte/frete da NF-e conforme layout SEFAZ.
5//!
6//! ## Estrutura Completa do Grupo Transporte
7//!
8//! O grupo `<transp>` pode conter:
9//! - `<modFrete>`: Modalidade do frete (obrigatório)
10//! - `<transporta>`: Dados do transportador (opcional)
11//! - `<veicTransp>`: Dados do veículo (opcional)
12//! - `<reboque>`: Dados de reboques (opcional, múltiplos)
13//! - `<vol>`: Dados dos volumes transportados (opcional, múltiplos)
14//!
15//! ## Nota sobre Implementação
16//!
17//! Esta biblioteca implementa apenas o campo obrigatório `<modFrete>`.
18//! Os demais campos podem ser adicionados conforme necessidade.
19
20use super::Error;
21use serde::{Deserialize, Serialize};
22use serde_repr::{Deserialize_repr, Serialize_repr};
23use std::str::FromStr;
24
25/// Grupo de Informações do Transporte (tag `<transp>`)
26///
27/// Contém as informações relacionadas ao transporte dos produtos
28/// vendidos na NF-e.
29///
30/// ## Campo Obrigatório
31///
32/// O único campo obrigatório é `modFrete`, que indica quem é
33/// responsável pelo frete (CIF, FOB, etc.).
34///
35/// ## Campos Opcionais (não implementados)
36///
37/// - Dados do transportador (CNPJ, nome, endereço)
38/// - Dados do veículo (placa, UF, RNTC)
39/// - Dados dos volumes (quantidade, peso bruto/líquido)
40#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
41#[serde(rename = "transp")]
42pub struct Transporte {
43    /// Modalidade do frete (tag `<modFrete>`)
44    /// Define quem é responsável pela contratação e/ou pagamento do frete
45    #[serde(rename = "$unflatten=modFrete")]
46    pub modalidade: ModalidadeFrete,
47}
48
49impl FromStr for Transporte {
50    type Err = Error;
51
52    fn from_str(s: &str) -> Result<Self, Self::Err> {
53        quick_xml::de::from_str(s).map_err(|e| e.into())
54    }
55}
56
57/// Modalidade do Frete (tag `<modFrete>`)
58///
59/// Indica quem é responsável pela contratação e pagamento do frete.
60///
61/// ## Termos Comerciais (Incoterms)
62///
63/// | Código | Sigla | Responsabilidade |
64/// |--------|-------|------------------|
65/// | 0 | CIF | Remetente contrata e paga o frete |
66/// | 1 | FOB | Destinatário contrata e paga o frete |
67/// | 2 | - | Terceiro contrata e paga o frete |
68/// | 3 | - | Remetente transporta com veículo próprio |
69/// | 4 | - | Destinatário transporta com veículo próprio |
70/// | 9 | - | Não há transporte (retirada no local) |
71///
72/// ## Impacto Fiscal
73///
74/// A modalidade do frete afeta:
75/// - Base de cálculo do ICMS (frete pode compor a BC)
76/// - Direito a crédito de ICMS sobre o frete
77/// - Obrigatoriedade de informar dados do transportador
78#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]
79#[repr(u8)]
80pub enum ModalidadeFrete {
81    /// 0 - Frete por conta do Remetente (CIF - Cost, Insurance and Freight)
82    /// O vendedor é responsável por contratar e pagar o frete.
83    /// O valor do frete geralmente está incluído no preço do produto.
84    ContratacaoPorContaDoRemetente = 0,
85
86    /// 1 - Frete por conta do Destinatário (FOB - Free On Board)
87    /// O comprador é responsável por contratar e pagar o frete.
88    /// O preço do produto não inclui o frete.
89    ContratacaoPorContaDoDestinatario = 1,
90
91    /// 2 - Frete por conta de Terceiros
92    /// Um terceiro (não remetente nem destinatário) é responsável pelo frete.
93    ContratacaoPorContaDeTerceiros = 2,
94
95    /// 3 - Transporte Próprio por conta do Remetente
96    /// O remetente transporta com veículo próprio, sem contratação externa.
97    TransportePorContaDoRemetente = 3,
98
99    /// 4 - Transporte Próprio por conta do Destinatário
100    /// O destinatário retira a mercadoria com veículo próprio.
101    TransportePorContaDoDestinatario = 4,
102
103    /// 9 - Sem Ocorrência de Transporte
104    /// Usado quando não há deslocamento físico da mercadoria.
105    /// Ex: venda de energia elétrica, serviços, ou retirada imediata no balcão.
106    SemTransporte = 9,
107}