unit frm_Incidencias;

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
  TfrmIncidencias = class(TfrmBaseList)
    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;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmIncidencias: TfrmIncidencias;

implementation

uses
  dmg_Main, frm_IncidenciasEditor, uDbErrorHandler;

{$R *.dfm}

procedure TfrmIncidencias.FormShow(Sender: TObject);
begin
  inherited;
  frmIncidencias := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Incidencia:';
end;

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

procedure TfrmIncidencias.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  if dmgMain.CurrentCompanyId = '' then
    Exit;

  FQryMain.Close;
  LSql := 'SELECT i.id, i.fecha, i.titulo, i.descripcion, i.severidad, i.estado, i.tipo_origen, i.origen_id, ' +
          'CASE ' +
          '  WHEN i.tipo_origen = ''ALMACEN'' THEN al.descripcion ' +
          '  WHEN i.tipo_origen = ''OBRADOR'' THEN ob.nombre ' +
          '  ELSE '''' ' +
          'END as origen_nombre ' +
          'FROM ge_incidencias_obrador i ' +
          'LEFT JOIN ge_almacenes al ON i.origen_id = al.id AND i.tipo_origen = ''ALMACEN'' ' +
          'LEFT JOIN ge_obradores ob ON i.origen_id = ob.id AND i.tipo_origen = ''OBRADOR'' ' +
          'WHERE i.empresa_id = :empresa ';
  
  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'AND (i.titulo LIKE :search OR i.descripcion LIKE :search OR al.descripcion LIKE :search OR ob.nombre LIKE :search) ';
  end;
  
  LSql := LSql + 'ORDER BY i.fecha DESC';
  
  FQryMain.SQL.Text := LSql;
  FQryMain.ParamByName('empresa').AsString := dmgMain.CurrentCompanyId;
  
  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';
    
  FQryMain.Open;
  
  dbGridMain.Columns.Clear;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'fecha';
    Title.Caption := 'Fecha';
    Width := 130;
  end;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'titulo';
    Title.Caption := 'Título';
    Width := 200;
  end;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'tipo_origen';
    Title.Caption := 'Tipo Origen';
    Width := 90;
  end;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'origen_nombre';
    Title.Caption := 'Nombre Origen';
    Width := 180;
  end;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'severidad';
    Title.Caption := 'Severidad';
    Width := 80;
  end;
  
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'estado';
    Title.Caption := 'Estado';
    Width := 90;
  end;
end;

procedure TfrmIncidencias.btnEditClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if not Assigned(frmIncidenciasEditor) then
    Application.CreateForm(TfrmIncidenciasEditor, frmIncidenciasEditor);
  
  frmIncidenciasEditor.ParentForm := Self;
  frmIncidenciasEditor.IncidenciaId := FQryMain.FieldByName('id').AsString;
  if frmIncidenciasEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmIncidencias.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmIncidenciasEditor) then
    Application.CreateForm(TfrmIncidenciasEditor, frmIncidenciasEditor);
  
  frmIncidenciasEditor.ParentForm := Self;
  frmIncidenciasEditor.IncidenciaId := '';
  if frmIncidenciasEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmIncidencias.btnDeleteClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if MessageDlg('¿Está seguro de que desea eliminar esta incidencia?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_incidencias_obrador WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FQryMain.FieldByName('id').AsString;
      dmgMain.qryExec.ExecSQL;
      btnRefreshClick(nil);
    except
      on E: Exception do
        TDbErrorHandler.HandleException(E, 'Error al eliminar la incidencia');
    end;
  end;
end;

end.
