Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| da861ef964 | |||
| 8e642f2e0c | |||
| 7473db6b1f | |||
| 13489d58cf | |||
| 5ad8c1f395 | |||
| 103cd31e50 | |||
| 06783de4e2 | |||
| 11abac8daf | |||
| fea957dfb9 | |||
| 130b2b6da7 | |||
| b47d7766ad | |||
| 78fa778197 | |||
| 5e4340adca | |||
| c01133f39c | |||
| a6b295a6d0 |
@@ -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,
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -156,9 +160,10 @@ impl ReciboData {
|
|||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
|
|
||||||
// ── SANGRIAS ──
|
// ── SANGRIAS ──
|
||||||
|
if !self.sangrias_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("SANGRIAS"));
|
out.extend(escpos::line_bold("SANGRIAS"));
|
||||||
for linha in &self.sangrias_arr {
|
for linha in &self.sangrias_arr {
|
||||||
if linha.retirada.is_some() || linha.valor.is_some() {
|
if linha.retirada.unwrap_or(0.0) > 0.0 || linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let label = linha.label();
|
let label = linha.label();
|
||||||
let obs = linha.obs();
|
let obs = linha.obs();
|
||||||
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
||||||
@@ -167,13 +172,21 @@ impl ReciboData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total sangrias
|
||||||
|
let total_sangrias: f64 = self.sangrias_arr.iter()
|
||||||
|
.map(|l| l.retirada.unwrap_or(0.0) + l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
if total_sangrias > 0.0 {
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_sangrias)));
|
||||||
|
}
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
|
}
|
||||||
|
|
||||||
// ── DESPESAS ──
|
// ── DESPESAS ──
|
||||||
if !self.despesas_arr.is_empty() {
|
if !self.despesas_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("DESPESAS"));
|
out.extend(escpos::line_bold("DESPESAS"));
|
||||||
for linha in &self.despesas_arr {
|
for linha in &self.despesas_arr {
|
||||||
if linha.valor.is_some() {
|
if linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let label = linha.label();
|
let label = linha.label();
|
||||||
let obs = linha.obs();
|
let obs = linha.obs();
|
||||||
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
||||||
@@ -182,18 +195,30 @@ impl ReciboData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total despesas
|
||||||
|
let total_despesas: f64 = self.despesas_arr.iter()
|
||||||
|
.map(|l| l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_despesas)));
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── PIX CNPJ ──
|
// ── PIX CNPJ ──
|
||||||
if !self.pixcnpj_arr.is_empty() || self.pixcnpj > 0.0 {
|
if !self.pixcnpj_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("PIX CNPJ"));
|
out.extend(escpos::line_bold("PIX CNPJ"));
|
||||||
for linha in &self.pixcnpj_arr {
|
for linha in &self.pixcnpj_arr {
|
||||||
if linha.valor.is_some() {
|
if linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let label = linha.nome.clone().unwrap_or_else(|| "PIX CNPJ".to_string());
|
let label = linha.nome.clone().unwrap_or_else(|| "PIX CNPJ".to_string());
|
||||||
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total PIX CNPJ
|
||||||
|
let total_pixcnpj: f64 = self.pixcnpj_arr.iter()
|
||||||
|
.map(|l| l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
if total_pixcnpj > 0.0 {
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_pixcnpj)));
|
||||||
|
}
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,7 +226,7 @@ impl ReciboData {
|
|||||||
if !self.vales_arr.is_empty() {
|
if !self.vales_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("VALES"));
|
out.extend(escpos::line_bold("VALES"));
|
||||||
for linha in &self.vales_arr {
|
for linha in &self.vales_arr {
|
||||||
if linha.valor.is_some() {
|
if linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let label = linha.label();
|
let label = linha.label();
|
||||||
let obs = linha.obs();
|
let obs = linha.obs();
|
||||||
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
||||||
@@ -210,6 +235,13 @@ impl ReciboData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total vales
|
||||||
|
let total_vales: f64 = self.vales_arr.iter()
|
||||||
|
.map(|l| l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
if total_vales > 0.0 {
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_vales)));
|
||||||
|
}
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,11 +249,18 @@ impl ReciboData {
|
|||||||
if !self.receber_arr.is_empty() {
|
if !self.receber_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("A RECEBER"));
|
out.extend(escpos::line_bold("A RECEBER"));
|
||||||
for linha in &self.receber_arr {
|
for linha in &self.receber_arr {
|
||||||
if linha.valor.is_some() {
|
if linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let label = linha.label();
|
let label = linha.label();
|
||||||
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
out.extend(escpos::kv(&label, &linha.fmt_v()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total a receber
|
||||||
|
let total_receber: f64 = self.receber_arr.iter()
|
||||||
|
.map(|l| l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
if total_receber > 0.0 {
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_receber)));
|
||||||
|
}
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +268,7 @@ impl ReciboData {
|
|||||||
if !self.cancelamentos_arr.is_empty() {
|
if !self.cancelamentos_arr.is_empty() {
|
||||||
out.extend(escpos::line_bold("CANCELAMENTOS"));
|
out.extend(escpos::line_bold("CANCELAMENTOS"));
|
||||||
for linha in &self.cancelamentos_arr {
|
for linha in &self.cancelamentos_arr {
|
||||||
if linha.valor.is_some() {
|
if linha.numero.is_some() || linha.valor.unwrap_or(0.0) > 0.0 {
|
||||||
let num = linha.numero.clone().unwrap_or_default();
|
let num = linha.numero.clone().unwrap_or_default();
|
||||||
out.extend(escpos::kv(&num, &linha.fmt_v()));
|
out.extend(escpos::kv(&num, &linha.fmt_v()));
|
||||||
if let Some(ref m) = linha.motivo {
|
if let Some(ref m) = linha.motivo {
|
||||||
@@ -239,6 +278,13 @@ impl ReciboData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Total cancelamentos
|
||||||
|
let total_cancel: f64 = self.cancelamentos_arr.iter()
|
||||||
|
.map(|l| l.valor.unwrap_or(0.0))
|
||||||
|
.sum();
|
||||||
|
if total_cancel > 0.0 {
|
||||||
|
out.extend(escpos::kv("Total:", &self.fmt_money(total_cancel)));
|
||||||
|
}
|
||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,8 +322,10 @@ impl ReciboData {
|
|||||||
out.extend(escpos::divider());
|
out.extend(escpos::divider());
|
||||||
|
|
||||||
// ── DIFERENÇA ──
|
// ── DIFERENÇA ──
|
||||||
|
// Usa self.diferenca que o frontend calcula como sys_total - saldo_esperado
|
||||||
|
// (não recalcula de fechamento, que é o valor contado e não deve ser usado na diferença)
|
||||||
out.extend(escpos::line_bold("DIFERENCA"));
|
out.extend(escpos::line_bold("DIFERENCA"));
|
||||||
let diff = self.sys_total - self.saldo_esperado;
|
let diff = self.diferenca;
|
||||||
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 {
|
||||||
@@ -285,6 +333,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() {
|
||||||
|
|||||||
@@ -153,7 +153,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 +374,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>,
|
||||||
|
|||||||
+718
-283
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user