{
===============================================================================
  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: 26-01-2003
  Versión actual: 1.0.1
  Fecha versión actual: 22-04-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    22-04-2004    Arreglado un fallo con el código de empresa al insertar
                  un cobro a cliente nuevo.
===============================================================================
}

unit TablaPagosCliente;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  IBCustomDataSet, cxGrid, TablaPagosProveedor,

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos, RdxEmpresaActiva,

  // Contador
  Contadores, RdxGestorContadores;

type
  TDatosPagoCliente = class(TDatosPago)
  public
    CodigoCliente : String;
  end;

type
  TdmTablaPagosCliente = class(TDataModule)
  private
    procedure IniciarSQL;

  protected
  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;
    sqlGridPagosCliente : TStrings;
    sqlGridPagosPendCliente : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function IncrementarCodigo: boolean;
    function InsertarContador : boolean;
    function ValidarCodigo(Codigo : String) : Boolean;
    function FormatearCodigo(Codigo : String) : String;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    function DarDatosPagoCliente(PagoCliente : TDatosPagoCliente) : Boolean;
    function DarPagoClienteMax : String;
    function DarPagoClienteMin : String;

    procedure Inicializargridlistadopagoscliente(var Grid: TcxGrid);
    procedure InicializarGridPagosClientes(var vGrid: TcxGridDBTableView);
    procedure InicializarTablaPagosClientes(Tabla: TPTabla);
    procedure InicializarGridPagosPendClientes(var vGrid: TcxGridDBTableView);
    procedure InicializarTablaPagosPendClientes(Tabla: TPTabla);
    function ExistePagoConCliente(Codigo : Variant) : Boolean;    
  end;

var
  dmTablaPagosCliente: TdmTablaPagosCliente;

implementation

{$R *.DFM}

uses
  Variants, TablaEmpresas;

////////////////////////////////////////////////////////////////////////////////
// PRIVATE
////////////////////////////////////////////////////////////////////////////////

procedure TdmTablaPagosCliente.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('INSERT INTO PAGOSCLIENTE (CODIGOEMPRESA, CODIGO, FECHAALTA, USUARIO, FECHAPAGO, ');
    Add('TIPOLIBRO, NUMENTRADA, TIPOPAGO, FORMAPAGO, DESCRIPCION, IMPORTE, CODIGOCLIENTE, NIFCIF, NOMBRE, CALLE, ');
    Add('NUMERO, PISO, CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO1, TELEFONO2, ');
    Add('MOVIL1, MOVIL2, FAX, CORREO) ');
    Add('VALUES (:CODIGOEMPRESA, :CODIGO, :FECHAALTA, :USUARIO, :FECHAPAGO, ');
    Add(':TIPOLIBRO, :NUMENTRADA, :TIPOPAGO, :FORMAPAGO, :DESCRIPCION, :IMPORTE, :CODIGOCLIENTE, :NIFCIF, :NOMBRE, :CALLE, ');
    Add(':NUMERO, :PISO, :CODIGOPOSTAL, :POBLACION, :PROVINCIA, :TELEFONO1, :TELEFONO2, ');
    Add(':MOVIL1, :MOVIL2, :FAX, :CORREO) ');
  end;

  with sqlModificar do
  begin
    Add('update PAGOSCLIENTE set ');
    Add('FECHAPAGO = :FECHAPAGO, ');
    Add('TIPOLIBRO = :TIPOLIBRO, ');
    Add('NUMENTRADA = :NUMENTRADA, ');
    Add('TIPOPAGO = :TIPOPAGO, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('IMPORTE = :IMPORTE, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('PISO = :PISO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('TELEFONO1 = :TELEFONO1, ');
    Add('TELEFONO2 = :TELEFONO2, ');
    Add('MOVIL1 = :MOVIL1, ');
    Add('MOVIL2 = :MOVIL2, ');
    Add('FAX = :FAX, ');
    Add('CORREO = :CORREO ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA');
    Add('and CODIGO = :CODIGO)');
  end;

  with sqlEliminar do
  begin
    Add('DELETE FROM PAGOSCLIENTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA');
    Add('and CODIGO = :CODIGO)');
  end;

  with sqlConsultar do
  begin
    Add('SELECT * FROM PAGOSCLIENTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA');
    Add('and CODIGO = :CODIGO)');
  end;

  with sqlGrid do
  begin
    Add('SELECT CODIGO, TIPOPAGO, CODIGOCLIENTE, NOMBRE, TELEFONO1, FECHAPAGO, FORMAPAGO, IMPORTE ');
    Add('FROM PAGOSCLIENTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlGridPagosCliente do
  begin
    Add('SELECT CODIGO, TIPOPAGO, CODIGOCLIENTE, NOMBRE, TELEFONO1, FECHAPAGO, FORMAPAGO, IMPORTE ');
    Add('FROM PAGOSCLIENTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA');
    Add('and CODIGOCLIENTE = :CODIGOCLIENTE)');
  end;

  with sqlGridPagosPendCliente do
  begin
	Add('select c.codigo as codigocliente, c.nombre, ');
	Add('(select sum(f2.importetotal)');
	Add('from facturascliente f2');
	Add('where f2.codigocliente = c.codigo and');
	Add('f2.codigoempresa = :CODIGOEMPRESA) totalfacturas,');
	Add('(select sum(p.importe)');
	Add('from pagoscliente p');
	Add('where p.codigocliente = c.codigo and');
	Add('p.codigoempresa = :CODIGOEMPRESA) totalpagos,');
	Add('0.00 debe');

	Add('from clientes c');
	Add('where (((select sum(f2.importetotal)');
	Add('from facturascliente f2');
	Add('where f2.codigocliente = c.codigo and');
	Add('f2.codigoempresa = :CODIGOEMPRESA) is not null) or ((select sum(p.importe)');
	Add('from pagoscliente p');
	Add('where p.codigocliente = c.codigo and');
	Add('p.codigoempresa = :CODIGOEMPRESA) is not null))');
  end;
end;


////////////////////////////////////////////////////////////////////////////////
// PUBLIC
////////////////////////////////////////////////////////////////////////////////

constructor TdmTablaPagosCliente.Create (AOwner : TComponent);
begin
  inherited;
  sqlInsertar := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlGrid := TStringList.Create;
  sqlGridPagosCliente := TStringList.Create;
  sqlGridPagosPendCliente := TStringList.Create;

  IniciarSQL;
end;

destructor TdmTablaPagosCliente.Destroy;
begin
  sqlInsertar.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlGrid.Free;
  sqlGridPagosCliente.Free;
  sqlGridPagosPendCliente.Free;
  inherited;
end;

function TdmTablaPagosCliente.DarDatosPagoCliente(PagoCliente: TDatosPagoCliente): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if EsCadenaVacia(PagoCliente.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * ');
    SQL.Add('from PAGOSCLIENTE ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO)');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := PagoCliente.Codigo;
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        with PagoCliente do
        begin
          FechaAlta := FieldByName('FECHAALTA').AsString;
          Usuario := FieldByName('USUARIO').AsString;
          FechaPago := FieldByName('FECHAPAGO').AsString;
          TipoLibro := FieldByName('TIPOLIBRO').AsString;
          NumEntrada := FieldByName('NUMENTRADA').AsString;
          TipoPago := FieldByName('TIPOPAGO').AsString;
          Importe := FieldByName('IMPORTE').AsDouble;
          FormaPago := FieldByName('FORMAPAGO').AsString;
          Descripcion := FieldByName('DESCRIPCION').AsString;
          CodigoCliente := FieldByName('CODIGOCLIENTE').AsString;
          NIFCIF := FieldByName('NIFCIF').AsString;
          Nombre := FieldByName('NOMBRE').AsString;
          Calle := FieldByName('CALLE').AsString;
          Numero := FieldByName('NUMERO').AsString;
          Piso := FieldByName('PISO').AsString;
          CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
          Poblacion := FieldByName('POBLACION').AsString;
          Provincia := FieldByName('PROVINCIA').AsString;
          Telefono1 := FieldByName('TELEFONO1').AsString;
          Telefono2 := FieldByName('TELEFONO2').AsString;
          Movil1 := FieldByName('MOVIL1').AsString;
          Movil2 := FieldByName('MOVIL2').AsString;
          Fax := FieldByName('MOVIL1').AsString;
          Correo := FieldByName('MOVIL2').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPagosCliente.DarPagoClienteMax: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(CODIGO) ');
    SQL.Add('from PAGOSCLIENTE ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPagosCliente.DarPagoClienteMin: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select min(CODIGO) ');
    SQL.Add('from PAGOSCLIENTE ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaPagosCliente.InicializarGridPagosClientes (var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin
    OptionsView.Footer := True;

    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 pagos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna TIPOPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOPAGO';
    Columna.Caption := 'Movimiento';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna FECHAPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAPAGO';
    Columna.Caption := 'Fecha pago';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna FORMAPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FORMAPAGO';
    Columna.Caption := 'Forma de pago';
    Columna.Width := tamColFormaPago;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre de cliente';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    {Columna TELEFONO1}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TELEFONO1';
    Columna.Caption := 'Telefono';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna IMPORTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTE';
    Columna.Caption := 'Importe';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
  end;
end;

procedure TdmTablaPagosCliente.InicializarTablaPagosClientes(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('IMPORTE') <> NIL then
      with (FieldByName('IMPORTE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

procedure TdmTablaPagosCliente.InicializarGridListadoPagosCliente(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna TIPOPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TIPOPAGO';
    Columna.Caption := 'Tipo pago';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna FECHAPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAPAGO';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna FORMAPAGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FORMAPAGO';
    Columna.Caption := 'Forma pago';
    Columna.Width := tamColSituacion;
    Columna.Options.Filtering := False;
    {Columna IMPORTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTE';
    Columna.Caption := 'Importe total';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0.00# €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

procedure TdmTablaPagosCliente.InicializarGridPagosPendClientes(var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin

    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soAscending;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 Clientes adeudan';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
    {Columna TOTALFACTURAS}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TOTALFACTURAS';
    Columna.Caption := 'Importe total de facturas';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.HeaderAlignmentHorz := taRightJustify;
    {Columna TOTALPAGOS}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TOTALPAGOS';
    Columna.Caption := 'Importe total pagado';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.HeaderAlignmentHorz := taRightJustify;
    {Columna DEBE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DEBE';
    Columna.Caption := 'Debe';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.HeaderAlignmentHorz := taRightJustify;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0.00# €';
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
    
   end;
end;

function TdmTablaPagosCliente.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contPagosCliente);
end;

function TdmTablaPagosCliente.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.formatearCodigo(contPagosCliente, Codigo);
end;

function TdmTablaPagosCliente.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contPagosCliente);
end;

function TdmTablaPagosCliente.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contPagosCliente);
end;

function TdmTablaPagosCliente.ValidarCodigo(Codigo: String): Boolean;
begin
  Result := GestorContadores.validarCodigo(contPagosCliente, Codigo);
end;

procedure TdmTablaPagosCliente.InicializarTablaPagosPendClientes(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('TOTALFACTURAS') <> NIL then
      with (FieldByName('TOTALFACTURAS') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('TOTALPAGOS') <> NIL then
      with (FieldByName('TOTALPAGOS') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('DEBE') <> NIL then
      with (FieldByName('DEBE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

function TdmTablaPagosCliente.ExistePagoConCliente(Codigo: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if VarIsNull(Codigo) then
     Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCLIENTE ');
    SQL.Add('from PAGOSCLIENTE ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and CODIGOCLIENTE = :CODIGOCLIENTE');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGOCLIENTE').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Result := (RecordCount > 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
