unit frm_SelectDestino;

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
  TfrmSelectDestino = class(TfrmBaseSelect)
    btnNuevoDestino: TButton;
    procedure btnNuevoDestinoClick(Sender: TObject);
  private
    FClienteId: string;
    FSelectedDireccion: string;
    FSelectedPoblacion: string;
    FSelectedCp: string;
    FSelectedProvincia: string;
  protected
    procedure DoSearch; override;
    procedure DoSelect; override;
  public
    property ClienteId: string read FClienteId write FClienteId;
    property SelectedDireccion: string read FSelectedDireccion;
    property SelectedPoblacion: string read FSelectedPoblacion;
    property SelectedCp: string read FSelectedCp;
    property SelectedProvincia: string read FSelectedProvincia;
  end;

var
  frmSelectDestino: TfrmSelectDestino;

implementation

uses
  dmg_Main, frm_ClientesDestinosEditor, FireDAC.Stan.Param;

{$R *.dfm}

procedure TfrmSelectDestino.DoSearch;
var
  LSearch: string;
begin
  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text :=
    'SELECT id, id AS codigo_str, descripcion, direccion, poblacion, cp, provincia ' +
    'FROM ge_clientes_destinos ' +
    'WHERE activo = 1 ';

  if FClienteId <> '' then
  begin
    dmgMain.qryExec.SQL.Add('AND id_cliente = :cli ');
    dmgMain.qryExec.ParamByName('cli').AsString := FClienteId;
  end;

  LSearch := Trim(edtSearch.Text);
  if LSearch <> '' then
  begin
    dmgMain.qryExec.SQL.Add(
      'AND (UPPER(descripcion) LIKE UPPER(:search) OR ' +
      '     UPPER(direccion) LIKE UPPER(:search) OR ' +
      '     UPPER(poblacion) LIKE UPPER(:search) OR ' +
      '     cp LIKE :search) '
    );
    dmgMain.qryExec.ParamByName('search').AsString := '%' + LSearch + '%';
  end;

  dmgMain.qryExec.SQL.Add('ORDER BY descripcion');
  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 := 'ID';
    dmgMain.qryExec.FieldByName('codigo_str').DisplayWidth := 6;
  end;
  if dmgMain.qryExec.FindField('descripcion') <> nil then
  begin
    dmgMain.qryExec.FieldByName('descripcion').DisplayLabel := 'Sucursal / Destino';
    dmgMain.qryExec.FieldByName('descripcion').DisplayWidth := 25;
  end;
  if dmgMain.qryExec.FindField('direccion') <> nil then
  begin
    dmgMain.qryExec.FieldByName('direccion').DisplayLabel := 'Dirección';
    dmgMain.qryExec.FieldByName('direccion').DisplayWidth := 25;
  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('cp') <> nil then
  begin
    dmgMain.qryExec.FieldByName('cp').DisplayLabel := 'C.P.';
    dmgMain.qryExec.FieldByName('cp').DisplayWidth := 8;
  end;
  if dmgMain.qryExec.FindField('provincia') <> nil then
  begin
    dmgMain.qryExec.FieldByName('provincia').DisplayLabel := 'Provincia';
    dmgMain.qryExec.FieldByName('provincia').DisplayWidth := 15;
  end;
end;

procedure TfrmSelectDestino.DoSelect;
var
  DataSet: TDataSet;
begin
  inherited;
  DataSet := dbGridSelect.DataSource.DataSet;
  if Assigned(DataSet) and DataSet.Active and not DataSet.IsEmpty then
  begin
    if DataSet.FindField('direccion') <> nil then
      FSelectedDireccion := DataSet.FieldByName('direccion').AsString;
    if DataSet.FindField('poblacion') <> nil then
      FSelectedPoblacion := DataSet.FieldByName('poblacion').AsString;
    if DataSet.FindField('cp') <> nil then
      FSelectedCp := DataSet.FieldByName('cp').AsString;
    if DataSet.FindField('provincia') <> nil then
      FSelectedProvincia := DataSet.FieldByName('provincia').AsString;
    if DataSet.FindField('descripcion') <> nil then
      SelectedDesc := DataSet.FieldByName('descripcion').AsString;
  end;
end;

procedure TfrmSelectDestino.btnNuevoDestinoClick(Sender: TObject);
var
  LFrm: TfrmClientesDestinosEditor;
  Qry: TFDQuery;
  LNewId: string;
begin
  if FClienteId = '' then
  begin
    ShowMessage('No hay un cliente especificado para asignar la nueva sucursal.');
    Exit;
  end;

  LFrm := TfrmClientesDestinosEditor.Create(Self);
  try
    Qry := TFDQuery.Create(nil);
    try
      Qry.Connection := dmgMain.dbConn;
      Qry.CachedUpdates := False;
      Qry.SQL.Text := 'SELECT id, id_cliente, descripcion, direccion, poblacion, cp, ' +
                      'provincia, pais, activo, departamento, centro, ean_facturacion, ean_cliente, ean_emisor, ean_receptor ' +
                      'FROM ge_clientes_destinos WHERE id_cliente = :id_cliente LIMIT 1';
      Qry.ParamByName('id_cliente').AsString := FClienteId;
      Qry.Open;

      Qry.Append;
      Qry.FieldByName('id_cliente').AsString := FClienteId;
      Qry.FieldByName('activo').AsInteger := 1;

      LFrm.DataSet := Qry;
      LFrm.IsNew := True;
      LFrm.ClienteId := FClienteId;

      if LFrm.ShowModal = mrOk then
      begin
        try
          dmgMain.qryExec.Close;
          dmgMain.qryExec.SQL.Text :=
            'INSERT INTO ge_clientes_destinos (id_cliente, descripcion, direccion, ' +
            'poblacion, cp, provincia, pais, activo, departamento, centro, ean_facturacion, ean_cliente, ean_emisor, ean_receptor, id_user_creator, id_user_update) ' +
            'VALUES (:id_cliente, :desc, :dir, :pob, :cp, :prov, :pais, :act, :dept, :centro, :ean_fac, :ean_cli, :ean_emi, :ean_rec, :user, :user)';

          dmgMain.qryExec.ParamByName('id_cliente').AsString := FClienteId;
          dmgMain.qryExec.ParamByName('desc').AsString := Qry.FieldByName('descripcion').AsString;
          dmgMain.qryExec.ParamByName('dir').AsString := Qry.FieldByName('direccion').AsString;
          dmgMain.qryExec.ParamByName('pob').AsString := Qry.FieldByName('poblacion').AsString;
          dmgMain.qryExec.ParamByName('cp').AsString := Qry.FieldByName('cp').AsString;
          dmgMain.qryExec.ParamByName('prov').AsString := Qry.FieldByName('provincia').AsString;
          dmgMain.qryExec.ParamByName('pais').AsString := Qry.FieldByName('pais').AsString;
          dmgMain.qryExec.ParamByName('act').AsBoolean := Qry.FieldByName('activo').AsInteger <> 0;
          dmgMain.qryExec.ParamByName('dept').AsString := Qry.FieldByName('departamento').AsString;
          dmgMain.qryExec.ParamByName('centro').AsString := Qry.FieldByName('centro').AsString;
          dmgMain.qryExec.ParamByName('ean_fac').AsString := Qry.FieldByName('ean_facturacion').AsString;
          dmgMain.qryExec.ParamByName('ean_cli').AsString := Qry.FieldByName('ean_cliente').AsString;
          dmgMain.qryExec.ParamByName('ean_emi').AsString := Qry.FieldByName('ean_emisor').AsString;
          dmgMain.qryExec.ParamByName('ean_rec').AsString := Qry.FieldByName('ean_receptor').AsString;
          dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
          dmgMain.qryExec.ExecSQL;

          dmgMain.qryExec.Close;
          dmgMain.qryExec.SQL.Text := 'SELECT LAST_INSERT_ID()';
          dmgMain.qryExec.Open;
          LNewId := dmgMain.qryExec.Fields[0].AsString;
          dmgMain.qryExec.Close;

          DoSearch;
          if (LNewId <> '') and (dsSelect.DataSet <> nil) and dsSelect.DataSet.Active then
          begin
            dsSelect.DataSet.Locate('id', LNewId, []);
            DoSelect;
          end;
        except
          on E: Exception do
            ShowMessage('Error al guardar el nuevo destino: ' + E.Message);
        end;
      end
      else
      begin
        Qry.Cancel;
      end;
    finally
      Qry.Free;
    end;
  finally
    LFrm.Free;
  end;
end;

end.
