unit frm_SelectCliente;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Grids, Vcl.DBGrids,
  Data.DB, FireDAC.Comp.Client, uAppTheme, frm_BaseSelect;

type
  TfrmSelectCliente = class(TfrmBaseSelect)
  private
    FSelectedNif: string;
    FSelectedDireccion: string;
    FSelectedPoblacion: string;
  protected
    procedure DoSearch; override;
    procedure DoSelect; override;
  public
    property SelectedNif: string read FSelectedNif;
    property SelectedDireccion: string read FSelectedDireccion;
    property SelectedPoblacion: string read FSelectedPoblacion;
  end;

var
  frmSelectCliente: TfrmSelectCliente;

implementation

uses
  dmg_Main, FireDAC.Stan.Param;

{$R *.dfm}

procedure TfrmSelectCliente.DoSearch;
var
  LSearch: string;
begin
  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text :=
    'SELECT id, id AS codigo_str, nombre_comercial, nombre_fiscal, nif, ' +
    'domicilio, poblacion, codigo_postal, provincia, telefono ' +
    'FROM ge_clientes ' +
    'WHERE activo = 1 ';

  LSearch := Trim(edtSearch.Text);
  if LSearch <> '' then
  begin
    dmgMain.qryExec.SQL.Add(
      'AND (UPPER(nombre_comercial) LIKE UPPER(:search) OR ' +
      '     UPPER(nombre_fiscal) LIKE UPPER(:search) OR ' +
      '     UPPER(nif) LIKE UPPER(:search) OR ' +
      '     UPPER(poblacion) LIKE UPPER(:search) OR ' +
      '     CAST(id AS CHAR) LIKE :search) '
    );
    dmgMain.qryExec.ParamByName('search').AsString := '%' + LSearch + '%';
  end;

  dmgMain.qryExec.SQL.Add('ORDER BY CASE WHEN nombre_comercial IS NOT NULL AND nombre_comercial <> '''' THEN nombre_comercial ELSE nombre_fiscal END');
  dmgMain.qryExec.Open;

  if dmgMain.qryExec.FindField('id') <> nil then
    dmgMain.qryExec.FieldByName('id').Visible := False;

  if dmgMain.qryExec.FindField('codigo_str') <> nil then
  begin
    dmgMain.qryExec.FieldByName('codigo_str').DisplayLabel := 'Código';
    dmgMain.qryExec.FieldByName('codigo_str').DisplayWidth := 8;
  end;
  if dmgMain.qryExec.FindField('nombre_comercial') <> nil then
  begin
    dmgMain.qryExec.FieldByName('nombre_comercial').DisplayLabel := 'Nombre Comercial';
    dmgMain.qryExec.FieldByName('nombre_comercial').DisplayWidth := 25;
  end;
  if dmgMain.qryExec.FindField('nombre_fiscal') <> nil then
  begin
    dmgMain.qryExec.FieldByName('nombre_fiscal').DisplayLabel := 'Nombre Fiscal';
    dmgMain.qryExec.FieldByName('nombre_fiscal').DisplayWidth := 25;
  end;
  if dmgMain.qryExec.FindField('nif') <> nil then
  begin
    dmgMain.qryExec.FieldByName('nif').DisplayLabel := 'NIF / CIF';
    dmgMain.qryExec.FieldByName('nif').DisplayWidth := 12;
  end;
  if dmgMain.qryExec.FindField('poblacion') <> nil then
  begin
    dmgMain.qryExec.FieldByName('poblacion').DisplayLabel := 'Población';
    dmgMain.qryExec.FieldByName('poblacion').DisplayWidth := 18;
  end;
  if dmgMain.qryExec.FindField('telefono') <> nil then
  begin
    dmgMain.qryExec.FieldByName('telefono').DisplayLabel := 'Teléfono';
    dmgMain.qryExec.FieldByName('telefono').DisplayWidth := 12;
  end;
end;

procedure TfrmSelectCliente.DoSelect;
var
  DataSet: TDataSet;
begin
  inherited; // Rellena SelectedId, SelectedCode, SelectedDesc
  DataSet := dbGridSelect.DataSource.DataSet;
  if Assigned(DataSet) and DataSet.Active and not DataSet.IsEmpty then
  begin
    if DataSet.FindField('nif') <> nil then
      FSelectedNif := DataSet.FieldByName('nif').AsString;
    if DataSet.FindField('domicilio') <> nil then
      FSelectedDireccion := DataSet.FieldByName('domicilio').AsString;
    if DataSet.FindField('poblacion') <> nil then
      FSelectedPoblacion := DataSet.FieldByName('poblacion').AsString;

    if (DataSet.FindField('nombre_comercial') <> nil) and (Trim(DataSet.FieldByName('nombre_comercial').AsString) <> '') then
      SelectedDesc := DataSet.FieldByName('nombre_comercial').AsString
    else if DataSet.FindField('nombre_fiscal') <> nil then
      SelectedDesc := DataSet.FieldByName('nombre_fiscal').AsString;
  end;
end;

end.
