**Agrupamento de faltantes contíguos** (`detector_sequencia.rs`) - Nova função pública `agrupar_contiguos(&[u64]) -> Vec<(u64, u64)>` com 4 testes - Na tela de resultado, faltantes agora aparecem como `• 100–104 (5 notas)` em vez de 5 linhas separadas **Estatísticas de completude** (`resultado.rs`) - Cada série exibe: `Série 001 — 10 faltante(s) — 990/1000 notas (99.0% completo):` **Copiar para clipboard** (`resultado.rs`) - Botão `📋 Copiar` ao lado de cada série nos faltantes — copia todos os números (não só a página atual) - Botão `📋 Copiar` nas duplicatas — copia no formato `1234 (3x), 5678 (2x)` Total: **42 → 46 testes**, todos passando.
37 lines
1.0 KiB
Rust
37 lines
1.0 KiB
Rust
use chrono::NaiveDate;
|
||
use rust_decimal::Decimal;
|
||
|
||
/// Representa uma nota fiscal com seus campos lógicos.
|
||
/// `numero + serie + documento_tipo` é o identificador único de cada nota.
|
||
#[derive(Debug, Clone)]
|
||
pub struct Nota {
|
||
/// Número incremental da nota. Armazenado como u64.
|
||
pub numero: u64,
|
||
/// Série da nota (1–3 dígitos numéricos). Ex: "001", "1".
|
||
pub serie: String,
|
||
/// Tipo de documento (ex: "NFE", "NFCE"). None quando não mapeado.
|
||
pub documento_tipo: Option<String>,
|
||
/// Valor monetário da nota (opcional).
|
||
pub valor: Option<Decimal>,
|
||
/// Data de emissão da nota (opcional, exibida no PDF mas não usada em regras).
|
||
pub data: Option<NaiveDate>,
|
||
}
|
||
|
||
impl Nota {
|
||
pub fn new(
|
||
numero: u64,
|
||
serie: String,
|
||
documento_tipo: Option<String>,
|
||
valor: Option<Decimal>,
|
||
data: Option<NaiveDate>,
|
||
) -> Self {
|
||
Self {
|
||
numero,
|
||
serie,
|
||
documento_tipo,
|
||
valor,
|
||
data,
|
||
}
|
||
}
|
||
}
|