unit frm_SelectPedidoPreparado;

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, FireDAC.Stan.Param, uAppTheme, frm_BaseSelect;

type
  TfrmSelectPedidoPreparado = class(TfrmBaseSelect)
  private
    FSelectedBultos: Integer;
  protected
    procedure DoSearch; override;
    procedure DoSelect; override;
  public
    constructor Create(AOwner: TComponent); override;
    property SelectedBultos: Integer read FSelectedBultos write FSelectedBultos;
  end;

var
  frmSelectPedidoPreparado: TfrmSelectPedidoPreparado;

implementation

uses
  dmg_Main;

{$R *.dfm}

constructor TfrmSelectPedidoPreparado.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FSelectedBultos := 1;
end;

procedure TfrmSelectPedidoPreparado.DoSearch;
var
  LSql: string;
begin
  if (dmgMain.CurrentCompanyId = '') or not dmgMain.dbConn.Connected then Exit;

  dmgMain.qryExec.Close;
  LSql :=
    'SELECT p.id, ' +
    '       p.numero_pedido AS codigo_str, ' +
    '       p.numero_pedido, ' +
    '       p.fecha_pedido, ' +
    '       c.nombre_fiscal AS descripcion, ' +
    '       c.nombre_fiscal AS cliente_nombre, ' +
    '       COALESCE(d.descripcion, c.nombre_fiscal) AS destino_nombre, ' +
    '       COALESCE(d.poblacion, c.poblacion) AS poblacion, ' +
    '       COALESCE((SELECT SUM(bultos) FROM ge_pedidos_lineas WHERE id_pedido = p.id), 1) AS num_bultos ' +
    'FROM ge_pedidos p ' +
    'LEFT JOIN ge_clientes c ON p.cliente_id = c.id ' +
    'LEFT JOIN ge_clientes_destinos d ON p.clientedestino_id = d.id ' +
    'WHERE p.empresa_id = :emp ' +
    '  AND p.estado = ''PREPARADO'' ' +
    '  AND p.id NOT IN (SELECT r.pedido_id FROM ge_envios_recogidas r WHERE r.estado_codigo <> 5) ';

  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'AND (p.numero_pedido LIKE :search OR c.nombre_fiscal LIKE :search OR COALESCE(d.descripcion, '''') LIKE :search OR COALESCE(d.poblacion, c.poblacion) LIKE :search) ';
  end;

  LSql := LSql + 'ORDER BY p.fecha_pedido DESC, p.id DESC';

  dmgMain.qryExec.SQL.Text := LSql;
  dmgMain.qryExec.ParamByName('emp').AsString := dmgMain.CurrentCompanyId;

  if Trim(edtSearch.Text) <> '' then
  begin
    dmgMain.qryExec.ParamByName('search').DataType := ftWideString;
    dmgMain.qryExec.ParamByName('search').AsWideString := '%' + Trim(edtSearch.Text) + '%';
  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
    dmgMain.qryExec.FieldByName('codigo_str').Visible := False;

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

  if dmgMain.qryExec.FindField('numero_pedido') <> nil then
  begin
    dmgMain.qryExec.FieldByName('numero_pedido').DisplayLabel := 'Nº Pedido';
    dmgMain.qryExec.FieldByName('numero_pedido').DisplayWidth := 12;
  end;

  if dmgMain.qryExec.FindField('fecha_pedido') <> nil then
  begin
    dmgMain.qryExec.FieldByName('fecha_pedido').DisplayLabel := 'Fecha Pedido';
    dmgMain.qryExec.FieldByName('fecha_pedido').DisplayWidth := 12;
  end;

  if dmgMain.qryExec.FindField('cliente_nombre') <> nil then
  begin
    dmgMain.qryExec.FieldByName('cliente_nombre').DisplayLabel := 'Cliente';
    dmgMain.qryExec.FieldByName('cliente_nombre').DisplayWidth := 25;
  end;

  if dmgMain.qryExec.FindField('destino_nombre') <> nil then
  begin
    dmgMain.qryExec.FieldByName('destino_nombre').DisplayLabel := 'Destino / Entrega';
    dmgMain.qryExec.FieldByName('destino_nombre').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('num_bultos') <> nil then
  begin
    dmgMain.qryExec.FieldByName('num_bultos').DisplayLabel := 'Bultos';
    dmgMain.qryExec.FieldByName('num_bultos').DisplayWidth := 8;
  end;
end;

procedure TfrmSelectPedidoPreparado.DoSelect;
begin
  if not dmgMain.qryExec.IsEmpty then
  begin
    SelectedId := dmgMain.qryExec.FieldByName('id').AsString;
    SelectedCode := dmgMain.qryExec.FieldByName('numero_pedido').AsString;
    SelectedDesc := dmgMain.qryExec.FieldByName('cliente_nombre').AsString;
    if dmgMain.qryExec.FindField('num_bultos') <> nil then
      FSelectedBultos := dmgMain.qryExec.FieldByName('num_bultos').AsInteger;
    ModalResult := mrOk;
  end;
end;

end.
