{
===============================================================================
  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: 03-11-2002
  Versión actual: 1.0.1
  Fecha versión actual: 03-11-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    03-11-2004    p32. Añadido campo 'ULTIMOCAMBIO'.

===============================================================================
}

unit TablaClientes;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  TablaSucursalesCliente,

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

  //Contador
  Contadores, RdxGestorContadores;

type
  TDatosCliente = class(TObjeto)
  private
    FSucursales : TListaSucursales;
  public
    Codigo : String;
    NIFCIF : String;
    Nombre : String;
    Vendedor : String;
    Observaciones : String;
    Procedencia : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono1 : String;
    Telefono2 : String;
    Movil1 : String;
    Movil2 : String;
    Fax : String;
    Correo : String;
    PersonaContacto : String;
    constructor Create; overload;
    constructor Create(CodigoCliente : String); overload;
    procedure ObtenerDatos; override;
    procedure SalvarDatos;
    destructor Destroy; override;
    property Sucursales : TListaSucursales read FSucursales;
  end;

type
  TdmTablaClientes = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : 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;

    function ExisteCodigo(Codigo : String) : Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridClientes(var vGrid: TcxGridDBTableView);
    function DarCodCliMin : String;
    function DarCodCliMax : String;
    function DarNombreCliMin : String;
    function DarNombreCliMax : String;
  end;

var
  dmTablaClientes: TdmTablaClientes;

implementation

{$R *.DFM}

uses
  Literales;

constructor TdmTablaClientes.Create (AOwner : TComponent);
begin
  inherited;
  sqlInsertar := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlGrid := TStringList.Create;
  IniciarSQL;
end;

destructor TdmTablaClientes.Destroy;
begin
  sqlInsertar.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlGrid.Free;
  inherited;
end;

procedure TdmTablaClientes.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('INSERT INTO CLIENTES (CODIGO, FECHAALTA, NIFCIF, NOMBRE, ');
    Add('OBSERVACIONES, PROCEDENCIA, VENDEDOR, USUARIO, ULTIMOCAMBIO) ');
    Add('VALUES (:CODIGO, :FECHAALTA, :NIFCIF, :NOMBRE, ');
    Add(':OBSERVACIONES, :PROCEDENCIA, :VENDEDOR, :USUARIO, CURRENT_TIME)');
  end;

  with sqlModificar do
  begin
    Add('UPDATE CLIENTES SET');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('OBSERVACIONES = :OBSERVACIONES, ');
    Add('PROCEDENCIA = :PROCEDENCIA, ');
    Add('VENDEDOR = :VENDEDOR, ');
    Add('ULTIMOCAMBIO = CURRENT_TIME ');
    Add('WHERE (CODIGO = :CODIGO)');
  end;

  with sqlEliminar do
  begin
    Add('delete from CLIENTES ');
    Add('where CODIGO = :CODIGO');
  end;

  with sqlConsultar do
  begin
    Add('select * from CLIENTES ');
    Add('where CODIGO = :CODIGO');
  end;

  with sqlGrid do
  begin
    Add('select CLIENTES.CODIGO, CLIENTES.NIFCIF, CLIENTES.NOMBRE, TELEFONO1, MOVIL1, FAX ');
    Add('from CLIENTES left join SUCURSALESCLIENTE on ');
    Add('(SUCURSALESCLIENTE.CODIGOCLIENTE = CLIENTES.CODIGO and ');
    Add('SUCURSALESCLIENTE.TIPO = ''P'') ');
  end;
end;

function TdmTablaClientes.DarNuevoCodigo : String;
begin
  Result := GestorContadores.darNuevoCodigo(contClientes);
end;

function TdmTablaClientes.IncrementarCodigo : boolean;
begin
  Result := GestorContadores.IncrementarValor(contClientes);
end;

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

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

function TdmTablaClientes.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;

  if EsCadenaVacia(Codigo) then
    Exit;

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

procedure TdmTablaClientes.InicializarGridClientes (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 clientes';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    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;
    {Columna TELEFONO 1}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TELEFONO1';
    Columna.Caption := 'Teléfono 1';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna MOVIL 1}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'MOVIL1';
    Columna.Caption := 'Móvil 1';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna FAX}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FAX';
    Columna.Caption := 'Fax';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna CORREO}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CORREO';
    Columna.Caption := 'Correo electrónico';
    Columna.Width := tamColCorreo;
    Columna.Options.Filtering := False;
}
  end;
end;

function TdmTablaClientes.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contClientes);
end;

function TdmTablaClientes.DarCodCliMax: 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 CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaClientes.DarCodCliMin: 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 CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosCliente }

constructor TDatosCliente.Create(CodigoCliente: String);
begin
  inherited Create;
  Codigo := CodigoCliente;
  // Recuperar los datos
  ObtenerDatos;
end;

constructor TDatosCliente.Create;
begin
  inherited Create;
end;

destructor TDatosCliente.Destroy;
begin
  if Assigned(FSucursales) then
    FSucursales.Free;
  inherited;
end;

procedure TDatosCliente.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(Codigo) and EsCadenaVacia(Nombre) then
    raise Exception.Create(msgCliFaltaCli);

  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CLIENTES.NIFCIF, CLIENTES.NOMBRE, PROCEDENCIA, VENDEDOR, ');
    SQL.Add('CALLE, NUMERO, PISO, CODIGOPOSTAL, POBLACION, PROVINCIA, ');
    SQL.Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO, ');
    SQL.Add('PERSONACONTACTO, OBSERVACIONES ');
    SQL.Add('from CLIENTES left join SUCURSALESCLIENTE on ');
    SQL.Add('(SUCURSALESCLIENTE.CODIGOCLIENTE = CLIENTES.CODIGO and ');
    SQL.Add('SUCURSALESCLIENTE.TIPO = ''P'') ');
    if (not EsCadenaVacia(Codigo)) then
    begin
      SQL.Add('where CLIENTES.CODIGO = :CODIGO');
      ParamByName('CODIGO').AsString := Codigo;
    end
    else begin
      SQL.Add('where CLIENTES.NOMBRE = :NOMBRE');
      ParamByName('NOMBRE').AsString := Nombre;
    end;

    try
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        NIFCIF := FieldByName('NIFCIF').AsString;
        Nombre := FieldByName('NOMBRE').AsString;
        Vendedor := FieldByName('VENDEDOR').AsString;
        Observaciones := FieldByName('OBSERVACIONES').AsString;
        Procedencia := FieldByName('PROCEDENCIA').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('FAX').AsString;
        Correo := FieldByName('CORREO').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;

        // Recuperar la lista de propiedades del artículo
        if Assigned(FSucursales) then
          FSucursales.Free;
        FSucursales := TListaSucursales.Create(Codigo);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaClientes.DarNombreCliMax: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(NOMBRE) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaClientes.DarNombreCliMin: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select min(NOMBRE) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TDatosCliente.SalvarDatos;
var
  oSQL : TIBSQL;
  EsInsercion : Boolean;
begin
  EsInsercion := False;
  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    if EsCadenaVacia(Codigo) then
    begin
      Codigo := dmTablaClientes.DarNuevoCodigo;
      SQL.Assign(dmTablaClientes.sqlInsertar);
      ParamByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
      EsInsercion := True;
    end
    else
      SQL.Assign(dmTablaClientes.sqlModificar);

    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('NIFCIF').AsString := NifCif;
    ParamByName('NOMBRE').AsString := Nombre;
    ParamByName('OBSERVACIONES').AsString := Observaciones;
    ParamByName('PROCEDENCIA').AsString := Procedencia;
    ParamByName('VENDEDOR').AsString := Vendedor;
    try
      Prepare;
      try
        ExecQuery;
      except
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;

  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Clear;

    if EsInsercion then
    begin
      SQL.Assign(dmTablaSucursalesCliente.sqlInsertar);
      ParamByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
      ParamByName('TIPO').AsString := 'P';  // La dirección principal
    end
    else
      SQL.Assign(dmTablaSucursalesCliente.sqlModificar);

    ParamByName('CODIGOCLIENTE').AsString := Codigo;
    ParamByName('CODIGO').AsInteger := 1;  // La dirección principal
    ParamByName('CALLE').AsString := Calle;
    ParamByName('NUMERO').AsString := Numero;
    ParamByName('PISO').AsString := Piso;
    ParamByName('CODIGOPOSTAL').AsString := CodigoPostal;
    ParamByName('POBLACION').AsString := Poblacion;
    ParamByName('PROVINCIA').AsString := Provincia;
    ParamByName('TELEFONO1').AsString := Telefono1;
    ParamByName('TELEFONO2').AsString := Telefono2;
    ParamByName('MOVIL1').AsString := Movil1;
    ParamByName('MOVIL2').AsString := Movil2;
    ParamByName('FAX').AsString := Fax;
    ParamByName('CORREO').AsString := Correo;
    ParamByName('PERSONACONTACTO').AsString := PersonaContacto;

    try
      Prepare;
      ExecQuery;
      dmTablaClientes.IncrementarCodigo;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
