unit uViewDetallesContratoCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewDetallesArticulos, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, ImgList, PngImageList,
  uDADataTable, ActnList, ComCtrls, ToolWin, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, cxImageComboBox, cxTextEdit, cxMaskEdit, cxCheckBox, cxCurrencyEdit,
  Grids, DBGrids, StdCtrls, ExtCtrls, cxRichEdit, ExtActns, StdActns,
  JvExStdCtrls, JvCombobox, JvColorCombo, TB2Item, TBX, TB2Dock, TB2Toolbar,
  uControllerDetallesArticulos, uBizContratosCliente, uDAInterfaces, Buttons,
  Mask, DBCtrls, cxButtonEdit, cxDropDownEdit, Menus, cxGridCustomPopupMenu,
  cxGridPopupMenu, cxDBLookupComboBox, cxCalc, cxEditRepositoryItems,
  cxContainer, cxLookupEdit, cxDBLookupEdit, uBizDetallesContratoCliente,
  cxMemo, uBizDetallesPresupuestoCliente;

type
  IViewDetallesContratoCliente = interface(IViewDetallesArticulos)
  ['{61D7EB63-B37B-40D1-A36A-15F7F09525A4}']
    function GetContrato: IBizContratoCliente;
    procedure SetContrato(const Value: IBizContratoCliente);
    property Contrato: IBizContratoCliente read GetContrato write SetContrato;
  end;

  TfrViewDetallesContratoCliente = class(TfrViewDetallesArticulos, IViewDetallesContratoCliente)
    actAsignarDescuento: TAction;
    TBXItem18: TTBXItem;
    TBXSeparatorItem9: TTBXSeparatorItem;
    DAPropiedades: TDADataSource;
    cxGridViewPROPIEDAD: TcxGridDBColumn;
    cxLookupComboBox1: TcxLookupComboBox;
    DAValores: TDADataSource;
    cxRichEdit1: TcxRichEdit;
    cxGridViewTIPO_ARTICULO: TcxGridDBColumn;
    TBXSubmenuItem1: TTBXSubmenuItem;
    TBXSeparatorItem6: TTBXSeparatorItem;
    TBXItem14: TTBXItem;
    actCapituloCocina: TAction;
    actCapituloArmarioF: TAction;
    actCapituloBano: TAction;
    TBXItem15: TTBXItem;
    TBXItem16: TTBXItem;
    actCapituloArmarioI: TAction;
    TBXItem17: TTBXItem;
    actCapituloElectrodomesticos: TAction;
    actCapituloVarios: TAction;
    TBXItem19: TTBXItem;
    TBXItem20: TTBXItem;
    TBXSeparatorItem7: TTBXSeparatorItem;
    TBXSeparatorItem8: TTBXSeparatorItem;
    TBXSeparatorItem10: TTBXSeparatorItem;
    actCapituloImportes: TAction;
    TBXSeparatorItem11: TTBXSeparatorItem;
    TBXItem21: TTBXItem;
    actCapituloObra: TAction;
    TBXItem22: TTBXItem;
    cxLookupComboBox2: TcxLookupComboBox;
    actCapituloEncimeras: TAction;
    TBXItem23: TTBXItem;
    procedure actAsignarDescuentoExecute(Sender: TObject);
    procedure actAsignarDescuentoUpdate(Sender: TObject);
    procedure CustomViewShow(Sender: TObject);
    procedure cxGridViewDESCRIPCIONGetPropertiesForEdit(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
      var AProperties: TcxCustomEditProperties);
    procedure cxGridViewPROPIEDADGetPropertiesForEdit(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
      var AProperties: TcxCustomEditProperties);
    procedure actCapituloBanoExecute(Sender: TObject);
    procedure actCapituloArmarioFExecute(Sender: TObject);
    procedure actCapituloArmarioIExecute(Sender: TObject);
    procedure actCapituloCocinaExecute(Sender: TObject);
    procedure actCapituloElectrodomesticosExecute(Sender: TObject);
    procedure actCapituloVariosExecute(Sender: TObject);
    procedure actAnadirExecute(Sender: TObject);
    procedure actCapituloImportesExecute(Sender: TObject);
    procedure OnVISIBLEPropertiesEditValueChanged(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure actCapituloObraExecute(Sender: TObject);
    procedure cxLookupComboBox1PropertiesEditValueChanged(Sender: TObject);
    procedure actCapituloEncimerasExecute(Sender: TObject);

  private
    procedure AnadirCapitulo(const Tipo: String;const Descripcion: String; const Descuento:Boolean = false);
    procedure OnVISIBLE2PropertiesEditValueChanged(Sender: TObject);

  protected
    FContrato: IBizContratoCliente;
    FPropiedades: IBizPropiedades;
    function GetContrato: IBizContratoCliente;
    procedure SetContrato(const Value: IBizContratoCliente);

    procedure AnadirArticulosInterno; override;
    procedure RellenarArticulosInterno; override;
    function AnadirArticulo(pReferencia: String; TipoReferencia: TEnumReferencia): Boolean; override;

    function EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean; override;

  public
    property Contrato: IBizContratoCliente read GetContrato write SetContrato;
  end;

implementation
{$R *.dfm}

uses
uControllerDetallesBase, uDetallesContratoClienteController, schContratosClienteClient_Intf,
uDetallesPresupuestoClienteController, cxVariants, cxDataUtils,
uCalculosUtils;

{ TfrViewDetallesContratoProveedor }

procedure TfrViewDetallesContratoCliente.actAnadirExecute(Sender: TObject);
var
  AuxTipo: String;
begin
  AuxTipo := '';
  //En el caso de estar dentro de un capitulo almacenamos el tipo de articulo del capitulo
  if FContrato.Detalles.TIPO_DETALLE = TIPO_DETALLE_CONCEPTO then
     AuxTipo := FContrato.Detalles.TIPO_ARTICULO;

  inherited;

  //Asignamos el tipo de articulo del capitulo
  (Controller as IDetallesContratoClienteController).SetTipoArticulo(Detalles, AuxTipo);
end;

procedure TfrViewDetallesContratoCliente.actAsignarDescuentoExecute(Sender: TObject);
{var
  AuxTop, AuxRow:Integer;
  ADescuento: Variant;}

begin
{
  ADescuento := (Controller as IDetallesContratoClienteController).PedirDescuento;

  ShowHourglassCursor;
  _FocusedView.BeginUpdate;
  try

    if Assigned(Controller) and Assigned(FContrato.Detalles) then
    begin
      AuxTop := cxGridView.Controller.TopRowIndex;
      AuxRow := cxGridView.DataController.FocusedRowIndex;

      (Controller as IDetallesContratoClienteController).AsignarDescuento(FContrato.Detalles, darListaSeleccionados, ADescuento);

       _FocusedView.DataController.SelectRows(AuxRow,AuxRow);
       _FocusedView.Controller.TopRowIndex := AuxTop;
    end
  finally
    _FocusedView.EndUpdate;
    HideHourglassCursor;
  end;
}  
end;

procedure TfrViewDetallesContratoCliente.actAsignarDescuentoUpdate(Sender: TObject);
begin
  inherited;

  if not DADataSource.DataTable.IsEmpty then
    (Sender as TAction).Enabled := not (DADataSource.DataTable.State in dsEditModes)
    and (_FocusedView.DataController.GetSelectedCount > 0)
    and (FContrato.Detalles.TIPO_DETALLE = TIPO_DETALLE_CONCEPTO)
  else
    (Sender as TAction).Enabled := False;
end;

procedure TfrViewDetallesContratoCliente.actCapituloArmarioFExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_AF, 'FRENTE DE ARMARIO Nº ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloArmarioIExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_AI, 'INTERIOR DE ARMARIO Nº ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloBanoExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_B, 'MUEBLE DE BAÑO Nº ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloCocinaExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_C, 'MUEBLES DE COCINA ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloElectrodomesticosExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_E, 'ELECTRODOMÉSTICOS ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloEncimerasExecute(
  Sender: TObject);
begin
  inherited;
  AnadirCapitulo(TIPO_CAPITULO_V, 'ENCIMERAS ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloImportesExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_V, 'IMPORTES ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloObraExecute(
  Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_O, 'OBRA ');
end;

procedure TfrViewDetallesContratoCliente.actCapituloVariosExecute(Sender: TObject);
begin
  AnadirCapitulo(TIPO_CAPITULO_V, 'VARIOS ');
end;

function TfrViewDetallesContratoCliente.AnadirArticulo(pReferencia: String; TipoReferencia: TEnumReferencia): Boolean;
begin
  Result := (Controller as IDetallesContratoClienteController).AnadirArticulo(Detalles, pReferencia, TipoReferencia, Contrato.Cliente.ID);
end;

procedure TfrViewDetallesContratoCliente.AnadirArticulosInterno;
begin
  (Controller as IDetallesContratoClienteController).AnadirArticulos(Detalles, Contrato.Cliente);
end;

procedure TfrViewDetallesContratoCliente.AnadirCapitulo(const Tipo: String;const Descripcion: String; const Descuento:Boolean = false);
var
  bEsMultiSelect : Boolean;
begin

  // Debo quitar el multiselect porque provoca que se quede seleccionado
  // el registro actual y no el nuevo registro que voy a añadir
  bEsMultiSelect := _FocusedView.OptionsSelection.MultiSelect;
  if bEsMultiSelect then
    _FocusedView.OptionsSelection.MultiSelect := False;

  ShowHourglassCursor;
  _FocusedView.BeginUpdate;
  try
    if _FocusedView.Controller.EditingController.IsEditing then
       _FocusedView.Controller.EditingController.Edit.PostEditValue;

    if Assigned(Controller) and Assigned(Detalles) then
       (Controller as IDetallesContratoClienteController).AnadirCapitulo(Tipo, Descripcion, Descuento, Detalles)
  finally
    _FocusedView.EndUpdate;
    HideHourglassCursor;

    // Dejo la propiedad MultiSelect como estaba
    if bEsMultiSelect then
       _FocusedView.OptionsSelection.MultiSelect := bEsMultiSelect;
  end;
end;

procedure TfrViewDetallesContratoCliente.CustomViewDestroy(Sender: TObject);
begin
  cxGridViewVISIBLE.Properties.OnEditValueChanged := Nil;
  cxGridViewVISIBLE2.Properties.OnEditValueChanged := Nil;  
  inherited;
end;

procedure TfrViewDetallesContratoCliente.CustomViewShow(Sender: TObject);
begin
  inherited;
  if not Assigned(FPropiedades) then
  begin
    FPropiedades := (Controller as IDetallesContratoClienteController).DarPropiedades;
    FPropiedades.DataTable.Active := True;
    DAPropiedades.DataTable := FPropiedades.DataTable;
    DAValores.DataTable := FPropiedades.Valores.DataTable;
    cxGridViewVISIBLE.Properties.OnEditValueChanged := OnVISIBLEPropertiesEditValueChanged;
    cxGridViewVISIBLE2.Properties.OnEditValueChanged := OnVISIBLE2PropertiesEditValueChanged;
  end;
end;

procedure TfrViewDetallesContratoCliente.cxGridViewDESCRIPCIONGetPropertiesForEdit(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AProperties: TcxCustomEditProperties);
begin
  inherited;

  //OJO sin esto no se refresca el filtro en tabla detalle "VALORES".
   DAPropiedades.DataTable.Locate(fld_PropiedadesDESCRIPCION, cxGridViewPROPIEDAD.DataBinding.Field.AsVariant,[]);

  if (ARecord.DisplayTexts[cxGridViewTIPO.Index] = TIPO_DETALLE_CONCEPTO)
  and (ARecord.DisplayTexts[cxGridViewPROPIEDAD.Index] <> '') then
  begin
     AProperties := cxLookupComboBox1.Properties
  end
  else begin
     AProperties := cxRichEdit1.Properties;
  end;
end;

procedure TfrViewDetallesContratoCliente.cxGridViewPROPIEDADGetPropertiesForEdit(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AProperties: TcxCustomEditProperties);
begin
  inherited;

  if (ARecord.DisplayTexts[cxGridViewTIPO.Index] = TIPO_DETALLE_CONCEPTO) then
  begin
     AProperties := cxLookupComboBox2.Properties
  end
  else
     AProperties := cxRichEdit1.Properties;
end;

procedure TfrViewDetallesContratoCliente.cxLookupComboBox1PropertiesEditValueChanged(
  Sender: TObject);
var
  AEdit: TcxCustomEdit;
  AValue: Variant;
begin
  inherited;
  AEdit := Sender as TcxCustomEdit;

  if (AEdit.EditValue = DAValores.DataTable.FieldByName('DESCRIPCION').AsString) then
  begin
    AValue := DAValores.DataTable.FieldByName('PRECIO_PVP').Value;
    AEdit.PostEditValue;  // To 'stick' the new value in the active cell
    cxGridView.DataController.SetEditValue(cxGridViewIMPORTEUNIDAD.Index, AValue, evsValue);
    Controller.actualizarTotales(Detalles);
  end;
end;

function TfrViewDetallesContratoCliente.EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean;
var
  IndiceCol : Integer;
begin
  Result := True;

  if (AItem.Index in [cxGridViewDESCUENTO.Index]) then
  begin
    IndiceCol := cxGridView.GetColumnByFieldName(CAMPO_TIPO).Index;
    if (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_DETALLE_DESCUENTO)
    and (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_DETALLE_CONCEPTO)  then
       Result := False
  end
  else if (AItem.Index in [cxGridViewPROPIEDAD.Index, cxGridViewTIPO_ARTICULO.Index]) then
  begin
    IndiceCol := cxGridView.GetColumnByFieldName(CAMPO_TIPO).Index;
    if ((AItem.GridView.Items[IndiceCol].EditValue = TIPO_DETALLE_SALTO) or
        (AItem.GridView.Items[IndiceCol].EditValue = TIPO_DETALLE_SUBTOTAL) or
        (AItem.GridView.Items[IndiceCol].EditValue = TIPO_DETALLE_DESCUENTO) or
        (AItem.GridView.Items[IndiceCol].EditValue = TIPO_DETALLE_TITULO)) then
      Result := False
    else
    begin
    IndiceCol := cxGridView.GetColumnByFieldName(fld_ContratosCliente_DetallesTIPO_ARTICULO).Index;
    if ((AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_AF) and
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_AI) and
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_C) and
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_O) and
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_V) and
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_E) and                                
        (AItem.GridView.Items[IndiceCol].EditValue <> TIPO_CAPITULO_B)) then
      Result := False
    end;
  end
  else
    Result := inherited EsTipoEditable(AItem);
end;

function TfrViewDetallesContratoCliente.GetContrato: IBizContratoCliente;
begin
  Result := FContrato;
end;

procedure TfrViewDetallesContratoCliente.OnVISIBLE2PropertiesEditValueChanged(Sender: TObject);
var
  Orden: Integer;
begin
  inherited;
  Orden := 1;
  if (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_TITULO)
  or (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_TITULO_OPCIONAL)
  or (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_SUBTOTAL) then
  begin
     cxGridView.BeginUpdate;

     if (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_SUBTOTAL) then
        Orden := 0;
     (Controller as IDetallesContratoClienteController).SetVisible2(Detalles, cxGridView.DataController.GetItemByFieldName(CAMPO_VISIBLE2).EditValue, Orden);

     cxGridView.EndUpdate;
  end;
end;

procedure TfrViewDetallesContratoCliente.OnVISIBLEPropertiesEditValueChanged(Sender: TObject);
var
  Orden: Integer;
begin
  inherited;
  Orden := 1;
  if (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_TITULO)
  or (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_TITULO_OPCIONAL)
  or (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_SUBTOTAL) then
  begin
     cxGridView.BeginUpdate;

     if (cxGridView.DataController.GetItemByFieldName(CAMPO_TIPO).EditValue = TIPO_DETALLE_SUBTOTAL) then
        Orden := 0;

     if Assigned(Controller) and Assigned(Detalles) then
     (Controller as IDetallesContratoClienteController).SetVisible(Detalles, cxGridView.DataController.GetItemByFieldName(CAMPO_VISIBLE).EditValue, Orden);

     cxGridView.EndUpdate;
  end;
  (Controller as IDetallesContratoClienteController).ActualizarTotales(Detalles);
end;

procedure TfrViewDetallesContratoCliente.RellenarArticulosInterno;
begin
  (Controller as IDetallesContratoClienteController).AnadirArticulos(Detalles, Contrato.Cliente, False);
end;

procedure TfrViewDetallesContratoCliente.SetContrato(const Value: IBizContratoCliente);
begin
  FContrato := Value;
end;

end.
