v1.3.23: Rust salvar_fechamento envia TODAS colunas numeric + clientes/frango; ADD COLUMN clientes/frango no Postgres
Build Fechamento de Caixa / build (macos-14, app) (push) Has been cancelled
Build Fechamento de Caixa / build (ubuntu-22.04, deb) (push) Has been cancelled
Build Fechamento de Caixa / build (windows-2022, msi) (push) Has been cancelled

This commit is contained in:
root
2026-06-26 15:43:30 +00:00
parent bd867e8419
commit 35dcd27dda
+46 -38
View File
@@ -69,58 +69,66 @@ impl SupabaseClient {
/// Salva/atualiza um fechamento na tabela `fechamentos_web`. /// Salva/atualiza um fechamento na tabela `fechamentos_web`.
pub fn salvar_fechamento(&self, estado: &serde_json::Value) -> Result<Value, SupabaseError> { pub fn salvar_fechamento(&self, estado: &serde_json::Value) -> Result<Value, SupabaseError> {
let uuid = estado // id_fechamento = {loja}_{data}_{operador} (唯一, existe na tabela)
.get("uuid") let loja = estado.get("loja").and_then(|v| v.as_str()).unwrap_or("uniao");
.and_then(|v| v.as_str()) let data = estado.get("data").and_then(|v| v.as_str()).unwrap_or("");
.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!({ let payload = serde_json::json!({
"uuid": uuid, "id_fechamento": id_fechamento,
"loja": estado["loja"], "loja": loja,
"data": estado["data"], "data": data,
"operador": estado["operador"], "operador": operador,
"turno": estado["turno"], "turno": estado.get("turno").and_then(|v| v.as_str()).unwrap_or(""),
"saldo_troco": estado["saldo_troco"], "saldo_troco": estado.get("saldo_troco").and_then(|v| v.as_f64()).unwrap_or(0.0),
"saldo_esperado": estado["saldo_esperado"], "saldo_credito": estado.get("credito").and_then(|v| v.as_f64()).unwrap_or(0.0),
"fechamento": estado["fechamento"], "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, "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 // Upsert via POST com Prefer: resolution=merge-duplicates
let resp = self let resp = self
.http .http
.post(&format!("{}/rest/v1/rpc/upsert_fechamento", self.base_url)) .post(&format!("{}/rest/v1/fechamentos_web", self.base_url))
.headers(self.headers(true)) .headers(self.headers(true))
.header("Prefer", "resolution=merge-duplicates")
.json(&payload) .json(&payload)
.send()?; .send()?;
if resp.status().is_success() { let status = resp.status();
Ok(serde_json::json!({ "ok": true, "uuid": uuid })) if status.is_success() {
Ok(serde_json::json!({ "ok": true, "id_fechamento": id_fechamento }))
} else { } else {
let body = resp.text().unwrap_or_default(); let body = resp.text().unwrap_or_default();
// Fallback: tenta POST direto na tabela Err(SupabaseError::Api(format!(
let resp2 = self "HTTP {}: {}",
.http status.as_u16(),
.post(&format!("{}/rest/v1/fechamentos_web", self.base_url)) body
.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
)))
}
} }
} }