feat: DOBRADO_LOJA env injetado no build — builds separadas Uniao/Alianca/Ambos
- 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:
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user