correções na tela de login colab

This commit is contained in:
Eder Moraes 2026-04-27 00:02:22 -03:00
parent 624b6a7268
commit 99b34b2871
3 changed files with 76 additions and 25 deletions

View File

@ -7,7 +7,7 @@
default-src 'self'; default-src 'self';
script-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';
connect-src 'self' ws://localhost:3000 http://localhost:3000; connect-src 'self' ws://localhost:3000 http://localhost:3000 ws://autoatends.linco.work wss://autoatends.linco.work;
"> ">
<title>Tela de Atendimento</title> <title>Tela de Atendimento</title>
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style.css">

View File

@ -34,14 +34,14 @@
//o campo username deve ser formatado como cpf ou cnpj //o campo username deve ser formatado como cpf ou cnpj
function formatarCampoCPFCNPJ() { function formatarCampoCPFCNPJ() {
var campo = document.getElementById('username'); var campo = document.getElementById('username');
var valor = campo.value.replace(/\D/g, ''); // Remove todos os caracteres não numéricos var valor = campo.value.replace(/[^a-zA-Z0-9]/g, ''); // Remove apenas o que não for alfanumérico
if (valor.length <= 11) { if (valor.length <= 11) {
// Formata como CPF // Formata como CPF
valor = valor.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4'); valor = valor.replace(/([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{2})/, '$1.$2.$3-$4');
} else { } else {
// Formata como CNPJ // Formata como CNPJ
valor = valor.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5'); valor = valor.replace(/([a-zA-Z0-9]{2})([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{4})([a-zA-Z0-9]{2})/, '$1.$2.$3/$4-$5');
} }
campo.value = valor; campo.value = valor;
} }

93
main.js
View File

@ -15,10 +15,10 @@ let updateWin;
const dataPath = path.join(__dirname, 'data.json'); // Caminho para o JSON (backup local) const dataPath = path.join(__dirname, 'data.json'); // Caminho para o JSON (backup local)
const settingsPath = path.join(app.getPath('userData'), 'settings.json'); // Caminho para as configurações const settingsPath = path.join(app.getPath('userData'), 'settings.json'); // Caminho para as configurações
//! API //! api
const apiUrl = 'http://localhost:3000/api/'; // Adaptado para NestJS const apiUrl = 'https://aapi.linco.work/';
//! pusher //! pusher
const pusherUrl = 'http://localhost:3000'; // Agora aponta para o Socket.io (NestJS) const pusherUrl = apiUrl;
autoUpdater.autoDownload = false; autoUpdater.autoDownload = false;
autoUpdater.autoInstallOnAppQuit = true; autoUpdater.autoInstallOnAppQuit = true;
@ -113,7 +113,7 @@ async function getFirstData() {
const token = await getAuthToken(); const token = await getAuthToken();
const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')") const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')")
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')") const tenantId = await getTenantId();
const url = apiUrl + 'attendance/next-in-line/' + colabId; const url = apiUrl + 'attendance/next-in-line/' + colabId;
//! checa se o token e o colabId existem //! checa se o token e o colabId existem
@ -199,6 +199,29 @@ async function getAuthToken() {
}); });
} }
// Função para verificar o tenantId no localStorage
async function getTenantId() {
const checkWindow = async (win) => {
if (win && !win.isDestroyed()) {
try {
const val = await win.webContents.executeJavaScript('localStorage.getItem("tenantId");');
return (val && val !== 'null' && val !== 'undefined') ? val : null;
} catch (e) {
return null;
}
}
return null;
};
// Prioridade para janelas visíveis
let id = await checkWindow(operatorWin);
if (!id) id = await checkWindow(mainWin);
if (!id) id = await checkWindow(floatingWin);
if (!id) id = await checkWindow(loginWin);
return id;
}
// Função para criar a janela de login // Função para criar a janela de login
function createLoginWindow() { function createLoginWindow() {
loginWin = new BrowserWindow({ loginWin = new BrowserWindow({
@ -550,7 +573,7 @@ ipcMain.on('chamar-fila', async () => {
const colabId = await getSelectedOperatorId(); const colabId = await getSelectedOperatorId();
const token = await getAuthToken(); const token = await getAuthToken();
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')") const tenantId = await getTenantId();
const url = apiUrl + 'attendance/call-next/' + colabId; const url = apiUrl + 'attendance/call-next/' + colabId;
const request = net.request({ const request = net.request({
@ -664,7 +687,7 @@ ipcMain.on('select-atend-id', (itemId) => {
ipcMain.on('iniciar-atendimento', async (event, itemId) => { ipcMain.on('iniciar-atendimento', async (event, itemId) => {
const token = await getAuthToken(); const token = await getAuthToken();
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')") const tenantId = await getTenantId();
const url = apiUrl + 'attendance/' + itemId + '/start'; const url = apiUrl + 'attendance/' + itemId + '/start';
// envio de uma solicitação POST com o ID do item // envio de uma solicitação POST com o ID do item
@ -713,7 +736,7 @@ ipcMain.on('save-observation', async (event, { itemId, observation }) => {
console.log(`Salvando observação para item ${itemId}: ${observation}`); console.log(`Salvando observação para item ${itemId}: ${observation}`);
const token = await getAuthToken(); const token = await getAuthToken();
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')") const tenantId = await getTenantId();
const url = apiUrl + 'attendance/' + itemId + '/finish'; const url = apiUrl + 'attendance/' + itemId + '/finish';
const fmData = JSON.stringify({ const fmData = JSON.stringify({
@ -761,7 +784,6 @@ ipcMain.on('logout', () => {
localStorage.removeItem("selectedOperator"); localStorage.removeItem("selectedOperator");
localStorage.removeItem("salaOperator"); localStorage.removeItem("salaOperator");
localStorage.removeItem("servicosOperator"); localStorage.removeItem("servicosOperator");
localStorage.removeItem("tenantId");
`).then(() => { `).then(() => {
// Fecha a janela main e abre a janela de operador e inicia o aplicativo // Fecha a janela main e abre a janela de operador e inicia o aplicativo
mainWin.hide(); mainWin.hide();
@ -796,10 +818,15 @@ ipcMain.on('login-attempt', async (event, credentials) => {
const data = JSON.parse(responseData); const data = JSON.parse(responseData);
if (data.access_token) { if (data.access_token) {
// Tenta encontrar o tenantId em diferentes locais possíveis da resposta
const tenantId = data.tenantId || (data.user && data.user.tenantId) || (data.user && data.user.tenant_id);
console.log(`Login bem-sucedido. Token presente. TenantId encontrado: ${tenantId}`);
// Login bem-sucedido // Login bem-sucedido
loginWin.webContents.executeJavaScript(` loginWin.webContents.executeJavaScript(`
localStorage.setItem("authToken", "${data.access_token}"); localStorage.setItem("authToken", "${data.access_token}");
localStorage.setItem("tenantId", "${data.user.tenantId}"); localStorage.setItem("tenantId", "${tenantId || ''}");
`).then(() => { `).then(() => {
// Fecha a janela de login e abre a de seleção de operador // Fecha a janela de login e abre a de seleção de operador
event.reply('login-response', { success: true }); event.reply('login-response', { success: true });
@ -830,8 +857,11 @@ ipcMain.on('login-attempt', async (event, credentials) => {
}); });
}); });
// Remove máscara do login (CPF/CNPJ) antes de enviar para a API
const cleanLogin = credentials.login.replace(/[.\-\/]/g, '');
// Envia as credenciais // Envia as credenciais
request.write(JSON.stringify({ login: credentials.login, password: credentials.password })); request.write(JSON.stringify({ login: cleanLogin, password: credentials.password }));
request.end(); request.end();
} catch (error) { } catch (error) {
event.reply('login-response', { event.reply('login-response', {
@ -870,6 +900,9 @@ ipcMain.handle('get-operators', async () => {
try { try {
// Verifica se existe token de autenticação // Verifica se existe token de autenticação
const token = await getAuthToken(); const token = await getAuthToken();
const tenantId = await getTenantId();
console.log(`Buscando operadores - TenantId: ${tenantId}, Token presente: ${!!token}`);
if (!token) { if (!token) {
return { return {
@ -881,26 +914,44 @@ ipcMain.handle('get-operators', async () => {
const route = apiUrl + 'collaborators'; const route = apiUrl + 'collaborators';
return new Promise((resolve, reject) => { return new Promise((resolve) => {
const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
};
// Garante que o tenantId é uma string válida e não "null" ou "undefined"
if (tenantId && tenantId !== 'null' && tenantId !== 'undefined') {
headers['x-tenant-id'] = tenantId;
}
const request = net.request({ const request = net.request({
method: 'GET', method: 'GET',
url: route, url: route,
headers: { headers: headers
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
}); });
let responseData = ''; let responseData = '';
request.on('response', (response) => { request.on('response', (response) => {
let body = '';
response.on('data', (chunk) => { response.on('data', (chunk) => {
responseData += chunk.toString(); body += chunk.toString();
}); });
response.on('end', () => { response.on('end', () => {
if (response.statusCode !== 200) {
console.error(`Erro na API (${response.statusCode}):`, body);
resolve({
success: false,
message: `Erro ${response.statusCode}: ${body}`,
operators: []
});
return;
}
try { try {
const data = JSON.parse(responseData); const data = JSON.parse(body);
if (Array.isArray(data)) { if (Array.isArray(data)) {
const operators = data.map(colab => ({ const operators = data.map(colab => ({
@ -915,14 +966,14 @@ ipcMain.handle('get-operators', async () => {
operators: operators operators: operators
}); });
} else { } else {
reject({ resolve({
success: false, success: false,
message: 'Erro ao obter a lista de colaboradores', message: 'Resposta da API não é uma lista válida',
operators: [] operators: []
}); });
} }
} catch (error) { } catch (error) {
reject({ resolve({
success: false, success: false,
message: 'Erro ao processar resposta do servidor', message: 'Erro ao processar resposta do servidor',
operators: [] operators: []
@ -932,7 +983,7 @@ ipcMain.handle('get-operators', async () => {
}); });
request.on('error', (error) => { request.on('error', (error) => {
reject({ resolve({
success: false, success: false,
message: `Erro de conexão: ${error.message}`, message: `Erro de conexão: ${error.message}`,
operators: [] operators: []