unit uViewContratosCliente;

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, uBizContratosCliente, cxCurrencyEdit, Forms, uViewFiltroBase, ActnList, TB2Item,
  TBX, TB2Toolbar, TBXDkPanels, TB2Dock, dxPgsDlg, uDAInterfaces, Windows,
  uCustomView, uViewBase, cxTextEdit;

type
  IViewContratosCliente = interface(IViewGrid)
  ['{89FCCB14-46E9-4B45-BADD-847C881CCE1A}']
    function GetContratos: IBizContratoCliente;
    procedure SetContratos(const Value: IBizContratoCliente);
    property Contratos: IBizContratoCliente read GetContratos write SetContratos;
  end;

  TfrViewContratosCliente = class(TfrViewGrid, IViewContratosCliente)
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewINCIDENCIASACTIVAS: TcxGridDBColumn;
    cxGridViewNOMBRE: TcxGridDBColumn;
    cxGridViewSITUACION: TcxGridDBColumn;
    cxGridViewFECHA_CONTRATO: TcxGridDBColumn;
    cxGridViewIMPORTE_TOTAL: TcxGridDBColumn;
    cxGridLevelPendientes: TcxGridLevel;
    cxGridLevelAceptados: TcxGridLevel;
    cxStylePENDIENTES: TcxStyle;
    cxStyleACEPTADO: TcxStyle;
    actCocinas: TAction;
    TBXSeparatorItem2: TTBXSeparatorItem;
    TBXItem3: TTBXItem;
    cxGridViewNIF_CIF: TcxGridDBColumn;
    cxGridViewINCIDENCIAS: TcxGridDBColumn;
    cxStyleRECHAZADO: TcxStyle;
    cxGridViewTIPO_CONTRATO: TcxGridDBColumn;
    cxGridViewCALLE: TcxGridDBColumn;
    cxGridViewPOBLACION: TcxGridDBColumn;
    cxGridViewCODIGO_POSTAL: TcxGridDBColumn;
    cxGridViewPROVINCIA: TcxGridDBColumn;
    cxGridViewVENDEDOR: TcxGridDBColumn;
    cxGridViewReferenciaContenido: TcxGridDBColumn;
    cxGridViewLISTA_NOMBRES: TcxGridDBColumn;
    cxGridLevelRechazados: TcxGridLevel;
    cxGridViewFECHA_DECISION: TcxGridDBColumn;
    cxGridViewFACTURA_ASOCIADA: TcxGridDBColumn;
    cxGridViewFECHA_PREVISTA_MONTAJE: TcxGridDBColumn;
    cxGridViewCAMPO_LIBRE: TcxGridDBColumn;
    cxGridViewLOPD: TcxGridDBColumn;
    actBanos: TAction;
    actElectrodomesticos: TAction;
    actVarios: TAction;
    TBXItem2: TTBXItem;
    TBXItem4: TTBXItem;
    TBXItem5: TTBXItem;
    TBXSeparatorItem1: TTBXSeparatorItem;
    TBXSeparatorItem3: TTBXSeparatorItem;
    TBXSeparatorItem4: TTBXSeparatorItem;
    cxGridViewPROCEDENCIA_CLIENTE: TcxGridDBColumn;
    cxGridViewDESCUENTO: TcxGridDBColumn;
    cxGridViewIMPORTE_DESCUENTO: TcxGridDBColumn;
    cxGridViewIMPORTE_NETO: TcxGridDBColumn;
    cxGridViewFECHA_ULT_PRESENTACION_CLIENTE: TcxGridDBColumn;
    procedure cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel:
            TcxGridLevel);
    procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView;
            ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out
            AStyle: TcxStyle);
    procedure actCocinasExecute(Sender: TObject);
    procedure actCocinasUpdate(Sender: TObject);
    procedure cxGridViewICONOCustomDrawCell(Sender: TcxCustomGridTableView;
      ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
      var ADone: Boolean);
    procedure cxGridViewINCIDENCIASACTIVASGetCellHint(
      Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
      ACellViewInfo: TcxGridTableDataCellViewInfo; const AMousePos: TPoint;
      var AHintText: TCaption; var AIsHintMultiLine: Boolean;
      var AHintTextRect: TRect);
    procedure cxGridViewDataControllerCompare(
      ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
      AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
    procedure frViewFiltroBase1actQuitarFiltroExecute(Sender: TObject);
    procedure actQuitarAgrupacionesUpdate(Sender: TObject);
    procedure actQuitarAgrupacionesExecute(Sender: TObject);
    procedure CustomViewShow(Sender: TObject);
    procedure actBanosExecute(Sender: TObject);
    procedure actBanosUpdate(Sender: TObject);
    procedure actElectrodomesticosExecute(Sender: TObject);
    procedure actElectrodomesticosUpdate(Sender: TObject);
    procedure actVariosExecute(Sender: TObject);
    procedure actVariosUpdate(Sender: TObject);

  private
    FTipoContrato: String;  
    //Filtros relativos a la vista
    procedure AnadirFiltroSituaciones;
    procedure AnadirFiltroFechas;
    procedure AnadirFiltroTipo;

  protected
    FContratos: IBizContratoCliente;
    function GetContratos: IBizContratoCliente;
    procedure SetContratos(const Value: IBizContratoCliente);
  public
    procedure AnadirOtrosFiltros; override;
    property Contratos: IBizContratoCliente read GetContratos write SetContratos;
  end;

implementation

uses
  SysUtils, variants, uDataModuleContratosCliente, schContratosClienteClient_Intf,
  uViewGridBase, uPresupuestosClienteController,
  //uReferenciasUtils,
  cxVariants;

{$R *.dfm}

procedure TfrViewContratosCliente.actBanosExecute(Sender: TObject);
begin
  inherited;
  FTipoContrato := CTE_BANO;
  RefrescarFiltro
end;

procedure TfrViewContratosCliente.actBanosUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (FTipoContrato <> CTE_BANO);
end;

procedure TfrViewContratosCliente.actCocinasExecute(Sender: TObject);
begin
  FTipoContrato := CTE_COCINA;
  RefrescarFiltro
end;

procedure TfrViewContratosCliente.actCocinasUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (FTipoContrato <> CTE_COCINA);
end;

procedure TfrViewContratosCliente.actElectrodomesticosExecute(Sender: TObject);
begin
  inherited;
  FTipoContrato := CTE_ELECTRODOMESTICO;
  RefrescarFiltro
end;

procedure TfrViewContratosCliente.actElectrodomesticosUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (FTipoContrato <> CTE_ELECTRODOMESTICO);
end;

procedure TfrViewContratosCliente.actQuitarAgrupacionesExecute(Sender: TObject);
begin
  inherited;
  FTipoContrato := '';
  RefrescarFiltro
end;

procedure TfrViewContratosCliente.actQuitarAgrupacionesUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (FTipoContrato <> '');
end;

procedure TfrViewContratosCliente.actVariosExecute(Sender: TObject);
begin
  inherited;
  FTipoContrato := CTE_VARIOS;
  RefrescarFiltro
end;

procedure TfrViewContratosCliente.actVariosUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (FTipoContrato <> CTE_VARIOS);
end;

procedure TfrViewContratosCliente.AnadirFiltroFechas;
var
  Columna: TcxGridDBColumn;
  Fecha1, Fecha2: Variant;
  FechaDecision1, FechaDecision2: Variant;
  FechaMontaje1, FechaMontaje2: Variant;
  FFiltro : TcxFilterCriteriaItemList;
begin
  Fecha1 := frViewFiltroBase1.edtFechaIniFiltro.EditValue;
  Fecha2 := frViewFiltroBase1.edtFechaFinFiltro.EditValue;
  FechaDecision1 := frViewFiltroBase1.edtFecha2IniFiltro.EditValue;
  FechaDecision2 := frViewFiltroBase1.edtFecha2FinFiltro.EditValue;
  FechaMontaje1 := frViewFiltroBase1.edtFecha3IniFiltro.EditValue;
  FechaMontaje2 := frViewFiltroBase1.edtFecha3FinFiltro.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_CONTRATO');
    FFiltro.AddItem(Columna, foBetween, varArrayOf([Fecha1, Fecha2]), VarToStr(Fecha1) + ' and ' + VarToStr(Fecha2));
  end;

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

    Columna := (cxGridView as TcxGridDBTableView).GetColumnByFieldName('FECHA_DECISION');
    FFiltro.AddItem(Columna, foBetween, varArrayOf([FechaDecision1, FechaDecision2]), VarToStr(FechaDecision1) + ' and ' + VarToStr(FechaDecision2));
  end;

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

    Columna := (cxGridView as TcxGridDBTableView).GetColumnByFieldName('FECHA_PREVISTA_MONTAJE');
    FFiltro.AddItem(Columna, foBetween, varArrayOf([FechaMontaje1, FechaMontaje2]), VarToStr(FechaMontaje1) + ' and ' + VarToStr(FechaMontaje2));
  end;

end;

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

  case cxGrid.ActiveLevel.Index of
    1   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_CONTRATO_PENDIENTE, SITUACION_CONTRATO_PENDIENTE);
    2   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_CONTRATO_ACEPTADO, SITUACION_CONTRATO_ACEPTADO);
    3   : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_CONTRATO_RECHAZADO, SITUACION_CONTRATO_RECHAZADO);
  end;
end;

procedure TfrViewContratosCliente.AnadirFiltroTipo;
var
  FFiltro : TcxFilterCriteriaItemList;
begin
  FFiltro := AddFilterGrid(fboAnd);

  if (FTipoContrato <> '') then
      if (FTipoContrato = CTE_COCINA) then FFiltro.AddItem(cxGridViewTIPO_CONTRATO, foEqual, CTE_COCINA, CTE_COCINA)
      else if (FTipoContrato = CTE_BANO) then FFiltro.AddItem(cxGridViewTIPO_CONTRATO, foEqual, CTE_BANO, CTE_BANO)
           else if (FTipoContrato = CTE_ELECTRODOMESTICO) then FFiltro.AddItem(cxGridViewTIPO_CONTRATO, foEqual, CTE_ELECTRODOMESTICO, CTE_ELECTRODOMESTICO)
             else if (FTipoContrato = CTE_VARIOS) then FFiltro.AddItem(cxGridViewTIPO_CONTRATO, foEqual, CTE_VARIOS, CTE_VARIOS)
end;

procedure TfrViewContratosCliente.AnadirOtrosFiltros;
begin
  inherited;

  AnadirFiltroSituaciones;
  AnadirFiltroFechas;
  AnadirFiltroTipo;

  //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 TfrViewContratosCliente.CustomViewShow(Sender: TObject);
begin
  inherited;
  FTipoContrato := '';
end;

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

procedure TfrViewContratosCliente.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;

procedure TfrViewContratosCliente.cxGridViewICONOCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
{var
  R : TRect;}
begin
  inherited; 
{  R := AViewInfo.ContentBounds;
  ACanvas.FillRect(R);

  if (cxGridView.DataController.DisplayTexts[AViewInfo.GridRecord.RecordIndex,
    cxGridViewINCIDENCIASACTIVAS.Index] = 'Sin incidencias') then
    ACanvas.DrawImage(GridPNGImageList, R.Left + 2, R.Top + 2, 1)
  else
    ACanvas.DrawImage(GridPNGImageList, R.Left + 2, R.Top + 2, 2);
  ADone := True;}
end;

procedure TfrViewContratosCliente.cxGridViewINCIDENCIASACTIVASGetCellHint(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  ACellViewInfo: TcxGridTableDataCellViewInfo; const AMousePos: TPoint;
  var AHintText: TCaption; var AIsHintMultiLine: Boolean;
  var AHintTextRect: TRect);
begin
  inherited;
  if (ARecord.DisplayTexts[Sender.Index] <> 'Sin incidencias') then
  begin
    AIsHintMultiLine := True;
    if not VarIsNull(ARecord.Values[cxGridViewINCIDENCIAS.Index]) then
       AHintText := ARecord.Values[cxGridViewINCIDENCIAS.Index];
  end;
end;

procedure TfrViewContratosCliente.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_ContratosClienteSITUACION).Index;
    ASituacion := VarToStr(ARecord.DisplayTexts[IndiceCol]);
    if ASituacion = SITUACION_CONTRATO_PENDIENTE then
      AStyle.TextColor := cxStylePENDIENTES.TextColor
    else if ASituacion = SITUACION_CONTRATO_ACEPTADO then
      AStyle.TextColor := cxStyleACEPTADO.TextColor
    else if ASituacion = SITUACION_CONTRATO_RECHAZADO then
      AStyle.TextColor := cxStyleRECHAZADO.TextColor
  end;
end;

procedure TfrViewContratosCliente.frViewFiltroBase1actQuitarFiltroExecute(Sender: TObject);
begin
  frViewFiltroBase1.txtFiltroTodo.Clear;
end;

function TfrViewContratosCliente.GetContratos: IBizContratoCliente;
begin
  Result := FContratos;
end;

procedure TfrViewContratosCliente.SetContratos(const Value: IBizContratoCliente);
begin
  FContratos := Value;
  if Assigned(FContratos) then
    dsDataSource.DataTable := FContratos.DataTable;
end;

end.
