{
===============================================================================
  Copyright (©) 2003. 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: 22-02-2003
  Versión actual: 1.0.4
  Fecha versión actual: 04-02-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    15-08-2003    Se ha cambiado el intervalo a intervalo de nombre en vez
                  de intervalo de códigos de cliente.
    30-01-2004    Se utiliza el trimestre por defecto.
    30-03-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
    04-02-2005    Se elimnina la separación entre el informe resumen facturas e historial
                  facturas quedando un único informe desde el que acceder a ambos.
===============================================================================
}

unit HistorialFacturacionClientes;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RdxFrame, RdxTitulos, cxDropDownEdit, cxCalendar, cxDBEdit,
  RdxBotones, RdxPaneles, RdxBarras, cxMaskEdit, cxButtonEdit, cxControls,
  cxContainer, cxEdit, cxTextEdit, StdCtrls, AdvPanel, ExtCtrls, Configuracion,
  cxCheckBox, cxSpinEdit, InformeHistorialFacturacionClientes, VistaPrevia,
  TablaClientes, RdxRadioButton, RdxShape, TablaTrimestres, Entidades,
  InformeResumenFacturacionClientes, cxGraphics;

type
  TfrHistorialFacturacionClientes = class(TRdxFrame)
    pnlTitulo: TRdxPanelTituloOperacion;
    pnlCuerpo: TPanel;
    pnlProveedor: TAdvPanel;
    eCodigoCliente: TLabel;
    pnlVistaPrevia: TPanel;
    Label2: TLabel;
    cbCantidadMin: TcxCheckBox;
    CantidadMinima: TcxSpinEdit;
    NombreCliIni: TcxButtonEdit;
    NombreCliFin: TcxButtonEdit;
    RdxShape1: TRdxShape;
    rbTrimestre: TRdxRadioButton;
    cbxTrimestres: TcxComboBox;
    rbFechas: TRdxRadioButton;
    FechaInicial: TcxDateEdit;
    eFechaFin: TLabel;
    FechaFinal: TcxDateEdit;
    cbAgrupar: TcxCheckBox;
    procedure bImprimirClick(Sender: TObject);
    procedure cbCantidadMinClick(Sender: TObject);
    procedure cbCantidadMinPropertiesChange(Sender: TObject);
    procedure FechaIniPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure FechaFinPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure CantidadMinimaPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure NombreCliIniPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure NombreCliIniPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure NombreCliFinPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure NombreCliFinPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure rbTrimestreClick(Sender: TObject);
    procedure rbFechasClick(Sender: TObject);
    procedure cbxTrimestresPropertiesEditValueChanged(Sender: TObject);
    procedure cbAgruparPropertiesChange(Sender: TObject);
  private
    FVistaPrevia : TfrVistaPrevia;
    FInforme : TdmInformeHistorialFacturacionClientes;
    FInforme2 : TdmInformeResumenFacturacionClientes;
    FClienteIni : TDatosCliente;
    FClienteFin : TDatosCliente;
    FCodigoClienteAux : Variant;
    FListaTrimestres : TListaTrimestres;
    FAgrupado : Boolean;
    procedure SetAgrupado(const Value: Boolean);
  protected
    property Agrupado: Boolean read FAgrupado write SetAgrupado;
    procedure VerModal; override;
    procedure FreeContenido; override;
    function CloseFrame : Boolean; override;
    function CambiarEntidad(EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frHistorialFacturacionClientes: TfrHistorialFacturacionClientes;

implementation

{$R *.dfm}

{ TfrHistorialFacturacionClientes }

uses
  Literales, Mensajes, DateFunc, StrFunc, DateUtils, InformeBase,
  Clientes, RdxFrameClientes, cxDateUtils;

function TfrHistorialFacturacionClientes.CloseFrame: Boolean;
begin
  FInforme.Preview := NIL;
  FInforme2.Preview := NIL;
  (FVistaPrevia as TRdxFrame).CloseFrame;
  Result := inherited CloseFrame;
end;

constructor TfrHistorialFacturacionClientes.Create(AOwner: TComponent);
var
  NombreAux : String;
begin
  inherited Create(AOwner);
  Entidad := entHistorialFacturacionClientes;
  FAgrupado := True;

  FClienteIni := TDatosCliente.Create;
  FClienteFin := TDatosCliente.Create;

  FechaInicial.Date := DarDiaInicioMesDat;
  FechaFinal.Date := DarDiaFinalMesDat;

  NombreAux := dmTablaClientes.DarNombreCliMin;
  FClienteIni.Codigo := '';
  FClienteIni.Nombre := NombreAux;
  FClienteIni.ObtenerDatos;
  NombreCliIni.EditingText := FClienteIni.Nombre;

  NombreAux := dmTablaClientes.DarNombreCliMax;
  FClienteFin.Codigo := '';
  FClienteFin.Nombre := NombreAux;
  FClienteFin.ObtenerDatos;
  NombreCliFin.EditingText := FClienteFin.Nombre;

  FVistaPrevia := TfrVistaPrevia.Create(Self);
  FVistaPrevia.Parent := pnlVistaPrevia;

  FInforme := TdmInformeHistorialFacturacionClientes.Create(Self);
  with FInforme do
  begin
    Preview := FVistaPrevia.Preview;
    NombreIni := FClienteIni.Nombre;
    NombreFin := FClienteFin.Nombre;
    //FechaFacIni := FechaIni.EditValue;
    //FechaFacFin := FechaFin.EditValue;
    if cbCantidadMin.Checked then
      ImporteMinimo := CantidadMinima.Value
    else
      ImporteMinimo := NULL;
    //Previsualizar;
  end;

  FInforme2 := TdmInformeResumenFacturacionClientes.Create(Self);
  with FInforme2 do
  begin
    Preview := FVistaPrevia.Preview;
    NombreIni := FClienteIni.Nombre;
    NombreFin := FClienteFin.Nombre;
    //FechaFacIni := FechaIni.EditValue;
    //FechaFacFin := FechaFin.EditValue;
    if cbCantidadMin.Checked then
      ImporteMinimo := CantidadMinima.Value
    else
      ImporteMinimo := NULL;
    //Previsualizar;
  end;

  FListaTrimestres := TListaTrimestres.Create(tlcTriTodos);
  cbxTrimestres.ItemIndex := FListaTrimestres.cargarLista(cbxTrimestres.Properties.Items);
end;

destructor TfrHistorialFacturacionClientes.Destroy;
begin
  FInforme.Free;
  FInforme2.Free;  
  FClienteIni.Free;
  FClienteFin.Free;

  FListaTrimestres.Free;
  FListaTrimestres:= Nil;

  inherited;
end;

procedure TfrHistorialFacturacionClientes.bImprimirClick(Sender: TObject);
begin
  if Agrupado then
     FInforme.Imprimir
  else
     FInforme2.Imprimir;
end;

procedure TfrHistorialFacturacionClientes.cbCantidadMinClick(
  Sender: TObject);
begin
  CantidadMinima.Enabled := cbCantidadMin.Checked;
end;

procedure TfrHistorialFacturacionClientes.cbCantidadMinPropertiesChange(
  Sender: TObject);
begin
  if cbCantidadMin.Checked then
  begin
    FInforme.ImporteMinimo := CantidadMinima.Value;
    FInforme2.ImporteMinimo := CantidadMinima.Value;
  end
  else
  begin
    FInforme.ImporteMinimo := NULL;
    FInforme2.ImporteMinimo := NULL;
  end;

  if Agrupado then
     FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

procedure TfrHistorialFacturacionClientes.VerModal;
begin
  if (ContenidoModal is TRdxFrameClientes) then
    (ContenidoModal as TRdxFrameClientes).CodigoCliente := FCodigoClienteAux;
  inherited;
end;

procedure TfrHistorialFacturacionClientes.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameClientes) then
    FCodigoClienteAux := (ContenidoModal as TRdxFrameClientes).CodigoCliente;
  inherited;
end;

procedure TfrHistorialFacturacionClientes.FechaIniPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  ADate : TDateTime;
begin
  try
    if DisplayValue > FechaFinal.Date then
    begin
      ErrorText := msgFechasMal;
      Error := True;
      Exit;
    end;
    TextToDateEx(DisplayValue, ADate);
    FInforme.FechaFacIni := ADate;
    FInforme2.FechaFacIni := ADate;

    if Agrupado then
       FInforme.Previsualizar
    else
       FInforme2.Previsualizar;
  except
    Error := True;
    ErrorText := msgFechaNoValida;
  end;
end;

procedure TfrHistorialFacturacionClientes.FechaFinPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  ADate : TDateTime;
begin
  try
    if DisplayValue < FechaInicial.Date then
    begin
      ErrorText := msgFechasMal;
      Error := True;
      Exit;
    end;
    TextToDateEx(DisplayValue, ADate);
    FInforme.FechaFacFin := ADate;
    FInforme2.FechaFacFin := ADate;

    if Agrupado then
       FInforme.Previsualizar
    else
       FInforme2.Previsualizar;
  except
    Error := True;
    ErrorText := msgFechaNoValida;
  end;
end;

procedure TfrHistorialFacturacionClientes.CantidadMinimaPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if cbCantidadMin.Checked then
  begin
    FInforme.ImporteMinimo := DisplayValue;
    FInforme2.ImporteMinimo := DisplayValue;
  end
  else
  begin
    FInforme.ImporteMinimo := NULL;
    FInforme2.ImporteMinimo := NULL;
  end;

  if Agrupado then
      FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

procedure TfrHistorialFacturacionClientes.NombreCliIniPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrClientes.Create(Self);
  if FCodigoClienteAux <> Null then
  begin
    FClienteIni.Codigo := FCodigoClienteAux;
    FClienteIni.ObtenerDatos;
    NombreCliIni.EditingText := FClienteIni.Nombre;
    PostMessage(NombreCliIni.Handle,WM_KEYDOWN,VK_RETURN,0);
  end;
end;

procedure TfrHistorialFacturacionClientes.NombreCliIniPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if AnsiCompareText(DisplayValue, NombreCliFin.Text) > 0 then
  begin
    ErrorText := msgCliIniMayor;
    Error := True;
    Exit;
  end;
  FClienteIni.Nombre := DisplayValue;
  FClienteIni.Codigo := '';
  FInforme.NombreIni := FClienteIni.Nombre;
  FInforme2.NombreIni := FClienteIni.Nombre;

  if Agrupado then
     FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

procedure TfrHistorialFacturacionClientes.NombreCliFinPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if AnsiCompareText(DisplayValue, NombreCliIni.Text) < 0 then
  begin
    ErrorText := msgCliIniMayor;
    Error := True;
    Exit;
  end;
  FClienteFin.Nombre := DisplayValue;
  FClienteFin.Codigo := '';
  FInforme.NombreFin := FClienteFin.Nombre;
  FInforme2.NombreFin := FClienteFin.Nombre;

  if Agrupado then
     FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

procedure TfrHistorialFacturacionClientes.NombreCliFinPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrClientes.Create(Self);
  if FCodigoClienteAux <> Null then
  begin
    FClienteFin.Codigo := FCodigoClienteAux;
    FClienteFin.ObtenerDatos;
    NombreCliFin.EditingText := FClienteFin.Nombre;
    PostMessage(NombreCliFin.Handle,WM_KEYDOWN,VK_RETURN,0);
  end;
end;

procedure TfrHistorialFacturacionClientes.rbTrimestreClick(
  Sender: TObject);
begin
  cbxTrimestres.Enabled := True;
  FechaInicial.Enabled := False;
  FechaFinal.Enabled := False;
  cbxTrimestresPropertiesEditValueChanged(Sender);
end;

procedure TfrHistorialFacturacionClientes.rbFechasClick(Sender: TObject);
begin
  cbxTrimestres.Enabled := False;
  FechaInicial.Enabled := True;
  FechaFinal.Enabled := True;
end;

procedure TfrHistorialFacturacionClientes.cbxTrimestresPropertiesEditValueChanged(
  Sender: TObject);
var
  FCodigoTrimestre : String;
begin
  FCodigoTrimestre := FListaTrimestres.getCodItem(cbxTrimestres.ItemIndex);
  FechaInicial.Date := dmTablaTrimestres.darFechaIniTrimestre(FCodigoTrimestre);
  FechaFinal.Date := dmTablaTrimestres.darFechaFinTrimestre(FCodigoTrimestre);
  FInforme.FechaFacIni := FechaInicial.Date;
  FInforme.FechaFacFin := FechaFinal.Date;
  FInforme2.FechaFacIni := FechaInicial.Date;
  FInforme2.FechaFacFin := FechaFinal.Date;

  if Agrupado then
     FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

function TfrHistorialFacturacionClientes.CambiarEntidad(EntidadAnterior, Entidad: TRdxEntidad): Boolean;
begin
  inherited CambiarEntidad(EntidadAnterior, Entidad);
  ConfigurarFrame(Self, Self.Entidad);
end;

procedure TfrHistorialFacturacionClientes.cbAgruparPropertiesChange(
  Sender: TObject);
begin
  Agrupado := not Agrupado;
end;

procedure TfrHistorialFacturacionClientes.SetAgrupado(const Value: Boolean);
begin
  FAgrupado := Value;
  if Agrupado then
     FInforme.Previsualizar
  else
     FInforme2.Previsualizar;
end;

end.
