unit uViewPedidosCliente;

interface

uses
  uViewGrid, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, dxPSGlbl, dxPSUtl, dxPSEngn,
  dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider, dxPSFillPatterns,
  dxPSEdgePatterns, cxImageComboBox, ImgList, Controls, PngImageList,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGridCustomPopupMenu, cxGridPopupMenu, dxPSCore, dxPScxCommon, dxPScxGridLnk,
  uDADataTable, cxGridLevel, cxClasses, cxControls, cxGridCustomView, Classes,
  cxGrid,
  uBizPedidosCliente, cxCurrencyEdit, Forms, uViewFiltroBase, ActnList, TB2Item,
  TBX, TB2Toolbar, TBXDkPanels, TB2Dock, dxPgsDlg;

type
  IViewPedidosCliente = interface(IViewGrid)
  ['{96821714-55CF-4BC1-A0C1-16E027B2EF16}']
    function GetPedidos: IBizPedidoCliente;
    procedure SetPedidos(const Value: IBizPedidoCliente);
    property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos;
  end;

  TfrViewPedidosCliente = class(TfrViewGrid, IViewPedidosCliente)
    cxGridDBTableView1: TcxGridDBTableView;
    PngImageList: TPngImageList;
    cxGridViewID: TcxGridDBColumn;
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewINCIDENCIASACTIVAS: TcxGridDBColumn;
    cxGridViewNOMBRE: TcxGridDBColumn;
    cxGridViewSITUACION: TcxGridDBColumn;
    cxGridViewFECHA_PEDIDO: TcxGridDBColumn;
    cxGridViewCALLE: TcxGridDBColumn;
    cxGridViewCODIGO_POSTAL: TcxGridDBColumn;
    cxGridViewPOBLACION: TcxGridDBColumn;
    cxGridViewPROVINCIA: TcxGridDBColumn;
    cxGridViewPERSONA_CONTACTO: TcxGridDBColumn;
    cxGridViewTELEFONO: TcxGridDBColumn;
    cxGridViewIMPORTE_TOTAL: TcxGridDBColumn;
    cxGridLevelPendientes: TcxGridLevel;
    cxGridLevelEnProceso: TcxGridLevel;
    cxGridLevelServidor: TcxGridLevel;
    cxStylePENDIENTES: TcxStyle;
    cxStyleENPROCESO: TcxStyle;
    cxStyleSERVIDOS: TcxStyle;
    actCliente: TAction;
    actProvincia: TAction;
    TBXItem2: TTBXItem;
    TBXSeparatorItem1: TTBXSeparatorItem;
    TBXSeparatorItem2: TTBXSeparatorItem;
    TBXItem3: TTBXItem;
    cxGridViewTIENDAWEB: TcxGridDBColumn;
    cxGridViewFECHA_ENTREGA: TcxGridDBColumn;
    procedure cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel:
            TcxGridLevel);
    procedure cxGridViewCODIGOCustomDrawCell(Sender: TcxCustomGridTableView;
            ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var
            ADone: Boolean);
    procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView;
            ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out
            AStyle: TcxStyle);
    procedure actClienteExecute(Sender: TObject);
    procedure actClienteUpdate(Sender: TObject);
    procedure actProvinciaExecute(Sender: TObject);
    procedure actProvinciaUpdate(Sender: TObject);
    procedure cxGridViewTIENDAWEBCustomDrawCell(Sender: TcxCustomGridTableView;
      ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
      var ADone: Boolean);
    procedure cxGridViewMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);

  private
    //Filtros relativos a la vista
    procedure AnadirFiltroSituaciones;
    procedure AnadirFiltroFechas;

  protected
    FPedidos: IBizPedidoCliente;
    function GetPedidos: IBizPedidoCliente;
    procedure SetPedidos(const Value: IBizPedidoCliente);
  public
    procedure AnadirOtrosFiltros; override;
    property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos;
  end;

implementation

uses SysUtils, variants, windows, uDataModulePedidosCliente, schPedidosClienteClient_Intf,
  uViewGridBase;

{$R *.dfm}

procedure TfrViewPedidosCliente.actClienteExecute(Sender: TObject);
begin
  if (cxGridViewNOMBRE.GroupIndex < 0) then
  begin
    cxGridViewNOMBRE.GroupIndex := cxGridView.GroupedColumnCount;
    cxGridViewNOMBRE.Visible := False;
  end
  else
  begin
    cxGridViewNOMBRE.GroupIndex := -1;
    cxGridViewNOMBRE.Visible := True;
  end;
end;

procedure TfrViewPedidosCliente.actClienteUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Checked := not (cxGridViewNOMBRE.GroupIndex < 0);
end;

procedure TfrViewPedidosCliente.actProvinciaExecute(Sender: TObject);
begin
  if (cxGridViewPROVINCIA.GroupIndex < 0) then
  begin
    cxGridViewPROVINCIA.GroupIndex := cxGridView.GroupedColumnCount;
    cxGridViewPROVINCIA.Visible := False;
  end
  else
  begin
    cxGridViewPROVINCIA.GroupIndex := -1;
    cxGridViewPROVINCIA.Visible := True;
  end;
end;

procedure TfrViewPedidosCliente.actProvinciaUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Checked := not (cxGridViewPROVINCIA.GroupIndex < 0);
end;

procedure TfrViewPedidosCliente.AnadirFiltroFechas;
var
  Columna: TcxGridDBColumn;
  Fecha1, Fecha2: Variant;
  FFiltro : TcxFilterCriteriaItemList;
begin
  Fecha1 := frViewFiltroBase1.edtFechaIniFiltro.EditValue;
  Fecha2 := frViewFiltroBase1.edtFechaFinFiltro.EditValue;

  if  not VarIsNull(Fecha1)
  and not VarIsNull(Fecha2) then
  begin
    cxGridView.DataController.Filter.Options := [fcoCaseInsensitive, fcoSoftCompare];
    FFiltro := AddFilterGrid(fboAnd);

    Columna := (cxGridView as TcxGridDBTableView).GetColumnByFieldName('FECHA_PEDIDO');
    FFiltro.AddItem(Columna, foBetween, varArrayOf([Fecha1, Fecha2]), VarToStr(Fecha1) + ' and ' + VarToStr(Fecha2));
  end;
end;

procedure TfrViewPedidosCliente.AnadirFiltroSituaciones;
var
  FFiltro : TcxFilterCriteriaItemList;
begin
  FFiltro := AddFilterGrid(fboAnd);

  case cxGrid.ActiveLevel.Index of
    1   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_PENDIENTE, SITUACION_PEDIDO_PENDIENTE);
    2   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_ENPROCESO, SITUACION_PEDIDO_ENPROCESO);
    3   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_SERVIDO, SITUACION_PEDIDO_SERVIDO);
  end;
end;

procedure TfrViewPedidosCliente.AnadirOtrosFiltros;
begin
  inherited;

  AnadirFiltroSituaciones;
  AnadirFiltroFechas;

  //Finalmente activamos el filtro si tenemos algo
  if cxGridView.DataController.Filter.IsEmpty
  then cxGridView.DataController.Filter.Active := False
  else cxGridView.DataController.Filter.Active := True;
  cxGrid.ActiveLevel.GridView := cxGridView;
end;

procedure TfrViewPedidosCliente.cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel);
begin
  inherited;
  RefrescarFiltro;
end;

procedure TfrViewPedidosCliente.cxGridViewCODIGOCustomDrawCell(Sender:
        TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo:
        TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  R: TRect;
begin
  inherited;
  R := AViewInfo.ContentBounds;
  ACanvas.FillRect(R);
  ACanvas.DrawImage(PngImageList, R.Left, R.Top, 2);
  ADone := True;
end;

procedure TfrViewPedidosCliente.cxGridViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  Site     : TcxGridSite;
  HitTest  : TcxCustomGridHitTest;
  Item     : TcxCustomGridTableItem;
  Rec      : TcxCustomGridRecord;
  sNewHint : string;
begin
{Este método desaparecerá cuando se migre la aplicación, es para sacar la causa de la incidencia sin necesidad de entrar en el documento}
  Site := Sender as TcxGridSite;
  HitTest := Site.GridView.ViewInfo.GetHitTest(X, Y);
  if HitTest is TcxGridRecordCellHitTest then begin
    Item := TcxGridRecordCellHitTest(HitTest).Item;
    Rec := TcxGridRecordCellHitTest(HitTest).GridRecord;

    if  (Item.Index = cxGridView.GetColumnByFieldName(fld_PedidosClienteINCIDENCIAS_ACTIVAS).Index)
    and (Rec.Selected)
    and (Pedidos.DataTable.FieldByName(fld_PedidosClienteINCIDENCIAS_ACTIVAS).AsInteger = 1) then begin
      sNewHint := Pedidos.DataTable.FieldByName(fld_PedidosClienteINCIDENCIAS).AsString;
      if (cxGrid.Hint <> sNewHint) then begin
        cxGrid.ShowHint := false;
        cxGrid.Hint     := sNewHint;
      end
      else cxGrid.ShowHint := true;
    end
    else begin
      cxGrid.ShowHint := false;
    end;
  end;
end;

procedure TfrViewPedidosCliente.cxGridViewStylesGetContentStyle(Sender:
        TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem:
        TcxCustomGridTableItem; out AStyle: TcxStyle);
var
  IndiceCol: Integer;
  ASituacion: string;
begin
  inherited;
  if Assigned(ARecord) then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName(fld_PedidosClienteSITUACION).Index;
    ASituacion := VarToStr(ARecord.DisplayTexts[IndiceCol]);
    if ASituacion = SITUACION_PEDIDO_PENDIENTE then
      AStyle := cxStylePENDIENTES
    else if ASituacion = SITUACION_PEDIDO_ENPROCESO then
        AStyle := cxStyleENPROCESO
    else if ASituacion = SITUACION_PEDIDO_SERVIDO then
        AStyle := cxStyleSERVIDOS;
  end;
end;

procedure TfrViewPedidosCliente.cxGridViewTIENDAWEBCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  R : TRect;
begin
  inherited;
    if (AViewInfo.GridRecord.DisplayTexts[cxGridViewTIENDAWEB.Index] <> '') then
    begin
      R := AViewInfo.ContentBounds;
      ACanvas.FillRect(R);
      ACanvas.DrawImage(PngImageList, R.Left, R.Top, 4);
      ADone := True;
    end;
end;

function TfrViewPedidosCliente.GetPedidos: IBizPedidoCliente;
begin
  Result := FPedidos;
end;

procedure TfrViewPedidosCliente.SetPedidos(const Value: IBizPedidoCliente);
begin
  FPedidos := Value;
  if Assigned(FPedidos) then
    dsDataSource.DataTable := FPedidos.DataTable;
end;

end.
