diff --git a/src-tauri/src/plugins/supabase.rs b/src-tauri/src/plugins/supabase.rs index 1678d99..b0bcda6 100644 --- a/src-tauri/src/plugins/supabase.rs +++ b/src-tauri/src/plugins/supabase.rs @@ -69,58 +69,66 @@ impl SupabaseClient { /// Salva/atualiza um fechamento na tabela `fechamentos_web`. pub fn salvar_fechamento(&self, estado: &serde_json::Value) -> Result { - let uuid = estado - .get("uuid") - .and_then(|v| v.as_str()) - .unwrap_or(""); + // id_fechamento = {loja}_{data}_{operador} (唯一, existe na tabela) + let loja = estado.get("loja").and_then(|v| v.as_str()).unwrap_or("uniao"); + 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 payload = serde_json::json!({ - "uuid": uuid, - "loja": estado["loja"], - "data": estado["data"], - "operador": estado["operador"], - "turno": estado["turno"], - "saldo_troco": estado["saldo_troco"], - "saldo_esperado": estado["saldo_esperado"], - "fechamento": estado["fechamento"], + "id_fechamento": id_fechamento, + "loja": loja, + "data": data, + "operador": operador, + "turno": estado.get("turno").and_then(|v| v.as_str()).unwrap_or(""), + "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), + "saldo_alimentacao": estado.get("alimentacao").and_then(|v| v.as_f64()).unwrap_or(0.0), + "saldo_vales": estado.get("vales").and_then(|v| v.as_f64()).unwrap_or(0.0), + "saldo_areceber": estado.get("areceber").and_then(|v| v.as_f64()).unwrap_or(0.0), + "saldo_pixcnpj": estado.get("pixcnpj").and_then(|v| v.as_f64()).unwrap_or(0.0), + "fechamento_dinheiro": estado.get("fd").and_then(|v| v.as_f64()).unwrap_or(0.0), + "fechamento_cartoes": estado.get("fc").and_then(|v| v.as_f64()).unwrap_or(0.0), + "fechamento_areceber": estado.get("fr").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_sangrias": estado.get("total_sangrias").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_despesas": estado.get("total_despesas").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_cancelamentos": estado.get("total_cancelamentos").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_vales": estado.get("total_vales").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_pixcnpj": estado.get("total_pixcnpj").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_areceber": estado.get("total_areceber").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_cartao_credito": estado.get("total_credito").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_cartao_debito": estado.get("total_debito").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_cartao_alimentacao": estado.get("total_alimentacao").and_then(|v| v.as_f64()).unwrap_or(0.0), + "total_cartao_pix": estado.get("total_pix").and_then(|v| v.as_f64()).unwrap_or(0.0), + "saldo_esperado": estado.get("saldo_esperado").and_then(|v| v.as_f64()).unwrap_or(0.0), "dados": estado, - "observacoes": "rascunho", + "observacoes": estado.get("observacoes").and_then(|v| v.as_str()).unwrap_or(""), + "clientes": estado.get("clientes").and_then(|v| v.as_i64()).unwrap_or(0), + "frango": estado.get("frango").and_then(|v| v.as_i64()).unwrap_or(0), }); - let _url = format!( - "{}/rest/v1/fechamentos_web?uuid=eq.{}&select=id", - self.base_url, uuid - ); - // Upsert via POST com Prefer: resolution=merge-duplicates let resp = self .http - .post(&format!("{}/rest/v1/rpc/upsert_fechamento", self.base_url)) + .post(&format!("{}/rest/v1/fechamentos_web", self.base_url)) .headers(self.headers(true)) + .header("Prefer", "resolution=merge-duplicates") .json(&payload) .send()?; - if resp.status().is_success() { - Ok(serde_json::json!({ "ok": true, "uuid": uuid })) + let status = resp.status(); + if status.is_success() { + Ok(serde_json::json!({ "ok": true, "id_fechamento": id_fechamento })) } else { let body = resp.text().unwrap_or_default(); - // Fallback: tenta POST direto na tabela - let resp2 = self - .http - .post(&format!("{}/rest/v1/fechamentos_web", self.base_url)) - .headers(self.headers(true)) - .header("Prefer", "resolution=merge-duplicates") - .json(&payload) - .send()?; - if resp2.status().is_success() { - Ok(serde_json::json!({ "ok": true, "uuid": uuid })) - } else { - Err(SupabaseError::Api(format!( - "HTTP {}: {}", - resp2.status().as_u16(), - body - ))) - } + Err(SupabaseError::Api(format!( + "HTTP {}: {}", + status.as_u16(), + body + ))) } }