unit uViewExtractoMovimientos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewGrid, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxDataStorage, cxEdit, DB, cxDBData, uDADataTable, cxGridLevel,
  cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, uBizDiario, ActnList, Menus,
  cxGridBandedTableView, cxGridDBBandedTableView, JvComponent,
  JvFormAutoSize, PngImageList, ImgList, dxPSGlbl, dxPSUtl, dxPSEngn,
  dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider, dxPSFillPatterns,
  dxPSEdgePatterns, dxPSCore, dxPScxCommon, dxPScxGrid6Lnk,
  cxGridCustomPopupMenu, cxGridPopupMenu, uViewFiltroBase, TB2Item, TBX,
  TB2Toolbar, TBXDkPanels, TB2Dock, dxPgsDlg, uDAInterfaces, cxCalendar,
  cxImageComboBox, cxTextEdit, cxCurrencyEdit, uBizSubCuentas, uAsientosController,
  uCustomView, uViewBase;

type
  IViewExtractoMovimientos = interface(IViewGrid)
  ['{5CA170E3-5552-4EF5-A2C0-02E4C9052045}']
    function GetDiario: IBizDiario;
    procedure SetDiario(const Value: IBizDiario);
    property Diario: IBizDiario read GetDiario write SetDiario;
    function GetSubCuentas: IBizSubCuenta;
    procedure SetSubCuentas(const Value: IBizSubCuenta);
    property SubCuentas: IBizSubCuenta read GetSubCuentas write SetSubCuentas;
    function GetController : IAsientosController;
    procedure SetController (const Value : IAsientosController);
    property Controller : IAsientosController read GetController write SetController;
    function GetExtractoChange: TNotifyEvent;
    procedure SetExtractoChange(const Value: TNotifyEvent);
    property OnExtractoChange: TNotifyEvent read GetExtractoChange write SetExtractoChange;
  end;

  TfrViewExtractoMovimientos = class(TfrViewGrid, IViewExtractoMovimientos)
    cxGridViewCONCEPTO: TcxGridDBColumn;
    cxGridViewREF_SUBCUENTA: TcxGridDBColumn;
    cxGridViewID_ASIENTO: TcxGridDBColumn;
    PngImageList: TPngImageList;
    cxGridViewSUBCUENTA: TcxGridDBColumn;
    cxGridViewDEBE: TcxGridDBColumn;
    cxGridViewHABER: TcxGridDBColumn;
    cxGridViewFECHA_ASIENTO: TcxGridDBColumn;
    cxGridViewORDEN: TcxGridDBColumn;
    cxGridViewID_APUNTE: TcxGridDBColumn;
    cxGridViewID_FACTURA: TcxGridDBColumn;
    cxGridViewID_PAGO: TcxGridDBColumn;
    cxGridViewDOCUMENTO: TcxGridDBColumn;
    cxGridViewSaldo: TcxGridDBColumn;
    cxGridViewTIPO: TcxGridDBColumn;
    cxStyleCierre: TcxStyle;
    cxGridViewPUNTEADO: TcxGridDBColumn;
    procedure cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel);

    procedure CustomViewShow(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView;
      ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
      out AStyle: TcxStyle);
    procedure cxGridViewICONOCustomDrawCell(Sender: TcxCustomGridTableView;
      ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
      var ADone: Boolean);

  private
    FOnExtractoChange: TNotifyEvent;
    function GetExtractoChange: TNotifyEvent;
    procedure SetExtractoChange(const Value: TNotifyEvent);
    procedure AnadirFiltroFechas;
  protected
    FSubCuentas: IBizSubCuenta;
    FDiario: IBizDiario;
    FController : IAsientosController;
    function GetDiario: IBizDiario; virtual;
    procedure SetDiario(const Value: IBizDiario); virtual;
    function GetSubCuentas: IBizSubCuenta; virtual;
    procedure SetSubCuentas(const Value: IBizSubCuenta); virtual;
    function GetController : IAsientosController; virtual;
    procedure SetController (const Value : IAsientosController); virtual;

  public
    procedure AnadirOtrosFiltros; override;
    property OnExtractoChange: TNotifyEvent read GetExtractoChange write SetExtractoChange;
    property Diario: IBizDiario read GetDiario write SetDiario;
    property SubCuentas: IBizSubCuenta read GetSubCuentas write SetSubCuentas;
    property Controller : IAsientosController read GetController write SetController;
  end;

implementation
{$R *.dfm}

uses
  uSubCuentasController;

{ TfrViewDiario }

{
******************************* TfrViewDiario *******************************
}
function TfrViewExtractoMovimientos.GetController: IAsientosController;
begin
  Result := FController;
end;

function TfrViewExtractoMovimientos.GetDiario: IBizDiario;
begin
  Result := FDiario;
end;

function TfrViewExtractoMovimientos.GetExtractoChange: TNotifyEvent;
begin
  Result := FOnExtractoChange;
end;

function TfrViewExtractoMovimientos.GetSubCuentas: IBizSubCuenta;
begin
  Result := FSubCuentas;
end;

procedure TfrViewExtractoMovimientos.SetController(const Value: IAsientosController);
begin
  FController := Value;
end;

procedure TfrViewExtractoMovimientos.SetDiario(const Value: IBizDiario);
begin
  FDiario := Value;
  if Assigned(FDiario) then
    dsDataSource.DataTable := FDiario.DataTable;

  if Assigned(FOnExtractoChange) then
     FOnExtractoChange(Self);

  FDiario.DataTable.Active := True;
  GotoFirst;
end;


procedure TfrViewExtractoMovimientos.SetExtractoChange(const Value: TNotifyEvent);
begin
  FOnExtractoChange := Value;
end;

procedure TfrViewExtractoMovimientos.SetSubCuentas(const Value: IBizSubCuenta);
var
  Nivel: TcxGridLevel;
  auxb: Boolean;

begin
  FSubCuentas := Value;
  if Assigned(FSubCuentas) then
  begin
    if not FSubCuentas.DataTable.Active then
       FSubCuentas.DataTable.Active := True;

    if FSubCuentas.RecordCount > 0 then
    begin
      with FSubCuentas.DataTable do
      begin
        First;
        auxb:=True;
        while not EOF do
        begin
          if auxb
          //Ponemos la primera cuenta en el nivel ya creado
          then Nivel := cxGridLevel
          //Creamos un nuevo nivel
          else Nivel := cxGrid.Levels.Add;

          Nivel.Caption := FSubCuentas.DESCRIPCION;
          Nivel.Tag := FSubCuentas.ID;
          Next;
          auxb := False;
        end;
        First;
      end;
    end
    else cxGrid.RootLevelOptions.DetailTabsPosition := dtpNone;

//    FAsientos.Intervalo := frListaIntervalos.Intervalo;
  end;
end;

procedure TfrViewExtractoMovimientos.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
    _FocusedView.DataController.Filter.Options := [fcoCaseInsensitive, fcoSoftCompare];
    FFiltro := AddFilterGrid(fboAnd);

    Columna := _FocusedView.GetColumnByFieldName('FECHA_ASIENTO');
    FFiltro.AddItem(Columna, foBetween, varArrayOf([Fecha1, Fecha2]), VarToStr(Fecha1) + ' and ' + VarToStr(Fecha2));
  end;
end;

procedure TfrViewExtractoMovimientos.AnadirOtrosFiltros;
begin
  inherited;

  AnadirFiltroFechas;

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

procedure TfrViewExtractoMovimientos.CustomViewDestroy(Sender: TObject);
begin
  FSubCuentas := Nil;
  inherited;
end;

procedure TfrViewExtractoMovimientos.CustomViewShow(Sender: TObject);
begin
  inherited;
  with TSubCuentasController.Create do
    try
      SubCuentas := BuscarCajasBancos;
    finally
      Free;
    end;

  if Assigned(FController) then
  begin
    Diario := FController.BuscarAsientos(cxGrid.Levels.Items[cxGrid.ActiveLevel.Index].Tag);
    //Por si no lo guarda bien el registro del grid
    cxGridViewFECHA_ASIENTO.SortIndex := 0;
    cxGridViewORDEN.SortIndex := 1;
    cxGridViewFECHA_ASIENTO.SortOrder := soDescending;
    cxGridViewORDEN.SortOrder := soDescending;
  end;
end;

procedure TfrViewExtractoMovimientos.cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel);
var
  ACursor: TCursor;

begin
  ACursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;

  inherited;

  if Assigned(FController) then
     Diario := FController.BuscarAsientos(cxGrid.Levels.Items[ALevel.Index].Tag);

  cxGrid.Levels.Items[ALevel.Index].GridView := cxGridView;
  Screen.Cursor := ACursor;
end;

procedure TfrViewExtractoMovimientos.cxGridViewICONOCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  R : TRect;

begin
  inherited;
  R := AViewInfo.ContentBounds;
  ACanvas.FillRect(R);
  ACanvas.DrawImage(GridPNGImageList, R.Left, R.Top, 0);
  ADone := True;
end;

procedure TfrViewExtractoMovimientos.cxGridViewStylesGetContentStyle(
  Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
  AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
var
  IndiceCol: Integer;
  ATIPO: string;
begin
  inherited;

  if Assigned(ARecord) then
  begin

    IndiceCol := cxGridViewTIPO.Index;
    ATipo := VarToStr(ARecord.DisplayTexts[IndiceCol]);
    if (ATIPO = 'X') then
      AStyle := cxStyleCierre;
  end;
end;

end.
