{
===============================================================================
  Copyright (©) 2002. 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: 16-11-2002
  Versión actual: 1.0.1
  Fecha versión actual: 02-04-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-04-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
===============================================================================
}

unit ListadoPagosCliente;

interface

uses
  Windows, Db, StdCtrls, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles,
  RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFrameComisiones,
  RdxFrame, RXDBCtrl, RxMemDS, ComCtrls, cxDBEdit, cxMaskEdit, cxButtonEdit,
  Configuracion, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, AdvPanel,
  cxSpinEdit, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData,
  cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, cxDropDownEdit, cxCalendar,
  InformeComisionesVendedores, vistaPrevia,
  RdxDBFrame, RdxFrameListadoPagosCliente, InformeListadoPagosCliente,
  InformeListadoPagosClientes, RdxPageControl, IBCustomDataSet, IBDatabase,

  RdxEmpresaActiva, cxDataStorage, Entidades;

type
  TfrListadoPagosCliente = class(TRdxFrameListadoPagosCliente)
    brSimple: TRdxBarraInferior;
    dsFacturas: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    pnlCuerpo: TPanel;
    dsPagos: TDataSource;
    bVistaPrevia: TRdxBoton;
    bImprimir: TRdxBoton;
    bCancelar: TRdxBoton;
    dsClientesPagos: TDataSource;
    Paginas: TRdxPagesControl;
    pagPagosClientes: TTabSheet;
    pagPagosCliente: TTabSheet;
    pnlDatos: TAdvPanel;
    Panel3: TPanel;
    eCodigoCliente: TLabel;
    eNIFCIF: TLabel;
    eNombre: TLabel;
    CodCliente: TcxButtonEdit;
    NIFCIF: TcxTextEdit;
    Nombre: TcxTextEdit;
    Panel2: TPanel;
    ImportePendiente: TLabel;
    Panel1: TPanel;
    Splitter1: TSplitter;
    gridPagosPendClientes: TcxGrid;
    gridPagosPendClientescxGridDBTableView1: TcxGridDBTableView;
    gridPagosPendClientescxGridLevel1: TcxGridLevel;
    TablaClientesPagosAux: TIBDataSet;
    TablaClientesPagosAuxDEBE: TIBBCDField;
    TablaClientesPagosAuxCODIGOCLIENTE: TIBStringField;
    TablaClientesPagosAuxNOMBRE: TIBStringField;
    TablaClientesPagosAuxTOTALFACTURAS: TIBBCDField;
    TablaClientesPagosAuxTOTALPAGOS: TIBBCDField;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    gridFacturas: TcxGrid;
    cxGridDBTableView1: TcxGridDBTableView;
    cxGridLevel1: TcxGridLevel;
    Panel9: TPanel;
    gridPagos: TcxGrid;
    gridPagosDBTableView1: TcxGridDBTableView;
    gridPagosLevel1: TcxGridLevel;
    eTituloGrid1: TLabel;
    eTituloGrid2: TLabel;
    procedure bCancelarClick(Sender: TObject);
    procedure bImprimirClick(Sender: TObject);
    procedure bVistaPreviaClick(Sender: TObject);
    procedure CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
    procedure Panel1Resize(Sender: TObject);
    procedure IBDataSet1CalcFields(DataSet: TDataSet);
    procedure PaginasChange(Sender: TObject);
    procedure gridPagosPendClientescxGridDBTableView1DblClick(Sender: TObject);
    procedure gridFacturasDBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    procedure cxGridDBTableView1DataControllerSummaryAfterSummary(ASender: TcxDataSummary);

  private
    FInformeListadoPagosCliente : TdmInformeListadoPagosCliente;
    FInformeListadoPagosClientes : TdmInformeListadoPagosClientes;
    FPagos : Double;
    FDebe : Double;
    FTotal : Double;
    property Pagos: Double read FPagos write FPagos;
    property Debe: Double read FDebe write FDebe;
    property Total: Double read FTotal write FTotal;
    procedure Filtrar;
  protected
    procedure ActivarModoConsultar; override;
    procedure RecargarDatos; override;
    procedure FreeContenido; override;
    procedure BuscarFacturas;
    procedure BuscarPagos;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    procedure activarFacturasCobrosCliente;
  end;

var
  frListadoPagosCliente: TfrListadoPagosCliente;

implementation
{$R *.DFM}

uses
  Mensajes, IB, Colores, BaseDatos, Sysutils, Constantes,
  StrFunc, TablaPoblaciones, Excepciones, IBErrorCodes,
  Variants, NumFunc, Literales, TablaFacturasCliente,
  TablaPagosCliente, DateFunc, cxCheckBox, cxDateUtils, Graphics,
  Clientes, RdxFrameClientes, TablaClientes, TablaEmpresas;


procedure TfrListadoPagosCliente.ActivarModoConsultar;
begin
  Visible := True;
end;

procedure TfrListadoPagosCliente.BuscarFacturas;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaFacturas.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoCliente) then begin
        TablaFacturas.ParamByName('CODIGOCLIENTE').AsString  := CodigoCliente;
        TablaFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    end;

    TablaFacturas.Prepare;
    TablaFacturas.Open;
    dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);    
    gridFacturas.ActiveView.DataController.GotoFirst;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrListadoPagosCliente.BuscarPagos;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaPagos.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoCliente) then begin
        TablaPagos.ParamByName('CODIGOCLIENTE').AsString  := CodigoCliente;
        TablaPagos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    end;

    TablaPagos.Prepare;
    TablaPagos.Open;
    dmTablaPagosCliente.InicializarTablaPagosClientes(@TablaPagos);    
    gridPagos.ActiveView.DataController.GotoFirst;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

constructor TfrListadoPagosCliente.Create (AOwner : TComponent);
var
  Columna : TcxGridDBColumn;

begin
  inherited Create(AOwner);

  FInformeListadoPagosCliente := TdmInformeListadoPagosCliente.Create(Self);
  FInformeListadoPagosClientes := TdmInformeListadoPagosClientes.Create(Self);
  Entidad := entListadoPagosCliente;
  Pagos := 0;
  Debe := 0;
  Total := 0;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaClientesPagos := TablaClientesPagosAux;
  TablaFacturas := TIBDataSet.Create(Self);
  TablaPagos := TIBDataSet.Create(Self);
  dsClientesPagos.DataSet := TablaClientesPagos;
  dsFacturas.DataSet := TablaFacturas;
  dsPagos.DataSet := TablaPagos;

  with TablaClientesPagos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPagosCliente.sqlGridPagosPendCliente);
    RefreshSQL.Assign(dmTablaPagosCliente.sqlGridPagosPendCliente);
    AutoCalcFields := True;
    OnCalcFields := IBDataSet1CalcFields;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
  end;

  with TablaFacturas do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturasCliente);
    RefreshSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturasCliente);
  end;

  with TablaPagos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPagosCliente.sqlGridPagosCliente);
    RefreshSQL.Assign(dmTablaPagosCliente.sqlGridPagosCliente);
  end;

  dmTablaPagosCliente.InicializarGridPagosPendClientes(gridPagosPendClientescxGridDBTableView1);
  dmTablaPagosCliente.InicializarTablaPagosPendClientes(@TablaClientesPagos);
  gridPagosPendClientescxGridDBTableView1.DataController.Summary.OnAfterSummary := cxGridDBTableView1DataControllerSummaryAfterSummary;
  gridPagosPendClientes.ActiveView.DataController.GotoFirst;

  dmTablaFacturasCliente.InicializarGridListadoFacturasCliente(gridFacturas);
  dmTablaPagosCliente.InicializarTablaPagosPendClientes(@TablaClientesPagos);
  dmTablaPagosCliente.InicializarGridListadoPagosCliente(gridPagos);
  cxGridDBTableView1.DataController.Summary.OnAfterSummary := cxGridDBTableView1DataControllerSummaryAfterSummary;
  gridPagosDBTableView1.DataController.Summary.OnAfterSummary := cxGridDBTableView1DataControllerSummaryAfterSummary;

  Filtrar;
  if VarIsNull(TablaClientesPagos.FieldByName('CODIGOCLIENTE').AsVariant)
  then CodigoCliente := dmTablaClientes.DarCodCliMin
  else CodigoCliente := TablaClientesPagos.FieldByName('CODIGOCLIENTE').AsVariant;
  Paginas.ActivePageIndex := 0;
end;

destructor TfrListadoPagosCliente.Destroy;
begin
  FInformeListadoPagosCliente.Free;
  FInformeListadoPagosClientes.Free;

  TablaClientesPagos.Close;
  TablaClientesPagos.UnPrepare;
  TablaClientesPagos.Free;

  TablaFacturas.Close;
  TablaFacturas.UnPrepare;
  TablaFacturas.Free;

  TablaPagos.Close;
  TablaPagos.UnPrepare;
  TablaPagos.Free;
  inherited;
end;

procedure TfrListadoPagosCliente.bImprimirClick(Sender: TObject);
begin
  if (Paginas.ActivePageIndex = 0) then
  begin
    FInformeListadoPagosClientes.Preview := nil;
    FInformeListadoPagosClientes.Imprimir;
  end
  else begin
    FInformeListadoPagosCliente.CodigoCliente := CodCliente.Text;
    FInformeListadoPagosCliente.NIFCIFCliente := NIFCIF.Text;
    FInformeListadoPagosCliente.NombreCliente := Nombre.Text;
    FInformeListadoPagosCliente.Pagos := Pagos;
    FInformeListadoPagosCliente.Debe := Debe;
    FInformeListadoPagosCliente.Total := Total;

    FInformeListadoPagosCliente.Preview := nil;
    FInformeListadoPagosCliente.Imprimir;
  end;
end;

procedure TfrListadoPagosCliente.bCancelarClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrListadoPagosCliente.bVistaPreviaClick(Sender: TObject);
var
  FVistaPrevia : TfrVistaPrevia;

begin
  if (Paginas.ActivePageIndex = 0) then
  begin
    FVistaPrevia := TfrVistaPrevia.Create(Self);
    FInformeListadoPagosClientes.Preview := FVistaPrevia.Preview;
    FInformeListadoPagosClientes.Previsualizar;

    CaptionModal := 'Informe de listado de pagos de clientes';
  end
  else begin
    FInformeListadoPagosCliente.CodigoCliente := CodCliente.Text;
    FInformeListadoPagosCliente.NIFCIFCliente := NIFCIF.Text;
    FInformeListadoPagosCliente.NombreCliente := Nombre.Text;
    FInformeListadoPagosCliente.Pagos := Pagos;
    FInformeListadoPagosCliente.Debe := Debe;
    FInformeListadoPagosCliente.Total := Total;

    FVistaPrevia := TfrVistaPrevia.Create(Self);
    FInformeListadoPagosCliente.Preview := FVistaPrevia.Preview;
    FInformeListadoPagosCliente.Previsualizar;

    CaptionModal := 'Informe de listado de pagos de cliente';
  end;

  WidthModal := 800;
  HeightModal := 600;
  ModoModal := Consultar;
  EntidadModal := entListadoPagosCliente;
  ContenidoModal := FVistaPrevia;
end;

procedure TfrListadoPagosCliente.gridFacturasDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('DEBE').Index;
  if (IndiceCol = AViewInfo.Item.Index) then
  begin
    if Copy(Trim(AViewInfo.GridRecord.DisplayTexts[IndiceCol]), 1, 1) = '-' then
    begin
      ACanvas.Canvas.Font.Color := $00385937;
    end
    else
    begin
      ACanvas.Canvas.Font.Color := $000000CC;
    end;
  end;
end;

procedure TfrListadoPagosCliente.CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrClientes.Create(Self);
end;

procedure TfrListadoPagosCliente.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameClientes) then
    CodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente;

  inherited FreeContenido;
end;

procedure TfrListadoPagosCliente.RecargarDatos;
var
  DatosCliente : TDatosCliente;

begin
  if not gridPagosPendClientescxGridDBTableView1.DataController.LocateByKey(CodigoCliente) then
     gridPagosPendClientescxGridDBTableView1.DataController.GotoFirst;

  DatosCliente := TDatosCliente.Create(CodigoCliente);
  CodCliente.Text := DatosCliente.Codigo;
  NIFCIF.Text := DatosCliente.NIFCIF;
  Nombre.Text := DatosCliente.Nombre;
  DatosCliente.Free;

  BuscarFacturas;
  BuscarPagos;

  if (not varIsNull(gridPagos.ActiveView.DataController.Summary.FooterSummaryValues[0])) then
    Pagos := gridPagos.ActiveView.DataController.Summary.FooterSummaryValues[0];

  if (not varIsNull(gridFacturas.ActiveView.DataController.Summary.FooterSummaryValues[0])) then
    Debe := gridFacturas.ActiveView.DataController.Summary.FooterSummaryValues[0];

  Total := Debe - Pagos;
  ImportePendiente.Caption := 'El importe pendiente del cliente es:   ' + FormatFloat('#,##0.00 €', Total) + '        ';
end;

procedure TfrListadoPagosCliente.Panel1Resize(Sender: TObject);
begin
  gridFacturas.Width := (Panel1.ClientWidth - Splitter1.Width) div 2;
  gridPagos.Width := gridFacturas.Width;
end;

procedure TfrListadoPagosCliente.IBDataSet1CalcFields(DataSet: TDataSet);
begin
  with DataSet do
  begin
    if VarIsNull(FieldByName('TOTALPAGOS').AsVariant) then
       FieldByName('TOTALPAGOS').AsFloat := 0;

    if VarIsNull(FieldByName('TOTALFACTURAS').AsVariant) then
       FieldByName('TOTALFACTURAS').AsFloat := 0;

    FieldByName('DEBE').AsFloat := FieldByName('TOTALFACTURAS').AsFloat - FieldByName('TOTALPAGOS').AsFloat;
  end;
end;

procedure TfrListadoPagosCliente.PaginasChange(Sender: TObject);
begin
  if (Paginas.ActivePageIndex = 1) then
    CodigoCliente := TablaClientesPagos.FieldByName('CODIGOCLIENTE').AsString;
end;

procedure TfrListadoPagosCliente.gridPagosPendClientescxGridDBTableView1DblClick(Sender: TObject);
begin
  CodigoCliente := TablaClientesPagos.FieldByName('CODIGOCLIENTE').AsString;
  Paginas.ActivePageIndex := 1;
end;

procedure TfrListadoPagosCliente.Filtrar;
var
  Columna : TcxGridDBColumn;
  AItemList: TcxFilterCriteriaItemList;
  
begin
  with gridPagosPendClientes.ActiveView.DataController.Filter do
  begin
    BeginUpdate;
    try
      Root.Clear;

      Columna := (gridPagosPendClientes.ActiveView as TcxGridDBTableView).GetColumnByFieldName('DEBE');
      AItemList := Root.AddItemList(fboOr);
      AItemList.AddItem(Columna, foGreater, EmpresaActiva.IntervaloPagosCli, 'Mayor');
      AItemList.AddItem(Columna, foLess, - EmpresaActiva.IntervaloPagosCli, 'Menor');

      Active := True;
    finally
      EndUpdate;
      gridPagosPendClientes.ActiveView.DataController.GotoFirst;
    end;
  end;
end;

procedure TfrListadoPagosCliente.cxGridDBTableView1DataControllerSummaryAfterSummary(ASender: TcxDataSummary);
begin
if ASender.DataController.Summary.FooterSummaryItems.Count <> 0 then
   if (esCadenaVacia(ASender.DataController.Summary.FooterSummaryTexts[0])) then
       ASender.DataController.Summary.FooterSummaryValues[0] := 0;
end;

procedure TfrListadoPagosCliente.activarFacturasCobrosCliente;
begin
  Paginas.ActivePageIndex := 1;
end;

end.
