unit frm_CalidadIncidenciasEditor;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Param,
  dmg_Calidad, dmg_Main;

type
  TfrmCalidadIncidenciasEditor = class(TForm)
    lblCodigoNc: TLabel;
    edtCodigoNc: TEdit;
    lblFase: TLabel;
    edtFase: TEdit;
    lblGravedad: TLabel;
    cboGravedad: TComboBox;
    lblDesviacion: TLabel;
    memDesviacion: TMemo;
    lblAccionInmediata: TLabel;
    memAccionInmediata: TMemo;
    lblDestino: TLabel;
    cboDestino: TComboBox;
    pnlBottom: TPanel;
    btnGuardar: TButton;
    btnCancelar: TButton;
    procedure FormShow(Sender: TObject);
    procedure btnGuardarClick(Sender: TObject);
  private
    FIncidenciaId: Integer;
    FRegistroCabId: Integer;
    FFaseProceso: string;
    procedure CargarIncidenciaExistente;
  public
    property IncidenciaId: Integer read FIncidenciaId write FIncidenciaId;
    property RegistroCabId: Integer read FRegistroCabId write FRegistroCabId;
    property FaseProceso: string read FFaseProceso write FFaseProceso;
  end;

var
  frmCalidadIncidenciasEditor: TfrmCalidadIncidenciasEditor;

implementation

{$R *.dfm}

procedure TfrmCalidadIncidenciasEditor.FormShow(Sender: TObject);
begin
  if FIncidenciaId > 0 then
    CargarIncidenciaExistente
  else
  begin
    edtCodigoNc.Text := Format('NC-%s-%03d', [FormatDateTime('yyyyMMdd', Now), Random(900) + 100]);
    if FFaseProceso <> '' then
      edtFase.Text := FFaseProceso
    else
      edtFase.Text := 'Horneado / Proceso General';
  end;
end;

procedure TfrmCalidadIncidenciasEditor.CargarIncidenciaExistente;
var
  Q: TFDQuery;
  LDestino: string;
begin
  if FIncidenciaId <= 0 then Exit;

  Q := TFDQuery.Create(nil);
  try
    Q.Connection := dmgMain.dbConn;
    Q.SQL.Text := 'SELECT * FROM ge_calidad_incidencias WHERE id = :id';
    Q.ParamByName('id').AsInteger := FIncidenciaId;
    Q.Open;

    if not Q.IsEmpty then
    begin
      edtCodigoNc.Text := Q.FieldByName('codigo_nc').AsString;
      edtFase.Text := Q.FieldByName('fase_proceso').AsString;
      memDesviacion.Text := Q.FieldByName('descripcion_desviacion').AsString;
      memAccionInmediata.Text := Q.FieldByName('accion_inmediata').AsString;
      FRegistroCabId := Q.FieldByName('id_registro_cab').AsInteger;

      cboGravedad.ItemIndex := cboGravedad.Items.IndexOf(Q.FieldByName('gravedad').AsString);
      if cboGravedad.ItemIndex < 0 then cboGravedad.ItemIndex := 1;

      LDestino := UpperCase(Q.FieldByName('destino_producto').AsString);
      if SameText(LDestino, 'PROLONGAR') then cboDestino.ItemIndex := 0
      else if SameText(LDestino, 'RECHAZAR') then cboDestino.ItemIndex := 2
      else cboDestino.ItemIndex := 1;
    end;
  finally
    Q.Free;
  end;
end;

procedure TfrmCalidadIncidenciasEditor.btnGuardarClick(Sender: TObject);
var
  LDestinoCode: string;
begin
  if Trim(memDesviacion.Text) = '' then
  begin
    ShowMessage('Debe redactar la descripción de la desviación antes de guardar.');
    Exit;
  end;

  if Trim(memAccionInmediata.Text) = '' then
  begin
    ShowMessage('El estándar IFS Food requiere registrar la acción correctora inmediata aplicada.');
    Exit;
  end;

  case cboDestino.ItemIndex of
    0: LDestinoCode := 'PROLONGAR';
    1: LDestinoCode := 'BLOQUEAR';
    2: LDestinoCode := 'RECHAZAR';
  else
    LDestinoCode := 'BLOQUEAR';
  end;

  if FIncidenciaId > 0 then
  begin
    dmgCalidad.qryExecCalidad.Close;
    dmgCalidad.qryExecCalidad.SQL.Text :=
      'UPDATE ge_calidad_incidencias SET ' +
      '  fase_proceso = :fase, gravedad = :gravedad, ' +
      '  descripcion_desviacion = :desv, accion_inmediata = :accion, ' +
      '  destino_producto = :destino, updated_at = CURRENT_TIMESTAMP ' +
      'WHERE id = :id';
    dmgCalidad.qryExecCalidad.ParamByName('id').AsInteger := FIncidenciaId;
    dmgCalidad.qryExecCalidad.ParamByName('fase').AsString := edtFase.Text;
    dmgCalidad.qryExecCalidad.ParamByName('gravedad').AsString := cboGravedad.Text;
    dmgCalidad.qryExecCalidad.ParamByName('desv').DataType := ftWideString;
    dmgCalidad.qryExecCalidad.ParamByName('desv').AsWideString := memDesviacion.Text;
    dmgCalidad.qryExecCalidad.ParamByName('accion').DataType := ftWideString;
    dmgCalidad.qryExecCalidad.ParamByName('accion').AsWideString := memAccionInmediata.Text;
    dmgCalidad.qryExecCalidad.ParamByName('destino').AsString := LDestinoCode;
    dmgCalidad.qryExecCalidad.ExecSQL;
  end
  else
  begin
    dmgCalidad.CrearIncidenciaPCC(
      FRegistroCabId,
      edtFase.Text,
      memDesviacion.Text,
      memAccionInmediata.Text,
      LDestinoCode,
      1, // Default User ID
      cboGravedad.Text
    );
  end;

  ShowMessage(Format('No Conformidad %s guardada correctamente.', [edtCodigoNc.Text]));
  ModalResult := mrOk;
end;

end.
