unit uEditarFichaUnidades;

{$MODE Delphi}

interface

uses
  {$IFDEF WINDOWS}
  //  Windows,
  {$ENDIF}
  Math,
  //Messages,
  SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  //ComCtrls,
  StdCtrls, uBaseEditoresFichas, uFechas, Grids,
  //utilidades,
  ExtCtrls,
  Menus, Buttons,
  uCosaConNombre, xMatDefs, uFichasLPD,
  //uActores,
  uunidades, uverdoc;

type

  { TEditarFichaUnidades }

  TEditarFichaUnidades = class(TBaseEditoresFichas)
    BAyuda: TButton;
    BCancelar: TButton;
    BGuardar: TButton;
    cb_ai1: TCheckBox;
    cb_ai2: TCheckBox;
    cb_ai3: TCheckBox;
    cb_ai4: TCheckBox;
    cb_ic1: TCheckBox;
    cb_ic2: TCheckBox;
    cb_ic3: TCheckBox;
    cb_ic4: TCheckBox;
    e_mp1: TEdit;
    e_mp2: TEdit;
    e_mp3: TEdit;
    e_mp4: TEdit;
    e_ui1: TEdit;
    e_ui2: TEdit;
    e_ui3: TEdit;
    e_ui4: TEdit;
    GroupBox1: TGroupBox;
    lb_mm1: TLabel;
    lb_mm2: TLabel;
    lb_mm3: TLabel;
    lb_mm4: TLabel;
    lb_ui1: TLabel;
    lb_ui2: TLabel;
    lb_ui3: TLabel;
    lb_ui4: TLabel;
    MainMenu1: TMainMenu;
    Panel1: TPanel;
    procedure BCancelarClick(Sender: TObject);
    procedure BGuardarClick(Sender: TObject); override;
    procedure cb_ai2Change(Sender: TObject);
    procedure EditEnter(Sender: TObject);
    procedure EditExit(Sender: TObject);
    procedure GroupBox1Click(Sender: TObject);
    procedure lb_ui1Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure sgChequearCambios(Sender: TObject);
    procedure sgGetEditText(Sender: TObject; ACol, ARow: integer; var Value: string);
    procedure sgChequearCambiosKeyDown(Sender: TObject; var Key: word;
      Shift: TShiftState);
    procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
    procedure DTPChange(Sender: TObject);
    procedure cambiosForm(Sender: TObject);
    procedure BAyudaClick(Sender: TObject);
  protected
    function validarFormulario: boolean; override;
  public
    nTiposDeUnidades: integer;

    constructor Create(AOwner: TComponent; cosaConNombre: TCosaConNombre;
      ficha: TFichaLPD; fechaIni: TFecha); reintroduce; overload;
    constructor Create(AOwner: TComponent; cosaConNombre: TCosaConNombre;
      ficha: TFichaLPD; fechaIni: TFecha; tiposUnidades: TDAofString);
      reintroduce; overload;

  end;

var
  EditarFichaUnidades: TEditarFichaUnidades;

implementation

{$R *.lfm}
uses
  SimSEEEditMain;

constructor TEditarFichaUnidades.Create(AOwner: TComponent;
  cosaConNombre: TCosaConNombre; ficha: TFichaLPD; fechaIni: TFecha);
begin
  inherited Create(AOwner, cosaConNombre, ficha, sala);
  nTiposDeUnidades := 1;

  if cosaConNombre <> nil then
    self.Caption := 'Editar unidades de ' + cosaConNombre.nombre;

  if fechaIni <> nil then
    self.EFIni.Text := FSimSEEEdit.fechaIniToString(fechaIni);


  if ficha <> nil then
  begin
    self.EFIni.Text := FSimSEEEdit.fechaIniToString(ficha.fecha);

    nTiposDeUnidades := length(TFichaUnidades(ficha).nUnidades_Instaladas);

    e_ui1.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[0]);
    e_mp1.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[0]);
    cb_ai1.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[0];
    cb_ic1.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[0];

    if nTiposDeUnidades > 1 then
    begin
      e_ui2.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[1]);
      e_mp2.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[1]);
      cb_ai2.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[1];
      cb_ic2.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[1];
    end;
    if nTiposDeUnidades > 2 then
    begin
      e_ui3.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[2]);
      e_mp3.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[2]);
      cb_ai3.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[2];
      cb_ic3.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[2];
    end;
    if nTiposDeUnidades > 3 then
    begin
      e_ui4.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[3]);
      e_mp4.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[3]);
      cb_ai4.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[3];
      cb_ic4.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[3];
    end;
  end;
end;

constructor TEditarFichaUnidades.Create(AOwner: TComponent;
  cosaConNombre: TCosaConNombre; ficha: TFichaLPD; fechaIni: TFecha;
  tiposUnidades: TDAofString);
begin
  inherited Create(AOwner, cosaConNombre, ficha, sala);
  nTiposDeUnidades := max(1, Length(tiposUnidades));

  if cosaConNombre <> nil then
    self.Caption := 'Editar unidades de ' + cosaConNombre.nombre;

  if fechaIni <> nil then
    self.EFIni.Text := FSimSEEEdit.fechaIniToString(fechaIni);


  if ficha <> nil then
  begin
    self.EFIni.Text := FSimSEEEdit.fechaIniToString(ficha.fecha);
    e_ui1.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[0]);
    e_mp1.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[0]);
    cb_ai1.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[0];
    cb_ic1.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[0];
    if nTiposDeUnidades > 1 then
    begin
      e_ui2.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[1]);
      e_mp2.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[1]);
      cb_ai2.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[1];
      cb_ic2.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[1];
    end;

    if nTiposDeUnidades > 2 then
    begin
      e_ui3.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[2]);
      e_mp3.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[2]);
      cb_ai3.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[2];
      cb_ic3.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[2];
    end;

    if nTiposDeUnidades > 3 then
    begin
      e_ui4.Text := IntToStr(TFichaUnidades(ficha).nUnidades_Instaladas[3]);
      e_mp4.Text := IntToStr(TFichaUnidades(ficha).nUnidades_EnMantenimiento[3]);
      cb_ai4.Checked := TFichaUnidades(ficha).AltaConIncertidumbre[3];
      cb_ic4.Checked := TFichaUnidades(ficha).InicioCronicaConIncertidumbre[3];
    end;
  end;

  //Tengo que mostrar tantos casilleros como nombres me pasan
  if nTiposDeUnidades > 4 then
    raise Exception.Create(
      'No se pueden crear tipos de unidades con mas de 4 tipos diferentes');

  if Length(tiposUnidades) > 0 then
  begin
    lb_ui1.Caption := tiposUnidades[0];
  end;

  if nTiposDeUnidades > 1 then
  begin
    lb_ui2.Caption := tiposUnidades[1];
    lb_ui2.Visible := True;
    e_ui2.Visible := True;
    lb_mm2.Visible := True;
    e_mp2.Visible := True;
    cb_ai2.Visible := True;
    cb_ic2.Visible := True;
  end;

  if nTiposDeUnidades > 2 then
  begin
    lb_ui3.Caption := tiposUnidades[2];
    lb_ui3.Visible := True;
    e_ui3.Visible := True;
    lb_mm3.Visible := True;
    e_mp3.Visible := True;
    cb_ai3.Visible := True;
    cb_ic3.Visible := True;
  end;

  if nTiposDeUnidades > 3 then
  begin
    lb_ui4.Caption := tiposUnidades[3];
    lb_ui4.Visible := True;
    e_ui4.Visible := True;
    lb_mm4.Visible := True;
    e_mp4.Visible := True;
    cb_ai4.Visible := True;
    cb_ic4.Visible := True;
  end;
end;


function chequear_EMPMenorInst(eInst, eEMP: TEdit): boolean;
begin
  if not (eInst.Visible and eEMP.Visible) then
  begin
    Result := True;
    exit;
  end;

  if (StrToInt(eEMP.Text) <= StrToInt(eInst.Text)) then
    Result := True
  else
  begin
    eEMP.SetFocus;
    ShowMessage(
      'ERROR!: La cantidad de unidades en mantenimiento programado no puede superar a la cantidad de unidades instalada.'
      );
    Result := False;
  end;
end;

function TEditarFichaUnidades.validarFormulario: boolean;
var
  res: boolean;
begin
  Res := inherited validarEditFecha(EFIni) and
    inherited validarEditInt(e_ui1, 0, MAXINT) and
    inherited validarEditInt(e_ui2, 0, MAXINT) and
    inherited validarEditInt(e_ui3, 0, MAXINT) and
    inherited validarEditInt(e_ui4, 0, MAXINT) and
    inherited validarEditInt(e_mp1, 0, MAXINT) and
    inherited validarEditInt(e_mp2, 0, MAXINT) and
    inherited validarEditInt(e_mp3, 0, MAXINT) and
    inherited validarEditInt(e_mp4, 0, MAXINT) and
    inherited validarPeriodicidad(CBPeriodicidad, CBLargoPeriodo,
    ELargoPeriodo, EFIniPeriodo, EFFinPeriodo, sgPeriodicidad);

  if res then
  begin
    res := res and chequear_EMPMenorInst(e_ui1, e_mp1);
    res := res and chequear_EMPMenorInst(e_ui2, e_mp2);
    res := res and chequear_EMPMenorInst(e_ui3, e_mp3);
    res := res and chequear_EMPMenorInst(e_ui4, e_mp4);
  end;
  Result := res;

end;

procedure TEditarFichaUnidades.BCancelarClick(Sender: TObject);
begin
  inherited BCancelarClick(Sender);
end;

procedure TEditarFichaUnidades.BGuardarClick(Sender: TObject);
var
  periodicidad: TPeriodicidad;
  cantMaquinas_Instaladas: string;
  cantMaquinas_EnMantenimiento: string;
  AltaConIncertidumbre, InicioCronicaConIncertidumbre: TDAOfBoolean;
begin
  if validarFormulario then
  begin
    if CBPeriodicidad.Checked then
      periodicidad := inherited darPeriodicidad(CBLargoPeriodo,
        ELargoPeriodo, EFIniPeriodo, EFFinPeriodo, sgPeriodicidad)
    else
      periodicidad := nil;

    setlength(AltaConIncertidumbre, nTiposDeUnidades);
    setlength(InicioCronicaConIncertidumbre, nTiposDeUnidades);

    //Tengo que recorrer todos los edit validos
    cantMaquinas_Instaladas := e_ui1.Text;
    cantMaquinas_EnMantenimiento := e_mp1.Text;
    AltaConIncertidumbre[0] := cb_ai1.Checked;
    InicioCronicaConIncertidumbre[0] := cb_ic1.Checked;

    if nTiposDeUnidades > 1 then
    begin
      cantMaquinas_Instaladas := cantMaquinas_Instaladas + ';' + e_ui2.Text;
      cantMaquinas_EnMantenimiento := cantMaquinas_EnMantenimiento + ';' + e_mp2.Text;
      AltaConIncertidumbre[1] := cb_ai2.Checked;
      InicioCronicaConIncertidumbre[1] := cb_ic2.Checked;
    end;

    if nTiposDeUnidades > 2 then
    begin
      cantMaquinas_Instaladas := cantMaquinas_Instaladas + ';' + e_ui3.Text;
      cantMaquinas_EnMantenimiento := cantMaquinas_EnMantenimiento + ';' + e_mp3.Text;
      AltaConIncertidumbre[2] := cb_ai3.Checked;
      InicioCronicaConIncertidumbre[2] := cb_ic3.Checked;
    end;

    if nTiposDeUnidades > 3 then
    begin
      cantMaquinas_Instaladas := cantMaquinas_Instaladas + ';' + e_ui4.Text;
      cantMaquinas_EnMantenimiento := cantMaquinas_EnMantenimiento + ';' + e_mp4.Text;
      AltaConIncertidumbre[3] := cb_ai4.Checked;
      InicioCronicaConIncertidumbre[3] := cb_ic4.Checked;
    end;


    ficha := TFichaUnidades.Create(capa, StrToFecha(EFIni.Text),
      periodicidad, StrToDAOfNInt(cantMaquinas_Instaladas, ';'),
      StrToDAOfNInt(cantMaquinas_EnMantenimiento, ';'), AltaConIncertidumbre,
      InicioCronicaConIncertidumbre);

    ModalResult := mrOk;
  end;
end;

procedure TEditarFichaUnidades.cb_ai2Change(Sender: TObject);
begin

end;

procedure TEditarFichaUnidades.EditEnter(Sender: TObject);
begin
  inherited EditEnter(Sender);
end;

procedure TEditarFichaUnidades.EditExit(Sender: TObject);
begin
  inherited EditExit(Sender);
end;

procedure TEditarFichaUnidades.GroupBox1Click(Sender: TObject);
begin

end;

procedure TEditarFichaUnidades.lb_ui1Click(Sender: TObject);
begin

end;

procedure TEditarFichaUnidades.Panel1Click(Sender: TObject);
begin

end;

procedure TEditarFichaUnidades.sgChequearCambios(Sender: TObject);
begin
  inherited sgChequearCambios(TStringGrid(Sender));
end;

procedure TEditarFichaUnidades.sgGetEditText(Sender: TObject;
  ACol, ARow: integer; var Value: string);
begin
  inherited sgGetEditText(Sender, ACol, ARow, Value);
end;

procedure TEditarFichaUnidades.sgChequearCambiosKeyDown(Sender: TObject;
  var Key: word; Shift: TShiftState);
begin
  inherited sgChequearCambiosKeyDown(Sender, Key, Shift);
end;

procedure TEditarFichaUnidades.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
  inherited FormCloseQuery(Sender, CanClose);
end;


procedure TEditarFichaUnidades.DTPChange(Sender: TObject);
begin
  inherited DTPChange(Sender);
end;

procedure TEditarFichaUnidades.cambiosForm(Sender: TObject);
begin
  inherited cambiosForm(Sender);
end;

procedure TEditarFichaUnidades.BAyudaClick(Sender: TObject);
begin
  verdoc( 3826, TFichaUnidades);
end;

end.
