unit uViewDetalleReservas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frxClass, frxPreview, cxStyles,
  cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB,
  cxDBData, ActnList, uDADataTable, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView,
  cxGridDBTableView, cxGrid, StdCtrls, ExtCtrls, cxLabel, dxPSGlbl, dxPSUtl,
  dxPSEngn, dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider, dxPSFillPatterns,
  dxPSEdgePatterns, cxIntlPrintSys3, dxPSCore, dxPScxCommon, dxPScxGrid6Lnk, cxImage,
  cxImageComboBox, ImgList, PngImageList, cxTextEdit, Grids, DBGrids, cxDBLookupComboBox,
  cxButtonEdit, cxGridCustomPopupMenu, cxGridPopupMenu, uViewGrid,
  uBizInventario, uBizAlmacenes, cxSpinEdit, uViewFiltroBase, TB2Item, TBX,
  TB2Toolbar, TBXDkPanels, TB2Dock, dxPgsDlg, cxCurrencyEdit, uAlmacenesController,
  uDAInterfaces, cxContainer, cxMaskEdit, cxDropDownEdit;
  
type
  IViewDetalleReservas = interface(IViewGrid)
  ['{4417F53A-5BB1-4B99-8760-4C0E1D449582}']
    function GetDetalleReservas: IBizDetalleReservas;
    procedure SetDetalleReservas(const Value: IBizDetalleReservas);
    property DetalleReservas: IBizDetalleReservas read GetDetalleReservas write SetDetalleReservas;
    function GetAlmacenes: TStringList;
    procedure SetAlmacenes(const Value: TStringList);
    property Almacenes: TStringList read GetAlmacenes write SetAlmacenes;
    function GetObras: TStringList;
    procedure SetObras(const Value: TStringList);
    property Obras: TStringList read GetObras write SetObras;
    function DarIDAlmacenObraSeleccionada: Variant;
    function ListaAlmacenesObrasVacia: Boolean;
  end;

  TfrViewDetalleReservas = class(TfrViewGrid, IViewDetalleReservas)
    cxGridDBTableView1: TcxGridDBTableView;
    PngImageList: TPngImageList;
    cxStyleArticuloSinStock: TcxStyle;
    cxGridViewRecID: TcxGridDBColumn;
    cxGridViewFECHA_RESERVA: TcxGridDBColumn;
    cxGridViewCAUSA_RESERVA: TcxGridDBColumn;
    cxGridViewID_ALMACEN: TcxGridDBColumn;
    cxGridViewALMACEN: TcxGridDBColumn;
    cxGridViewID_ARTICULO: TcxGridDBColumn;
    cxGridViewFAMILIA: TcxGridDBColumn;
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewDESCRIPCION: TcxGridDBColumn;
    cxGridViewCANTIDAD: TcxGridDBColumn;
    cxGridViewUNIDAD_MEDIDA: TcxGridDBColumn;
    cxGridViewFABRICANTE: TcxGridDBColumn;
    cxGridViewREFERENCIA_FABR: TcxGridDBColumn;
    cxGridViewID_ALMACEN_RESERVA: TcxGridDBColumn;
    cxGridViewALMACEN_RESERVA: TcxGridDBColumn;
    pnlAlmacenes: TPanel;
    eAlmacen: TLabel;
    cxListaAlmacenesObras: TcxComboBox;
    procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView;
            ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out
            AStyle: TcxStyle);
    procedure cxListaAlmacenesObrasPropertiesEditValueChanged(Sender: TObject);
    procedure CustomViewShow(Sender: TObject);

  private
    //Filtros relativos a la vista
    procedure AnadirFiltroAlmacenesObras;

  protected
    FAlmacenes: TStringList;
    FObras: TStringList;
    FDetalleReservas: IBizDetalleReservas;

    function GetAlmacenes: TStringList;
    procedure SetAlmacenes(const Value: TStringList);
    function GetObras: TStringList;
    procedure SetObras(const Value: TStringList);
    function GetDetalleReservas: IBizDetalleReservas;
    procedure SetDetalleReservas(const Value: IBizDetalleReservas);


//    FAlmacenesController: IAlmacenesController;
//    function GetAlmacenes: IBizAlmacen;
//    procedure SetAlmacenes(const Value: IBizAlmacen);


  public
    property DetalleReservas: IBizDetalleReservas read GetDetalleReservas write SetDetalleReservas;
    procedure AnadirOtrosFiltros; override;

//    property Almacenes: IBizAlmacen read GetAlmacenes write SetAlmacenes;

    destructor Destroy; override;





    function DarIDAlmacenObraSeleccionada: Variant;
    function ListaAlmacenesObrasVacia: Boolean;

  end;

implementation
{$R *.dfm}

uses uDataModuleInventario, schInventarioClient_Intf;

procedure TfrViewDetalleReservas.AnadirFiltroAlmacenesObras;
var
  FFiltro : TcxFilterCriteriaItemList;
  CodigoAlmacen: Variant;
begin
  FFiltro := AddFilterGrid(fboAnd);

  CodigoAlmacen := DarIDAlmacenObraSeleccionada;

  if not VarIsNull(CodigoAlmacen) then
  begin
     FFiltro.AddItem(cxGridViewID_ALMACEN, foEqual, CodigoAlmacen, CodigoAlmacen);
     cxGridViewALMACEN.Visible := False;
  end
  else
     cxGridViewALMACEN.Visible := True;
end;

procedure TfrViewDetalleReservas.AnadirOtrosFiltros;
begin
  inherited;

  AnadirFiltroAlmacenesObras;

  //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 TfrViewDetalleReservas.CustomViewShow(Sender: TObject);
begin
  inherited;
  if Assigned(FAlmacenes) or Assigned(FObras) then
     cxListaAlmacenesObras.ItemIndex := 0
  //En el caso de ser la vista para la selección de articulos de un determinado almacén
  else
     pnlAlmacenes.Visible:= False;
end;

procedure TfrViewDetalleReservas.cxGridViewStylesGetContentStyle(Sender:
        TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem:
        TcxCustomGridTableItem; out AStyle: TcxStyle);
{var
  IndiceCol: Integer;
  AStock: Variant;}
begin
  inherited;
{
  if Assigned(ARecord) then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName(fld_DetalleReservasSTOCK).Index;
    AStock := ARecord.DisplayTexts[IndiceCol];
    if (AStock < 0) then
      AStyle := cxStyleArticuloSinStock;
  end;
}  
end;

procedure TfrViewDetalleReservas.cxListaAlmacenesObrasPropertiesEditValueChanged(Sender: TObject);
begin
  inherited;
  RefrescarFiltro;
end;

function TfrViewDetalleReservas.DarIDAlmacenObraSeleccionada: Variant;
begin
  Result := Null;

  if VarIsNull(cxListaAlmacenesObras.EditValue) then
     Exit;

  //INV_ALMACENES
  if Assigned(FAlmacenes) then
     Result := FAlmacenes.Values[cxListaAlmacenesObras.EditValue]
  //INV_OBRAS
  else if Assigned(FObras) then
     Result := FObras.Values[cxListaAlmacenesObras.EditValue]
  else
     Raise Exception.Create('No se ha asignado ninguna lista de ALMACENES');
end;

destructor TfrViewDetalleReservas.Destroy;
begin
  FAlmacenes := Nil;
  FObras := Nil;
  FDetalleReservas := Nil;
  inherited;
end;

function TfrViewDetalleReservas.GetAlmacenes: TStringList;
begin
  Result := FAlmacenes;
end;

function TfrViewDetalleReservas.GetDetalleReservas: IBizDetalleReservas;
begin
  Result := FDetalleReservas;
end;

function TfrViewDetalleReservas.GetObras: TStringList;
begin
  Result := FObras;
end;

function TfrViewDetalleReservas.ListaAlmacenesObrasVacia: Boolean;
begin
  Result := (cxListaAlmacenesObras.Properties.Items.Count = 0);
end;

procedure TfrViewDetalleReservas.SetAlmacenes(const Value: TStringList);
var
  Nivel: TcxGridLevel;
  i: integer;
begin
  FAlmacenes := Value;
  eAlmacen.Caption := 'Almacén';

  if Assigned(FAlmacenes) then
  begin
    cxGrid.BeginUpdate;
    try
      with cxListaAlmacenesObras.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
          for i := 0 to FAlmacenes.Count - 1 do
            Add(FAlmacenes.Names[i]);
        finally
          EndUpdate;
        end;
      end;

    finally
      cxGrid.EndUpdate;
    end;
  end;
end;

procedure TfrViewDetalleReservas.SetDetalleReservas(const Value: IBizDetalleReservas);
begin
  FDetalleReservas := Value;
  if Assigned(FDetalleReservas) then
     dsDataSource.DataTable := FDetalleReservas.DataTable
  else
     dsDataSource.DataTable := Nil;
end;

procedure TfrViewDetalleReservas.SetObras(const Value: TStringList);
var
  Nivel: TcxGridLevel;
  i: integer;
begin
  FObras := Value;
  eAlmacen.Caption := 'Obra';

  if Assigned(FObras) then
  begin
    cxGrid.BeginUpdate;
    try
      with cxListaAlmacenesObras.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
          for i := 0 to FObras.Count - 1 do
            Add(FObras.Names[i]);
        finally
          EndUpdate;
        end;
      end;

    finally
      cxGrid.EndUpdate;
    end;
  end;
end;

end.
