unit frm_ArticulosEans;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids,
  Vcl.ExtCtrls, Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
  FireDAC.Stan.Async, FireDAC.DApt, uAppTheme, uBaseForm;

type
  TfrmArticulosEans = class(TForm)
    pnlBottom: TPanel;
    btnCerrar: TBitBtn;
    pnlMain: TPanel;
    dbgEans: TDBGrid;
    dsEans: TDataSource;
    qryEans: TFDQuery;
    pnlRight: TPanel;
    btnAnadir: TSpeedButton;
    btnEliminar: TSpeedButton;
    pnlTop: TPanel;
    lblArticulo: TLabel;
    lblArticuloNombre: TLabel;
    procedure FormShow(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
    procedure btnAnadirClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
    procedure qryEansUpdateRecord(ASender: TDataSet; ARequest: TFDUpdateRequest;
      var AAction: TFDErrorAction; AOptions: TFDUpdateRowOptions);
    procedure qryEansNewRecord(DataSet: TDataSet);
  private
    FArticuloId: Integer;
    FArticuloDesc: string;
    procedure LoadEans;
  public
    property ArticuloId: Integer read FArticuloId write FArticuloId;
    property ArticuloDesc: string read FArticuloDesc write FArticuloDesc;
  end;

var
  frmArticulosEans: TfrmArticulosEans;

implementation

uses
  dmg_Main, uDbErrorHandler;

{$R *.dfm}

procedure TfrmArticulosEans.FormShow(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);
  lblArticuloNombre.Caption := FArticuloDesc;
  
  qryEans.Connection := dmgMain.dbConn;
  qryEans.OnUpdateRecord := qryEansUpdateRecord;
  qryEans.OnNewRecord := qryEansNewRecord;
  
  qryEans.SQL.Text :=
    'SELECT id, articulo_id, ean, unidades ' +
    'FROM ge_articulos_ean ' +
    'WHERE articulo_id = :articulo_id ' +
    'ORDER BY unidades ASC';
    
  LoadEans;
  
  dbgEans.Columns.Clear;
  with dbgEans.Columns.Add do
  begin
    FieldName := 'ean';
    Title.Caption := 'Código de Barras (EAN)';
    Width := 200;
  end;
  with dbgEans.Columns.Add do
  begin
    FieldName := 'unidades';
    Title.Caption := 'Unidades por Bulto';
    Width := 150;
    Alignment := taRightJustify;
  end;
end;

procedure TfrmArticulosEans.LoadEans;
begin
  qryEans.Close;
  qryEans.ParamByName('articulo_id').AsInteger := FArticuloId;
  qryEans.Open;
end;

procedure TfrmArticulosEans.btnCerrarClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmArticulosEans.qryEansNewRecord(DataSet: TDataSet);
begin
  DataSet.FieldByName('articulo_id').AsInteger := FArticuloId;
  DataSet.FieldByName('unidades').AsFloat := 1.0;
end;

procedure TfrmArticulosEans.btnAnadirClick(Sender: TObject);
var
  LEan: string;
  LUnidadesStr: string;
  LUnidades: Double;
begin
  LEan := InputBox('Añadir Código EAN', 'Introduce el código EAN:', '');
  if Trim(LEan) = '' then Exit;
  
  LUnidadesStr := InputBox('Unidades', 'Introduce el número de unidades para este bulto:', '1');
  if Trim(LUnidadesStr) = '' then Exit;
  
  LUnidades := StrToFloatDef(StringReplace(LUnidadesStr, '.', FormatSettings.DecimalSeparator, []), 1.0);
  
  // Guardar en Base de Datos
  try
    dmgMain.qryExec.Close;
    dmgMain.qryExec.SQL.Text :=
      'INSERT INTO ge_articulos_ean (articulo_id, ean, unidades, id_user_creator, id_user_update) ' +
      'VALUES (:articulo_id, :ean, :unidades, :user, :user)';
    dmgMain.qryExec.ParamByName('articulo_id').AsInteger := FArticuloId;
    dmgMain.qryExec.ParamByName('ean').AsString := Trim(LEan);
    dmgMain.qryExec.ParamByName('unidades').AsFloat := LUnidades;
    dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
    dmgMain.qryExec.ExecSQL;
    
    LoadEans;
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, 'Error al insertar el código EAN (es posible que ya exista)');
  end;
end;

procedure TfrmArticulosEans.btnEliminarClick(Sender: TObject);
begin
  if qryEans.IsEmpty then Exit;
  
  if MessageDlg('¿Desea eliminar el código EAN seleccionado?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_articulos_ean WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsInteger := qryEans.FieldByName('id').AsInteger;
      dmgMain.qryExec.ExecSQL;
      
      LoadEans;
    except
      on E: Exception do
      		TDbErrorHandler.HandleException(E, 'Error al eliminar el código EAN');
    end;
  end;
end;

procedure TfrmArticulosEans.qryEansUpdateRecord(ASender: TDataSet; ARequest: TFDUpdateRequest;
  var AAction: TFDErrorAction; AOptions: TFDUpdateRowOptions);
begin
  if ARequest = arInsert then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text :=
        'INSERT INTO ge_articulos_ean (articulo_id, ean, unidades, id_user_creator, id_user_update) ' +
        'VALUES (:articulo_id, :ean, :unidades, :user, :user)';
      dmgMain.qryExec.ParamByName('articulo_id').AsInteger := FArticuloId;
      dmgMain.qryExec.ParamByName('ean').AsString := ASender.FieldByName('ean').AsString;
      dmgMain.qryExec.ParamByName('unidades').AsFloat := ASender.FieldByName('unidades').AsFloat;
      dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
      dmgMain.qryExec.ExecSQL;
      AAction := eaApplied;
    except
      on E: Exception do
      begin
        AAction := eaFail;
        TDbErrorHandler.HandleException(E, 'Error al insertar el código EAN');
      end;
    end;
  end
  else if ARequest = arUpdate then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text :=
        'UPDATE ge_articulos_ean SET ean = :ean, unidades = :unidades, id_user_update = :user, updated_at = CURRENT_TIMESTAMP ' +
        'WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsInteger := ASender.FieldByName('id').AsInteger;
      dmgMain.qryExec.ParamByName('ean').AsString := ASender.FieldByName('ean').AsString;
      dmgMain.qryExec.ParamByName('unidades').AsFloat := ASender.FieldByName('unidades').AsFloat;
      dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
      dmgMain.qryExec.ExecSQL;
      AAction := eaApplied;
    except
      on E: Exception do
      begin
        AAction := eaFail;
        TDbErrorHandler.HandleException(E, 'Error al guardar los cambios del código EAN');
      end;
    end;
  end;
end;

end.
