unit uBizReferenciaGenerica;

interface

uses
  Classes, DB, SysUtils, uROClasses, uDADataTable, uDBSelectionList,
  schReferenciaGenericaClient_Intf;

const
  BIZ_REFERENCIAGENERICA = 'Client.ReferenciaGenerica';

type
  TRefGenEstado = (rgPendiente, rgEnEspera, rgResuelto);

  IBizReferenciaGenerica = interface(IReferenciaGenerica)
  ['{31C0DE0B-9B92-43A6-810D-7E94F5FF12FE}']
    procedure VerTodos;
    procedure VerPendientes;
    procedure VerEnEspera;
    procedure VerResueltos;
    procedure DesglosarReferencia;
    procedure Show;
    procedure Print (const Centro, Vendedor : string; const Estado : TRefGenEstado; const AFiltro : String = '');
    procedure Preview (const Centro, Vendedor : string; const Estado : TRefGenEstado; const AFiltro : String = '');
    procedure SetEstado(const AValue : TRefGenEstado);
    function GetEstado : TRefGenEstado ;
    property Estado : TRefGenEstado read GetEstado write SetEstado;
  end;

  TBizReferenciaGenericaDataTableRules = class(TReferenciaGenericaDataTableRules,
    IBizReferenciaGenerica, ISelectedRowList)
  private
    FSelectedRows : TSelectedRowList;  
  protected
    procedure SetEstado(const AValue : TRefGenEstado);
    function GetEstado : TRefGenEstado ;
    function GetSelectedRows : TSelectedRowList;
    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    procedure VerTodos;
    procedure VerPendientes;
    procedure VerEnEspera;
    procedure VerResueltos;
    procedure DesglosarReferencia;
    procedure Show;
    procedure Print (const Centro, Vendedor : string; const Estado : TRefGenEstado; const AFiltro : String = '');
    procedure Preview (const Centro, Vendedor : string; const Estado : TRefGenEstado; const AFiltro : String = '');
    property Estado : TRefGenEstado read GetEstado write SetEstado;
    property SelectedRows : TSelectedRowList read GetSelectedRows;
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
  end;

implementation

uses
  uEditorUtils, uDataModuleReferenciaGenerica, uDataTableUtils, uDACDSDataTable;


{ TBizReferenciaGenericaDataTableRules }

constructor TBizReferenciaGenericaDataTableRules.Create(
  aDataTable: TDADataTable);
begin
  inherited;
  FSelectedRows := TSelectedRowList.Create(aDataTable);
end;

procedure TBizReferenciaGenericaDataTableRules.DesglosarReferencia;
var
  ADataTable : TDACDSDataTable;
  AEstado : TRefGenEstado;
  i : integer;
begin

  if (Abs(VTAPROCESO) < 2) and
     (Abs(VTAFINAL) < 2) and
     (Abs(VTATERM) < 2) then
     Exit; // No se puede desglosar si la cantidad es menor que 2.

  AEstado := Estado;
  DataTable.Edit;
  try
    if (VTAPROCESO <> 0) then
    begin
      if (VTAPROCESO > 0) then
        VTAPROCESO := VTAPROCESO - 1
      else
        VTAPROCESO := VTAPROCESO + 1
    end
    else begin
      if (VTAFINAL <> 0) then
      begin
        if (VTAFINAL > 0) then
          VTAFINAL := VTAFINAL - 1
        else
          VTAFINAL := VTAFINAL + 1
      end
      else begin
        if (VTATERM <> 0) then
        begin
          if (VTATERM > 0) then
            VTATERM := VTATERM - 1
          else
            VTATERM := VTATERM + 1
        end
      end;
    end;
  finally
    DataTable.Post;
  end;

  SelectedRows.Clear;
  SelectedRows.CurrentRowSelected := True;
  ADataTable := TDACDSDataTable.Create(nil);
  try
    ADataTable.RemoteFetchEnabled := False;
    ADataTable.LogChanges := False;
    CopyDataTable(DataTable, ADataTable, True);

    // Duplicar el registro
    DataTable.Next;
    if not DataTable.EOF then
      DataTable.Insert
    else
      DataTable.Append;
    for i := 0 to DataTable.FieldCount - 1 do
      DataTable.Fields[i].Value := ADataTable.Fields[i].Value;
    DataTable.Post;

  finally
    ADataTable.Free;
  end;

  DataTable.Edit;
  Estado := AEstado;
  FECHACAMBIO := Now;

  { Todavía no sé el valor que va a tener asi que le asigno uno cualquiera para
    que en el cliente pueda diferenciar la fila nueva }
  NUMCON := 99;


  try
    if (VTAPROCESO <> 0) then
    begin
      if (VTAPROCESO > 0) then
        VTAPROCESO := 1
      else
        VTAPROCESO := -1
    end
    else begin
      if (VTAFINAL <> 0) then
      begin
        if (VTAFINAL > 0) then
          VTAFINAL := 1
        else
          VTAFINAL := -1
      end
      else begin
        if (VTATERM <> 0) then
        begin
          if (VTATERM > 0) then
            VTATERM := 1
          else
            VTATERM := -1
        end
      end;
    end;
  finally
    DataTable.Post;
  end;
end;

destructor TBizReferenciaGenericaDataTableRules.Destroy;
begin
  FreeAndNil(FSelectedRows);
  inherited;
end;

function TBizReferenciaGenericaDataTableRules.GetEstado: TRefGenEstado;
var
  aux : String;
begin
  aux := GetESTADOValue;
  Result := rgPendiente;
  if aux = 'E' then
    Result := rgEnEspera
  else
    if aux = 'R' then
      Result := rgResuelto;
end;

function TBizReferenciaGenericaDataTableRules.GetSelectedRows: TSelectedRowList;
begin
  Result := FSelectedRows;
end;

procedure TBizReferenciaGenericaDataTableRules.OnNewRecord(
  Sender: TDADataTable);
begin
  inherited;
  ESTADO := rgPendiente;
  FECHACAMBIO := Now;
end;

procedure TBizReferenciaGenericaDataTableRules.Preview(const Centro,
  Vendedor: string; const Estado : TRefGenEstado; const AFiltro : String);
var
  AEstado : String;
begin
  case Estado of
    rgPendiente   : AEstado := 'P';
    rgEnEspera    : AEstado := 'E';
    rgResuelto    : AEstado := 'R';
    else
      AEstado := '';
  end;

  dmReferenciaGenerica.Preview(Centro, Vendedor, AEstado, AFiltro);
end;

procedure TBizReferenciaGenericaDataTableRules.Print(const Centro,
  Vendedor: string; const Estado : TRefGenEstado; const AFiltro : String);
var
  AEstado : String;
begin
  case Estado of
    rgPendiente   : AEstado := 'P';
    rgEnEspera    : AEstado := 'E';
    rgResuelto    : AEstado := 'R';
    else
      AEstado := '';
  end;

  dmReferenciaGenerica.Print(Centro, Vendedor, AEstado, AFiltro);
end;

procedure TBizReferenciaGenericaDataTableRules.SetEstado(
  const AValue: TRefGenEstado);
begin
  case AValue of
    rgPendiente   : SetESTADOValue('P');
    rgEnEspera    : SetESTADOValue('E');
    rgResuelto    : SetESTADOValue('R');
    else
      SetESTADOValue('P');
  end;
end;

procedure TBizReferenciaGenericaDataTableRules.Show;
begin
  ShowEditor(IBizReferenciaGenerica, Self, etItem);
end;

procedure TBizReferenciaGenericaDataTableRules.VerEnEspera;
begin
  with Self.DataTable do
  begin
    DisableControls;
    DisableEventHandlers;
    try
      Filtered := False;
      Filter := '(' + fld_ReferenciaGenericaESTADO + ' = ''E'')';
      Filtered := True;
    finally
      EnableEventHandlers;
      EnableControls;
    end;
  end;
end;

procedure TBizReferenciaGenericaDataTableRules.VerPendientes;
begin
  with Self.DataTable do
  begin
    DisableControls;
    DisableEventHandlers;
    try
      Filtered := False;
      Filter := '(' + fld_ReferenciaGenericaESTADO + ' = ''P'') OR '
        + '(' + fld_ReferenciaGenericaESTADO + ' IS NULL)';      
      Filtered := True;
    finally
      EnableEventHandlers;
      EnableControls;
    end;
  end;
end;

procedure TBizReferenciaGenericaDataTableRules.VerResueltos;
begin
  with Self.DataTable do
  begin
    DisableControls;
    DisableEventHandlers;
    try
      Filtered := False;
      Filter := '(' + fld_ReferenciaGenericaESTADO + ' = ''R'')';
      Filtered := True;
    finally
      EnableEventHandlers;
      EnableControls;
    end;
  end;
end;

procedure TBizReferenciaGenericaDataTableRules.VerTodos;
begin
  Self.DataTable.Filtered := False;
end;

initialization
  RegisterDataTableRules(BIZ_REFERENCIAGENERICA, TBizReferenciaGenericaDataTableRules);

end.

