{
===============================================================================
  Copyright (©) 2001. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 01-10-2001
  Versión actual: 1.0.5
  Fecha versión actual: 23-11-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    09-10-2001    Al pulsar la tecla ESC se activa el botón 'Cancelar'. Sólo
                  pasa cuando este frame está en una ventana modal.

    07-04-2002    Se ha adaptado para la transacción única.

    12-10-2002    P244. Se han añadido los listado de clientes.

    06-03-2004    Al hacer doble click sobre el grid, se pasará a modificar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.

    23-11-2004    p297. Solo sacar etiquetas de los clientes/proveedores etiquetados.
===============================================================================
}

unit Clientes;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls,
  Tipos, Menus, am2000menuitem, am2000popupmenu, am2000, Db, DBTables,
  RXDBCtrl, RdxPaneles, RdxBarras, TablaClientes,
  RdxDBFrame, RdxFrameClientes, dxCntner, dxTL, dxDBCtrl,
  dxDBGrid, am2000utils, pngimage, ImgList, dxDBTLCl, dxGrClms;

type
  TfrClientes = class(TRdxFrameClientes)
    menuDocumentos: TPopupMenu2000;
    Presupuestos1: TMenuItem2000;
    Albaranes1: TMenuItem2000;
    Facturas1: TMenuItem2000;
    N1: TMenuItem2000;
    N2: TMenuItem2000;
    dsClientes: TDataSource;
    pnlSuperior: TRdxBarraSuperior;
    bAnadir: TRdxBotonSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bBuscar: TRdxBotonSuperior;
    bDocumentos: TRdxBotonMenu;
    bListar: TRdxBotonMenu;
    menuListar: TPopupMenu2000;
    bListadoEtiquetas: TMenuItem2000;
    Listadodeclientes1: TMenuItem2000;
    imgSombra: TImage;
    pnlContenido: TRdxPanel;
    pnlExtra: TRdxBarraSuperior;
    bEtiquetar: TRdxBoton;
    pnlGrid: TPanel;
    gridClientes: TdxDBGrid;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    procedure bAnadirClick(Sender: TObject);
    procedure bModificarClick(Sender: TObject);
    procedure bConsultarClick(Sender: TObject);
    procedure bBuscarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure Presupuestos1Click(Sender: TObject);
    procedure Albaranes1Click(Sender: TObject);
    procedure Facturas1Click(Sender: TObject);
    procedure gridClientesRefreshButton(Sender: TObject);
    procedure Listadodeclientes1Click(Sender: TObject);
    procedure bListadoEtiquetasClick(Sender: TObject);
    procedure gridClientesDblClick(Sender: TObject);
    procedure bEtiquetarClick(Sender: TObject);
    procedure gridClientesCustomDrawCell(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
      ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
      var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
      var ADone: Boolean);
  private
    FEtiquetados: Boolean;
    procedure ActualizarBotones;
    procedure SetEtiquetados(const Value: Boolean);
  protected
    procedure BuscarCliente; override;
    procedure FreeContenido; override;
    procedure VerModal; override;
  public
    property SoloEtiquetados : Boolean read FEtiquetados write SetEtiquetados;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaClientes;
    property Entidad;
  end;

var
  frClientes: TfrClientes;

implementation
{$R *.DFM}
uses
  IBCustomDataSet, Cliente, BuscarCliente, BaseDatos, PresupuestosClientes,
  AlbaranesClientes, FacturasClientes, ListarClientes, GenerarEtiquetasClientes,
  Configuracion, mensajes, StrFunc, Constantes;

constructor TfrClientes.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entCliente;
  ConfigurarFrame(Self, Self.Entidad);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaClientes := TIBDataSet.Create(Self);
  dsClientes.DataSet := TablaClientes;

  with TablaClientes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaClientes.sqlGrid);
    Prepare;
    Open;
    ActualizarBotones;
  end;

  dmTablaClientes.InicializarGridClientes(gridClientes);
  with (gridClientes.ColumnByFieldName('ETIQUETADO') as TdxDBGridImageColumn) do
  begin
    Images := dmConfiguracion.ilEtiquetado;
    ImageIndexes.Add('0');
    ImageIndexes.Add('1');
    Values.Add('1');
    Values.Add('0');
  end;
end;

procedure TfrClientes.bAnadirClick(Sender: TObject);
begin
  Contenido := TfrCliente.Create(Self);
  Contenido.Modo := Anadir;
end;

procedure TfrClientes.bModificarClick(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  Contenido := TfrCliente.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrClientes.bConsultarClick(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  Contenido := TfrCliente.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrClientes.bBuscarClick(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  Contenido := TfrBuscarCliente.Create(Self);
end;

procedure TfrClientes.bEliminarClick(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  Contenido := TfrCliente.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrClientes.bSeleccionarClick(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrClientes.bCancelarGuardarClick(Sender: TObject);
begin
  FCodigoCliente := NULL;
  CloseFrame;
end;

procedure TfrClientes.BuscarCliente;
begin
  with TablaClientes do
  begin
    DisableControls;
    Close;
    Open;
    ActualizarBotones;
    EnableControls;
    Locate('CODIGO', CodigoCliente, []);
  end;
end;

destructor TfrClientes.Destroy;
begin
  TablaClientes.Close;
  TablaClientes.Unprepare;
  TablaClientes.Free;
  inherited;
end;

procedure TfrClientes.FreeContenido;
begin
  if (Contenido is TRdxFrameClientes) then
    CodigoCliente := (Contenido as TRdxFrameClientes).CodigoCliente;
  inherited;
end;

procedure TfrClientes.Presupuestos1Click(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  CaptionModal := Format('Lista de presupuestos del cliente %s', [TablaClientes.FieldByName('NOMBRE').AsString]);
  WidthModal := 815;
  HeightModal := 600;
  ModoModal := Consultar;
  ContenidoModal := TfrPresupuestosClientes.Create(Self);
end;

procedure TfrClientes.VerModal;
begin
  FCodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  if (ContenidoModal is TfrPresupuestosClientes) then
    (ContenidoModal as TfrPresupuestosClientes).CodigoCliente := FCodigoCliente;
  if (ContenidoModal is TfrAlbaranesClientes) then
    (ContenidoModal as TfrAlbaranesClientes).CodigoCliente := FCodigoCliente;
  if (ContenidoModal is TfrFacturasClientes) then
    (ContenidoModal as TfrFacturasClientes).CodigoCliente := FCodigoCliente;
  inherited;
end;

procedure TfrClientes.Facturas1Click(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  CaptionModal := Format('Lista de facturas del cliente %s', [TablaClientes.FieldByName('NOMBRE').AsString]);
  WidthModal := 815;
  HeightModal := 600;
  ModoModal := Consultar;
  ContenidoModal := TfrFacturasClientes.Create(Self);
end;

procedure TfrClientes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bAnadir.Enabled := False;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := True;
    bDocumentos.Enabled := True;
    bBuscar.Enabled := True;
    Exit;
  end;

  if TablaClientes.RecordCount = 0 then
  begin
    bAnadir.Enabled := True;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := False;
    bDocumentos.Enabled := False;
    bBuscar.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bModificar.Enabled := True;
    bEliminar.Enabled := True;
    bConsultar.Enabled := True;
    bDocumentos.Enabled := True;
    bBuscar.Enabled := True;
  end;
end;

procedure TfrClientes.gridClientesRefreshButton(Sender: TObject);
begin
  BuscarCliente;
end;

procedure TfrClientes.Albaranes1Click(Sender: TObject);
begin
  CodigoCliente := TablaClientes.FieldByName('CODIGO').AsString;
  CaptionModal := Format('Lista de albaranes del cliente %s', [TablaClientes.FieldByName('NOMBRE').AsString]);
  WidthModal := 815;
  HeightModal := 600;
  ModoModal := Consultar;
  ContenidoModal := TfrAlbaranesClientes.Create(Self);
end;

procedure TfrClientes.Listadodeclientes1Click(Sender: TObject);
begin
  Contenido := TfrListarClientes.Create(Self);
  Contenido.Modo := Listar;
end;

procedure TfrClientes.bListadoEtiquetasClick(Sender: TObject);
begin
  CaptionModal := 'Generar etiquetas de cliente';
  WidthModal := 505;
  HeightModal := 200;
  ModoModal := Listar;
  EntidadModal := entCliente;
  ContenidoModal := TfrGenerarEtiquetasClientes.Create(Self);
end;

procedure TfrClientes.gridClientesDblClick(Sender: TObject);
begin
  if Modo = Seleccionar then
    bSeleccionar.Click
  else
    bModificar.Click;
end;

procedure TfrClientes.bEtiquetarClick(Sender: TObject);
var
  IndiceCol1 : Integer;
  IndiceCol2 : Integer;
  IndiceSel : Integer;
  CodClientes0 : TStringList;
  CodClientes1 : TStringList;

begin
  IndiceCol1 := gridClientes.ColumnByFieldName('CODIGO').Index;
  IndiceCol2 := gridClientes.ColumnByFieldName('ETIQUETADO').Index;

  CodClientes0 := TStringList.Create;
  CodClientes1 := TStringList.Create;

  for IndiceSel:=0 to gridClientes.SelectedCount-1 do
  begin
    if StrToInt(gridClientes.SelectedNodes[IndiceSel].Strings[IndiceCol2]) = CTE_NOETIQUETAR then
      CodClientes0.Append(gridClientes.SelectedNodes[IndiceSel].Strings[IndiceCol1])
    else
      CodClientes1.Append(gridClientes.SelectedNodes[IndiceSel].Strings[IndiceCol1]);
  end;

  //Asignamos su nuevo valor a los clientes elegidos
  dmTablaClientes.EtiquetarClientes(codClientes0, CTE_NOETIQUETAR);
  dmTablaClientes.EtiquetarClientes(codClientes1, CTE_ETIQUETAR);
  Commit;

  codClientes0.Free;
  codClientes1.Free;

  //Refrescamos
  CodigoCliente := gridClientes.FocusedNode.Strings[IndiceCol1];
end;

procedure TfrClientes.gridClientesCustomDrawCell(Sender: TObject;
  ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
  AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean;
  var AText: String; var AColor: TColor; AFont: TFont;
  var AAlignment: TAlignment; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
{  if not ASelected then
  begin
    IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('ETIQUETADO').Index;
    if StrToInt(ANode.Strings[IndiceCol]) = CTE_ETIQUETAR then
      AFont.Color := COLOR_ETIQUETADO
    else
      AFont.Color := COLOR_NOETIQUETADO;
  end;}
end;

procedure TfrClientes.SetEtiquetados(const Value: Boolean);
var
  valor : variant;
begin
  valor := 1;
  FEtiquetados := Value;
  if FEtiquetados then
     gridClientes.Filter.Add(gridClientes.FindColumnByFieldName('ETIQUETADO'), valor, valor);
end;

end.
