﻿unit farticulos;

interface

uses
  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, FireDAC.Comp.DataSet, FireDAC.Comp.Client, uFireDacHelper,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.DBCtrls, Vcl.Mask, Vcl.ComCtrls, Vcl.Grids, Vcl.DBGrids,
  Vcl.ExtCtrls,DATA.DB,   shellapi,
   Vcl.ExtDlgs, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage, Vcl.Imaging.GIFImg;

type

  Tarticulos = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel5: TPanel;
    Label1: TLabel;
    todosarticulos: TCheckBox;
    tbuscar: TEdit;
    DBGrid1: TDBGrid;
    particulos: TPanel;
    pdatosarticulos: TPanel;
    Panel14: TPanel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    DBCheckBox2: TDBCheckBox;
    DBEdit1: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit11: TDBEdit;
    DBEdit12: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBEdit22: TDBEdit;
    Detallesarticulos: TPageControl;
    TAlbaranes: TTabSheet;
    Panel10: TPanel;
    Label32: TLabel;
    btALcancelar: TButton;
    btALmodificar: TButton;
    btALborrar: TButton;
    btALnuevo: TButton;
    btALguardar: TButton;
    DBGrid7: TDBGrid;
    TFacturas: TTabSheet;
    Panel11: TPanel;
    Label31: TLabel;
    btFcancelar: TButton;
    btFmodificar: TButton;
    btFborrar: TButton;
    btFnuevo: TButton;
    btFguardar: TButton;
    DBGrid8: TDBGrid;
    Panel4: TPanel;
    Label36: TLabel;
    btAcancelar: TButton;
    btAmodificar: TButton;
    btAborrar: TButton;
    btAnuevo: TButton;
    btAguardar: TButton;
    qfamilias: TFDQuery;
    qfamiliasidempresa: TIntegerField;
    qfamiliasid: TIntegerField;
    qfamiliasdescripcion: TWideStringField;
    combofamilias: TDBLookupComboBox;
    dsqfamilias: TDataSource;
    qfamiliasactivo: TIntegerField;
    DBMemo1: TDBMemo;
    Label3: TLabel;
    DBCheckBox1: TDBCheckBox;
    qproveedores: TFDQuery;
    dsqproveedores: TDataSource;
    qtipoivas: TFDQuery;
    dsqtiposiva: TDataSource;
    qproveedoresid: TIntegerField;
    qproveedoresIdempresa: TIntegerField;
    qproveedoresnif: TWideStringField;
    qproveedoresnombre: TWideStringField;
    qproveedoresnombre_corto: TWideStringField;
    qtipoivasid: TIntegerField;
    qtipoivasdescripcion: TWideStringField;
    qtipoivastipo: TIntegerField;
    DBLookupComboBox2: TDBLookupComboBox;
    DBLookupComboBox3: TDBLookupComboBox;
    qaux: TFDQuery;
    TabSheet4: TTabSheet;
    DBCheckBox3: TDBCheckBox;
    DBEdit2: TDBEdit;
    Label15: TLabel;
    Label16: TLabel;
    DBEdit5: TDBEdit;
    Label17: TLabel;
    qlistadoproveedores: TFDQuery;
    qlistadoproveedoresidproveedor: TIntegerField;
    qlistadoproveedoresnombre: TWideStringField;
    qlistadoproveedoresid: TWideStringField;
    qlistadoproveedoresid_propio: TWideStringField;
    qlistadoproveedoresult_precio: TFloatField;
    qlistadoproveedoresidempresa: TIntegerField;
    DBGrid2: TDBGrid;
    dsqlistproveedores: TDataSource;
    DBCheckBox4: TDBCheckBox;
    qcompras: TFDQuery;
    qcomprasnombre: TWideStringField;
    qcomprasdocumento: TWideStringField;
    qcomprasfecha: TDateField;
    qcomprascodigo: TWideStringField;
    qcomprasdescripcion: TWideStringField;
    qcomprasid_propio: TWideStringField;
    qcomprascantidad: TFloatField;
    qcomprasprecio: TFloatField;
    qcomprasidempresa: TIntegerField;
    qcomprasdesc_propia: TWideStringField;
    qcomprasidentrada: TIntegerField;
    qcomprashas_doc: TLargeintField;
    DBGrid3: TDBGrid;
    dsqcompras: TDataSource;
    Panel3: TPanel;
    Button3: TButton;
    Button4: TButton;
    qcomprasstock: TFloatField;
    qarticulosfinal: TFDQuery;
    qarticulosfinalidempresa: TIntegerField;
    qarticulosfinalid: TIntegerField;
    qarticulosfinalcodigo: TWideStringField;
    qarticulosfinaldescripcion: TWideStringField;
    qarticulosfinalactivo: TIntegerField;
    qarticulosfinalpreciocoste: TFloatField;
    dsqarticulosfinal: TDataSource;
    dtarticulosfinal: TFDQuery;
    dtarticulosfinalidempresa: TIntegerField;
    dtarticulosfinalid: TIntegerField;
    dtarticulosfinalcodigo: TWideStringField;
    dtarticulosfinaldescripcion: TWideStringField;
    dtarticulosfinalfamilia: TIntegerField;
    dtarticulosfinalprovhab: TIntegerField;
    dtarticulosfinaltipoiva: TIntegerField;
    dtarticulosfinalpreciocoste: TFloatField;
    dtarticulosfinalmargen: TFloatField;
    dtarticulosfinalbeneficio: TFloatField;
    dtarticulosfinalpvp: TFloatField;
    dtarticulosfinalstock: TFloatField;
    dtarticulosfinalult_preciocompra: TFloatField;
    dtarticulosfinalfacturable: TIntegerField;
    dtarticulosfinalobservaciones: TWideStringField;
    dtarticulosfinalactivo: TIntegerField;
    dtarticulosfinalvalor_almacen: TFloatField;
    dtarticulosfinalstock_minimo: TFloatField;
    dtarticulosfinalavisar_stock: TIntegerField;
    dtarticulosfinalcontrolar_traza: TIntegerField;
    dtarticulosfinalpeso: TFloatField;
    dtarticulosfinaldescripcion_doc: TWideStringField;
    dtarticulosfinalinventariable: TIntegerField;
    dtarticulosfinalactualizar_stock: TIntegerField;
    dtarticulosfinalregistro: TWideStringField;
    dtarticulosfinalmateria_activa: TWideStringField;
    dtarticulosfinaldosis: TWideStringField;
    dtarticulosfinalplazo_seguridad: TIntegerField;
    dtarticulosfinalnum_aplicaciones: TIntegerField;
    dtarticulosfinalfrecuencia: TWideStringField;
    dtarticulosfinalvol_hect: TFloatField;
    dtarticulosfinalpermitir_mezcla: TIntegerField;
    dtarticulosfinalunidad_medida: TWideStringField;
    dsarticulosfinal: TDataSource;
    DBEdit6: TDBEdit;
    Label18: TLabel;
    ZQuery1: TFDQuery;
    ZQuery1id: TIntegerField;
    ZQuery1idempresa: TIntegerField;
    ZQuery1identrada: TIntegerField;
    ZQuery1idproveedor: TIntegerField;
    ZQuery1codigo: TWideStringField;
    ZQuery1id_propio: TWideStringField;
    ZQuery1descripcion: TWideStringField;
    ZQuery1lote: TWideStringField;
    ZQuery1cantidad: TFloatField;
    ZQuery1stock: TFloatField;
    ZQuery1precio: TFloatField;
    ZQuery1tipo_iva: TIntegerField;
    ZQuery1base: TFloatField;
    ZQuery1total: TFloatField;
    Label19: TLabel;
    DBEdit7: TDBEdit;
    qcompraslote: TWideStringField;
    DBCheckBox5: TDBCheckBox;
    PageControl1: TPageControl;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    temp_fotos: TFDTable;
    temp_fotoside: TIntegerField;
    temp_fotosidt: TIntegerField;
    temp_fotosimagen: TBlobField;
    temp_fotosextension: TWideStringField;
    dsempfotos: TDataSource;
    Panel34: TPanel;
    Panel35: TPanel;
    Panel36: TPanel;
    Label43: TLabel;
    Button5: TButton;
    Button15: TButton;
    Panel37: TPanel;
    DBGrid4: TDBGrid;
    Memo2: TMemo;
    Button21: TButton;
    Button20: TButton;
    dsdocumentos: TDataSource;
    documentos: TFDQuery;
    documentos_tmp: TFDTable;
    OpenPictureDialog1: TOpenPictureDialog;
    OpenDialog2: TOpenDialog;
    documentos_tmpid: TIntegerField;
    documentos_tmpide: TIntegerField;
    documentos_tmpfecha: TDateField;
    documentos_tmpdescripcion: TWideStringField;
    documentos_tmparchivo: TBlobField;
    documentos_tmpnomarchivo: TWideStringField;
    documentos_tmpextension: TWideStringField;
    documentos_tmpidlote: TIntegerField;
    documentos_tmpcodpar: TWideStringField;
    documentos_tmpidea: TIntegerField;
    documentos_tmpidt: TIntegerField;
    documentos_tmpidaf: TIntegerField;
    documentosid: TIntegerField;
    documentoside: TIntegerField;
    documentosfecha: TDateField;
    documentosdescripcion: TWideStringField;
    documentosnomarchivo: TWideStringField;
    documentosextension: TWideStringField;
    documentosidaf: TIntegerField;
    Panel6: TPanel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    DBEdit13: TDBEdit;
    DBEdit14: TDBEdit;
    DBEdit15: TDBEdit;
    DBEdit16: TDBEdit;
    DBEdit17: TDBEdit;
    qtemp_doc: TFDQuery;
    qtemp_docid: TIntegerField;
    qtemp_docide: TIntegerField;
    qtemp_docarchivo: TBlobField;
    qtemp_docextension: TWideStringField;
    qtemp_docnomarchivo: TWideStringField;
    SaveDialog1: TSaveDialog;
    Label25: TLabel;
    DBEdit18: TDBEdit;
    qmateriaactiva: TFDQuery;
    qmateriaactivamateria_activa: TWideStringField;
    combofamilia: TDBLookupComboBox;
    Label26: TLabel;
    qfamilias2: TFDQuery;
    dsqfamilias2: TDataSource;
    qfamilias2idempresa: TIntegerField;
    qfamilias2id: TIntegerField;
    qfamilias2descripcion: TWideStringField;
    qfamilias2activo: TIntegerField;
    qfamilias2grupo: TIntegerField;
    qfamilias2COMUN: TIntegerField;
    qfamilias2ABONOS: TIntegerField;
    qfamilias2FITOSANITARIOS: TIntegerField;
    qfamilias2SUMINISTROS: TIntegerField;
    qfamilias2GENERADORES: TIntegerField;
    Label27: TLabel;
    DBEdit19: TDBEdit;
    Label28: TLabel;
    DBEdit20: TDBEdit;
    Label29: TLabel;
    DBCheckBox6: TDBCheckBox;
    qactualizar_stocks: TFDQuery;
    Panel15: TPanel;
    Label74: TLabel;
    Image2: TImage;
    Button2: TButton;
    btEimagen: TButton;
    btEoKimagen: TButton;
    imgfotoe: TImage;
    Button1: TButton;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure tbuscarChange(Sender: TObject);
    procedure todosarticulosClick(Sender: TObject);
    procedure btAnuevoClick(Sender: TObject);
    procedure btAborrarClick(Sender: TObject);
    procedure btAmodificarClick(Sender: TObject);
    procedure btAguardarClick(Sender: TObject);
    procedure btAcancelarClick(Sender: TObject);
    procedure DBEdit12Change(Sender: TObject);
    procedure DBEdit8Change(Sender: TObject);
    procedure DBEdit22Change(Sender: TObject);
    procedure DBEdit10Change(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure dsqarticulosfinalStateChange(Sender: TObject);
    procedure qarticulosfinalAfterClose(DataSet: TDataSet);
    procedure qarticulosfinalAfterOpen(DataSet: TDataSet);
    procedure qarticulosfinalAfterRefresh(DataSet: TDataSet);
    procedure qarticulosfinalBeforeOpen(DataSet: TDataSet);
    procedure dsarticulosfinalStateChange(Sender: TObject);
    procedure dsarticulosfinalDataChange(Sender: TObject; Field: TField);
    procedure Image2DblClick(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button19Click(Sender: TObject);
    procedure Button21Click(Sender: TObject);
    procedure Button20Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure DBEdit13Exit(Sender: TObject);
    procedure combofamiliaClick(Sender: TObject);
    procedure dsqfamilias2DataChange(Sender: TObject; Field: TField);
    procedure btEimagenClick(Sender: TObject);
    procedure btEoKimagenClick(Sender: TObject);
    procedure dsqarticulosfinalDataChange(Sender: TObject; Field: TField);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid3CellClick(Column: TColumn);
    procedure DBGrid3DblClick(Sender: TObject);
  private
    { Private declarations }
    tmrBusqueda: TTimer;
    procedure VerDocEntrada(idEntrada: Integer; idEmpresa : Integer);
    procedure tmrBusquedaTimer(Sender: TObject);
    procedure VisualizarImagen;

  public
    { Public declarations }
    var   filtro:string;
          vertodos:integer;
  end;

var
  articulos: Tarticulos;

implementation

{$R *.dfm}

uses datos,webutils,principal;



procedure Tarticulos.btAcancelarClick(Sender: TObject);
begin
   dtarticulosfinal.cancel;
   dtarticulosfinal.MasterSource:=dsqarticulosfinal;
end;

procedure Tarticulos.btAmodificarClick(Sender: TObject);
begin
   dtarticulosfinal.MasterSource:=nil;
   dtarticulosfinal.edit;
//   dbedit1.SetFocus;
end;

procedure Tarticulos.btAborrarClick(Sender: TObject);
begin
    dtarticulosfinal.delete;
    qarticulosfinal.Refresh;
    dtarticulosfinal.Refresh;
end;

procedure Tarticulos.btAnuevoClick(Sender: TObject);
begin
   dtarticulosfinal.MasterSource:=nil;
   dtarticulosfinal.append;
   pagecontrol1.TabIndex:= 0;
   qaux.SQL.Clear;
   qaux.SQL.Add('select max(id)+1 from articulosf');
   qaux.Open;
   dbedit1.SetFocus;
   dbedit1.Text:=qaux.Fields[0].AsString;
   combofamilias.KeyValue:=dm.tempresaidfamilia.asinteger;

end;

procedure Tarticulos.btEimagenClick(Sender: TObject);
var
  PanelDC: HDC;
  Jpg : TJPEGImage;
  bmp : Tbitmap;
  imagen : TPicture;
  ext:string;
//  imagen : TJPEGImage;

begin

if (Sender as TButton).Caption ='Cargar imagen' then
begin

  if OpenPictureDialog1.Execute then
  begin
//    imagen := TJPEGImage.Create;
    imagen := TPicture.Create;
    bmp:= TBitmap.Create;
    jpg:=TJPEGImage.Create;

    try

      ext:= ExtractFileExt(openpicturedialog1.FileName);
      if (ext='.jpg') or (ext='jpeg') then
      begin
        imgfotoe.Picture.LoadFromFile(OpenPictureDialog1.FileName);//'c:\formagest\imagenes\'+dm.alumnosid.asstring+'.bmp');
        bteokimagen.Visible:=true;
      end else
      begin
          imgfotoe.Picture.LoadFromFile(OpenPictureDialog1.FileName);//'c:\formagest\imagenes\'+dm.alumnosid.asstring+'.bmp');
          bteokimagen.Visible:=true;
      end;
      imgfotoe.Visible:=true;
    finally
      imagen.Free;
    end;
  end;


end;

end;

procedure Tarticulos.btEoKimagenClick(Sender: TObject);
var
  ext: string;
begin
  if OpenPictureDialog1.FileName <> '' then
  begin
    ext := ExtractFileExt(OpenPictureDialog1.FileName);
    qactualizar_stocks.Close;
    qactualizar_stocks.SQL.Text := 'UPDATE articulosf SET imagen = :IMAGEN, extension = :EXT WHERE id = :ID';
    qactualizar_stocks.ParamByName('IMAGEN').LoadFromFile(OpenPictureDialog1.FileName, ftBlob);
    qactualizar_stocks.ParamByName('EXT').AsString := ext;
    qactualizar_stocks.ParamByName('ID').AsInteger := dtarticulosfinalid.AsInteger;
    qactualizar_stocks.ExecSQL;
    
    VisualizarImagen;
    
    imgfotoe.Picture := nil;
    imgfotoe.Visible := false;
    bteokimagen.Visible := false;
  end;
end;

procedure Tarticulos.Button15Click(Sender: TObject);
var ext,nomarchivo:string;
    x:integer;
begin
  if opendialog2.Execute then
  begin
    try
    finally
       if opendialog2.Files.Count=1 then
       begin
          qaux.SQL.Clear;
          qaux.SQL.Add('delete from documentos_tmp ');
          qaux.ExecSQL;
          documentos_tmp.Open;
          documentos_tmp.Append;
          ext:= ExtractFileExt(opendialog2.FileName);
          nomarchivo:= extractfilename(opendialog2.FileName);
          documentos_tmpidaf.Value:=dtarticulosfinalid.Asinteger;
          documentos_tmpfecha.Value:=date();
          documentos_tmpide.Value:=dtarticulosfinalidempresa.asinteger;
          documentos_tmpnomarchivo.Value:=nomarchivo;
          documentos_tmpdescripcion.Value:=nomarchivo;
          documentos_tmpextension.Value:=ext;
          documentos_tmparchivo.LoadFromFile(opendialog2.FileName);
          documentos_tmp.Post;
          qaux.SQL.Clear;
          qaux.SQL.Add('insert into documentos (ide,fecha,descripcion,archivo,nomarchivo,extension,idlote,codpar,idea,idt,idaf) (select ide,fecha,descripcion,archivo,nomarchivo,extension,idlote,codpar,idea,idt,idaf from documentos_tmp)');
          qaux.ExecSQL;
          qaux.SQL.Clear;
          qaux.SQL.Add('delete from documentos_tmp ');
          qaux.ExecSQL;
          documentos.Close;
          documentos.Prepare;
          documentos.ParamByName('ARTICULO').AsInteger:=dtarticulosfinalid.AsInteger;
          documentos.ParamByName('EMPRESA').AsInteger:=dtarticulosfinalidempresa.AsInteger;
          documentos.open;
       end else
       begin
          memo2.Clear;
          memo2.Lines.AddStrings(opendialog2.files);
          for x := 0 to opendialog2.Files.Count-1 do
            begin
                qaux.SQL.Clear;
                qaux.SQL.Add('delete from documentos_tmp ');
                qaux.ExecSQL;
                documentos_tmp.Open;
                documentos_tmp.Append;
                ext:= ExtractFileExt(memo2.Lines[x]);
                nomarchivo:= extractfilename(memo2.Lines[x]);
                documentos_tmpidaf.Value:=dtarticulosfinalid.Asinteger;
                documentos_tmpfecha.Value:=date();
                documentos_tmpide.Value:=dtarticulosfinalidempresa.Asinteger;
                documentos_tmpnomarchivo.Value:=nomarchivo;
                documentos_tmpdescripcion.Value:=nomarchivo;
                documentos_tmpextension.Value:=ext;
                documentos_tmparchivo.LoadFromFile(memo2.Lines[x]);
                documentos_tmp.Post;

                qaux.SQL.Clear;
                qaux.SQL.Add('insert into documentos (ide,fecha,descripcion,archivo,nomarchivo,extension,idlote,codpar,idea,idt,idaf) (select ide,fecha,descripcion,archivo,nomarchivo,extension,idlote,codpar,idea,idt,idaf from documentos_tmp)');
                qaux.ExecSQL;
                qaux.SQL.Clear;
                qaux.SQL.Add('delete from documentos_tmp ');
                qaux.ExecSQL;
                documentos.Close;
                documentos.Prepare;
                documentos.ParamByName('ARTICULO').AsInteger:=dtarticulosfinalid.Asinteger;
                documentos.ParamByName('EMPRESA').AsInteger:=dtarticulosfinalidempresa.Asinteger;
                documentos.open;
                panel37.Visible:=true;
            end;
       end;
    end;
  end;

end;

procedure Tarticulos.Button19Click(Sender: TObject);
var ext:string;
begin
  if opendialog2.Execute then
  begin
    try
      ext:= ExtractFileExt(opendialog2.FileName);
      if (ext='.jpg') or (ext='.jpeg') or (ext='.bmp') or (ext='.png') then
      begin
//        imgfoto.Picture.LoadFromFile(opendialog2.FileName);
//        imgfoto.Visible:=true;
      end
    finally
       documentos.edit;
    end;
  end;
end;

procedure Tarticulos.Button1Click(Sender: TObject);
begin
if dtarticulosfinalregistro.AsString<>'' then
begin
try
    // Ejemplo: Acceso a la documentaci�n t�cnica de Veri*Factu AEAT
    TWebHelper.AbrirURL('https://servicio.mapa.gob.es/regfiweb/VerFicha/Index?numRegistro='+dtarticulosfinalregistro.AsString);
  except
    on E: Exception do
      MessageDlg('Error al abrir la ayuda: ' + E.Message, mtError, [mbOK], 0);
  end;
end;
end;

procedure Tarticulos.Button20Click(Sender: TObject);
var nomarchivo:string;
begin
    qtemp_doc.Close;
    qtemp_doc.SQL.Text := 'SELECT ide, id, archivo, nomarchivo, extension FROM documentos WHERE ide = :EMPRESA AND id = :ID';
    qtemp_doc.Prepare;
    qtemp_doc.ParamByName('EMPRESA').AsInteger:=documentoside.asinteger;
    qtemp_doc.ParamByName('ID').AsInteger:=documentosid.asinteger;
    qtemp_doc.Open;
    nomarchivo:=qtemp_docnomarchivo.AsString;
    deletefile('c:\agrigest\tmp\*.*');
    qtemp_docarchivo.SaveToFile('c:\agrigest\tmp\'+nomarchivo);
    ShellExecute(Handle,nil,PChar('c:\agrigest\tmp\'+nomarchivo),'','',SW_SHOWNORMAL);

end;

procedure Tarticulos.Button21Click(Sender: TObject);
var  archivo:string;
begin
    qtemp_doc.Close;
    qtemp_doc.SQL.Text := 'SELECT ide, id, archivo, nomarchivo, extension FROM documentos WHERE ide = :EMPRESA AND id = :ID';
    qtemp_doc.Prepare;
    qtemp_doc.ParamByName('EMPRESA').AsInteger:=documentoside.asinteger;
    qtemp_doc.ParamByName('ID').AsInteger:=documentosid.asinteger;
    qtemp_doc.Open;
    archivo:=qtemp_docnomarchivo.AsString;
    savedialog1.FileName:=archivo;
    savedialog1.Execute();
    archivo:=savedialog1.FileName;
    qtemp_docarchivo.SaveToFile(archivo);
end;

procedure Tarticulos.Button2Click(Sender: TObject);
begin
  if not dtarticulosfinal.IsEmpty then
  begin
    qactualizar_stocks.Close;
    qactualizar_stocks.SQL.Text := 'UPDATE articulosf SET imagen = NULL, extension = NULL WHERE id = :ID';
    qactualizar_stocks.ParamByName('ID').AsInteger := dtarticulosfinalid.AsInteger;
    qactualizar_stocks.ExecSQL;
    VisualizarImagen;
  end;
end;

procedure Tarticulos.Button5Click(Sender: TObject);
begin
    documentos.Delete;
end;

procedure Tarticulos.combofamiliaClick(Sender: TObject);
begin
    combofamilia.KeyValue:=null;
end;

procedure Tarticulos.DBEdit10Change(Sender: TObject);
begin
if dbedit10.Text<>'' then
  begin
  if (dtarticulosfinal.State in [dsedit,dsinsert]) and (dbedit10.Focused) then
      begin
          dtarticulosfinalpvp.Value:=(1+(dtarticulosfinalmargen.asfloat/100))*strtofloat(dbedit10.Text);
          dtarticulosfinalbeneficio.Value:=dtarticulosfinalpvp.AsFloat-strtofloat(dbedit10.Text);
      end;
  end;

end;

procedure Tarticulos.DBEdit12Change(Sender: TObject);
begin
if dbedit12.Text<>'' then
  begin
    if (dtarticulosfinal.State in [dsedit,dsinsert]) and (dbedit12.Focused) then
        begin
            dtarticulosfinalpvp.Value:=dtarticulosfinalpreciocoste.AsFloat*((strtofloat(dbedit12.Text)/100)+1);
            dtarticulosfinalbeneficio.Value:=dtarticulosfinalpvp.AsFloat-dtarticulosfinalpreciocoste.asfloat;
        end;
    end;
end;

procedure Tarticulos.DBEdit13Exit(Sender: TObject);
begin
   if dtarticulosfinalregistro.AsString<>'' then
   begin
     qmateriaactiva.Close;
     qmateriaactiva.Prepare;
     qmateriaactiva.ParamByName('REGISTRO').AsString:=dtarticulosfinalregistro.asstring;
     qmateriaactiva.Open;
     if qmateriaactivamateria_activa.asstring<>'' then
     dtarticulosfinalmateria_activa.Value:=qmateriaactivamateria_activa.asstring;
   end;

end;

procedure Tarticulos.DBEdit22Change(Sender: TObject);
begin
if dbedit22.Text<>'' then
  begin
    if (dtarticulosfinal.State in [dsedit,dsinsert]) and (dbedit22.Focused) then
        begin
            dtarticulosfinalmargen.Value:=(((strtofloat(dbedit22.Text)*100)/dtarticulosfinalpreciocoste.AsFloat))-100;
            dtarticulosfinalbeneficio.Value:=strtofloat(dbedit22.Text)-dtarticulosfinalpreciocoste.asfloat;
        end;
  end;
end;

procedure Tarticulos.DBEdit8Change(Sender: TObject);
begin
if dbedit8.Text<>'' then
  begin
  if (dtarticulosfinal.State in [dsedit,dsinsert]) and (dbedit8.Focused) then
      begin
          dtarticulosfinalpvp.Value:=strtofloat(dbedit8.Text)+dtarticulosfinalpreciocoste.asfloat;
          dtarticulosfinalmargen.Value:=((dtarticulosfinalpvp.asfloat*100)/dtarticulosfinalpreciocoste.AsFloat)-100;
      end;
  end;
end;

procedure Tarticulos.dsarticulosfinalDataChange(Sender: TObject; Field: TField);
begin
    qcompras.close;
    qcompras.ParamByName('EMPRESA').Asinteger:=dtarticulosfinalidempresa.AsInteger;
    qcompras.ParamByName('ARTICULO').Asstring:=dtarticulosfinalcodigo.Asstring;
    qcompras.Open;
    qlistadoproveedores.close;
    qlistadoproveedores.ParamByName('EMPRESA').Asinteger:=dtarticulosfinalidempresa.AsInteger;
    qlistadoproveedores.ParamByName('ARTICULO').Asstring:=dtarticulosfinalcodigo.Asstring;
    qlistadoproveedores.Open;
    documentos.Close;
    documentos.Prepare;
    documentos.ParamByName('ARTICULO').AsInteger:=dtarticulosfinalid.AsInteger;
    documentos.ParamByName('EMPRESA').AsInteger:=dtarticulosfinalidempresa.AsInteger;
    documentos.open;

    if Field = nil then
      VisualizarImagen;
end;

procedure Tarticulos.dsarticulosfinalStateChange(Sender: TObject);
begin
if dtarticulosfinal.State in [dsedit,dsinsert] then
    begin
       Panel14.Enabled:=true;
       btAnuevo.enabled:=false;
       btAborrar.enabled:=false;
       btAmodificar.enabled:=false;
       btAguardar.enabled:=true;
       btAcancelar.enabled:=true;
    end;
    if dtarticulosfinal.State in [dsbrowse] then
    begin
       Panel14.Enabled:=false;
       btAnuevo.enabled:=true;
       btAborrar.enabled:=true;
       btAmodificar.enabled:=true;
       btAguardar.enabled:=false;
       btAcancelar.enabled:=false;
    end;
end;

procedure Tarticulos.dsqarticulosfinalDataChange(Sender: TObject;
  Field: TField);
begin
  // Image handling moved to dsarticulosfinalDataChange and SQL based logic
end;

procedure Tarticulos.dsqarticulosfinalStateChange(Sender: TObject);
begin
    if dtarticulosfinal.State in [dsedit,dsinsert] then
    begin
       Panel14.Enabled:=true;
       btAnuevo.enabled:=false;
       btAborrar.enabled:=false;
       btAmodificar.enabled:=false;
       btAguardar.enabled:=true;
       btAcancelar.enabled:=true;
    end;
    if dtarticulosfinal.State in [dsbrowse] then
    begin
       Panel14.Enabled:=false;
       btAnuevo.enabled:=true;
       btAborrar.enabled:=true;
       btAmodificar.enabled:=true;
       btAguardar.enabled:=false;
       btAcancelar.enabled:=false;
    end;
end;

procedure Tarticulos.dsqfamilias2DataChange(Sender: TObject; Field: TField);
begin
    filtro:='%'+tbuscar.Text+'%';
    if todosarticulos.Checked then vertodos:=1 else vertodos:=0;
    qarticulosfinal.Close;
    qarticulosfinal.open;
end;

procedure Tarticulos.btAguardarClick(Sender: TObject);
begin
    dtarticulosfinal.Post;
    qarticulosfinal.Refresh;
    qarticulosfinal.Locate('id',dtarticulosfinalid.AsInteger,[locaseinsensitive,lopartialkey]);
    dtarticulosfinal.MasterSource:=dsqarticulosfinal;
    dtarticulosfinal.Refresh;
end;

procedure Tarticulos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   qarticulosfinal.close;
   filtro:='';
   vertodos:=0;
end;

procedure Tarticulos.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (activecontrol is tdbgrid) then
    begin
        if Key = 13 then Key :=9;
    end;

end;

procedure Tarticulos.FormKeyPress(Sender: TObject; var Key: Char);
var formatos:tformatsettings;
punto:string;
begin
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatos);
    punto:=formatos.DecimalSeparator;
    if punto=',' then
    begin
        key:=upcase(key);
        if (key='.') and (activecontrol is tdbedit) then
        begin
           if  (activecontrol as tdbedit).Field.DataType in [ftfloat,ftCurrency,ftbcd,ftfmtbcd] then key:=','
        end;
        if (key='.') and (activecontrol is tdbgrid) then
        begin
            key:=',';
        end;
    end;
    if (activecontrol is tdbgrid) then
    begin
        if Key = #13 then Key :=#9;
    end;

    if (key=#13) then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;
end;

procedure Tarticulos.FormShow(Sender: TObject);
begin
//    qactualizar_stocks.ExecSQL;
    qarticulosfinal.close;
    qarticulosfinal.Open;
    detallesarticulos.ActivePageIndex:=5;
    qlistadoproveedores.Prepare;
    qcompras.Prepare;
    qfamilias2.Open;
    pagecontrol1.TabIndex:=0;

end;

procedure Tarticulos.Image2DblClick(Sender: TObject);
var nomarchivo:string;
begin
    nomarchivo:='empimg'+temp_fotosextension.AsString;
    ShellExecute(Handle,nil,PChar('c:\agrigest\tmp\'+nomarchivo),'','',SW_SHOWNORMAL);
end;

procedure Tarticulos.qarticulosfinalAfterClose(DataSet: TDataSet);
begin
   dtarticulosfinal.close;
   qfamilias.close;
   qtipoivas.close;
   qproveedores.close;
end;

procedure Tarticulos.qarticulosfinalAfterOpen(DataSet: TDataSet);
begin
   dtarticulosfinal.Open;
   qfamilias.Open;
   qtipoivas.Open;
   qproveedores.Open;
end;

procedure Tarticulos.qarticulosfinalAfterRefresh(DataSet: TDataSet);
begin
   dtarticulosfinal.refresh;
   qfamilias.refresh;
   qtipoivas.refresh;
   qproveedores.refresh;
end;

procedure Tarticulos.qarticulosfinalBeforeOpen(DataSet: TDataSet);
var vdescripcion,vcodigo,vid,vfamilia,vactivo:string;
begin
{    if filtro<>'' then
    begin
       begin
         filtrolocal:=' where descripcion like('+''''+filtro+''''+') or codigo like('+''''+filtro+''''+') or id like('+''''+filtro+''''+')';
       end;
      if vertodos=0 then
      begin
          begin
            filtrolocal:=' where (descripcion like('+''''+filtro+''''+') or codigo like('+''''+filtro+''''+') or id like('+''''+filtro+''''+')';
            filtrolocal:=filtrolocal+') and activo=1 ';
          end;
      end;
    end;


    if filtro='' then
    begin
      filtrolocal:='';
      if vertodos=0 then
      begin
          filtrolocal:=' where activo=1 ';
      end;
    end;                                              }
    vdescripcion:=filtro;
    vcodigo:=filtro;
    vid:=filtro;
    if combofamilia.KeyValue=null then vfamilia:='%' else vfamilia:=combofamilia.KeyValue;
    if vertodos=0 then vactivo:='1' else vactivo:='%';
    qarticulosfinal.Prepare;
    qarticulosfinal.ParamByName('DESCRIPCION').AsString:=vdescripcion;
    qarticulosfinal.ParamByName('CODIGO').AsString:=vcodigo;
    qarticulosfinal.ParamByName('ID').AsString:=vid;
    qarticulosfinal.ParamByName('FAMILIA').AsString:=vfamilia;
    qarticulosfinal.ParamByName('ACTIVO').AsString:=vactivo;

//    qarticulosfinal.SQL.Clear;
//    qarticulosfinal.SQL.Add('select idempresa,id,codigo,descripcion,activo,preciocoste from articulosf ' + filtrolocal +' order by descripcion')

end;

procedure Tarticulos.tbuscarChange(Sender: TObject);
begin
  if not Assigned(tmrBusqueda) then
  begin
    tmrBusqueda := TTimer.Create(Self);
    tmrBusqueda.Interval := 400;
    tmrBusqueda.OnTimer := tmrBusquedaTimer;
    tmrBusqueda.Enabled := False;
  end;

  tmrBusqueda.Enabled := False;
  tmrBusqueda.Enabled := True;
end;

procedure Tarticulos.tmrBusquedaTimer(Sender: TObject);
begin
  tmrBusqueda.Enabled := False;
  filtro := '%' + tbuscar.Text + '%';
  if todosarticulos.Checked then vertodos := 1 else vertodos := 0;
  qarticulosfinal.Close;
  qarticulosfinal.Open;
end;

procedure Tarticulos.todosarticulosClick(Sender: TObject);
begin
    if todosarticulos.Checked=true then
    begin
        vertodos:=1;
        qarticulosfinal.Close;
//        qarticulosfinal.SQL.Clear;
//        qarticulosfinal.SQL.add('select * from articulosf order by descripcion asc');
        qarticulosfinal.Open;
    end else
    begin
        vertodos:=0;
        qarticulosfinal.Close;
//        qarticulosfinal.SQL.Clear;
//        qarticulosfinal.SQL.add('select * from articulosf where activo=1 order by descripcion asc');
        qarticulosfinal.Open;
    end;
end;

procedure Tarticulos.DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'has_doc' then
  begin
    DBGrid3.Canvas.FillRect(Rect);
    if qcomprashas_doc.AsInteger > 0 then
    begin
       BASE.listaiconos.Draw(DBGrid3.Canvas, Rect.Left + 2, Rect.Top + 1, 154);
    end;
  end;
end;

procedure Tarticulos.VisualizarImagen;
var
  sExt, sFileName: string;
begin
  image2.Picture := nil;
  if (dtarticulosfinal.Active) and (not dtarticulosfinal.IsEmpty) then
  begin
    qaux.Close;
    qaux.SQL.Text := 'SELECT imagen, extension FROM articulosf WHERE id = :ID_ART';
    qaux.ParamByName('ID_ART').AsInteger := dtarticulosfinalid.AsInteger;
    qaux.Open;

    if (not qaux.IsEmpty) and (not qaux.FieldByName('imagen').IsNull) then
    begin
      sExt := LowerCase(Trim(qaux.FieldByName('extension').AsString));
      if sExt = '' then sExt := '.bmp';
      if sExt[1] <> '.' then sExt := '.' + sExt;
      
      if not DirectoryExists('c:\agrigest\tmp') then
        ForceDirectories('c:\agrigest\tmp');

      sFileName := 'c:\agrigest\tmp\temp_art_image' + sExt;
      
      try
        TBlobField(qaux.FieldByName('imagen')).SaveToFile(sFileName);
        image2.Picture.LoadFromFile(sFileName);
      except
        // Silently fail if image cannot be loaded
      end;
    end;
    qaux.Close;
  end;
end;

procedure Tarticulos.VerDocEntrada(idEntrada: Integer; idEmpresa : Integer);
var
  nomarchivo: string;
begin
  if idEntrada <= 0 then Exit;

  qtemp_doc.Close;
  qtemp_doc.SQL.Text := 'SELECT ide, id, archivo, nomarchivo, extension FROM documentos WHERE ide = :EMPRESA AND identrada = :ID';
  qtemp_doc.ParamByName('ID').AsInteger := idEntrada;
  qtemp_doc.ParamByName('EMPRESA').AsInteger := idEmpresa;
  qtemp_doc.Open;

  if not qtemp_doc.IsEmpty then
  begin
    nomarchivo := qtemp_doc.FieldByName('nomarchivo').AsString;
    if nomarchivo = '' then
      nomarchivo := 'Documento_' + IntToStr(idEntrada) + qtemp_doc.FieldByName('extension').AsString;

    if not DirectoryExists('c:\agrigest\tmp') then CreateDir('c:\agrigest\tmp');

    try
      TBlobField(qtemp_doc.FieldByName('archivo')).SaveToFile('c:\agrigest\tmp\' + nomarchivo);
      ShellExecute(Handle, nil, PChar('c:\agrigest\tmp\' + nomarchivo), '', '', SW_SHOWNORMAL);
    except
      on E: Exception do
        ShowMessage('Error al abrir el documento: ' + E.Message);
    end;
  end
  else
    ShowMessage('El documento asociado a esta entrada no está disponible.');
end;

procedure Tarticulos.DBGrid3CellClick(Column: TColumn);
begin
  if (Column.FieldName = 'has_doc') and (qcomprashas_doc.AsInteger > 0) then
  begin
    VerDocEntrada(qcomprasidentrada.AsInteger, qcomprasidempresa.asinteger);
  end;
end;

procedure Tarticulos.DBGrid3DblClick(Sender: TObject);
begin
  if qcomprashas_doc.AsInteger > 0 then
  begin
    VerDocEntrada(qcomprasidentrada.AsInteger, qcomprasidempresa.asinteger);
  end;
end;

end.
