unit frm_SelectProduct;

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
  TfrmSelectProduct = class(TfrmBaseSelect)
  private
    FSelectedPrice: Double;
    FSelectedIvaRate: Double;
    FSelectedPrices: TStringList;
    FSelectedIvaRates: TStringList;
    FOnlyWithFicha: Boolean;
    FFilterAlmacenStockId: Integer;
  protected
    procedure DoSearch; override;
    procedure DoSelect; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property SelectedPrice: Double read FSelectedPrice;
    property SelectedIvaRate: Double read FSelectedIvaRate;
    property SelectedPrices: TStringList read FSelectedPrices;
    property SelectedIvaRates: TStringList read FSelectedIvaRates;
    property OnlyWithFicha: Boolean read FOnlyWithFicha write FOnlyWithFicha;
    property FilterAlmacenStockId: Integer read FFilterAlmacenStockId write FFilterAlmacenStockId;
  end;

var
  frmSelectProduct: TfrmSelectProduct;

implementation

uses
  dmg_Main;

{$R *.dfm}

constructor TfrmSelectProduct.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FSelectedPrices := TStringList.Create;
  FSelectedIvaRates := TStringList.Create;
  FOnlyWithFicha := False;
  FFilterAlmacenStockId := 0;
end;

destructor TfrmSelectProduct.Destroy;
begin
  FSelectedPrices.Free;
  FSelectedIvaRates.Free;
  inherited Destroy;
end;

procedure TfrmSelectProduct.DoSearch;
begin
  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text := 
    'SELECT a.id, a.id as codigo_str, ' +
    'a.descripcion, a.pvp1, COALESCE(t.tipo, 21.00) as tipo_iva ' +
    'FROM ge_articulos a ' +
    'LEFT JOIN ge_tipos_iva t ON a.id_tipo_iva = t.id ' +
    'WHERE a.activo = true ';
  
  if FOnlyWithFicha then
    dmgMain.qryExec.SQL.Add('AND EXISTS (SELECT 1 FROM ge_articulos_fichas_tecnicas f WHERE f.id_articulo = a.id) ');

  if FFilterAlmacenStockId > 0 then
  begin
    dmgMain.qryExec.SQL.Add(
      'AND EXISTS (SELECT 1 FROM ge_stock_envasado se WHERE se.id_articulo = a.id AND se.id_almacen = :almFilter ' +
      'AND (se.cantidad_unidades - COALESCE(se.cantidad_reservada, 0)) > 0) '
    );
  end;

  if Trim(edtSearch.Text) <> '' then
  begin
    dmgMain.qryExec.SQL.Add('AND (a.descripcion LIKE :search OR CAST(a.id AS CHAR) LIKE :search) ');
    dmgMain.qryExec.ParamByName('search').DataType := ftWideString;
    dmgMain.qryExec.ParamByName('search').AsWideString := '%' + Trim(edtSearch.Text) + '%';
  end;

  if FFilterAlmacenStockId > 0 then
    dmgMain.qryExec.ParamByName('almFilter').AsInteger := FFilterAlmacenStockId;
  
  dmgMain.qryExec.SQL.Add('ORDER BY a.descripcion');
  dmgMain.qryExec.Open;
  
  // Ocultar la columna ID en la rejilla
  if dmgMain.qryExec.FindField('id') <> nil then
    dmgMain.qryExec.FieldByName('id').Visible := False;
end;

procedure TfrmSelectProduct.DoSelect;
var
  i: Integer;
  BookmarkList: TBookmarkList;
begin
  if MultiSelect then
  begin
    inherited; // Llama a la extracción base para SelectedIds, SelectedCodes, SelectedDescs
    
    FSelectedPrices.Clear;
    FSelectedIvaRates.Clear;

    BookmarkList := dbGridSelect.SelectedRows;
    if BookmarkList.Count > 0 then
    begin
      dbGridSelect.DataSource.DataSet.DisableControls;
      try
        for i := 0 to BookmarkList.Count - 1 do
        begin
          dbGridSelect.DataSource.DataSet.GotoBookmark(BookmarkList[i]);
          FSelectedPrices.Add(dbGridSelect.DataSource.DataSet.FieldByName('pvp1').AsString);
          FSelectedIvaRates.Add(dbGridSelect.DataSource.DataSet.FieldByName('tipo_iva').AsString);
        end;
      finally
        dbGridSelect.DataSource.DataSet.EnableControls;
      end;
    end
    else
    begin
      if not dbGridSelect.DataSource.DataSet.IsEmpty then
      begin
        FSelectedPrices.Add(dbGridSelect.DataSource.DataSet.FieldByName('pvp1').AsString);
        FSelectedIvaRates.Add(dbGridSelect.DataSource.DataSet.FieldByName('tipo_iva').AsString);
      end;
    end;
  end
  else
  begin
    if not dmgMain.qryExec.IsEmpty then
    begin
      SelectedId := dmgMain.qryExec.FieldByName('id').AsString;
      SelectedCode := dmgMain.qryExec.FieldByName('codigo_str').AsString;
      SelectedDesc := dmgMain.qryExec.FieldByName('descripcion').AsString;
      FSelectedPrice := dmgMain.qryExec.FieldByName('pvp1').AsFloat;
      FSelectedIvaRate := dmgMain.qryExec.FieldByName('tipo_iva').AsFloat;
      ModalResult := mrOk;
    end;
  end;
end;

end.
