Compare commits

..

21 Commits

Author SHA1 Message Date
root aa147885a8 v1.3.30: diferença tela lançamento usa sysTotal (troco+credito+debito+alimentacao+vales+receber+pix+pixcnpj) - saldo_esperado - cancelamentos
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
2026-06-28 01:52:50 +00:00
root 00fa17fa52 v1.3.29: ignora HTTP 409 duplicate (ja existe = ok)
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
2026-06-27 23:54:07 +00:00
root 5e6f8b09a9 v1.3.28: diferença = fechamento - saldo_esperado - cancelamentos (正确 formula); clientes/frango no ESC/POS
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
2026-06-27 23:26:01 +00:00
root 9ac4eb7042 v1.3.27: buildEstadoForBackend envia TODOS totais pro Postgres (colunas SQL)
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
2026-06-26 21:55:44 +00:00
root 2b8fa98ed7 v1.3.26: sem_acento também no turno (manhã→manha)
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
2026-06-26 21:42:43 +00:00
root 77e927fef0 v1.3.25: add sem_acento() - remove acentos de loja antes de enviar (União→uniao)
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
2026-06-26 19:22:10 +00:00
root 3f6b2ae6e4 v1.3.23: embed SUPABASE_ANON_KEY e SERVICE_KEY no binario (fallback) - resolve 401 em qualquer PC
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
2026-06-26 16:45:36 +00:00
root 35dcd27dda 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
2026-06-26 15:43:30 +00:00
root bd867e8419 v1.3.21: PDF/envio - CONTADORES no final do buildConfirmHTML
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
2026-06-26 14:41:43 +00:00
root da861ef964 v1.3.20: Diferença tela = SaldoCaixa(Sistema) - SaldoEsperado - Cancelamentos; CONTADORES no final do Recibo 80mm
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
2026-06-26 14:32:25 +00:00
root 8e642f2e0c v1.3.18: SaldoCaixa(Sistema) agora inclui TROCO. Diferença = SaldoCaixa(Sistema) - SaldoEsperado - Cancelamentos
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
2026-06-26 14:02:41 +00:00
root 7473db6b1f Revert "v1.3.16: Diferença=SaldoCaixa(Sistema)-SaldoEsperado-Cancelamentos; nomes padronizados"
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 reverts commit 13489d58cf.
2026-06-26 13:55:23 +00:00
root 13489d58cf v1.3.16: Diferença=SaldoCaixa(Sistema)-SaldoEsperado-Cancelamentos; nomes padronizados
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
2026-06-26 13:52:34 +00:00
root 5ad8c1f395 v1.3.15: diferença=fechamento-saldo_esperado-cancelamentos; ESCPOS 80mm+HTML com clientes+frango
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
2026-06-26 13:33:28 +00:00
root 103cd31e50 v1.3.14b: campos Clientes e Frango Assado no formulário, reports e modal
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
2026-06-26 13:21:02 +00:00
root 06783de4e2 v1.3.14: dia anterior com modal+senha, editing mode PATCH, sys_total sem troco, fórmulas corrigidas, reportHTML
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
2026-06-26 12:57:39 +00:00
root 11abac8daf v1.3.13: fórmulas corrigidas — diferença=(fechamento-(saldo_esp-cancel)), sys_total sem troco, reportHTML separado
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
2026-06-26 12:45:46 +00:00
root fea957dfb9 v1.3.12: dia anterior robusto — hasTauri check em todas as chamadas
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
2026-06-26 03:44:53 +00:00
root 130b2b6da7 v1.3.11: 3 bugs corrigidos — preview sempre abre, tabela cartoes com traços, variaveis ausentes
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
2026-06-26 03:40:48 +00:00
root b47d7766ad v1.3.10: relatório completo idêntico ao PDF — todas seções, tabela cartões 4 colunas, saldo sistema, fechamento contado, diff sys_total
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
2026-06-26 03:24:27 +00:00
root 78fa778197 v1.3.9: dif ESC/POS usa self.diferenca (sys_total - saldo_esperado)
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
2026-06-26 03:11:16 +00:00
4 changed files with 930 additions and 348 deletions
+5 -3
View File
@@ -36,10 +36,10 @@ fn load_config() -> (String, String) {
} }
} }
} }
// Fallback: tenta variáveis de ambiente // Fallback 3: chaves embedadas no binário (funciona em qualquer PC sem config)
( (
std::env::var("SUPABASE_ANON_KEY").unwrap_or_default(), "sb_publishable_NCUGwstslOvVt5JtGxKB9A_p-BERG57".to_string(),
std::env::var("SUPABASE_SERVICE_KEY").unwrap_or_default(), "sb_secret_T6eHIKJDGaH53HMTG6UUKa_6ou6KfEW".to_string(),
) )
} }
@@ -96,6 +96,8 @@ fn main() {
plugins::supabase::sb_carregar_rascunho, plugins::supabase::sb_carregar_rascunho,
plugins::supabase::sb_listar_recentes, plugins::supabase::sb_listar_recentes,
plugins::supabase::sb_buscar_por_id, plugins::supabase::sb_buscar_por_id,
plugins::supabase::sb_buscar_por_uuid,
plugins::supabase::sb_atualizar_fechamento,
plugins::supabase::sb_salvar_listas, plugins::supabase::sb_salvar_listas,
plugins::supabase::sb_carregar_listas, plugins::supabase::sb_carregar_listas,
plugins::supabase::sb_online, plugins::supabase::sb_online,
+12 -1
View File
@@ -127,6 +127,10 @@ pub struct ReciboData {
pub cancelamentos_arr: Vec<ReciboLinha>, pub cancelamentos_arr: Vec<ReciboLinha>,
#[serde(default)] #[serde(default)]
pub observacoes: Option<String>, pub observacoes: Option<String>,
#[serde(default)]
pub clientes: i32,
#[serde(default)]
pub frango: i32,
} }
impl ReciboData { impl ReciboData {
@@ -318,8 +322,9 @@ impl ReciboData {
out.extend(escpos::divider()); out.extend(escpos::divider());
// ── DIFERENÇA ── // ── DIFERENÇA ──
// Diferença = total_fechamento - saldo_esperado - cancelamentos
out.extend(escpos::line_bold("DIFERENCA")); out.extend(escpos::line_bold("DIFERENCA"));
let diff = self.diferenca; let diff = self.fechamento - self.saldo_esperado - self.cancelamentos;
let diff_str = if diff >= 0.0 { let diff_str = if diff >= 0.0 {
format!("+{}", self.fmt_money(diff)) format!("+{}", self.fmt_money(diff))
} else { } else {
@@ -327,6 +332,12 @@ impl ReciboData {
}; };
out.extend(escpos::title(&diff_str)); out.extend(escpos::title(&diff_str));
// ── CONTADORES ──
out.extend(escpos::line_bold("CONTADORES"));
out.extend(escpos::kv("Clientes:", &self.clientes.to_string()));
out.extend(escpos::kv("Frango Assado:", &self.frango.to_string()));
out.extend(escpos::divider());
// ── OBSERVAÇÕES ── // ── OBSERVAÇÕES ──
if let Some(ref obs) = self.observacoes { if let Some(ref obs) = self.observacoes {
if !obs.trim().is_empty() { if !obs.trim().is_empty() {
+148 -39
View File
@@ -7,6 +7,29 @@ use std::time::Duration;
use tauri::State; use tauri::State;
use thiserror::Error; 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)] #[derive(Error, Debug)]
#[allow(dead_code)] #[allow(dead_code)]
pub enum SupabaseError { pub enum SupabaseError {
@@ -69,58 +92,75 @@ 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 // Normaliza loja e turno para minúsculo (CHECK constraints do Postgres)
.get("uuid") let loja = estado
.get("loja")
.and_then(|v| v.as_str()) .and_then(|v| v.as_str())
.unwrap_or(""); .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| sem_acento(&s.to_lowercase()))
.unwrap_or_else(|| "manha".to_string());
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": turno,
"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_cartao_credito").and_then(|v| v.as_f64()).unwrap_or(0.0),
"total_cartao_debito": estado.get("total_cartao_debito").and_then(|v| v.as_f64()).unwrap_or(0.0),
"total_cartao_alimentacao": estado.get("total_cartao_alimentacao").and_then(|v| v.as_f64()).unwrap_or(0.0),
"total_cartao_pix": estado.get("total_cartao_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!( // Primeiro tenta INSERT (upsert via Prefer)
"{}/rest/v1/fechamentos_web?uuid=eq.{}&select=id",
self.base_url, uuid
);
// 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() || status.as_u16() == 409 {
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
)))
}
} }
} }
@@ -153,7 +193,59 @@ impl SupabaseClient {
} }
} }
/// Lista fechamentos recentes de uma loja. /// Busca um fechamento pelo UUID.
pub fn buscar_por_uuid(&self, uuid: &str) -> Result<Option<Value>, SupabaseError> {
let url = format!(
"{}/rest/v1/fechamentos_web?uuid=eq.{}&select=*",
self.base_url, uuid
);
let resp = self
.http
.get(&url)
.headers(self.headers(false))
.send()?;
if resp.status().is_success() {
let arr: Vec<Value> = resp.json()?;
Ok(arr.into_iter().next())
} else {
let status = resp.status();
let body = resp.text().unwrap_or_default();
Err(SupabaseError::Api(format!(
"HTTP {}: {}",
status.as_u16(),
body
)))
}
}
/// Atualiza campos específicos de um fechamento pelo UUID (PATCH).
pub fn atualizar_fechamento(&self, uuid: &str, updates: &serde_json::Value) -> Result<Value, SupabaseError> {
let url = format!(
"{}/rest/v1/fechamentos_web?uuid=eq.{}",
self.base_url, uuid
);
let resp = self
.http
.patch(&url)
.headers(self.headers(true))
.json(updates)
.send()?;
if resp.status().is_success() {
Ok(serde_json::json!({ "ok": true, "uuid": uuid }))
} else {
let status = resp.status();
let body = resp.text().unwrap_or_default();
Err(SupabaseError::Api(format!(
"HTTP {}: {}",
status.as_u16(),
body
)))
}
}
pub fn listar_recentes(&self, loja: &str, limite: i64) -> Result<Vec<Value>, SupabaseError> { pub fn listar_recentes(&self, loja: &str, limite: i64) -> Result<Vec<Value>, SupabaseError> {
let url = format!( let url = format!(
"{}/rest/v1/fechamentos_web?loja=eq.{}&order=data.desc,atualizado_em.desc&limit={}&select=id,uuid,data,operador,turno,saldo_troco,saldo_esperado,fechamento,sync_status,observacoes,atualizado_em", "{}/rest/v1/fechamentos_web?loja=eq.{}&order=data.desc,atualizado_em.desc&limit={}&select=id,uuid,data,operador,turno,saldo_troco,saldo_esperado,fechamento,sync_status,observacoes,atualizado_em",
@@ -322,6 +414,23 @@ pub fn sb_buscar_por_id(
sb.buscar_por_id(id) sb.buscar_por_id(id)
} }
#[tauri::command]
pub fn sb_buscar_por_uuid(
sb: State<'_, SupabaseClient>,
uuid: String,
) -> Result<Option<serde_json::Value>, SupabaseError> {
sb.buscar_por_uuid(&uuid)
}
#[tauri::command]
pub fn sb_atualizar_fechamento(
sb: State<'_, SupabaseClient>,
uuid: String,
updates: serde_json::Value,
) -> Result<serde_json::Value, SupabaseError> {
sb.atualizar_fechamento(&uuid, &updates)
}
#[tauri::command] #[tauri::command]
pub fn sb_salvar_listas( pub fn sb_salvar_listas(
sb: State<'_, SupabaseClient>, sb: State<'_, SupabaseClient>,
+765 -305
View File
File diff suppressed because it is too large Load Diff