AbetoDesign_FactuGES2/Source/Servidor/Utiles/uRestriccionesUsuarioUtils.pas

113 lines
3.4 KiB
ObjectPascal
Raw Normal View History

unit uRestriccionesUsuarioUtils;
interface
uses
uDAInterfaces, uROSessions;
{ 'FiltrarAccesoUsuario' sirve para filtrar un dataset a las empresas
que el usuario puede acceder }
procedure FiltrarAccesoUsuario (ASession: TROSession;
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
const FieldNameID_EMPRESA : String = 'ID_EMPRESA');
procedure _FiltrarAccesoUsuario (ASession: TROSession;
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
const FieldNameID_EMPRESA : String = 'ID_EMPRESA');
implementation
uses
Classes, SysUtils, uDatabaseUtils, uUsersManager, uDataModuleServer,
Dialogs;
procedure _FiltrarAccesoUsuario (ASession: TROSession;
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
const FieldNameID_EMPRESA : String);
var
AUserInfo : TUserInfo;
WhereAnterior : String;
begin
{
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATENCI<EFBFBD>N!!! <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MOVIDA MENTAL!!!!!!!
En el caso de la tabla contactos hay definida en el
esquema una cl<EFBFBD>usula where (p.e: where categoria = :categoria).
Si el cliente manda alguna clausula where, DA lo hace
mal y PISA la clausula where del esquema con el where
que le manda el cliente. Pero despu<EFBFBD>s falla todo por
que trata de rellenar el par<EFBFBD>metro :CATEGORIA que ya
no existe en el where por que lo ha pisado con el
where del cliente.
SOLUCI<EFBFBD>N: si el cliente manda alguna cl<EFBFBD>usula where,
anteponer AND para unirla al where definido en el esquema.
}
{ Antes de filtrar ADataset, hay que saber si el cliente manda
alguna cl<EFBFBD>usula where en ADataset. Si hay where hay que
anteponer AND para unirla al where definido en el esquema. }
// Mirar si hay WHERE en el ADataSet que viene desde el cliente
if ADataSet.Where.NotEmpty then
begin
// Hay where en el dataset del cliente
// <20>Hay WHERE en ese ADataSet definido en el esquema?
if HayClausulaWhere(ASchema.GetDatasetText(AConnection, ADataSet.Name)) then
begin
// Hay que juntar los dos WHERE en uno
WhereAnterior := ADataSet.Where.Clause;
ADataSet.Where.Clear;
ADataSet.Where.AddOperator(opAND);
ADataSet.Where.AddText(WhereAnterior);
end;
end;
{ Aqu<EFBFBD> se asegura que el usuario s<EFBFBD>lo accede a las filas
de las empresas a las que tiene permiso para acceder }
AUserInfo := TUserInfo.Create(ASession);
try
if not AUserInfo.EsAdministrador then
begin
if ADataSet.Where.NotEmpty then
ADataSet.Where.AddOperator(opAND);
ADataSet.Where.AddCondition(FieldNameID_EMPRESA,
cIn, '(' + AUserInfo.Empresas + ')');
end;
finally
FreeAndNil(AUserInfo);
end;
end;
procedure FiltrarAccesoUsuario (ASession: TROSession;
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
const FieldNameID_EMPRESA : String);
var
AUserInfo : TUserInfo;
begin
{ Aqu<EFBFBD> se asegura que el usuario s<EFBFBD>lo accede a las filas
de las empresas a las que tiene permiso para acceder }
AUserInfo := TUserInfo.Create(ASession);
try
if not AUserInfo.EsAdministrador then
begin
with ADataSet.DynamicWhere do
Expression := NewBinaryExpression(NewField('', FieldNameID_EMPRESA),
NewConstant(AUserInfo.Empresas, datString), dboIn);
end;
finally
FreeAndNil(AUserInfo);
end;
end;
end.