unit frm_EventosMaterialesCatEditor;

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.Buttons,
  Vcl.ComCtrls, Data.DB, FireDAC.Comp.Client, uAppTheme, FireDAC.Stan.Param, uBaseForm,
  Vcl.Grids, Vcl.DBGrids;

type
  TfrmEventosMaterialesCatEditor = class(TfrmBase)
    lblCodigo: TLabel;
    edtCodigo: TEdit;
    lblDescripcion: TLabel;
    edtDescripcion: TEdit;
    lblTipo: TLabel;
    cbTipo: TComboBox;
    chkActivo: TCheckBox;
    procedure FormShow(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSalirClick(Sender: TObject);
  protected
    procedure DoAnadir; override;
    procedure DoModificar; override;
    procedure DoPrimero; override;
    procedure DoAnterior; override;
    procedure DoSiguiente; override;
    procedure DoUltimo; override;
  private
    FMaterialId: string;
    FParentForm: TForm;
    procedure LoadData;
  public
    property MaterialId: string read FMaterialId write FMaterialId;
    property ParentForm: TForm read FParentForm write FParentForm;
  end;

var
  frmEventosMaterialesCatEditor: TfrmEventosMaterialesCatEditor;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_EventosMaterialesCat;

{$R *.dfm}

procedure TfrmEventosMaterialesCatEditor.FormShow(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);

  btnGuardar.OnClick := btnSaveClick;
  btnSalir.OnClick := btnSalirClick;

  pgcDetails.Visible := True;
  TsListado.TabVisible := False;
  pgcDetails.ActivePage := tsDatosEnvio;
  pnlSideToolbar.Visible := False;
  dbgItems.Visible := False;
  pnlFooter.Visible := False;

  if FMaterialId <> '' then
    LoadData
  else
  begin
    edtCodigo.Clear;
    edtDescripcion.Clear;
    cbTipo.ItemIndex := 0;
    chkActivo.Checked := True;
  end;
end;

procedure TfrmEventosMaterialesCatEditor.LoadData;
begin
  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text := 'SELECT id, codigo, descripcion, tipo, activo FROM ge_eventos_materiales_cat WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsString := FMaterialId;
  dmgMain.qryExec.Open;
  
  if not dmgMain.qryExec.IsEmpty then
  begin
    edtCodigo.Text := dmgMain.qryExec.FieldByName('codigo').AsString;
    edtDescripcion.Text := dmgMain.qryExec.FieldByName('descripcion').AsString;
    
    // Tipo combobox
    cbTipo.ItemIndex := cbTipo.Items.IndexOf(dmgMain.qryExec.FieldByName('tipo').AsString);
    if cbTipo.ItemIndex = -1 then cbTipo.ItemIndex := 0;
    
    chkActivo.Checked := dmgMain.qryExec.FieldByName('activo').AsInteger <> 0;
  end;
  dmgMain.qryExec.Close;
end;

procedure TfrmEventosMaterialesCatEditor.btnSaveClick(Sender: TObject);
var
  LIsNew: Boolean;
begin
  if Trim(edtCodigo.Text) = '' then
  begin
    ShowMessage('El código del material es obligatorio.');
    Exit;
  end;

  if Trim(edtDescripcion.Text) = '' then
  begin
    ShowMessage('La descripción del material es obligatoria.');
    Exit;
  end;

  LIsNew := (FMaterialId = '');

  dmgMain.qryExec.Close;
  if LIsNew then
  begin
    dmgMain.qryExec.SQL.Text :=
      'INSERT INTO ge_eventos_materiales_cat (codigo, descripcion, tipo, activo, id_user_creator, id_user_update) ' +
      'VALUES (:cod, :desc, :tipo, :activo, :user, :user)';
  end
  else
  begin
    dmgMain.qryExec.SQL.Text :=
      'UPDATE ge_eventos_materiales_cat SET codigo = :cod, descripcion = :desc, tipo = :tipo, activo = :activo, ' +
      'id_user_update = :user, updated_at = CURRENT_TIMESTAMP WHERE id = :id';
    dmgMain.qryExec.ParamByName('id').AsString := FMaterialId;
  end;

  dmgMain.qryExec.ParamByName('cod').AsString := edtCodigo.Text;
  dmgMain.qryExec.ParamByName('desc').AsString := edtDescripcion.Text;
  dmgMain.qryExec.ParamByName('tipo').AsString := cbTipo.Text;
  dmgMain.qryExec.ParamByName('activo').AsBoolean := chkActivo.Checked;
  dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;

  try
    dmgMain.qryExec.ExecSQL;
    ResetChangeTracking;
    ShowMessage('Material guardado correctamente.');
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, dmgMain.qryExec.SQL.Text);
  end;
end;

procedure TfrmEventosMaterialesCatEditor.btnSalirClick(Sender: TObject);
begin
  ModalResult := mrCancel;
  Close;
end;

procedure TfrmEventosMaterialesCatEditor.DoAnadir;
begin
  FMaterialId := '';
  edtCodigo.Clear;
  edtDescripcion.Clear;
  cbTipo.ItemIndex := 0;
  chkActivo.Checked := True;
  edtCodigo.SetFocus;
end;

procedure TfrmEventosMaterialesCatEditor.DoModificar;
begin
  edtCodigo.SetFocus;
end;

procedure TfrmEventosMaterialesCatEditor.DoPrimero;
var
  LParent: TfrmEventosMaterialesCat;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmEventosMaterialesCat) then
    LParent := TfrmEventosMaterialesCat(FParentForm)
  else if Assigned(frmEventosMaterialesCat) then
    LParent := frmEventosMaterialesCat;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.First;
    FMaterialId := LParent.QryMain.FieldByName('id').AsString;
    LoadData;
  end;
end;

procedure TfrmEventosMaterialesCatEditor.DoAnterior;
var
  LParent: TfrmEventosMaterialesCat;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmEventosMaterialesCat) then
    LParent := TfrmEventosMaterialesCat(FParentForm)
  else if Assigned(frmEventosMaterialesCat) then
    LParent := frmEventosMaterialesCat;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Prior;
    FMaterialId := LParent.QryMain.FieldByName('id').AsString;
    LoadData;
  end;
end;

procedure TfrmEventosMaterialesCatEditor.DoSiguiente;
var
  LParent: TfrmEventosMaterialesCat;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmEventosMaterialesCat) then
    LParent := TfrmEventosMaterialesCat(FParentForm)
  else if Assigned(frmEventosMaterialesCat) then
    LParent := frmEventosMaterialesCat;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Next;
    FMaterialId := LParent.QryMain.FieldByName('id').AsString;
    LoadData;
  end;
end;

procedure TfrmEventosMaterialesCatEditor.DoUltimo;
var
  LParent: TfrmEventosMaterialesCat;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmEventosMaterialesCat) then
    LParent := TfrmEventosMaterialesCat(FParentForm)
  else if Assigned(frmEventosMaterialesCat) then
    LParent := frmEventosMaterialesCat;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Last;
    FMaterialId := LParent.QryMain.FieldByName('id').AsString;
    LoadData;
  end;
end;

end.
