unit frm_Lotes;

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, System.UITypes, FireDAC.Comp.Client,
  frm_BaseList, Vcl.ComCtrls;

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

var
  frmLotes: TfrmLotes;

implementation

uses
  dmg_Main, frm_LotesCreator, uDbErrorHandler;

{$R *.dfm}

procedure TfrmLotes.FormShow(Sender: TObject);
begin
  inherited;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Lote/Prod:';
  btnEditar.Visible := True;
  btnBorrar.Visible := True;
end;

procedure TfrmLotes.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmLotesCreator) then
    Application.CreateForm(TfrmLotesCreator, frmLotesCreator);

  frmLotesCreator.LoteId := 0;
  frmLotesCreator.ParentForm := Self;
  if frmLotesCreator.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmLotes.btnEditClick(Sender: TObject);
var
  LLoteId: Integer;
begin
  if FQryMain.IsEmpty then Exit;

  LLoteId := FQryMain.FieldByName('id').AsInteger;
  if LLoteId <= 0 then Exit;

  if not Assigned(frmLotesCreator) then
    Application.CreateForm(TfrmLotesCreator, frmLotesCreator);

  frmLotesCreator.LoteId := LLoteId;
  frmLotesCreator.ParentForm := Self;
  if frmLotesCreator.ShowModal = mrOk then
  begin
    btnRefreshClick(nil);
    FQryMain.Locate('id', LLoteId, []);
  end;
end;

procedure TfrmLotes.dbGridMainDblClick(Sender: TObject);
begin
  btnEditClick(Sender);
end;

procedure TfrmLotes.btnDeleteClick(Sender: TObject);
var
  LLoteId: Integer;
begin
  if FQryMain.IsEmpty then Exit;

  LLoteId := FQryMain.FieldByName('id').AsInteger;
  if LLoteId <= 0 then Exit;

  if MessageDlg('¿Está seguro de que desea eliminar/desactivar este lote?', mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'UPDATE ge_lotes SET activo = 0, id_user_update = :user, updated_at = CURRENT_TIMESTAMP WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsInteger := LLoteId;
      if (dmgMain.CurrentUserId <> '') and (StrToIntDef(dmgMain.CurrentUserId, 0) > 0) then
        dmgMain.qryExec.ParamByName('user').AsInteger := StrToIntDef(dmgMain.CurrentUserId, 1)
      else
        dmgMain.qryExec.ParamByName('user').Clear;
      dmgMain.qryExec.ExecSQL;

      btnRefreshClick(nil);
    except
      on E: Exception do
        TDbErrorHandler.HandleException(E, 'Error al desactivar el lote');
    end;
  end;
end;

procedure TfrmLotes.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  FQryMain.Close;
  LSql := 
    'SELECT l.id, COALESCE(NULLIF(l.codigo_antiguo, ''''), l.codigo) as lote_cod, l.codigo as lote_num_auto, a.descripcion as articulo, o.nombre as obrador, l.fecha, l.observaciones ' +
    'FROM ge_lotes l ' +
    'LEFT JOIN ge_articulos a ON l.id_articulo = a.id ' +
    'LEFT JOIN ge_obradores o ON l.id_obrador = o.id ' +
    'WHERE l.activo = 1 ';

  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'AND (a.descripcion LIKE :search OR CAST(l.codigo AS CHAR) LIKE :search OR CAST(COALESCE(l.codigo_antiguo, '''') AS CHAR) LIKE :search OR o.nombre LIKE :search) ';
  end;
  LSql := LSql + 'ORDER BY l.fecha DESC, l.id DESC';

  FQryMain.SQL.Text := LSql;

  if Trim(edtSearch.Text) <> '' then
  begin
    FQryMain.ParamByName('search').DataType := ftWideString;
    FQryMain.ParamByName('search').AsWideString := '%' + Trim(edtSearch.Text) + '%';
  end;

  FQryMain.Open;
end;

end.
