unit frm_ProvFacturas;

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, System.UITypes;

type
  TfrmProvFacturasList = 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
  frmProvFacturasList: TfrmProvFacturasList;

implementation

uses
  dmg_Main, frm_ProvFacturasEditor, uDbErrorHandler;

{$R *.dfm}

procedure TfrmProvFacturasList.FormShow(Sender: TObject);
begin
  DateFilterField := 'fecha';
  AlphaFilterField := 'nombre_proveedor';
  StatusFilterField := 'pagada';
  StatusValues.Add('Pagada');
  StatusValues.Add('Pendiente');

  inherited;
  frmProvFacturasList := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Factura:';
end;

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

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

  LSearch := Trim(edtSearch.Text);
  FQryMain.Close;

  LSql := 'SELECT a.id, a.documento, a.fecha, p.nombre as nombre_proveedor, a.totalentrada, a.pagada ' +
          'FROM ge_prov_facturas a ' +
          'LEFT JOIN ge_proveedores p ON a.idproveedor = p.id ' +
          'WHERE a.idempresa = :empresa ';

  if LSearch <> '' then
  begin
    LSql := LSql + 'AND (p.nombre LIKE :search OR a.documento LIKE :search) ';
  end;

  LSql := LSql + 'ORDER BY a.fecha DESC, a.documento DESC';

  FQryMain.SQL.Text := LSql;
  FQryMain.ParamByName('empresa').AsString := dmgMain.CurrentCompanyId;

  if LSearch <> '' then
    FQryMain.ParamByName('search').AsString := '%' + LSearch + '%';

  FQryMain.Open;
  
  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'documento';
    Title.Caption := 'Nº Factura';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'fecha';
    Title.Caption := 'Fecha';
    Width := 100;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'nombre_proveedor';
    Title.Caption := 'Proveedor';
    Width := 300;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'totalentrada';
    Title.Caption := 'Total';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'pagada';
    Title.Caption := 'Pagada';
    Width := 70;
  end;
end;

procedure TfrmProvFacturasList.btnEditClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if not Assigned(frmProvFacturasEditor) then
    Application.CreateForm(TfrmProvFacturasEditor, frmProvFacturasEditor);
  
  frmProvFacturasEditor.qMaster.Close;
  frmProvFacturasEditor.qMaster.SQL.Text := 
    'SELECT f.*, p.nombre as nombre_proveedor FROM ge_prov_facturas f ' +
    'LEFT JOIN ge_proveedores p ON f.idproveedor = p.id ' +
    'WHERE f.idempresa = :idempresa ORDER BY f.fecha DESC, f.documento DESC';
  frmProvFacturasEditor.qMaster.ParamByName('idempresa').AsString := dmgMain.CurrentCompanyId;
  frmProvFacturasEditor.qMaster.Open;
  frmProvFacturasEditor.qMaster.Locate('id', FQryMain.FieldByName('id').AsString, []);
  
  if frmProvFacturasEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmProvFacturasList.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmProvFacturasEditor) then
    Application.CreateForm(TfrmProvFacturasEditor, frmProvFacturasEditor);
    
  frmProvFacturasEditor.qMaster.Close;
  frmProvFacturasEditor.qMaster.SQL.Text := 
    'SELECT f.*, p.nombre as nombre_proveedor FROM ge_prov_facturas f ' +
    'LEFT JOIN ge_proveedores p ON f.idproveedor = p.id ' +
    'WHERE f.idempresa = :idempresa';
  frmProvFacturasEditor.qMaster.ParamByName('idempresa').AsString := dmgMain.CurrentCompanyId;
  frmProvFacturasEditor.qMaster.Open;
  
  frmProvFacturasEditor.btnAnadirClick(nil);
  if frmProvFacturasEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

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

end.
