[RESOLVIDO] Login com Multi-Empresas

Olá pessoal, estou com uma pequena dúvida, é o seguinte:

Estou fazendo um sistema Multi-Empresas, nesse caso seria (Matriz_x_Filial) não empresas distintas.
O que o sistema tem que controlar é, verificar se o usuário ao logar, esta cadastrado na empresa onde escolheu ao logar através de um select.

Eu criei no app_login, a seguinte lógica e apliquei no onValidate:

[code]$sql = “SELECT login FROM unid_x_user WHERE idunidade = {unid}”;
sc_lookup(rs, $sql);
if({rs} !== {login} )
{
sc_error_message(“Desculpe, mas o usuário não tem permissão de acesso a essa Unidade.”);
sc_error_exit();

}
else
{

//Não faz nada!  Loga no sistema!

}[/code]

o {unid} é um campo que criei para o usuário escolher a Matriz ou Filial. É apenas um campo select.
o {login} é de uma tabela chamada unid_x_login onde é um N - N. (Muitos para Muitos).

A princípio o código esta correto, mas na prática o sistema responde sem lógica. Por exemplo! Ao escolher a Unidade “1”, e na tabela unid_x_login as informações realmente for verdadeira ex:(login = “admin” | unid = “1”) ele mesmo assim mostra a condição else ex:(Desculpe, mas o usuário não tem permissão de acesso a essa Unidade).

Alguém pode opinar o que pode esta ocorrendo? É como se o laço não funcionasse mesmo estando correto logicamente.

Abraço a todos!

Pessoal se alguém poder testar isso em um BLANK agradeço. Pois o resultado é totalmente contraditório ao código proposto.

Nome da tabela do BD: unid_x_user.
Valores:
idunidade = 1
login = admin
//---------------------------------

[code]$unidade = ‘1’;
$login = “admin”;

$sql = “SELECT login FROM unid_x_user WHERE idunidade = ‘$unidade’”;
sc_select(rs, $sql);
if({rs} == $login)
{
echo ‘Ok’;
}
else
{
echo ‘Erro!’;

}[/code]

Resultado = “Erro!”

FredKeyster,

Existem muitas causas para a exibição desta mensagem (que necessariamente não é um Erro). O que você deve fazer é habilitar o modo Debug para verificar se existe realmente um ERRO.

Forte abraço.

Fred,
Existem dois problemas no teu codigo.
Primeiro o sql ira retornar todos os logins de uma empresa, nao apenas 1 para testar.
Segundo, a variavel rs é um array. Vc deveria testá-la assim: {rs[0][0]}==algumacoisa

Tente fazer assim:

$sql = “SELECT login FROM unid_x_user WHERE idunidade = {unid} and login={login}”;
sc_lookup(rs, $sql);
if(!isset({rs[0][0]} )
{
sc_error_message(“Desculpe, mas o usuário não tem permissão de acesso a essa Unidade.”);
sc_error_exit();

}
else
{

//Não faz nada!  Loga no sistema!

}

Primeiro o sql ira retornar todos os logins de uma empresa, nao apenas 1 para testar.

Verdade Allan, eu fiz assim no Blank:

{unid}=‘2’;
{login} = “Fred”;

$check_sql = "SELECT login FROM unid_x_user WHERE idunidade = ‘{unid}’ AND login = ‘{login}’ ";
sc_lookup(rs, $check_sql);

if ({rs[0][0]} == {login}) // Row found
{

sc_error_message("Legal!");
sc_error_exit();

}
else // No row found
{
sc_error_message(“Erro!”);
sc_error_exit();
}

Mas quando jogo na aplicação da um erro de página!

Erro no servidor O site encontrou um erro ao recuperar http://macroerp.com.br/scriptcase7/app/MacroERP/app_login/app_Login.php?nmgp_outra_jan=true&script_case_session=vs5fuafr2l510bmejkdcco26t3&286. Ele pode estar em manutenção ou configurado incorretamente. Veja algumas sugestões: Recarregue esta página da web mais tarde. Erro HTTP {500 (Internal Server Error): Ocorreu uma condição inesperada enquanto o servidor tentava completar a solicitação.

Com o (!isset…) não deu certo no Blank, da o erro acima, mas sem ele ele funfa legal, mas quando eu jogo na aplicação da o erro acima.

Fred,
Tem um erro no script que te passei. Faltou um perenteses.
if (isset({rs[0][0]})) {

Não acho que essa mensagem de erro seja devido ao código da aplicação.

Allan eu tinha percebido isso, hehe… mesmo assim não esta funcionando a lógica, você pode testar no blank e verá que ele faz ao contrário do que a lógica se refere, é isso que estou encucado.

Jovito ja fiz o debug, o mesmo não mostra nada relacionado a “erro” apenas mostra os select’s corretamente.

Mais alguma sugestão?

Fred,
Fiz o teste aqui em uma aplicação blank e funcionou, inclusive com o !isset.
Quanto ao erro http 500, não sei o que está causando.
Boa sorte

Pois é Allan, no Blank funfa legal, mas na App não! Estou estudando o que pode ser. Mesmo assim muito obrigado pela ajuda irmão!
Abraços!

Bem, como tava dando muito problema…

Resolvi fazer de outra maneira e deu certo.

Criei um evento ajax, onde aparecerá no check box apenas as empresas que o usuário tiver permissão de acesso.
Resolveu de boa!

Obrigado pessoal!

Como você fez isto?

Na aplicação login crie um campo virtual do tipo “select”. Nele atribua o evento ajax do tipo “onChange” Atribua o onChange ao campo “usuário”, pois é através do nome do usuário que o sistema vai verificar a que unidades (empresas) o mesmo pertence. No evento coloque um “Select” onde vai pesquisar quais empresas ele esta permitido para acessar, sendo assim só vai aparecer as empresas no select que ele tiver permissão de acesso.

Exemplo:

http://macroerp.com.br/01/app_Login/app_Login.php

se vc colocar no usuário “Admin” aparecerá 2 empresas
Se colocar “Fred” aparecerá uma empresa.

Agradeço sua atenção, mas eu me expressei errado…foi mal… eu quase desfalecendo é como eu posso forçar as aplicações abrirem somente para aquela empresa escolhida, por exemplo:

  • Escolhi a empresa A(quem tem a ID 1);
  • Abro a aplicação de formulário que vou incluir funcionário nesta empresa A, mas que não apareça outras empresas, somente esta que foi informada no login, pelo que percebi tornou-se em uma variável global.

Me informa como que posso filtrar na aplicação usando a variável global, como realizo este filtro, poderia por favor me dá um exemplo com o código? Agradeço muito sua atenção amigo!

Mas é bem simples! É só você criar uma tabela N:N relações Ex: “unid_x_user” onde cada usuário poderá ter acesso as empresas que lhe pertence.

Depois no evento ajax coloque um select puxando (filtrando) as informações do usuário.
Exemplo:

[code]$_sql = ‘SELECT idunidade’
. ’ FROM unid_x_user’
. ’ WHERE login = “’.{login}.’”’;

sc_lookup(ds, $_sql);

if (isset({ds[0][0]})) // Encoutrou
{
if ({ds[0][0]} != 0) // Todas as empresas
{

{unid} = {ds[0][0]};

}else{

sc_error_message("Erro");
sc_error_exit();
 
 }

}[/code]

Depois no campo do tipo select filtre a variável global.
Ex:

SELECT DISTINCT unidade.idunidade , unidade.unidade FROM unid_x_user INNER JOIN unidade ON unidade.idunidade = unid_x_user.idunidade WHERE login = '{login}' ORDER BY unidade