unit frm_PrepararPedidos;

interface

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

type
  TfrmPrepararPedidos = class(TfrmBaseList)
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject); override;
    procedure btnNewClick(Sender: TObject); override;
    procedure btnEditClick(Sender: TObject); override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPrepararPedidos: TfrmPrepararPedidos;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_PreparacionPedidoEditor, frm_EnviosRecogida;

{$R *.dfm}

procedure TfrmPrepararPedidos.FormShow(Sender: TObject);
var
  I, LIdx: Integer;
  Cmb: TComboBox;
begin
  DateFilterField := 'fecha_pedido';
  StatusFilterField := 'estado';
  StatusValues.Clear;
  StatusValues.Add('PENDIENTE');
  StatusValues.Add('EN PREPARACION');
  StatusValues.Add('PROCESADO');
  StatusValues.Add('PREPARADO');
  StatusValues.Add('ENVIADO');
  StatusValues.Add('CANCELADO');
  StatusValues.Add('COMPLETADO');
  StatusValues.Add('RECHAZADO');
  StatusValues.Add('ERROR');

  inherited;
  frmPrepararPedidos := Self;
  OnDestroy := FormDestroy;

  // Seleccionar 'EN PREPARACION' por defecto en el desplegable de estado
  for I := 0 to grpStatuses.ControlCount - 1 do
  begin
    if grpStatuses.Controls[I] is TComboBox then
    begin
      Cmb := TComboBox(grpStatuses.Controls[I]);
      LIdx := Cmb.Items.IndexOf('EN PREPARACION');
      if LIdx >= 0 then
      begin
        Cmb.ItemIndex := LIdx;
        ApplyAllFilters;
      end;
      Break;
    end;
  end;

  // Configurar panel de búsqueda
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Pedido / Albarán / Cliente / Destino:';


end;

procedure TfrmPrepararPedidos.FormDestroy(Sender: TObject);
begin
  if frmPrepararPedidos = Self then
    frmPrepararPedidos := nil;
end;

procedure TfrmPrepararPedidos.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  if dmgMain.CurrentCompanyId = '' then Exit;

  FQryMain.Close;
  LSql := 'SELECT p.id, p.numero_pedido, p.fecha_pedido, p.estado, ' +
          '       c.nombre_fiscal AS cliente_nombre, ' +
          '       COALESCE(d.descripcion, c.nombre_fiscal) AS destino_nombre, ' +
          '       COALESCE(d.poblacion, c.poblacion) AS poblacion, ' +
          '       COALESCE(d.provincia, c.provincia) AS provincia, ' +
          '       r.cod_recogida, r.num_bultos, ' +
          '       t.nombre AS transportista_nombre, ' +
          '       a.serie AS albaran_serie, a.numero AS albaran_numero, ' +
          '       CASE WHEN a.numero IS NOT NULL THEN CONCAT(IF(COALESCE(a.serie, '''') <> '''', CONCAT(a.serie, ''-''), ''''), a.numero) ELSE '''' END AS numero_albaran ' +
          '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 ' +
          'LEFT JOIN ge_envios_recogidas r ON r.pedido_id = p.id AND r.estado_codigo <> 5 ' +
          'LEFT JOIN ge_envios_config ec ON r.config_id = ec.id ' +
          'LEFT JOIN ge_envios_transportistas t ON ec.transportista_id = t.id ' +
          'LEFT JOIN ge_albaranes a ON a.id = (' +
          '  SELECT a2.id FROM ge_albaranes a2 ' +
          '  WHERE (a2.id = r.albaran_id OR (a2.id_pedido = p.id AND a2.empresa_id = p.empresa_id)) ' +
          '  ORDER BY (a2.id = r.albaran_id) DESC, a2.id DESC ' +
          '  LIMIT 1' +
          ') ' +
          'WHERE p.empresa_id = :emp ';

  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'AND (p.numero_pedido LIKE :search OR c.nombre_fiscal LIKE :search OR r.cod_recogida LIKE :search OR COALESCE(d.poblacion, c.poblacion) LIKE :search OR CAST(a.numero AS CHAR) LIKE :search OR CONCAT(COALESCE(a.serie, ''''), ''-'', a.numero) LIKE :search) ';
  end;

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

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

  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';

  FQryMain.Open;

  lblRecordCount.Caption := Format('Pedidos Procesados: %d', [FQryMain.RecordCount]);

  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'numero_pedido';
    Title.Caption := 'Nº Pedido';
    Width := 95;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'numero_albaran';
    Title.Caption := 'Nº Albarán';
    Width := 95;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'fecha_pedido';
    Title.Caption := 'Fecha Pedido';
    Width := 90;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'cliente_nombre';
    Title.Caption := 'Cliente';
    Width := 200;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'destino_nombre';
    Title.Caption := 'Destino / Entrega';
    Width := 180;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'poblacion';
    Title.Caption := 'Población';
    Width := 110;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'transportista_nombre';
    Title.Caption := 'Transportista';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'cod_recogida';
    Title.Caption := 'Cód. Recogida';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'num_bultos';
    Title.Caption := 'Bultos';
    Width := 60;
    Alignment := taRightJustify;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'estado';
    Title.Caption := 'Estado';
    Width := 90;
  end;
end;

procedure TfrmPrepararPedidos.btnNewClick(Sender: TObject);
var
  LPedId: Integer;
begin
  if FQryMain.IsEmpty then Exit;
  LPedId := FQryMain.FieldByName('id').AsInteger;
  if LPedId <= 0 then Exit;

  if not Assigned(frmEnviosRecogida) then
    Application.CreateForm(TfrmEnviosRecogida, frmEnviosRecogida);

  frmEnviosRecogida.PedidoId := LPedId;
  if frmEnviosRecogida.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmPrepararPedidos.btnEditClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;

  if not Assigned(frmPreparacionPedidoEditor) then
    Application.CreateForm(TfrmPreparacionPedidoEditor, frmPreparacionPedidoEditor);

  frmPreparacionPedidoEditor.PedidoId := FQryMain.FieldByName('id').AsString;
  if frmPreparacionPedidoEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

end.
