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, dxPScxGrid6Lnk,
  uDADataTable, cxGridLevel, cxClasses, cxControls, cxGridCustomView, Classes,
  cxGrid,
  uBizPedidosCliente, cxCurrencyEdit, Forms, uViewFiltroBase, ActnList, TB2Item,

  cxLookAndFeelPainters, dxPSPDFExportCore, dxPSPDFExport, cxDrawTextUtils,
  dxPSPrVwStd, dxPSPrVwAdv, dxPScxEditorProducers, dxPScxExtEditorProducers,
  dxPScxPageControlProducer, uDAInterfaces, SpTBXItem, SpTBXDkPanels,
  uCustomView, uViewBase, cxLookAndFeels, cxTextEdit, TB2Toolbar, TB2Dock;

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;
    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;
    cxGridViewTIENDAWEB: TcxGridDBColumn;
    cxGridViewFECHA_ENTREGA: TcxGridDBColumn;
    cxGridViewNUM_COPIAS: TcxGridDBColumn;
    cxGridViewNUM_CORREOS: 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);
    procedure cxGridViewNUM_CORREOSCustomDrawHeader(Sender: TcxGridTableView;
      ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
      var ADone: Boolean);
    procedure cxGridViewNUM_COPIASCustomDrawHeader(Sender: TcxGridTableView;
      ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
      var ADone: Boolean);
    procedure frViewFiltroBase1actQuitarFiltroExecute(Sender: TObject);
    procedure CustomViewShow(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure OnFiltroListaPropertiesChange(Sender: TObject);
    procedure OnFiltroListaPropertiesInitPopup(Sender: TObject);
    procedure CustomViewCreate(Sender: TObject);

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

  protected
    FProvincias : TStringList;
    FPedidos: IBizPedidoCliente;
    function GetPedidos: IBizPedidoCliente;
    procedure SetPedidos(const Value: IBizPedidoCliente);
    procedure CargarProvincias;

  public
    procedure AnadirOtrosFiltros; override;
    property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos;
  end;

implementation

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

{$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.AnadirFiltroProvincia;
var
  FFiltro : TcxFilterCriteriaItemList;
begin

  //Solo se aplica este filtro en el caso de tener activo el panel de detalle de filtro
  //y sobre la lista de pedidos
  if frViewFiltroBase1.Visible then
  begin
    if (VarToStr(frViewFiltroBase1.eLista.EditValue) <> 'Todos') then
    begin
      FFiltro := AddFilterGrid(fboAnd);
      FFiltro.AddItem(cxGridViewPROVINCIA, foEqual, VarToStr(frViewFiltroBase1.eLista.EditValue), VarToStr(frViewFiltroBase1.eLista.EditValue));
    end;
  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;
  AnadirFiltroProvincia;
  
  //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.CargarProvincias;
var
  i : integer;
begin
  with TProvinciasPoblacionesController.Create do
    try
      FProvincias := DarListaProvincias;

      with frViewFiltroBase1.eLista.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
          Add('Todos');  //Case 0
          for i := 0 to FProvincias.Count - 1 do
            Add(FProvincias.Names[i]);

          frViewFiltroBase1.eLista.ItemIndex := 0;
        finally
          EndUpdate;
        end;
      end;
    finally
      Free;
    end;
end;

procedure TfrViewPedidosCliente.CustomViewCreate(Sender: TObject);
begin
  inherited;
  FProvincias := NIL;
end;

procedure TfrViewPedidosCliente.CustomViewDestroy(Sender: TObject);
begin
  frViewFiltroBase1.eLista.Properties.OnChange := Nil;
  frViewFiltroBase1.eLista.Properties.OnInitPopup := Nil;

  if Assigned(FProvincias) then
    FreeANDNIL(FProvincias);

  inherited;
end;

procedure TfrViewPedidosCliente.CustomViewShow(Sender: TObject);
begin
  inherited;
  frViewFiltroBase1.eLista.Properties.OnChange := OnFiltroListaPropertiesChange;
  frViewFiltroBase1.eLista.Properties.OnInitPopup := OnFiltroListaPropertiesInitPopup;
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.cxGridViewNUM_COPIASCustomDrawHeader(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var
  R : TRect;
begin
  inherited;
{
  with AViewInfo do
  begin
    LookAndFeelPainter.DrawHeader(ACanvas, Bounds, TextAreaBounds, Neighbors,
      Borders, ButtonState, AlignmentHorz, AlignmentVert, MultiLine,
      False, '', Params.Font, Params.TextColor, Params.Color);

    R := AViewInfo.ContentBounds;
    ACanvas.FillRect(R);
    ACanvas.DrawImage(PngImageList10, R.Left + 2, R.Top, 0);
  end;

  ADone := True;
}
end;

procedure TfrViewPedidosCliente.cxGridViewNUM_CORREOSCustomDrawHeader(
  Sender: TcxGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var
  R : TRect;
begin
  inherited;
{
  with AViewInfo do
  begin
    LookAndFeelPainter.DrawHeader(ACanvas, Bounds, TextAreaBounds, Neighbors,
      Borders, ButtonState, AlignmentHorz, AlignmentVert, MultiLine,
      False, '', Params.Font, Params.TextColor, Params.Color);

    R := AViewInfo.ContentBounds;
    ACanvas.FillRect(R);
    ACanvas.DrawImage(PngImageList10, R.Left + 2, R.Top, 1);
  end;

  ADone := True;
}  
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;

procedure TfrViewPedidosCliente.frViewFiltroBase1actQuitarFiltroExecute(
  Sender: TObject);
begin
  frViewFiltroBase1.LimpiarCampos;
end;

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

procedure TfrViewPedidosCliente.OnFiltroListaPropertiesChange(Sender: TObject);
begin
  inherited;
  RefrescarFiltro;
end;

procedure TfrViewPedidosCliente.OnFiltroListaPropertiesInitPopup(Sender: TObject);
begin
  inherited;

  ShowHourglassCursor;
  try
    if not Assigned(FProvincias) then
      CargarProvincias;
  finally
    HideHourglassCursor;
  end;
end;

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

end.
