unit frm_OrdenesFabricacion;

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, FireDAC.Stan.Param,
  FireDAC.Comp.Client, frm_BaseList;

type
  TfrmOrdenesFabricacion = class(TfrmBaseList)
    btnMonitorLive: TSpeedButton;
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject); override;
    procedure btnNewClick(Sender: TObject); override;
    procedure btnEditClick(Sender: TObject); override;
    procedure btnDeleteClick(Sender: TObject); override;
    procedure btnMonitorLiveClick(Sender: TObject);
    procedure dbGridMainDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmOrdenesFabricacion: TfrmOrdenesFabricacion;

implementation

uses
  dmg_Main, frm_OrdenesFabricacionEditor, frm_MonitorFabricacion;

{$R *.dfm}

procedure TfrmOrdenesFabricacion.FormShow(Sender: TObject);
begin
  inherited;
  frmOrdenesFabricacion := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Orden:';

  btnMonitorLive.Tag := 999;
  btnRefreshClick(nil);
end;

procedure TfrmOrdenesFabricacion.FormDestroy(Sender: TObject);
begin
  if frmOrdenesFabricacion = Self then
    frmOrdenesFabricacion := nil;
end;

procedure TfrmOrdenesFabricacion.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  FQryMain.Close;
  LSql :=
    'SELECT e.id, e.fecha, e.id_obrador, o.nombre AS obrador_nombre, ' +
    '       e.id_receta, r.descripcion AS receta_nombre, ' +
    '       e.numero_masas, e.multiplicador, ' +
    '       e.hora_inicio, e.hora_fin, e.temp_obrador, e.temp_masa_final, ' +
    '       e.tiempo_real_minutos, e.ok_visual, e.observaciones, ' +
    '       CASE ' +
    '         WHEN e.hora_fin IS NOT NULL THEN ''FINALIZADA'' ' +
    '         WHEN e.hora_inicio IS NOT NULL THEN ''EN AMASADO'' ' +
    '         ELSE ''PENDIENTE'' ' +
    '       END AS estado_nombre ' +
    'FROM ob_elaboraciones e ' +
    'LEFT JOIN ob_recetas r ON e.id_receta = r.id ' +
    'LEFT JOIN ge_obradores o ON e.id_obrador = o.id ' +
    'WHERE 1=1 ';

  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'AND (r.descripcion LIKE :search OR o.nombre LIKE :search OR CAST(e.id AS CHAR) LIKE :search) ';
  end;

  LSql := LSql + 'ORDER BY e.fecha DESC, e.id DESC';

  FQryMain.SQL.Text := LSql;
  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';

  FQryMain.Open;

  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'id';
    Title.Caption := 'Nº Orden';
    Width := 70;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'fecha';
    Title.Caption := 'Fecha';
    Width := 85;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'obrador_nombre';
    Title.Caption := 'Obrador';
    Width := 140;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'receta_nombre';
    Title.Caption := 'Receta / Producto';
    Width := 250;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'numero_masas';
    Title.Caption := 'Masas';
    Title.Alignment := taCenter;
    Alignment := taCenter;
    Width := 55;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'multiplicador';
    Title.Caption := 'Factor';
    Title.Alignment := taCenter;
    Alignment := taCenter;
    Width := 55;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'estado_nombre';
    Title.Caption := 'Estado';
    Title.Alignment := taCenter;
    Alignment := taCenter;
    Width := 110;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'hora_inicio';
    Title.Caption := 'H. Inicio';
    Width := 75;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'hora_fin';
    Title.Caption := 'H. Fin';
    Width := 75;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'temp_masa_final';
    Title.Caption := 'Temp. Masa';
    Width := 80;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'tiempo_real_minutos';
    Title.Caption := 'Duración (min)';
    Width := 90;
  end;
end;

procedure TfrmOrdenesFabricacion.btnEditClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;

  if not Assigned(frmOrdenesFabricacionEditor) then
    Application.CreateForm(TfrmOrdenesFabricacionEditor, frmOrdenesFabricacionEditor);

  frmOrdenesFabricacionEditor.ElaboracionId := FQryMain.FieldByName('id').AsString;
  if frmOrdenesFabricacionEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmOrdenesFabricacion.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmOrdenesFabricacionEditor) then
    Application.CreateForm(TfrmOrdenesFabricacionEditor, frmOrdenesFabricacionEditor);

  frmOrdenesFabricacionEditor.ElaboracionId := '';
  if frmOrdenesFabricacionEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmOrdenesFabricacion.btnDeleteClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;

  if not FQryMain.FieldByName('hora_fin').IsNull then
  begin
    ShowMessage('No se puede eliminar una orden de fabricación que ya ha sido finalizada.');
    Exit;
  end;

  if MessageDlg('¿Está seguro de que desea anular esta orden de fabricación?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ob_elaboraciones WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FQryMain.FieldByName('id').AsString;
      dmgMain.qryExec.ExecSQL;
      btnRefreshClick(nil);
    except
      on E: Exception do
        ShowMessage('Error al eliminar la orden de fabricación: ' + E.Message);
    end;
  end;
end;

procedure TfrmOrdenesFabricacion.btnMonitorLiveClick(Sender: TObject);
begin
  if not Assigned(frmMonitorFabricacion) then
    Application.CreateForm(TfrmMonitorFabricacion, frmMonitorFabricacion);
  frmMonitorFabricacion.Show;
end;

procedure TfrmOrdenesFabricacion.dbGridMainDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  LEstado: string;
begin
  if FQryMain.Active and not FQryMain.IsEmpty then
  begin
    LEstado := FQryMain.FieldByName('estado_nombre').AsString;
    if Column.FieldName = 'estado_nombre' then
    begin
      if LEstado = 'PENDIENTE' then
      begin
        dbGridMain.Canvas.Brush.Color := $00E0E0E0;
        dbGridMain.Canvas.Font.Color := clBlack;
      end
      else if LEstado = 'EN AMASADO' then
      begin
        dbGridMain.Canvas.Brush.Color := $00FFF3D6;
        dbGridMain.Canvas.Font.Color := $00663300;
      end
      else if LEstado = 'FINALIZADA' then
      begin
        dbGridMain.Canvas.Brush.Color := $00D4FCD4;
        dbGridMain.Canvas.Font.Color := $00004400;
      end;
    end;
  end;

  dbGridMain.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end.
