diff --git a/src-tauri/src/plugins/supabase.rs b/src-tauri/src/plugins/supabase.rs index b0bcda6..fba7272 100644 --- a/src-tauri/src/plugins/supabase.rs +++ b/src-tauri/src/plugins/supabase.rs @@ -7,6 +7,29 @@ use std::time::Duration; use tauri::State; use thiserror::Error; +/// Remove acentos de uma string (ex: "União" → "Uniao") +fn sem_acento(s: &str) -> String { + s.replace("ã", "a") + .replace("á", "a") + .replace("à", "a") + .replace("â", "a") + .replace("é", "e") + .replace("è", "e") + .replace("ê", "e") + .replace("í", "i") + .replace("ì", "i") + .replace("î", "i") + .replace("õ", "o") + .replace("ó", "o") + .replace("ò", "o") + .replace("ô", "o") + .replace("ú", "u") + .replace("ù", "u") + .replace("û", "u") + .replace("ç", "c") + .replace("ñ", "n") +} + #[derive(Error, Debug)] #[allow(dead_code)] pub enum SupabaseError { @@ -69,20 +92,29 @@ impl SupabaseClient { /// Salva/atualiza um fechamento na tabela `fechamentos_web`. pub fn salvar_fechamento(&self, estado: &serde_json::Value) -> Result { - // id_fechamento = {loja}_{data}_{operador} (唯一, existe na tabela) - let loja = estado.get("loja").and_then(|v| v.as_str()).unwrap_or("uniao"); + // Normaliza loja e turno para minúsculo (CHECK constraints do Postgres) + let loja = estado + .get("loja") + .and_then(|v| v.as_str()) + .map(|s| sem_acento(&s.to_lowercase()).replace(" ", "_")) + .unwrap_or_else(|| "uniao".to_string()); let data = estado.get("data").and_then(|v| v.as_str()).unwrap_or(""); let operador = estado.get("operador").and_then(|v| v.as_str()).unwrap_or(""); let id_fechamento = format!("{}_{}_{}", loja, data, operador) .to_lowercase() .replace(" ", "_"); + let turno = estado + .get("turno") + .and_then(|v| v.as_str()) + .map(|s| s.to_lowercase()) + .unwrap_or_else(|| "manha".to_string()); let payload = serde_json::json!({ "id_fechamento": id_fechamento, "loja": loja, "data": data, "operador": operador, - "turno": estado.get("turno").and_then(|v| v.as_str()).unwrap_or(""), + "turno": turno, "saldo_troco": estado.get("saldo_troco").and_then(|v| v.as_f64()).unwrap_or(0.0), "saldo_credito": estado.get("credito").and_then(|v| v.as_f64()).unwrap_or(0.0), "saldo_debito": estado.get("debito").and_then(|v| v.as_f64()).unwrap_or(0.0),