unit uViewMedicaciones;

interface

uses
  Types, 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,
  uBizMedicaciones, cxCurrencyEdit, Forms, uViewFiltroBase, ComCtrls, Tabs,
  cxPC, ActnList, TB2Item, TBX, TB2Dock, TB2Toolbar, TBXDkPanels, dxPgsDlg,
  uDAInterfaces, uCustomView, uViewBase;
  
type
  IViewMedicaciones = interface(IViewGrid)
  ['{DD6FBD03-6903-4828-8471-4DB6BF36858F}']
    function GetMedicaciones: IBizMedicacion;
    procedure SetMedicaciones(const Value: IBizMedicacion);
    property Medicaciones: IBizMedicacion read GetMedicaciones write SetMedicaciones;
  end;

  TfrViewMedicaciones = class(TfrViewGrid, IViewMedicaciones)
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewFECHA_DESDE: TcxGridDBColumn;
    cxGridViewNOMBRE: TcxGridDBColumn;
    cxGridViewNUMERO_SS: TcxGridDBColumn;
    cxStyleProximosAEnviar: TcxStyle;
    cxStylePENDIENTES: TcxStyle;
    cxStyleENVIADOS: TcxStyle;
    cxStyleSERVIDOS: TcxStyle;
    actPacientes: TAction;
    TBXItem3: TTBXItem;
    TBXSeparatorItem1: TTBXSeparatorItem;
    cxGridViewFECHA_HASTA: TcxGridDBColumn;
    cxStyleRETRASADOS: TcxStyle;
    procedure cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel:
            TcxGridLevel);

    procedure actPacientesExecute(Sender: TObject);
    procedure actPacientesUpdate(Sender: TObject);
    procedure cxGridViewDataControllerCompare(
      ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
      AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);

  private
    //Filtros relativos a la vista
    procedure AnadirFiltroFechas;

  protected
    FMedicaciones: IBizMedicacion;
    function GetMedicaciones: IBizMedicacion;
    procedure SetMedicaciones(const Value: IBizMedicacion);
  public
    procedure AnadirOtrosFiltros; override;
    property Medicaciones: IBizMedicacion read GetMedicaciones write SetMedicaciones;
  end;

implementation

uses
  SysUtils, DateUtils, variants, windows, uDataModuleMedicaciones,
  schMedicacionClient_Intf,
  uViewGridBase, uReferenciasUtils, cxVariants;

{$R *.dfm}

procedure TfrViewMedicaciones.actPacientesExecute(Sender: TObject);
begin
  inherited;
  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 TfrViewMedicaciones.actPacientesUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Checked := not (cxGridViewNOMBRE.GroupIndex < 0);
end;

procedure TfrViewMedicaciones.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_DESDE');
    FFiltro.AddItem(Columna, foGreaterEqual, Fecha1, VarToStr(Fecha1));

    FFiltro.BoolOperatorKind := fboAnd;

    Columna := (cxGridView as TcxGridDBTableView).GetColumnByFieldName('FECHA_HASTA');
    FFiltro.AddItem(Columna, foLessEqual, Fecha2, VarToStr(Fecha2));
  end;
end;

procedure TfrViewMedicaciones.AnadirOtrosFiltros;
begin
  inherited;

  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 TfrViewMedicaciones.cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel);
begin
  inherited;
  RefrescarFiltro;
end;

procedure TfrViewMedicaciones.cxGridViewDataControllerCompare(
  ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
  AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
begin
  inherited;
  if (AItemIndex = cxGridViewREFERENCIA.Index) and
     (VarType(V1) = VarType(V2)) and (VarType(V1) = varString) then
    Compare := CompararReferencias(V1, V2)
  else
    Compare := VarCompare(V1, V2);
end;

function TfrViewMedicaciones.GetMedicaciones: IBizMedicacion;
begin
  Result := FMedicaciones;
end;

procedure TfrViewMedicaciones.SetMedicaciones(const Value: IBizMedicacion);
begin
  FMedicaciones := Value;
  if Assigned(FMedicaciones) then
    dsDataSource.DataTable := FMedicaciones.DataTable;
end;

end.
