AlonsoYSal_FactuGES2/Source/Servidor/Utiles/uRestriccionesUsuarioUtils.pas
2019-11-18 10:36:42 +00:00

113 lines
3.4 KiB
ObjectPascal
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
  <E38080>TENCI覰!!!     MOVIDA MENTAL!!!!!!!
En el caso de la tabla contactos hay definida en el
esquema una cl醬sula 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閟 falla todo por
que trata de rellenar el par醡etro :CATEGORIA que ya
no existe en el where por que lo ha pisado con el
where del cliente.
SOLUCI覰: si el cliente manda alguna cl醬sula where,
anteponer AND para unirla al where definido en el esquema.
}
{ Antes de filtrar ADataset, hay que saber si el cliente manda
alguna cl醬sula 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
// 縃ay 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<71> se asegura que el usuario s髄o 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<71> se asegura que el usuario s髄o 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.