feat: DOBRADO_LOJA env injetado no build — builds separadas Uniao/Alianca/Ambos
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

- app.rs: LOJA_FIXA via option_env!(DOBRADO_LOJA), get_loja_fixa command
- app.rs: set_loja bloqueado se build fixa
- index.html: DOMContentLoaded detecta loja fixa e esconde seletor
- 3 executáveis: fc-uniao.exe / fc-alianca.exe / fc-ambos.exe
This commit is contained in:
root
2026-07-02 20:53:40 +00:00
parent 5c9cb1905b
commit 659d9779b3
3 changed files with 51 additions and 2 deletions
+1
View File
@@ -111,6 +111,7 @@ fn main() {
plugins::printer::ativar_modo_teste_impressao, plugins::printer::ativar_modo_teste_impressao,
// App // App
plugins::app::get_loja, plugins::app::get_loja,
plugins::app::get_loja_fixa,
plugins::app::set_loja, plugins::app::set_loja,
plugins::app::get_config, plugins::app::get_config,
plugins::app::set_config, plugins::app::set_config,
+27 -1
View File
@@ -1,5 +1,8 @@
//! Plugin de configuração da aplicação (loja, preferências) //! Plugin de configuração da aplicação (loja, preferências)
//! Persistido em config.json ao lado do banco SQLite. //! Persistido em config.json ao lado do banco SQLite.
//!
//! LOJA_FIXA: definido em tempo de build via env DOBRADO_LOJA (Uniao | Alianca).
//! Quando definido, a loja é travada e o seletor do formulário fica desabilitado.
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::fs; use std::fs;
@@ -7,6 +10,9 @@ use std::path::PathBuf;
use std::sync::Mutex; use std::sync::Mutex;
use tauri::State; use tauri::State;
/// Indica se a loja foi fixada em tempo de build.
pub const LOJA_FIXA: Option<&'static str> = option_env!("DOBRADO_LOJA");
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AppConfig { pub struct AppConfig {
pub loja: String, pub loja: String,
@@ -15,17 +21,28 @@ pub struct AppConfig {
pub turno_default: String, pub turno_default: String,
pub sync_automatico: bool, pub sync_automatico: bool,
pub auto_open_printer: bool, pub auto_open_printer: bool,
/// Verdadeiro quando a build tem loja fixa (não permite trocar no formulário)
#[serde(skip_serializing_if = "Option::is_none")]
pub loja_fixa: Option<bool>,
}
impl AppConfig {
/// Loja padrão: o env DOBRADO_LOJA se existir, senão "Uniao"
pub fn default_loja() -> String {
LOJA_FIXA.unwrap_or("Uniao").to_string()
}
} }
impl Default for AppConfig { impl Default for AppConfig {
fn default() -> Self { fn default() -> Self {
Self { Self {
loja: "Uniao".to_string(), loja: Self::default_loja(),
pdv_nome: "PDV-01".to_string(), pdv_nome: "PDV-01".to_string(),
operador_default: String::new(), operador_default: String::new(),
turno_default: String::new(), turno_default: String::new(),
sync_automatico: true, sync_automatico: true,
auto_open_printer: false, auto_open_printer: false,
loja_fixa: LOJA_FIXA.map(|_| true),
} }
} }
} }
@@ -65,8 +82,17 @@ pub fn get_loja(state: State<'_, AppState>) -> String {
state.config.lock().unwrap().loja.clone() state.config.lock().unwrap().loja.clone()
} }
#[tauri::command]
pub fn get_loja_fixa() -> Option<String> {
LOJA_FIXA.map(|s| s.to_string())
}
#[tauri::command] #[tauri::command]
pub fn set_loja(state: State<'_, AppState>, loja: String) -> Result<(), String> { pub fn set_loja(state: State<'_, AppState>, loja: String) -> Result<(), String> {
// Se loja_fixa está ativa, não permite alterar
if LOJA_FIXA.is_some() {
return Err("Loja fixa em tempo de build — não é possível trocar.".to_string());
}
state.config.lock().unwrap().loja = loja; state.config.lock().unwrap().loja = loja;
state.save() state.save()
} }
+23 -1
View File
@@ -3667,7 +3667,29 @@ async function salvarEdicaoSupabase() {
} }
// ─── Boot ───────────────────────────────────────────────────────────────── // ─── Boot ─────────────────────────────────────────────────────────────────
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', async () => {
// Detecta se é build com loja fixa (União ou Aliança)
try {
const fixa = await window.__TAURI__.core.invoke('get_loja_fixa');
if (fixa) {
// Build fixa: desabilita e esconde o seletor de loja
window.__LOJA_FIXA__ = fixa;
const sel = document.getElementById('f-loja');
if (sel) {
sel.value = fixa;
sel.disabled = true;
sel.style.display = 'none';
}
// Esconde também o label "Loja"
const label = document.querySelector('.meta-label');
if (label && label.textContent.trim() === 'Loja') {
label.style.display = 'none';
}
estado.loja = fixa;
}
} catch(e) {
console.warn('get_loja_fixa não disponível:', e);
}
loadConfig(); loadConfig();
buildDatalists(); buildDatalists();
if (!loadState()) init(); if (!loadState()) init();