unit frm_ObradoresEditor;

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

type
  TfrmObradoresEditor = class(TfrmBase)
    lblId: TLabel;
    edtId: TEdit;
    lblDescripcion: TLabel;
    edtDescripcion: TEdit;
    lblCapacidad: TLabel;
    edtCapacidad: TEdit;
    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
    FObradorId: string;
    FParentForm: TForm;
    procedure LoadData;
  public
    property ObradorId: string read FObradorId write FObradorId;
    property ParentForm: TForm read FParentForm write FParentForm;
  end;

var
  frmObradoresEditor: TfrmObradoresEditor;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_Obradores;

{$R *.dfm}

procedure TfrmObradoresEditor.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;

  edtId.ReadOnly := True;
  edtId.Color := clBtnFace;

  if FObradorId <> '' then
    LoadData
  else
    DoAnadir;
end;

procedure TfrmObradoresEditor.LoadData;
begin
  if FObradorId = '' then Exit;

  dmgMain.qryExec.Close;
  // Nota: decripcion (con typo) de la tabla ge_obradores
  dmgMain.qryExec.SQL.Text := 'SELECT * FROM ge_obradores WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsString := FObradorId;
  dmgMain.qryExec.Open;
  
  if not dmgMain.qryExec.IsEmpty then
  begin
    edtId.Text := dmgMain.qryExec.FieldByName('id').AsString;
    edtDescripcion.Text := dmgMain.qryExec.FieldByName('nombre').AsString;
    
    if dmgMain.qryExec.FieldByName('capacidad_produccion').IsNull then
      edtCapacidad.Clear
    else
      edtCapacidad.Text := dmgMain.qryExec.FieldByName('capacidad_produccion').AsString;
      
    chkActivo.Checked := dmgMain.qryExec.FieldByName('activo').AsInteger <> 0;
  end;
  dmgMain.qryExec.Close;
end;

procedure TfrmObradoresEditor.DoAnadir;
begin
  FObradorId := '';
  edtId.Text := '(Autonumérico)';
  edtDescripcion.Clear;
  edtCapacidad.Clear;
  chkActivo.Checked := True;
  edtDescripcion.SetFocus;
end;

procedure TfrmObradoresEditor.DoModificar;
begin
  edtDescripcion.SetFocus;
end;

procedure TfrmObradoresEditor.DoPrimero;
var
  LParent: TfrmObradores;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmObradores) then
    LParent := TfrmObradores(FParentForm)
  else if Assigned(frmObradores) then
    LParent := frmObradores;

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

procedure TfrmObradoresEditor.DoAnterior;
var
  LParent: TfrmObradores;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmObradores) then
    LParent := TfrmObradores(FParentForm)
  else if Assigned(frmObradores) then
    LParent := frmObradores;

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

procedure TfrmObradoresEditor.DoSiguiente;
var
  LParent: TfrmObradores;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmObradores) then
    LParent := TfrmObradores(FParentForm)
  else if Assigned(frmObradores) then
    LParent := frmObradores;

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

procedure TfrmObradoresEditor.DoUltimo;
var
  LParent: TfrmObradores;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmObradores) then
    LParent := TfrmObradores(FParentForm)
  else if Assigned(frmObradores) then
    LParent := frmObradores;

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

procedure TfrmObradoresEditor.btnSalirClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmObradoresEditor.btnSaveClick(Sender: TObject);
var
  LIsNew: Boolean;
  LCapacidad: Integer;
begin
  if Trim(edtDescripcion.Text) = '' then
  begin
    ShowMessage('Debe introducir la descripción del obrador.');
    edtDescripcion.SetFocus;
    Exit;
  end;

  if Trim(edtCapacidad.Text) <> '' then
  begin
    if not TryStrToInt(Trim(edtCapacidad.Text), LCapacidad) or (LCapacidad < 0) then
    begin
      ShowMessage('La capacidad de producción debe ser un número entero positivo.');
      edtCapacidad.SetFocus;
      Exit;
    end;
  end;

  LIsNew := (FObradorId = '');
  try
    dmgMain.qryExec.Close;
    if LIsNew then
    begin
      dmgMain.qryExec.SQL.Text := 
        'INSERT INTO ge_obradores (nombre, activo, capacidad_produccion, id_empresa, id_user_creator, id_user_update) ' +
        'VALUES (:des, :act, :cap, :emp, :user, :user)';
    end
    else
    begin
      dmgMain.qryExec.SQL.Text := 
        'UPDATE ge_obradores SET nombre = :des, activo = :act, ' +
        'capacidad_produccion = :cap, id_user_update = :user, updated_at = CURRENT_TIMESTAMP ' +
        'WHERE id = :id';
    end;

    if not LIsNew then
      dmgMain.qryExec.ParamByName('id').AsString := FObradorId;
    dmgMain.qryExec.ParamByName('des').AsString := Trim(edtDescripcion.Text);
    dmgMain.qryExec.ParamByName('act').AsBoolean := chkActivo.Checked;
    
    if Trim(edtCapacidad.Text) = '' then
    begin
      dmgMain.qryExec.ParamByName('cap').DataType := ftInteger;
      dmgMain.qryExec.ParamByName('cap').Clear;
    end
    else
      dmgMain.qryExec.ParamByName('cap').AsInteger := LCapacidad;
    
    if LIsNew then
      dmgMain.qryExec.ParamByName('emp').AsString := dmgMain.CurrentCompanyId;
      
    dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
    
    dmgMain.qryExec.ExecSQL;

    if LIsNew then
    begin
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'SELECT LAST_INSERT_ID()';
      dmgMain.qryExec.Open;
      FObradorId := dmgMain.qryExec.Fields[0].AsString;
      dmgMain.qryExec.Close;
      edtId.Text := FObradorId;
    end;

    ResetChangeTracking;
    ShowMessage('Obrador guardado correctamente.');

    if Assigned(FParentForm) and (FParentForm is TfrmObradores) then
    begin
      TfrmObradores(FParentForm).btnRefreshClick(nil);
      TfrmObradores(FParentForm).QryMain.Locate('id', FObradorId, []);
    end;
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, 'Error al guardar el obrador');
  end;
end;

end.
