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

    {
       ¡¡¡¡¡ATENCIÓN!!! ¡¡¡¡¡¡¡¡MOVIDA MENTAL!!!!!!!

    En el caso de la tabla contactos hay definida en el
    esquema una clá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és falla todo por
    que trata de rellenar el parámetro :CATEGORIA que ya
    no existe en el where por que lo ha pisado con el
    where del cliente.

    SOLUCIÓN: si el cliente manda alguna clá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á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

    // ¿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í se asegura que el usuario só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í se asegura que el usuario só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.
