diff --git a/src-tauri/src/plugins/supabase.rs b/src-tauri/src/plugins/supabase.rs index ef95cab..22e0471 100644 --- a/src-tauri/src/plugins/supabase.rs +++ b/src-tauri/src/plugins/supabase.rs @@ -250,21 +250,48 @@ impl SupabaseClient { /// Atualiza campos específicos de um fechamento pelo id_fechamento. pub fn atualizar_fechamento(&self, id_fechamento: &str, updates: &serde_json::Value) -> Result { + // Whitelist: só colunas que existem na tabela fechamentos_web. + // Campos de lista (vales, despesas, sangrias, etc.) vivem no JSONB `dados` + // e são tratados separadamente via salvar_listas / carregar_listas. + static ALLOWED: &[&str] = &[ + "data", "loja", "turno", "operador", + "saldo_troco", "saldo_credito", "saldo_debito", "saldo_alimentacao", + "saldo_vales", "saldo_areceber", + "total_cartao_credito", "total_cartao_debito", "total_cartao_alimentacao", + "total_cartao_pix", "total_pixcnpj", + "total_sangrias", "total_despesas", "total_vales", + "total_areceber", "total_cancelamentos", + "fechamento_dinheiro", "fechamento_cartoes", "fechamento_areceber", + "clientes", "frango", "vendas", "saldo_esperado", + "observacoes", "edited_at", "edited_by", + ]; + + let filtered: serde_json::Map = updates + .as_object() + .cloned() + .unwrap_or_default() + .into_iter() + .filter(|(k, _)| ALLOWED.contains(&k.as_str())) + .collect(); + + if filtered.is_empty() { + return Err(SupabaseError::Api("Nenhum campo válido para atualizar".into())); + } + let url = format!( "{}/rest/v1/fechamentos_web?id_fechamento=eq.{}", self.base_url, urlencoding::encode(id_fechamento) ); - // Log do que está sendo enviado (debug) - log::info!("[PATCH] url={} body={}", url, updates); + log::info!("[PATCH] url={} body={:#?}", url, filtered); let resp = self .http .patch(&url) .headers(self.headers(true)) .header("Prefer", "return=representation") - .json(updates) + .json(&filtered) .send()?; let status = resp.status();