diff --git a/src/lib.rs b/src/lib.rs index 84c94e4..072ab9d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -86,10 +86,8 @@ pub fn datatype_to_val_str_from_str(s: &str) -> Option { /// Assumimos que a coluna 39 (zero-based 39 -> 40a coluna) contém o valor, e coluna 1 contém a data /// Processa uma sheet específica do calamine (Range) e retorna linhas E250 pub fn process_sheet(range: &Range, codigo_receita: &str, mes_apuracao: &str) -> Vec { - // Agrega os valores da planilha por estado e retorna UM único |E250| com o total - let mut total: f64 = 0.0; - let mut any = false; - let mut chosen_vencimento: Option = None; + // Gera uma linha |E250| para cada dia (linha) da planilha com valor não-zero + let mut result: Vec = Vec::new(); for row in range.rows().skip(1) { let valor_dt_opt = if row.len() > 39 { row.get(39) } else { None }; @@ -106,32 +104,22 @@ pub fn process_sheet(range: &Range // tentar parse do valor formatado (ex: "1.234,56" ou "1234,56") let normalized = valor_str.replace('.', "").replace(',', "."); - if let Ok(v) = normalized.parse::() { - total += v; - any = true; - } - - // escolher vencimento: a primeira data válida encontrada - if chosen_vencimento.is_none() { - if let Some(venc_dt) = vencimento_dt_opt + if let Ok(_v) = normalized.parse::() { + // obter o vencimento desta linha específica + let venc = vencimento_dt_opt .map(|v| v.to_string()) .and_then(|s| datatype_to_val_str_from_str(&s[..])) - { - chosen_vencimento = Some(venc_dt); - } + .unwrap_or_else(|| "01012000".to_string()); + + // formatar valor para o SPED (vírgula decimal) + let valor_formatted = valor_str.replace('.', ","); + let linha = format!("|E250|999|{}|{}|{}|||||{}|", valor_formatted, venc, codigo_receita, mes_apuracao.replace('/', "")); + result.push(linha); } } } - if !any { - return Vec::new(); - } - - // formatar total para o SPED (vírgula decimal) - let valor_formatted = format!("{:.2}", total).replace('.', ","); - let venc = chosen_vencimento.unwrap_or_else(|| "01012000".to_string()); - let linha = format!("|E250|999|{}|{}|{}|||||{}|", valor_formatted, venc, codigo_receita, mes_apuracao.replace('/', "")); - vec![linha] + result } /// Processa uma única linha representada por slice de Strings (útil para testes).