﻿unit principal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.StrUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.DBCtrls,
  Data.DB, Vcl.Grids, Vcl.DBGrids, dateutils, CPort, Vcl.Touch.Keyboard, Vcl.ImgList, Vcl.ComCtrls,
  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.Client,
  FireDAC.Comp.DataSet, FireDAC.Phys.MySQL, FireDAC.Phys.SQLite, local_db, sync_thread;

type
  Tpprincipal = class(TForm)
    PSELECCION: TPanel;
    PINFORMACION: TPanel;
    PPESADAS: TPanel;
    PESAR: TButton;
    Button1: TButton;
    PBOTONES: TPanel;
    BPLIMPIADORA: TButton;
    DBagrigest: TFDConnection;
    qmprimas: TFDQuery;
    dsqmprimas: TDataSource;
    dsproductos: TDataSource;
    qproductos: TFDQuery;
    combovariedad: TDBLookupComboBox;
    Label1: TLabel;
    comboproducto: TDBLookupComboBox;
    Label2: TLabel;
    PLIMPIADORAS: TPanel;
    qtrabajosalmacen: TFDQuery;
    dsqtrabajosalmacen: TDataSource;
    PPESARUVALIMPIADORAS: TPanel;
    Panel1: TPanel;
    combopuestos: TDBLookupComboBox;
    Edit1: TEdit;
    Label3: TLabel;
    btanadir: TButton;
    Label5: TLabel;
    Memo1: TMemo;
    lmesa: TLabel;
    qmovimientos_mesa: TFDQuery;
    dsqmovimientos_mesa: TDataSource;
    qaux: TFDQuery;
    dsqaux: TDataSource;
    lbascula: TLabel;
    dsqaux2: TDataSource;
    qaux2: TFDQuery;
    bpenvasada: TButton;
    tpesar: TTimer;
    puerto1: TComPort;
    lpeso: TLabel;
    Edit2: TEdit;
    Label6: TLabel;
    lpesotrabajador: TLabel;
    qenvasadoras: TFDQuery;
    dsqenvasadoras: TDataSource;
    Label4: TLabel;
    Ta_cero: TTimer;
    Label7: TLabel;
    comboenvasadoras: TDBLookupComboBox;
    Timer4: TTimer;
    DBGrid2: TDBGrid;
    tsincronizar: TTimer;
    dbservidor: TFDConnection;
    lc_movimientos_mesa: TFDTable;
    lc_trabajo_diario: TFDTable;
    lc_rendimiento: TFDTable;
    lc_produccion: TFDTable;
    qaux3: TFDQuery;
    PCONEXION: TPanel;
    qaux4: TFDQuery;
    btterminar: TButton;
    produccionx: TFDTable;
    movimientos_mesa: TFDTable;
    trabajo_diario: TFDTable;
    rendimiento: TFDTable;
    qaux5: TFDQuery;
    qaux6: TFDQuery;
    lpesominimo: TLabel;
    lpesomaximo: TLabel;
    Tboton: TTimer;
    empresa: TFDTable;
    tcalendario_laboral: TFDTable;
    DBCheckBox1: TDBCheckBox;
    dscalendario: TDataSource;
    DBCheckBox2: TDBCheckBox;
    lproducto: TLabel;
    lvariedad: TLabel;
    esclavo: TFDQuery;
    lesclavo: TLabel;
    qrecuperar: TFDQuery;
    vestable: TShape;
    ednumero: TEdit;
    lnumero: TLabel;
    teclado: TTouchKeyboard;
    Button3: TButton;
    TouchKeyboard1: TTouchKeyboard;
    dsdesbloqueos: TDataSource;
    qdesbloqueos: TFDQuery;
    Button4: TButton;
    ImageList1: TImageList;
    griddesbloqueos: TDBGrid;
    ComData1: TComDataPacket;
    comdata2: TComDataPacket;
    btentradasmprimas: TButton;
    btcontrol: TButton;
    btconfiguracion: TButton;
    PENTRADAS: TPanel;
    PCONFIGURACION: TPanel;
    PCONTROL: TPanel;
    qsectores: TFDQuery;
    dsqsectores: TDataSource;
    qvariedadeslinea: TFDQuery;
    Panel2: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    DBGrid1: TDBGrid;
    qproductoslinea: TFDQuery;
    dsqvariedadeslinea: TDataSource;
    dsqproductoslinea: TDataSource;
    dsqmprimas2: TDataSource;
    qmprimas2: TFDQuery;
    dsqproductos2: TDataSource;
    qproductos2: TFDQuery;
    listaiconos: TImageList;
    Button7: TButton;
    Panel3: TPanel;
    Panel4: TPanel;
    Button8: TButton;
    Panel7: TPanel;
    DBGrid3: TDBGrid;
    Panel8: TPanel;
    combovariedadlinea: TDBLookupComboBox;
    Label9: TLabel;
    Button5: TButton;
    Panel9: TPanel;
    Label10: TLabel;
    comboproductolinea: TDBLookupComboBox;
    Button6: TButton;
    Panel10: TPanel;
    Label8: TLabel;
    combosector: TDBLookupComboBox;
    Label11: TLabel;
    teclado2: TTouchKeyboard;
    Panel11: TPanel;
    Label12: TLabel;
    lid: TEdit;
    Label13: TLabel;
    combosectorentradas: TDBLookupComboBox;
    Panel12: TPanel;
    DBGrid4: TDBGrid;
    qpesadas: TFDQuery;
    qpesadassector: TFDQuery;
    qpesadassectortmp: TFDQuery;
    Button9: TButton;
    qauxsrv: TFDQuery;
    dspesadassector: TDataSource;
    Panel13: TPanel;
    Label14: TLabel;
    DBLookupComboBox1: TDBLookupComboBox;
    Panel14: TPanel;
    Panel15: TPanel;
    DBGrid5: TDBGrid;
    qpuestos: TFDQuery;
    fechacontrol: TDateTimePicker;
    Label15: TLabel;
    dsqpuestos: TDataSource;
    qmovimientos_mesa2: TFDQuery;
    dsqmovimientos_mesas2: TDataSource;
    Panel16: TPanel;
    Panel17: TPanel;
    DBGrid6: TDBGrid;
    Button10: TButton;
    lnumtrabajadores: TLabel;
    tcomprobar: TTimer;
    Button2: TButton;
    ltotempleados: TLabel;
    lconectado: TLabel;
    lpiezas: TLabel;
    Label16: TLabel;
    Button11: TButton;
    Button12: TButton;
    Label17: TLabel;
    lpesopieza: TLabel;
    ZReadOnlyQuery1: TFDQuery;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure btanadirClick(Sender: TObject);
    procedure puerto1RxChar(Sender: TObject; Count: Integer);
    procedure BPLIMPIADORAClick(Sender: TObject);
    procedure bpenvasadaClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Enter(Sender: TObject);
    procedure Edit2Enter(Sender: TObject);
    procedure PESARClick(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure dsproductosDataChange(Sender: TObject; Field: TField);
    procedure tpesarTimer(Sender: TObject);
    procedure Ta_ceroTimer(Sender: TObject);
    procedure TbotonTimer(Sender: TObject);
    procedure Timer4Timer(Sender: TObject);
    procedure tsincronizarTimer(Sender: TObject);
    procedure btterminarClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure combopuestosExit(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
    procedure ComData1Packet(Sender: TObject; const Str: string);
    procedure puerto1RxBuf(Sender: TObject; const Buffer; Count: Integer);
    procedure comdata2Packet(Sender: TObject; const Str: string);
    procedure btentradasmprimasClick(Sender: TObject);
    procedure btconfiguracionClick(Sender: TObject);
    procedure btcontrolClick(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure lidEnter(Sender: TObject);
    procedure lidExit(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure dsqpuestosDataChange(Sender: TObject; Field: TField);
    procedure Button10Click(Sender: TObject);
    procedure fechacontrolChange(Sender: TObject);
    procedure dsqsectoresDataChange(Sender: TObject; Field: TField);
    procedure ednumeroEnter(Sender: TObject);
    procedure ednumeroExit(Sender: TObject);
    procedure tcomprobarTimer(Sender: TObject);
    procedure dsqmovimientos_mesaDataChange(Sender: TObject; Field: TField);
    procedure comboproductoDropDown(Sender: TObject);
    procedure comboenvasadorasDropDown(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure combovariedadCloseUp(Sender: TObject);
    procedure combovariedadDropDown(Sender: TObject);
  private
    { Private declarations }
    FINIFileName: string;
    FLocalDBPath: string;
    FSyncThread: TSyncThread;
    procedure OnSyncStatusChange(Sender: TObject; Status: TConnectionStatus; const Msg: string);
    procedure OnLogoutRequest(Sender: TObject; WorkerID: Integer);
  public
    { Public declarations }
    procedure DesbloquearTerminal;
  end;

var
  pprincipal: Tpprincipal;
  desdegrid,desdetrabajador,a_cero,estable,bloqueado,desbloqueado:boolean;
  visor,cadena,gid,tmesa,tbascula,tpreguntarlimpiadora,ttipobascula,producto,variedad,tbasedatos,treplicacion,thost:string;
  ajusteentrada,ajustesalida,porcentagebloqueo,bloqueominimo,bloqueomaximo,pesovalido,vpesopieza:real;
  gfecha:tdatetime;
  replicando,corriendo:integer;
  paquetes:integer;
  num_limpiadora:integer;


implementation

{$R *.dfm}

uses desbloqueo, configuracion;

//uses desbloqueo, configuracion;
function SoloNumeros(Cad: string): string;
var
  i: Integer;
begin
  Result:='';
  for i:= 1 to Length(Cad) do
    if (Cad[i] in ['0'..'9']) or (cad[i]=',') then
      Result:= Result + Cad[i];
end;

procedure Tpprincipal.Button10Click(Sender: TObject);
begin
    qpesadassector.Delete;
end;

procedure Tpprincipal.Button11Click(Sender: TObject);
begin
   vpesopieza:=vpesopieza-1;
   lpesopieza.Caption:=floattostr(vpesopieza);
end;

procedure Tpprincipal.Button12Click(Sender: TObject);
begin
   vpesopieza:=vpesopieza+1;
   lpesopieza.Caption:=floattostr(vpesopieza);
end;

procedure Tpprincipal.Button1Click(Sender: TObject);

begin
    try
    if tpreguntarlimpiadora='1' then
    begin
      teclado.Visible:=true;
      bplimpiadora.Visible:=true;
      bpenvasada.visible:=false;
    end else
         begin
            teclado.Visible:=false;
            bplimpiadora.Visible:=false;
            bpenvasada.visible:=true;
         end;
    timer4.Enabled:=true;
    desdegrid:=false;
    combopuestos.Visible:=true;
    btterminar.Visible:=false;
    if lmesa.Caption<>'Mesa 0' then
    begin
        ppesadas.Visible:=false;
        ppesaruvalimpiadoras.Visible:=false;
    end;
    plimpiadoras.Visible:=true;
    pentradas.Visible:=false;
    pcontrol.Visible:=false;
    pconfiguracion.Visible:=false;
    qtrabajosalmacen.Open;
    qmovimientos_mesa.Close;
    qmovimientos_mesa.SQL.Clear;
    qmovimientos_mesa.sql.add(' select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null ');
    qmovimientos_mesa.sql.add('  order by trabajador');
    qmovimientos_mesa.open;
    qenvasadoras.Close;
    qenvasadoras.SQL.Clear;
    qenvasadoras.sql.add('select idt,trabajador from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and puesto like('+''''+'%ENVASADORA%'+''''+')');
    qenvasadoras.open;
    qtrabajosalmacen.close;
    qtrabajosalmacen.SQL.Clear;
    qtrabajosalmacen.sql.add(' select * from TRABAJOS_ALMACEN where activo=1 and mesas like ('+''''+'%*'+tmesa+'*%'+'''' +') ORDER BY puesto');
    qtrabajosalmacen.open;

    edit1.SetFocus
    finally
        puerto1.Connected:=false;
    end;

end;

procedure Tpprincipal.Button2Click(Sender: TObject);
begin
    PPRINCIPAL.Close;
end;

procedure Tpprincipal.BPLIMPIADORAClick(Sender: TObject);
begin

    ta_cero.enabled:=true;
    timer4.Enabled:=false;
    try
    if puerto1.Connected=false then puerto1.Connected:=true;
    except
       showmessage('El puerto de comunicaciones no existe');
    end;
    qmovimientos_mesa.close;
    lc_trabajo_diario.close;
    lc_movimientos_mesa.Close;




    plimpiadoras.Visible:=false;
    teclado.Visible:=FALSE;
    ppesadas.Visible:=false;
    ppesaruvalimpiadoras.Visible:=true;
    BPLIMPIADORA.Visible:=false;
    BPENVASADA.Visible:=true;
    edit2.SetFocus;
    paquetes:=0;
    cadena:='';
//    combopuestos.DropDown;
end;

procedure Tpprincipal.Button3Click(Sender: TObject);
var peso:real;
    pesoletras,vdia,vmes,vanyo,vfecha:string;
    mes,dia,anyo:word;
begin
{

     pesoletras:=lpeso.Caption;
    a_cero:=false;
    try
       peso:=strtofloat(pesoletras);
    except

    end;
    pesar.visible:=false;
    tboton.Enabled:=false;
    if qproductos.FieldByName('pesadomanual').AsInteger=1 then
    begin

        lc_produccion.Open;
        lc_produccion.Append;
        lc_produccion.FieldByName('fecha').value:=date;//gfecha;
        lc_produccion.FieldByName('hora').value:=time;
        lc_produccion.FieldByName('mesa').value:=lmesa.Caption;
        lc_produccion.FieldByName('bascula').value:=lbascula.Caption;
        lc_produccion.FieldByName('idt').value:=qenvasadoras.FieldByName('idt').asinteger;
        lc_produccion.FieldByName('embasadora').value:=qenvasadoras.FieldByName('trabajador').asstring;
        lc_produccion.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
        lc_produccion.FieldByName('producto').value:=qproductos.FieldByName('codigo').asstring;
        lc_produccion.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
        lc_produccion.FieldByName('peso_teorico').value:=qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('peso').AsFloat;
        lc_produccion.FieldByName('peso_real').Value:=pesovalido;//peso;
        lc_produccion.FieldByName('estado').Value:=1;
        lc_produccion.Post;
        ppesadas.Color:=clLime;
        a_cero:=false;
        ta_cero.Enabled:=true;
        tboton.enabled:=true;
        bloqueado:=false;
        estable:=false;
        pesovalido:=0;
    end;
    if qproductos.FieldByName('pesadomanual').asinteger=0 then
    begin

        lc_produccion.Open;
        lc_produccion.Append;
        lc_produccion.FieldByName('fecha').value:=date;//gfecha;
        lc_produccion.FieldByName('hora').value:=time;
        lc_produccion.FieldByName('mesa').value:=lmesa.Caption;
        lc_produccion.FieldByName('bascula').value:=lbascula.Caption;
        lc_produccion.FieldByName('idt').value:=qenvasadoras.FieldByName('idt').asinteger;
        lc_produccion.FieldByName('embasadora').value:=qenvasadoras.FieldByName('trabajador').asstring;
        lc_produccion.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
        lc_produccion.FieldByName('producto').value:=qproductos.FieldByName('codigo').asstring;
        lc_produccion.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
        lc_produccion.FieldByName('peso_teorico').value:=qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('peso').AsFloat;
        lc_produccion.FieldByName('peso_real').Value:=peso;
        lc_produccion.FieldByName('estado').Value:=1;
        lc_produccion.Post;
        tboton.enabled:=false;
        a_cero:=false;
        ta_cero.Enabled:=true;
        estable:=false;
        pesar.visible:=false;
        bloqueado:=false;
   end;
    finally
    end;

}
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    if length(vmes)=1 then vmes:='0'+vmes;
    if length(vdia)=1 then vdia:='0'+vdia;
    vfecha:=''''+vanyo+'-'+vmes+'-'+vdia+'''';
    pesoletras:=lpesotrabajador.Caption;
//    pesoletras[3]:=',';
    peso:=strtofloat(pesoletras);
    if num_limpiadora<>-1 then
    begin
      qaux.SQL.Clear;
      qaux.SQL.Add('select trabajador,idt,num_limpiadora from movimiento_mesas  where idt='+inttostr(num_limpiadora));
      qaux.open;
        lc_rendimiento.open;
        lc_rendimiento.append;
        lc_rendimiento.FieldByName('fecha').value:=date; //gfecha;
        lc_rendimiento.FieldByName('hora').value:=time;
        lc_rendimiento.FieldByName('idt').value:=qaux.Fields[1].AsInteger;
        lc_rendimiento.FieldByName('trabajador').value:=qaux.Fields[0].Asstring;
        lc_rendimiento.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
        lc_rendimiento.FieldByName('peso_bruto').value:=peso;
        lc_rendimiento.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
        lc_rendimiento.FieldByName('pesoneto').value:=peso-qproductos.FieldByName('tara').asfloat;
        lc_rendimiento.FieldByName('estado').value:=1;
        lc_rendimiento.FieldByName('num_limpiadora').value:=qaux.Fields[2].AsInteger;
        lc_rendimiento.post;
        edit2.Text:='';
        edit2.SetFocus;
        a_cero:=false;
        ta_cero.Enabled:=true;
        bloqueado:=false;
        estable:=false;
        pesovalido:=0;
     end else
          begin
              showmessage('NUMERO DE LIMPIADORA NO ENCONTRADO');
              edit2.Text:='';
              edit2.SetFocus;
          end;

end;

procedure Tpprincipal.Button4Click(Sender: TObject);
begin
    if griddesbloqueos.Visible then
    begin
      griddesbloqueos.Visible:=false;
      qdesbloqueos.Close;
    end else
    begin
      griddesbloqueos.Visible:=true;
      qdesbloqueos.Close;
      qdesbloqueos.SQL.Clear;
      qdesbloqueos.SQL.Add('select * from desbloqueos_local where mesa='+''''+lmesa.Caption+''''+' and bascula='+''''+lbascula.Caption+''''+' order by fecha desc,hora desc');
      qdesbloqueos.Open;
    end;
end;

procedure Tpprincipal.Button5Click(Sender: TObject);
begin
    if (combovariedadlinea.KeyValue<>null) and (combosector.KeyValue<>null) then
    begin
        qvariedadeslinea.Append;
        qvariedadeslinea.FieldByName('ide').value:=qsectores.FieldByName('ide').AsInteger;
        qvariedadeslinea.FieldByName('idsector').Value:=qsectores.FieldByName('id').AsInteger;
        qvariedadeslinea.FieldByName('id').value:=qmprimas2.FieldByName('id').asstring;
        qvariedadeslinea.Post;
        qvariedadeslinea.Refresh;
    end else showmessage('¡¡ DEBE SELECCIONAR UNA LINEA DE PRODUCCION Y UNA VARIEDAD¡¡');
end;

procedure Tpprincipal.Button6Click(Sender: TObject);
begin
    if (comboproductolinea.KeyValue<>null) and (combosector.KeyValue<>null) then
    begin
        qproductoslinea.Append;
        qproductoslinea.FieldByName('ide').value:=qsectores.FieldByName('ide').AsInteger;
        qproductoslinea.FieldByName('idsector').Value:=qsectores.FieldByName('id').AsInteger;
        qproductoslinea.FieldByName('codigo').value:=qproductos2.FieldByName('codigo').asstring;
        qproductoslinea.FieldByName('descripcion').value:=qproductos2.FieldByName('descripcion').asstring;
        qproductoslinea.Post;
        qproductoslinea.Refresh;
    end else showmessage('¡¡ DEBE SELECCIONAR UNA LINEA DE PRODUCCION Y UN PRODUCTO¡¡');
end;

procedure Tpprincipal.Button7Click(Sender: TObject);
begin
   qvariedadeslinea.Delete;
end;

procedure Tpprincipal.Button8Click(Sender: TObject);
begin
   qproductoslinea.delete;
end;

procedure Tpprincipal.Button9Click(Sender: TObject);
begin
   qpesadas.Close;
   qpesadas.SQL.Clear;
   qpesadas.SQL.Add('select * from ea_pesadas where idea>=0 and id='+lid.Text+' and idempresa='+qsectores.FieldByName('ide').asstring);
   qpesadas.Open;
   if qpesadas.RecordCount>0 then
   begin
     qauxsrv.Close;
     qauxsrv.SQL.Clear;
     qauxsrv.SQL.Add('delete from pesadas_sector_tmp ');
     qauxsrv.ExecSQL;
     qpesadassectortmp.Open;
     qpesadassectortmp.Append;
     qpesadassectortmp.FieldByName('ide').value:=qpesadas.FieldByName('idempresa').AsInteger;
     qpesadassectortmp.FieldByName('id').value:=qpesadas.FieldByName('id').AsInteger;
     qpesadassectortmp.FieldByName('idea').value:=qpesadas.FieldByName('idEA').AsInteger;
     qpesadassectortmp.FieldByName('idsector').value:=qsectores.FieldByName('id').AsInteger;
     qpesadassectortmp.FieldByName('descsector').value:=qsectores.FieldByName('descripcion').AsString;
     qpesadassectortmp.FieldByName('fecha').value:=date();
     qpesadassectortmp.FieldByName('hora').value:=time();
     qpesadassectortmp.FieldByName('peso_neto').value:=qpesadas.FieldByName('peso_neto').Asfloat;
     qpesadassectortmp.FieldByName('lote').value:=qpesadas.FieldByName('lote').Asstring;
     qpesadassectortmp.FieldByName('variedad').value:=qpesadas.FieldByName('mprima').Asstring;
     qpesadassectortmp.post;
     qauxsrv.Close;
     qauxsrv.SQL.Clear;
     qauxsrv.SQL.Add('insert into pesadas_sector select * from pesadas_sector_tmp');
     qauxsrv.ExecSQL;
     qpesadassector.Refresh;
     qpesadassector.First;
     qpesadas.Edit;
     qpesadas.FieldByName('id_palet2').Value:='TRIGGER_ON';
     qpesadas.FieldByName('fechatrabajo').value:=date();
     qpesadas.FieldByName('iddestino').Value:=qsectores.FieldByName('idalmacen').AsInteger;
     qpesadas.FieldByName('recuperar_envases').Value:=1;
     qpesadas.Post;
     qauxsrv.SQL.Clear;
     qauxsrv.SQL.Add('update ea_materiales ea set recuperado=-1 where ea.ide='+qpesadas.FieldByName('idempresa').asstring+' and ea.idea='+qpesadas.FieldByName('id').asstring+' and ea.idea2='+qpesadas.FieldByName('idEA').asstring);
     qauxsrv.execsql;
   end;
   lid.Text:='';
   combosectorentradas.KeyValue:=null;
   lid.SetFocus;
end;

procedure Tpprincipal.comboenvasadorasDropDown(Sender: TObject);
begin
    qenvasadoras.Close;
    qenvasadoras.SQL.Clear;
    qenvasadoras.sql.add('select idt,trabajador from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and puesto like('+''''+'%ENVASADORA%'+''''+')');
    qenvasadoras.open;
end;

procedure Tpprincipal.comboproductoDropDown(Sender: TObject);
begin
    qproductos.connection:=dbservidor;
    qproductos.sql.clear;
    qproductos.sql.add('select * from productos WHERE (codigo) in (select codigo from productos_sector ');
    qproductos.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by descripcion');
    qproductos.ParamByName('MESA').AsInteger:=strtoint(tmesa);
    try
      try
      qproductos.open;
      except
          qproductos.Close;
          qproductos.connection:=dbagrigest;
          qproductos.SQL.Clear;
          qproductos.SQL.Add('SELECT * FROM productos WHERE activo=1 ORDER BY descripcion');
          qproductos.Open;
      end;
    finally
      if qproductos.Active then
      begin
      if qproductos.Active and (qproductos.RecordCount>0) then comboproducto.KeyValue:=qproductos.FieldByName('codigo').AsString;
      if (not qproductos.Active) or (qproductos.RecordCount=0) then
      begin
          qproductos.close;
          qproductos.sql.clear;
          qproductos.sql.add('select * from productos WHERE ACTIVO=1 ORDER BY descripcion');
          qproductos.open;
      end;
      end;
    end;
end;

procedure Tpprincipal.combopuestosExit(Sender: TObject);
begin
    if combopuestos.Text='' then combopuestos.SetFocus;

end;

procedure Tpprincipal.combovariedadCloseUp(Sender: TObject);
begin
  if qmprimas.Active and (qmprimas.RecordCount > 0) then
  begin
    vpesopieza:=qmprimas.FieldByName('pesopieza').AsFloat;
    lpesopieza.Caption:=floattostr(vpesopieza);
  end;
end;

procedure Tpprincipal.combovariedadDropDown(Sender: TObject);
begin
    qmprimas.Close;
    qmprimas.sql.clear;
    qmprimas.sql.add('select * from MATERIAS_PRIMAS WHERE (idempresa,id) in (select ide,mprima from materias_primas_sector ');
    qmprimas.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by variedad');
    qmprimas.ParamByName('MESA').AsInteger:=strtoint(tmesa);
    try
      try
        qmprimas.Open;
      except
        try
          qmprimas.Close;
          qmprimas.Connection:=dbagrigest;
          qmprimas.SQL.Clear;
          qmprimas.SQL.Add('SELECT * FROM materias_primas WHERE activo=1 ORDER BY variedad');
          qmprimas.Open;
        except
        end;
      end;
    finally
      if qmprimas.Active then
      begin
        if qmprimas.Active and (qmprimas.RecordCount>0) then combovariedad.KeyValue:=qmprimas.FieldByName('id').AsString;
        if (not qmprimas.Active) or (qmprimas.RecordCount=0) or (dbservidor.Params.Values['Server']='localhost') then
        begin
            qmprimas.close;
            qmprimas.sql.clear;
            qmprimas.sql.add('SELECT * FROM materias_primas WHERE activo=1 ORDER BY descripcion');
            try
              qmprimas.open;
            except
            end;
        end;
      end;
    end;

end;

procedure Tpprincipal.comdata2Packet(Sender: TObject; const Str: string);
var pos1,pos2:integer;
    peso2:real;
begin
if ttipobascula='4' then
begin
 Pos1 := System.Pos(comdata2.StartString, str);
 pos2 := pos1+7;
 cadena:=copy(str,pos1,10);
 cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
 cadena:= StringReplace(cadena, ' ', '',[rfReplaceAll, rfIgnoreCase]);

  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            if not bloqueado then tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    peso2:=peso2*-1;
    cadena:=FormatFloat(',0.000', peso2);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
  if peso2<0 then cadena:='¡¡ERROR¡¡';
  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;

end;
if ttipobascula='0' then
begin
 Pos1 := System.Pos(comdata2.StartString, str);
 pos2 := pos1+8;
 cadena:=copy(str,pos1,9);
 cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
 cadena:= StringReplace(cadena, ' ', '',[rfReplaceAll, rfIgnoreCase]);

  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;

  end else
         begin
            estable:=false;
            if not bloqueado then tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    peso2:=peso2*-1;
    cadena:=FormatFloat(',0.000', peso2);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
  if peso2<0 then cadena:='¡¡ERROR¡¡';
  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
end;
end;

procedure Tpprincipal.ComData1Packet(Sender: TObject; const Str: string);
var pos1,pos2:integer;
    peso2:real;
begin

if ttipobascula='0' then
begin
 Pos1 := System.Pos(comdata1.StartString, str);
 pos2 := pos1+8;
 cadena:=copy(str,pos1,9);
 cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
 cadena:= StringReplace(cadena, ' ', '',[rfReplaceAll, rfIgnoreCase]);

  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    cadena:=FormatFloat(',0.000', peso2);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
end;
if ttipobascula='1' then
begin
 Pos1 := System.Pos(comdata1.StartString, str);
 pos2 := pos1+5;
 cadena:=copy(str,pos1,6);
 cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
 cadena:= StringReplace(cadena, ' ', '',[rfReplaceAll, rfIgnoreCase]);

  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    cadena:=FormatFloat(',0.000', peso2);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
end;
if ttipobascula='4' then
begin
 Pos1 := System.Pos(comdata1.StartString, str);
 pos2 := pos1+7;
 cadena:=copy(str,pos1,10);
 cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
 cadena:= StringReplace(cadena, ' ', '',[rfReplaceAll, rfIgnoreCase]);

  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    cadena:=FormatFloat(',0.000', peso2);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
end;



end;

procedure Tpprincipal.DBGrid1CellClick(Column: TColumn);
begin
    timer4.Enabled:=false;
    desdegrid:=true;
    btterminar.Visible:=true;
    btanadir.Visible:=false;
    gid:=qmovimientos_mesa.FieldByName('id').AsString;
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('select nif,nombre,id from trabajadores where id='+''''+qmovimientos_mesa.FieldByName('idt').AsString+'''');
    qaux.Open;
    Edit1.SetFocus;
    Edit1.Text:=qaux.Fields[0].AsString;
    combopuestos.Visible:=false;
    btterminar.SetFocus;
end;

procedure Tpprincipal.dsproductosDataChange(Sender: TObject; Field: TField);
begin
    if (qproductos.FieldByName('pesadomanual').AsInteger=1) and a_cero then
    begin
       pesar.Visible:=true;
       tpesar.enabled:=false;
       tboton.enabled:=true;
       ppesadas.Color:=clBtnFace;
       lpesomaximo.Visible:=false;
       lpesominimo.Visible:=false;
    end;
    if qproductos.FieldByName('pesadomanual').AsInteger=0 then
    begin
//       a_cero:=true;
        if ppesadas.color<>cllime then pesar.Visible:=false;
        tpesar.Enabled:=true;
        tboton.enabled:=false;
        lpesomaximo.Visible:=true;
        lpesominimo.Visible:=true;
    end;
    lproducto.Caption:=qproductos.FieldByName('codigo').asstring;
end;

procedure Tpprincipal.dsqmovimientos_mesaDataChange(Sender: TObject;
  Field: TField);
begin
   ltotempleados.Caption:='Total en el puesto :'+inttostr(qmovimientos_mesa.RecordCount);
end;

procedure Tpprincipal.dsqpuestosDataChange(Sender: TObject; Field: TField);
var dia,mes,anyo:word;
    tfecha:string;
begin
    decodedate(fechacontrol.date,anyo,mes,dia);
    tfecha:=''''+floattostr(anyo)+'/'+floattostr(mes)+'/'+floattostr(dia)+'''';
    qmovimientos_mesa2.close;
    qmovimientos_mesa2.sql.Clear;
    qmovimientos_mesa2.sql.Add('select * from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qmovimientos_mesa2.open;
    qaux.close;
    qaux.SQL.Clear;
    qaux.sql.Add('select count(distinct(trabajador)) from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qaux.Open;
    lnumtrabajadores.Caption:='Nº de trabajadores: '+inttostr(qaux.fields[0].asinteger);

end;

procedure Tpprincipal.dsqsectoresDataChange(Sender: TObject; Field: TField);
var dia,mes,anyo:word;
    tfecha:string;
begin
    decodedate(fechacontrol.date,anyo,mes,dia);
    tfecha:=''''+floattostr(anyo)+'/'+floattostr(mes)+'/'+floattostr(dia)+'''';
    qmovimientos_mesa2.close;
    qmovimientos_mesa2.sql.Clear;
    qmovimientos_mesa2.sql.Add('select * from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qmovimientos_mesa2.open;
    qaux.close;
    qaux.SQL.Clear;
    qaux.sql.Add('select count(distinct(trabajador)) from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qaux.Open;
    lnumtrabajadores.Caption:='Nº de trabajadores: '+inttostr(qaux.fields[0].asinteger);
end;

procedure Tpprincipal.btanadirClick(Sender: TObject);
var horaajustada:ttime;
    hora,minutos,horaaj,minutosaj:word;
    dhora,dminutos,dsegundos,dmilisegundos:word;
    horasfact:real;
    tid:integer;
    horarealanterior,horaajustadaanterior:real;
begin
if edit1.Text<>'' then
begin




/// compruebo que no esta en esta mesa y la inserto
    qaux2.SQL.Clear;
    qaux2.sql.add('select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and idt='+qaux.fields[1].asstring+' and salida_real is null ');
    qaux2.open;

    if qaux2.RecordCount=0  then
    begin

        decodetime(now,dhora,dminutos,dsegundos,dmilisegundos);
        horaaj:=dhora;

        if (dminutos<=ajusteentrada) then minutosaj:=0;
        if (dminutos>ajusteentrada) and (dminutos<=15+ajusteentrada) then minutosaj:=15;
        if (dminutos>15+ajusteentrada) and (dminutos<=30+ajusteentrada) then minutosaj:=30;
        if (dminutos>30+ajusteentrada) and (dminutos<=45+ajusteentrada) then minutosaj:=45;
        if dminutos>45+ajusteentrada then
        begin
            minutosaj:=0;
            horaaj:=horaaj+1;
        end;
// compruebo que no este en otra mesa para ajustar la hora
        qaux2.SQL.Clear;
        qaux2.sql.add('select * from movimiento_mesas where mesa<>'+''''+lmesa.Caption+''''+' and idt='+qaux.fields[1].asstring+' and salida_real is null ');
        qaux2.open;
        if qaux2.RecordCount>0 then horaajustada:=time else horaajustada:=encodetime(horaaj,minutosaj,0,0);

        qaux4.Close;
        qaux4.SQL.Clear;
        qaux4.SQL.Add('select min(id),max(id) from movimiento_mesas_local');
        qaux4.Open;
        if qaux4.Fields[0].AsInteger<=0 then tid:=qaux4.Fields[0].asinteger-1
        else tid:=(qaux4.Fields[1].asinteger+1)*-1;


        lc_movimientos_mesa.Open;
        lc_movimientos_mesa.append;
        lc_movimientos_mesa.FieldByName('id').Value:=tid;
        lc_movimientos_mesa.FieldByName('fecha').Value:=date;//gfecha;
        lc_movimientos_mesa.FieldByName('mesa').Value:=lmesa.Caption;
        lc_movimientos_mesa.FieldByName('idt').Value:=qaux.Fields[1].Asinteger;
        lc_movimientos_mesa.FieldByName('TRABAJADOR').Value:=qaux.Fields[0].AsString;
        lc_movimientos_mesa.FieldByName('ENTRADA_REAL').Value:=time;
        lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').Value:=horaajustada;
        lc_movimientos_mesa.FieldByName('PUESTO').Value:=qtrabajosalmacen.FieldByName('puesto').AsString;
        lc_movimientos_mesa.FieldByName('TIPOTRABAJO').Value:=qtrabajosalmacen.FieldByName('tipo_trabajo').AsString;
        lc_movimientos_mesa.FieldByName('ARTICULO').Value:=qtrabajosalmacen.FieldByName('articulo').AsString;
        lc_movimientos_mesa.FieldByName('PARCELA').value:=qtrabajosalmacen.FieldByName('parcela').asstring;
        lc_movimientos_mesa.FieldByName('estado').value:=1;
        if ednumero.Visible then  lc_movimientos_mesa.FieldByName('num_limpiadora').value:=strtoint(ednumero.Text);
        lc_movimientos_mesa.post;
        lc_movimientos_mesa.close;
    end;

///compruebo si esta en otra mesa la saco de la mesa
    qaux2.SQL.Clear;
    qaux2.sql.add('select * from movimiento_mesas where mesa<>'+''''+lmesa.Caption+''''+' and idt='+qaux.fields[1].asstring+' and salida_real is null ');
    qaux2.open;
    ///
    if qaux2.RecordCount>0 then
    begin
       while not qaux2.eof do
       begin

            qaux4.close;
            qaux4.SQL.Clear;
            qaux4.SQL.Add('select * from movimiento_mesas_local where id='+qaux2.Fields[0].Asstring+' and mesa<>'+''''+lmesa.Caption+''''+' and idt='+qaux.fields[1].asstring+' and salida_real is null' );
            qaux4.Open;
            if qaux4.RecordCount=0 then
            begin
                lc_movimientos_mesa.Open;
                lc_movimientos_mesa.append;
                lc_movimientos_mesa.FieldByName('id').Value:=qaux2.Fields[0].asinteger;
                lc_movimientos_mesa.FieldByName('fecha').Value:=qaux2.Fields[1].asdatetime;
                lc_movimientos_mesa.FieldByName('mesa').Value:=qaux2.Fields[2].asstring;
                lc_movimientos_mesa.FieldByName('idt').Value:=qaux2.Fields[3].asinteger;
                lc_movimientos_mesa.FieldByName('TRABAJADOR').Value:=qaux2.Fields[4].asstring;
                lc_movimientos_mesa.FieldByName('ENTRADA_REAL').Value:=qaux2.Fields[5].asdatetime;
                lc_movimientos_mesa.FieldByName('SALIDA_REAL').Value:=time;
                lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').Value:=qaux2.Fields[7].asdatetime;
                lc_movimientos_mesa.FieldByName('SALIDA_AJUSTADA').Value:=horaajustada;
                lc_movimientos_mesa.FieldByName('HORASREALES').Value:=time-qaux2.Fields[6].AsDateTime;
                lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=horaajustada-qaux2.Fields[7].asdatetime;
                lc_movimientos_mesa.FieldByName('PUESTO').Value:=qaux2.Fields[11].AsString;
                lc_movimientos_mesa.FieldByName('TIPOTRABAJO').Value:=qaux2.Fields[12].AsString;
                lc_movimientos_mesa.FieldByName('ARTICULO').Value:=qaux2.Fields[13].AsString;
                lc_movimientos_mesa.FieldByName('PARCELA').value:=qaux2.Fields[14].AsString;
                lc_movimientos_mesa.FieldByName('estado').value:=2;
                lc_movimientos_mesa.post;
            end else
            begin
                //lc_movimientos_mesa.Open;
                lc_movimientos_mesa.Locate('id',qaux2.Fields[0].asstring,[locaseinsensitive,lopartialkey]);
                lc_movimientos_mesa.edit;
                lc_movimientos_mesa.FieldByName('SALIDA_REAL').Value:=time;
                lc_movimientos_mesa.FieldByName('SALIDA_AJUSTADA').Value:=time;//horaajustada;
                lc_movimientos_mesa.FieldByName('HORASREALES').Value:=time-qaux2.Fields[6].AsDateTime;
                lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=time-qaux2.Fields[7].asdatetime;//horaajustada-qaux2.Fields[7].asdatetime;
                lc_movimientos_mesa.FieldByName('estado').value:=2;
                lc_movimientos_mesa.post;
            end;
            qaux2.Next;
       end;
    qaux4.Close;
    qaux4.SQL.Clear;
    qaux4.SQL.Add('select min(id)-1 from trabajo_diario_local');
    qaux4.Open;

    tid:=qaux4.Fields[0].AsInteger;
    if tid=0 then tid:=-1;
    if tid>0 then tid:=tid*-1;
    horasfact:=lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').asfloat*24;
    lc_trabajo_diario.open;
    lc_trabajo_diario.Append;
    lc_trabajo_diario.FieldByName('id').value:=tid;
    lc_trabajo_diario.FieldByName('fecha').value:=lc_movimientos_mesa.FieldByName('fecha').AsDateTime;
    lc_trabajo_diario.FieldByName('parcela').value:=lc_movimientos_mesa.FieldByName('PARCELA').AsString;
    lc_trabajo_diario.FieldByName('idt').value:=lc_movimientos_mesa.FieldByName('idt').AsInteger;
    lc_trabajo_diario.FieldByName('trabajador').value:=lc_movimientos_mesa.FieldByName('TRABAJADOR').AsString;
    lc_trabajo_diario.FieldByName('typework').value:=lc_movimientos_mesa.FieldByName('TIPOTRABAJO').AsString;
    lc_trabajo_diario.FieldByName('articulo').value:=lc_movimientos_mesa.FieldByName('ARTICULO').AsString;
    lc_trabajo_diario.FieldByName('qhoras').value:=horasfact;
    lc_trabajo_diario.FieldByName('precio').value:=0;
    lc_trabajo_diario.FieldByName('total').value:=0;
    lc_trabajo_diario.FieldByName('estadotrabajodiario').value:='S';
    lc_trabajo_diario.FieldByName('estado').Value:=1;
    lc_trabajo_diario.FieldByName('origen').Value:=lc_movimientos_mesa.FieldByName('mesa').Asstring+' '+lc_movimientos_mesa.FieldByName('fecha').Asstring+' desde las '+lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsString+' hasta las '+lc_movimientos_mesa.FieldByName('SALIDA_REAL').AsString;
    if horasfact>0 then lc_trabajo_diario.post else lc_trabajo_diario.Cancel;
//    lc_trabajo_diario.post

    end;

    qmovimientos_mesa.Close;
    qmovimientos_mesa.SQL.Clear;
    qmovimientos_mesa.sql.add(' select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null ');
    qmovimientos_mesa.sql.add('  order by trabajador');
    qmovimientos_mesa.open;
    qenvasadoras.SQL.Clear;
    qenvasadoras.sql.add('select idt,trabajador from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and puesto like('+''''+'%ENVASADORA%'+''''+')');
    qenvasadoras.open;
    desdegrid:=false;
    edit1.Clear;
    edit1.SetFocus;
    label5.Caption:='';
    ednumero.Text:='';
    qtrabajosalmacen.Close;
end;

end;

procedure Tpprincipal.btconfiguracionClick(Sender: TObject);
begin
    pentradas.Visible:=false;
    plimpiadoras.visible:=false;
    pcontrol.Visible:=false;
    pconfiguracion.Visible:=true;
    qsectores.Close;
    qvariedadeslinea.Close;
    qproductoslinea.Close;
    qmprimas2.Close;
    qproductos2.Close;
    qsectores.open;
    qvariedadeslinea.open;
    qproductoslinea.open;
    qmprimas2.open;
    qproductos2.open;
    timer4.Enabled:=true;
end;

procedure Tpprincipal.btcontrolClick(Sender: TObject);
begin
    pentradas.Visible:=false;
    plimpiadoras.visible:=false;
    pcontrol.Visible:=true;
    pconfiguracion.Visible:=false;
    fechacontrol.Date:=date();
    qpuestos.Close;
    qsectores.Close;
    qmovimientos_mesa2.close;
    qsectores.open;
    qpuestos.open;
    qmovimientos_mesa2.open;


end;

procedure Tpprincipal.btentradasmprimasClick(Sender: TObject);
var dia,mes,anyo:word;
    vanyo,vmes,vdia,vfecha:string;
begin
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    vfecha:=''''+vanyo+'-'+vmes+'-'+vdia+'''';
    pentradas.Visible:=true;
    plimpiadoras.visible:=false;
    pcontrol.Visible:=false;
    pconfiguracion.Visible:=false;
    qsectores.Close;
    qsectores.Open;
    qpesadassector.Close;
    qpesadassector.SQL.Clear;
    qpesadassector.SQL.Add('select * from pesadas_sector where fecha='+vfecha+' order by fecha desc, hora desc');
    qpesadassector.Open;
end;

procedure Tpprincipal.btterminarClick(Sender: TObject);
var horaajustada,ahora,control,vhorainicioalmuerzo,vhorafinalmuerzo,vhoracomienzomerienda,vhorafinmerienda:ttime;
    hora,minutos,horaaj,minutosaj,anyo,mes,dia:word;
    dhora,dminutos,dsegundos,dmilisegundos:word;
    horasfact:real;
    tid,descuento:integer;
    vmes,vdia,vanyo,vfecha,sdescuento:string;
    descanso:integer;
begin
/// obtengo el id del nempleado
    descanso:=empresa.FieldByName('tiempoalmuerzo').AsInteger;
    lc_movimientos_mesa.close;
    lc_movimientos_mesa.open;
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    if length(vmes)=1 then vmes:='0'+vmes;
    if length(vdia)=1 then vdia:='0'+vdia;
    vfecha:=vanyo+'-'+vmes+'-'+vdia;
    tcalendario_laboral.open;
    tcalendario_laboral.locate('fecha',vfecha,[locaseinsensitive,lopartialkey]);
    vhorainicioalmuerzo:=tcalendario_laboral.FieldByName('inicio_almuerzo').AsDateTime;
    vhorafinalmuerzo:=tcalendario_laboral.FieldByName('fin_almuerzo').AsDateTime;
    vhoracomienzomerienda:=tcalendario_laboral.FieldByName('inicio_merienda').AsDateTime;
    vhorafinmerienda:=tcalendario_laboral.FieldByName('fin_merienda').AsDateTime;
    ahora:=timeof(now);
    control:=strtotime('15:00:00');
    if ahora<control then
    begin
          if (vhorainicioalmuerzo>0) and (vhorafinalmuerzo>0)  then
          begin
             decodetime(vhorafinalmuerzo-vhorainicioalmuerzo,dhora,dminutos,dsegundos,dmilisegundos);
             descanso:=dhora*60+dminutos;
          end;

          descuento:=descanso*(tcalendario_laboral.FieldByName('almuerzo').asinteger);
    end;
 //   control:=strtotime('17:00:00');
    if ahora>control then
    begin
          if (vhoracomienzomerienda>0) and (vhorafinmerienda>0) then
          begin
             decodetime(vhorafinmerienda-vhoracomienzomerienda,dhora,dminutos,dsegundos,dmilisegundos);
             descanso:=dhora*60+dminutos;
          end;

          descuento:=descanso*(tcalendario_laboral.FieldByName('merienda').asinteger);
    end;
    decodetime(now,dhora,dminutos,dsegundos,dmilisegundos);
    horaaj:=dhora;
    if (dminutos<=ajustesalida) then minutosaj:=0;
    if (dminutos>ajustesalida) and (dminutos<=ajustesalida+15) then minutosaj:=15;
    if (dminutos>ajustesalida+15) and (dminutos<=ajustesalida+30) then minutosaj:=30;
    if (dminutos>ajustesalida+30) and (dminutos<=ajustesalida+45) then minutosaj:=45;
    if dminutos>ajustesalida+45 then
    begin
        minutosaj:=0;
        horaaj:=horaaj+1;
    end;

    horaajustada:=encodetime(horaaj,minutosaj,0,0);

    if ahora<control then
    begin
    if ((lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsDateTime<vhorainicioalmuerzo) or (lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsDateTime=lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').AsDateTime))
       and ( horaajustada>=vhorafinalmuerzo) then
    begin
      descuento:=descuento;
    end else descuento:=0;
    end;
    if (ahora>control) then
    begin
    if ((lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsDateTime<vhoracomienzomerienda) or (lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsDateTime=lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').AsDateTime)) and ( horaajustada>vhorafinmerienda) then
    begin
      descuento:=descuento;
    end else descuento:=0;
    end;

    if (horaajustada-lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').AsDateTime)*24=0 then descuento:=0;
    if descuento=0 then sdescuento:='00:00:00' else sdescuento:='00:'+inttostr(descuento)+':00';
    lc_movimientos_mesa.Locate('id',gid,[locaseinsensitive]);
    if lc_movimientos_mesa.FieldByName('estado').AsInteger=1 then
    begin
        lc_movimientos_mesa.Edit;
        lc_movimientos_mesa.FieldByName('SALIDA_REAL').Value:=time;
        lc_movimientos_mesa.FieldByName('SALIDA_AJUSTADA').Value:=horaajustada;
        lc_movimientos_mesa.FieldByName('HORASREALES').Value:=now-lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').asdatetime;//-strtotime(sdescuento);
        if horaajustada<lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').AsDateTime then
        begin
           lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=0
        end else
            lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=horaajustada-lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').asdatetime-strtotime(sdescuento);
            lc_movimientos_mesa.FieldByName('estado').value:=1;
        lc_movimientos_mesa.Post;
        qmovimientos_mesa.Refresh;
    end;
    if lc_movimientos_mesa.FieldByName('estado').AsInteger=0 then
    begin
        lc_movimientos_mesa.Edit;
        lc_movimientos_mesa.FieldByName('SALIDA_REAL').Value:=time;
        lc_movimientos_mesa.FieldByName('SALIDA_AJUSTADA').Value:=horaajustada;
        lc_movimientos_mesa.FieldByName('HORASREALES').Value:=now-lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').asdatetime-strtotime(sdescuento);
        if horaajustada<lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').AsDateTime then
        begin
           lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=0
        end else
           lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').Value:=horaajustada-lc_movimientos_mesa.FieldByName('ENTRADA_AJUSTADA').asdatetime-strtotime(sdescuento);
        lc_movimientos_mesa.FieldByName('estado').value:=2;
        lc_movimientos_mesa.Post;
        qmovimientos_mesa.Refresh;
    end;


    qaux2.SQL.Clear;
    qaux2.SQL.Add('select min(id)-1 from trabajo_diario_local');
    qaux2.Open;

    tid:=qaux2.Fields[0].AsInteger;
    if tid=0 then tid:=-1;
    if tid>0 then tid:=tid*-1;
    horasfact:=lc_movimientos_mesa.FieldByName('HORASAJUSTADAS').asfloat*24;
    lc_trabajo_diario.open;
    lc_trabajo_diario.Append;
    lc_trabajo_diario.FieldByName('id').value:=tid;
    lc_trabajo_diario.FieldByName('fecha').value:=lc_movimientos_mesa.FieldByName('fecha').AsDateTime;
    lc_trabajo_diario.FieldByName('parcela').value:=lc_movimientos_mesa.FieldByName('PARCELA').AsString;
    lc_trabajo_diario.FieldByName('idt').value:=lc_movimientos_mesa.FieldByName('idt').AsInteger;
    lc_trabajo_diario.FieldByName('trabajador').value:=lc_movimientos_mesa.FieldByName('TRABAJADOR').AsString;
    lc_trabajo_diario.FieldByName('typework').value:=lc_movimientos_mesa.FieldByName('TIPOTRABAJO').AsString;
    lc_trabajo_diario.FieldByName('articulo').value:=lc_movimientos_mesa.FieldByName('ARTICULO').AsString;
    lc_trabajo_diario.FieldByName('qhoras').value:=horasfact;
    lc_trabajo_diario.FieldByName('precio').value:=0;
    lc_trabajo_diario.FieldByName('total').value:=0;
    lc_trabajo_diario.FieldByName('estadotrabajodiario').value:='S';
    lc_trabajo_diario.FieldByName('estado').Value:=1;
    lc_trabajo_diario.FieldByName('origen').Value:=lmesa.Caption+' '+lc_movimientos_mesa.FieldByName('fecha').Asstring+' desde las '+lc_movimientos_mesa.FieldByName('ENTRADA_REAL').AsString+' hasta las '+lc_movimientos_mesa.FieldByName('SALIDA_REAL').AsString;
    if horasfact>0 then lc_trabajo_diario.post else lc_trabajo_diario.Cancel;



    qmovimientos_mesa.Close;
    qmovimientos_mesa.SQL.Clear;
    qmovimientos_mesa.sql.add(' select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null ');
    qmovimientos_mesa.sql.add(' order by trabajador');
    qmovimientos_mesa.open;

    combopuestos.Visible:=true;
    dbgrid2.SetFocus;
    edit1.Clear;
    edit1.SetFocus;
    qenvasadoras.SQL.Clear;
    qenvasadoras.sql.add('select idt,trabajador from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and puesto='+''''+'ENVASADORA'+'''');
    qenvasadoras.open;
    desdegrid:=false;
    btanadir.Visible:=true;
    btterminar.Visible:=false;
    combopuestos.Visible:=true;
    label5.caption:='';
    qtrabajosalmacen.Close;
    combopuestos.ListFieldIndex:=-1;
    qaux.Close;
    timer4.Enabled:=true;

end;

procedure Tpprincipal.bpenvasadaClick(Sender: TObject);
begin
    tpesar.Enabled:=enabled;
    ta_cero.Enabled:=enabled;
    paquetes:=0;
    cadena:='';
    if (combovariedad.Text='') or (comboproducto.Text='') or (comboenvasadoras.Text='') then
    begin
        showmessage('DEBE SELECCIONAR VARIEDAD, PRODUCTO  Y ENVASADORA');
    end ELSE
    begin
        plimpiadoras.Visible:=false;
        ppesadas.Visible:=true;
        ppesaruvalimpiadoras.Visible:=false;
        BPENVASADA.Visible:=FALSE;
        BPLIMPIADORA.Visible:=TRUE;
        ta_cero.enabled:=true;
        tpesar.enabled:=true;
        timer4.Enabled:=false;
        if puerto1.Connected=false then puerto1.Connected:=true;
        bloqueado:=false;
        if teclado.visible=true then teclado.Visible:=false;
        qmovimientos_mesa.close;
        lc_trabajo_diario.close;
        lc_movimientos_mesa.Close;
        button4.SetFocus;
    end;

end;

procedure Tpprincipal.Edit1Enter(Sender: TObject);
begin
   edit1.Clear;
end;

procedure Tpprincipal.Edit1Exit(Sender: TObject);
begin
    if edit1.text<>'' then
    begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('select nombre,id from trabajadores where nif='+''''+edit1.Text+'''');
        qaux.open;
            if qaux.RecordCount>0 then
            begin
            label5.Caption:=qaux.Fields[0].AsString;

            qaux2.Close;
            qaux2.SQL.Clear;
            qaux2.sql.add('select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and idt='+qaux.fields[1].asstring);
            qaux2.sql.add('  order by idt');
            qaux2.open;
            if (qaux2.RecordCount>0) and (not desdegrid) then
            begin
                edit1.Clear;
                edit1.SetFocus;
                btanadir.Enabled:=true;
                btanadir.Caption:='Añadir';
                combopuestos.Visible:=true;
            end;
        end else
             begin
               showmessage('EMPLEADO/A NO ENCONTRADO');
               EDIT1.SetFocus;
             end;
    end else
    begin
       label5.Caption:='';
    end;
    desdetrabajador:=true;
    qtrabajosalmacen.Open;
    combopuestos.ListFieldIndex:=-1;
end;

procedure Tpprincipal.Edit2Enter(Sender: TObject);
begin
    edit2.Clear;
end;

procedure Tpprincipal.Edit2Exit(Sender: TObject);
var peso:real;
    pesoletras,vdia,vmes,vanyo,vfecha:string;
    mes,dia,anyo:word;
begin
if edit2.Text<>'' then
begin
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    if length(vmes)=1 then vmes:='0'+vmes;
    if length(vdia)=1 then vdia:='0'+vdia;
    vfecha:=''''+vanyo+'-'+vmes+'-'+vdia+'''';
    num_limpiadora:=-1;
    qaux.Close;
    qaux.SQL.Clear;
    qaux.SQL.Add('select trabajador,idt,num_limpiadora from movimiento_mesas  where fecha='+vfecha+' and mesa='+''''+lmesa.caption+''''+' and idt=(select id from trabajadores where nif='+''''+edit2.Text+''''+')');
    qaux.open;
    if qaux.RecordCount>0 then
    num_limpiadora:=qaux.Fields[1].AsInteger
    else
    begin
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('select trabajador,idt,num_limpiadora from movimiento_mesas  where fecha='+vfecha+' and mesa='+''''+lmesa.caption+''''+' and num_limpiadora='+''''+edit2.Text+'''');
      qaux.open;
      if qaux.RecordCount>0 then
      num_limpiadora:=qaux.Fields[1].AsInteger
      else num_limpiadora:=-1
    end;
    if num_limpiadora=-1 then
    begin
        showmessage('TRABAJADOR/A NO REGISTRADO EN EL PUESTO');
        edit2.SetFocus;
    end;
end;

end;

procedure Tpprincipal.ednumeroEnter(Sender: TObject);
begin
    teclado2.Visible:=true;
    teclado2.Top:=ednumero.Top+135;
    teclado2.left:=ednumero.Left+105+139;
end;

procedure Tpprincipal.ednumeroExit(Sender: TObject);
begin
   teclado2.Visible:=false;
end;

procedure Tpprincipal.fechacontrolChange(Sender: TObject);
var dia,mes,anyo:word;
    tfecha:string;
begin
    decodedate(fechacontrol.date,anyo,mes,dia);
    tfecha:=''''+floattostr(anyo)+'/'+floattostr(mes)+'/'+floattostr(dia)+'''';
    qmovimientos_mesa2.close;
    qmovimientos_mesa2.sql.Clear;
    qmovimientos_mesa2.sql.Add('select * from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qmovimientos_mesa2.open;
    qaux.close;
    qaux.SQL.Clear;
    qaux.sql.Add('select count(distinct(trabajador)) from movimiento_mesas where fecha='+tfecha+' and mesa='+''''+qpuestos.FieldByName('descripcion').AsString+''''+' order by trabajador');
    qaux.Open;
    lnumtrabajadores.Caption:='Nº de trabajadores: '+inttostr(qaux.fields[0].asinteger);

end;

procedure Tpprincipal.lidEnter(Sender: TObject);
begin
    teclado2.Visible:=true;
    teclado2.Top:=lid.Top;
    teclado2.left:=lid.Left+165+139;
end;

procedure Tpprincipal.lidExit(Sender: TObject);
begin
    teclado2.Visible:=false;
end;

procedure Tpprincipal.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if (key='.') and (activecontrol is tdbedit) then
    begin
       if  (activecontrol as tdbedit).Field.DataType in [ftfloat,ftCurrency,ftbcd,ftfmtbcd] then key:=','
    end;
    if (key=#13) and not (activecontrol is tdblookupcontrol)then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;

end;

procedure Tpprincipal.FormShow(Sender: TObject);
var F: TextFile;
    sLinea,tuser,tpass,tpuerto: String;
    hora1,hora2,hora3:ttime;
    i: Integer;
    LQuery: TFDQuery;
    LModoLectura, LTriggersRxChar: Integer;
begin
  gfecha:=date;
  desdegrid:=false;
  visor:='';
  estable:=false;

  FINIFileName := ExtractFilePath(Application.ExeName) + 'mesas.ini';
  
  // Parse command line arguments for multi-instance custom config file
  for i := 1 to ParamCount do
  begin
    if StartsText('/ini:', ParamStr(i)) then
    begin
      FINIFileName := Copy(ParamStr(i), 6, Length(ParamStr(i)));
      if ExtractFilePath(FINIFileName) = '' then
        FINIFileName := ExtractFilePath(Application.ExeName) + FINIFileName;
    end;
  end;

  FLocalDBPath := ChangeFileExt(FINIFileName, '_local.db');
  InicializarBaseDatosLocal(FLocalDBPath);

  if not FileExists(FINIFileName) then
  begin
    fconfiguracion := Tfconfiguracion.Create(Self);
    try
      fconfiguracion.INIFileName := FINIFileName;
      if fconfiguracion.ShowModal <> mrOk then
      begin
        Application.Terminate;
        Exit;
      end;
    finally
      fconfiguracion.Free;
    end;
  end;

  AssignFile( F, FINIFileName );
  Reset( F );
  Memo1.Clear;
  while not Eof( F ) do
  begin
    ReadLn( F, sLinea );
    Memo1.Lines.Add( sLinea );
  end;

  CloseFile( F );
    thost:=memo1.lines[0];
    tuser:=memo1.lines[1];
    tpass:=memo1.lines[2];
    tmesa:=memo1.lines[3];
    tbascula:=memo1.lines[4];
    tpuerto:=memo1.lines[5];
    ttipobascula:=memo1.lines[6];
    tpreguntarlimpiadora:=memo1.lines[7];
    treplicacion:=memo1.lines[8];
    tbasedatos:=memo1.lines[9];

    lmesa.Caption:='Puesto '+tmesa;
    lbascula.Caption:='Báscula ' +tbascula;
    if tpreguntarlimpiadora='1' then
    begin
      lnumero.Visible:=true;
      ednumero.Visible:=true;
      bplimpiadora.Visible:=true;
      bpenvasada.Visible:=false;
    end;
    if tpreguntarlimpiadora='0' then
    begin
      lnumero.Visible:=false;
      ednumero.Visible:=false;
      bplimpiadora.Visible:=false;
      bpenvasada.Visible:=true;
    end;

    // Conectar base de datos remota
    dbservidor.Connected:=false;
    dbservidor.Params.Clear;
    dbservidor.DriverName := 'MySQL';
    dbservidor.Params.Add('DriverID=MySQL');
    dbservidor.Params.Add('Server=' + thost);
    dbservidor.Params.Add('User=' + tuser);
    dbservidor.Params.Add('Password=' + tpass);
    dbservidor.Params.Add('Database=' + tbasedatos);
    dbservidor.LoginPrompt := False;
    try
       DBservidor.connected:=true;
       lconectado.caption:='CONECTADO A: ' +thost;
    except
       dbservidor.Connected := False;
       dbservidor.Params.Clear;
       dbservidor.DriverName := 'SQLite';
       dbservidor.Params.Add('DriverID=SQLite');
       dbservidor.Params.Add('Database=' + FLocalDBPath);
       dbservidor.LoginPrompt := False;
       try
         dbservidor.Connected := True;
       except
         // ignore
       end;
       lconectado.caption:='CONECTADO A: EQUIPO LOCAL';
    end;

    // Conectar base de datos local SQLite
    DBagrigest.Connected:=false;
    DBagrigest.Params.Clear;
    DBagrigest.DriverName := 'SQLite';
     DBagrigest.Params.Add('DriverID=SQLite');
    DBagrigest.Params.Add('Database=' + FLocalDBPath);
    DBagrigest.LoginPrompt := False;
    DBagrigest.connected:=true;

    // Configurar el puerto serie dinámicamente usando modelos_basculas del servidor
    LModoLectura := 0;
    LTriggersRxChar := 0;
    LQuery := TFDQuery.Create(nil);
    try
      LQuery.Connection := dbservidor;
      LQuery.SQL.Text := 'SELECT * FROM modelos_basculas WHERE id = :id';
      LQuery.ParamByName('id').AsInteger := StrToIntDef(ttipobascula, 0);
      try
        LQuery.Open;
        if not LQuery.Eof then
        begin
          puerto1.Connected := False;
          puerto1.Port := 'COM' + tpuerto;
          LModoLectura := LQuery.FieldByName('modo_lectura').AsInteger;
          LTriggersRxChar := LQuery.FieldByName('triggers_rx_char').AsInteger;
          
          if LModoLectura = 0 then
          begin
            puerto1.TriggersOnRxChar := False;
            comdata1.ComPort := puerto1;
            comdata2.ComPort := puerto1;
            comdata1.MaxBufferSize := LQuery.FieldByName('cd1_buf_size').AsInteger;
            comdata1.Size := LQuery.FieldByName('cd1_buf_size').AsInteger;
            comdata1.StartString := LQuery.FieldByName('cd1_start').AsString;
            comdata1.StopString := LQuery.FieldByName('cd1_stop').AsString;
            
            comdata2.MaxBufferSize := LQuery.FieldByName('cd2_buf_size').AsInteger;
            comdata2.Size := LQuery.FieldByName('cd2_buf_size').AsInteger;
            comdata2.StartString := LQuery.FieldByName('cd2_start').AsString;
            comdata2.StopString := LQuery.FieldByName('cd2_stop').AsString;
          end
          else
          begin
            comdata1.ComPort := nil;
            comdata2.ComPort := nil;
            puerto1.TriggersOnRxChar := LTriggersRxChar = 1;
          end;
          
          try
            puerto1.Connected := True;
          except
            // silent fail
          end;
        end;
      except
        // fallback local if offline
      end;
    finally
      LQuery.Free;
    end;

    // Inicializar y correr hilo de replicación integrado
    if treplicacion = '1' then
    begin
      if Assigned(FSyncThread) then
      begin
        FSyncThread.Terminate;
        FSyncThread.WaitFor;
      end;
      FSyncThread := TSyncThread.Create(FLocalDBPath, thost, tuser, tpass, tbasedatos, 5);
      FSyncThread.OnStatusChange := OnSyncStatusChange;
      FSyncThread.OnLogoutRequest := OnLogoutRequest;
      FSyncThread.Start;
    end;

    qaux.SQL.Clear;
    plimpiadoras.Visible:=false;
    ppesadas.Visible:=false;
    ppesaruvalimpiadoras.Visible:=false;
    tcalendario_laboral.open;

    qtrabajosalmacen.Open;
    qmovimientos_mesa.close;
    qmovimientos_mesa.SQL.Clear;
    qmovimientos_mesa.sql.add(' select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null order by trabajador');
    qmovimientos_mesa.open;
    qenvasadoras.Close;
    qenvasadoras.SQL.Clear;
    qenvasadoras.sql.add('select idt,trabajador from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null and puesto like('+''''+'%ENVASADORA%'+''''+')');
    qenvasadoras.open;
    qtrabajosalmacen.close;
    qtrabajosalmacen.SQL.Clear;
    qtrabajosalmacen.sql.add(' select * from TRABAJOS_ALMACEN where activo=1 and mesas like ('+''''+'%*'+tmesa+'*%'+'''' +') ORDER BY puesto');
    qtrabajosalmacen.open;
    qproductos.close;
    qproductos.sql.clear;
    qproductos.sql.add('select * from productos WHERE (codigo) in (select codigo from productos_sector ');
    qproductos.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by descripcion');
    qproductos.ParamByName('MESA').AsInteger:=strtoint(tmesa);
    qproductos.Open;
    try
      try
      qproductos.open;
      except
          qproductos.connection:=dbagrigest;
          qproductos.SQL.Clear;
          qproductos.SQL.Add('SELECT * FROM productos WHERE activo=1 ORDER BY descripcion');
          qproductos.open;
      end;
    finally
    if qproductos.Active then
    begin
    //    if qproductos.Active and (qproductos.RecordCount>0) then comboproducto.KeyValue:=qproductoscodigo.AsString;
        if (not qproductos.Active) or (qproductos.RecordCount=0) or (dbservidor.Params.Values['Server']='localhost') then
        begin
          qproductos.sql.clear;
          qproductos.sql.add('select * from productos WHERE ACTIVO=1 ORDER BY descripcion');
          qproductos.open;
        end;
    //    comboproducto.KeyValue:=qproductoscodigo.AsString;
    end;
    end;
    qmprimas.close;
    qmprimas.sql.clear;
    qmprimas.sql.add('select * from MATERIAS_PRIMAS WHERE (idempresa,id) in (select ide,mprima from materias_primas_sector ');
    qmprimas.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by descripcion');
    qmprimas.ParamByName('MESA').AsInteger:=strtoint(tmesa);
    qmprimas.Open;
    try
      try
        qmprimas.open;
      except
        qmprimas.connection:=dbagrigest;
        qmprimas.SQL.Clear;
        qmprimas.SQL.Add('SELECT * FROM materias_primas WHERE activo=1 ORDER BY variedad');
        qmprimas.open;
      end;
    finally
    if qmprimas.Active then
    begin
    //    if qmprimas.Active and (qmprimas.RecordCount>0) then combovariedad.KeyValue:=qmprimasid.AsString;
        if (not qmprimas.Active) or (qmprimas.RecordCount=0) or (dbservidor.Params.Values['Server']='localhost') then
        begin
          qmprimas.sql.clear;
          qmprimas.sql.add('select * from MATERIAS_PRIMAS WHERE ACTIVO=1 ORDER BY descripcion');
          qmprimas.open;
        end;
    end;
    end;
end;
procedure Tpprincipal.PESARClick(Sender: TObject);
var peso:real;
    pesoletras:string;
begin
    try
//    puerto1.Open;
    pesoletras:=lpeso.Caption;
    a_cero:=false;
    try
       peso:=strtofloat(pesoletras);
    except

    end;
    pesar.visible:=false;
    tboton.Enabled:=false;
    if qproductos.FieldByName('pesadomanual').AsInteger=1 then
    begin

        lc_produccion.Open;
        lc_produccion.Append;
        lc_produccion.FieldByName('fecha').value:=date;//gfecha;
        lc_produccion.FieldByName('hora').value:=time;
        lc_produccion.FieldByName('mesa').value:=lmesa.Caption;
        lc_produccion.FieldByName('bascula').value:=lbascula.Caption;
        lc_produccion.FieldByName('idt').value:=qenvasadoras.FieldByName('idt').asinteger;
        lc_produccion.FieldByName('embasadora').value:=qenvasadoras.FieldByName('trabajador').asstring;
        lc_produccion.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
        lc_produccion.FieldByName('producto').value:=qproductos.FieldByName('codigo').asstring;
        lc_produccion.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
        lc_produccion.FieldByName('peso_teorico').value:=qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('peso').AsFloat;
        lc_produccion.FieldByName('peso_real').Value:=pesovalido;//peso;
        lc_produccion.FieldByName('estado').Value:=1;
        lc_produccion.Post;
        ppesadas.Color:=clLime;
        lpiezas.Caption:='0';
        a_cero:=false;
        ta_cero.Enabled:=true;
        tboton.enabled:=true;
        bloqueado:=false;
        estable:=false;
        pesovalido:=0;
    end;
    if qproductos.FieldByName('pesadomanual').asinteger=0 then
    begin

        lc_produccion.Open;
        lc_produccion.Append;
        lc_produccion.FieldByName('fecha').value:=date;//gfecha;
        lc_produccion.FieldByName('hora').value:=time;
        lc_produccion.FieldByName('mesa').value:=lmesa.Caption;
        lc_produccion.FieldByName('bascula').value:=lbascula.Caption;
        lc_produccion.FieldByName('idt').value:=qenvasadoras.FieldByName('idt').asinteger;
        lc_produccion.FieldByName('embasadora').value:=qenvasadoras.FieldByName('trabajador').asstring;
        lc_produccion.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
        lc_produccion.FieldByName('producto').value:=qproductos.FieldByName('codigo').asstring;
        lc_produccion.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
        lc_produccion.FieldByName('peso_teorico').value:=qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('peso').AsFloat;
        lc_produccion.FieldByName('peso_real').Value:=peso;
        lc_produccion.FieldByName('estado').Value:=1;
        lc_produccion.Post;
        tboton.enabled:=false;
        a_cero:=false;
        ta_cero.Enabled:=true;
        estable:=false;
        pesar.visible:=false;
        bloqueado:=false;
    end;
    finally
    end;

end;

procedure Tpprincipal.puerto1RxBuf(Sender: TObject; const Buffer;
  Count: Integer);
  var str:string;
begin
if ttipobascula='0' then
    begin
      puerto1.Readstr(Str, Count);
    end;
if ttipobascula='1' then
    begin
      puerto1.Readstr(Str, Count);
    end;
if ttipobascula='4' then
    begin
      puerto1.Readstr(Str, Count);
    end;

end;

procedure Tpprincipal.puerto1RxChar(Sender: TObject; Count: Integer);
var
  str,primera: String;
  peso2:real;
  letra,x:integer;
  Buffer:array [0..10] of byte;
begin
/// tipo 10 bascula dibal don ciro
if ttipobascula='10' then
begin
  puerto1.ReadStr(Str, count);
  str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
  str:= StringReplace(str, '= ', '',[rfReplaceAll, rfIgnoreCase]);
  delete(str,8,length(str)-7);
  cadena:=str;
  if visor=cadena then
  begin
      estable:=true;
      if desbloqueado then tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;
  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    cadena:=floattostr(peso2);
    except
        on error: exception do
        begin
           peso2:=0;
           cadena:='------';
        end;
    end;

  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
end;
if ttipobascula='1' then
begin
  if count>=12 then
  begin
      puerto1.Readstr(Str, count);
      str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, '=','',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, '+', '',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, ' ', '',[rfReplaceAll, rfIgnoreCase]);
      cadena:=str;
      cadena:=solonumeros(cadena);
      cadena:=copy(cadena,0,7);
      if visor=cadena then
      begin
        estable:=true;
        try
        peso2:=strtofloat(cadena);
        vestable.Brush.Color:=clgreen;
        except
              on error: exception do
              begin
                 peso2:=0;
                 cadena:='------';
              end;
        end;
//        cadena:=floattostr(peso2);
        lpeso.caption:=cadena;
        lpesotrabajador.caption:=cadena;
      end
      else
      begin
       estable:=false;
       vestable.Brush.Color:=clred;
      end;
      visor:=cadena;

   end;

end;
{if ttipobascula='0' then
begin
  puerto1.ReadStr(Str, Count);
  str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
  str:= StringReplace(str, '= ', '',[rfReplaceAll, rfIgnoreCase]);
  delete(str,8,length(str)-7);
  cadena:=str;
 // cadena:=Copy(str, Length(str)+1- 6, 7);
//  str:= StringReplace(str, '=-', '',[rfReplaceAll, rfIgnoreCase]);
  if visor=cadena then estable:=true else estable:=false;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena);
    except
        on error: exception do
        begin
           peso2:=0;
           cadena:='------';
        end;
    end;

  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
//   lpeso.caption :=floattostr(strtofloat(cadena));
//  lpeso.caption :=Copy(str, Length(str)+1- 6, 6);
//  lpesotrabajador.caption :=Copy(str, Length(str)+1- 6, 6);
end;
if ttipobascula='2' then
begin
//  if count>=10 then
//  begin
      lpeso.caption:='dentro '+inttostr(count);
      x:=2;
      puerto1.Readstr(Str, count);
      str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, '=','',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, '+', '',[rfReplaceAll, rfIgnoreCase]);
      str:= StringReplace(str, ' ', '',[rfReplaceAll, rfIgnoreCase]);
      cadena:=str;
//      cadena:=solonumeros(cadena);

      cadena:=copy(cadena,0,7);
      if visor=cadena then
      begin
        estable:=true;
        try
        peso2:=strtofloat(cadena)/1000;
        vestable.Brush.Color:=clgreen;
        except
              on error: exception do
              begin
                 peso2:=0;
                 cadena:='------';
              end;
        end;
        cadena:=floattostr(peso2);
        lpeso.caption:=cadena;
        lpesotrabajador.caption:=cadena;
      end
      else
      begin
       estable:=false;
       vestable.Brush.Color:=clred;
      end;
      visor:=cadena;

  // end;// else lpeso.caption:=inttostr(count);

end;

      //    puerto1.ClearBuffer(true,true);
{  letra:=strtoint(cadena[7]);
  if (letra in [0..9])  then
  begin
      cadena:=cadena+str;
      cadena:= StringReplace(cadena, '.', ',',[rfReplaceAll, rfIgnoreCase]);
      cadena:= StringReplace(cadena, '= ', '',[rfReplaceAll, rfIgnoreCase]);
      cadena:= StringReplace(cadena, '+', '',[rfReplaceAll, rfIgnoreCase]);
      cadena:=copy(cadena,0,7);
      if visor=cadena then estable:=true else estable:=false;
      visor:=cadena;
      try
      peso2:=strtofloat(cadena);
    //    cadena:=format('<%6.3d>',[peso2]);
        //    cadena:=floattostr(peso2);
      //  visor:=floattostr(peso2);//cadena;
        except
            on error: exception do
            begin
               peso2:=0;
               cadena:='------';
            end;
        end;
        lpeso.caption:=cadena;
        lpesotrabajador.caption:=cadena;
        cadena:='';
        delete(str,0,length(str));
        cadena:=str;
  end else
         begin
          cadena:='';
          delete(str,0,length(str));
          cadena:=str;
         end;

  end;  }


// puerto1.Readstr(Str, count);
// str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
// str:= StringReplace(str, '= ', '',[rfReplaceAll, rfIgnoreCase]);
// str:= StringReplace(str, '+', ' ',[rfReplaceAll, rfIgnoreCase]);
// delete(str,8,length(str)-7);
// cadena:=str;
{ if visor=cadena then estable:=true else estable:=false;

 visor:=cadena;
 try
 peso2:=strtofloat(cadena);
 except
    on error: exception do
            begin
               peso2:=0;
  //             cadena:='------';
            end;
 end;
 lpeso.caption:=cadena;
 lpesotrabajador.caption:=cadena;
}
 // if length(str)>=7 then
 // begin
 // end;
 // puerto1.ClearBuffer(true,true);
  //   lpeso.caption :=floattostr(strtofloat(cadena));
//  lpeso.caption :=Copy(str, Length(str)+1- 6, 6);
//  lpesotrabajador.caption :=Copy(str, Length(str)+1- 6, 6);
if ttipobascula='3' then
begin
//if count>12 then
//begin
  puerto1.ReadStr(Str, Count);
//  if str[3]='.' then
//  begin
  str:= StringReplace(str, '.', ',',[rfReplaceAll, rfIgnoreCase]);
  str:= StringReplace(str, '= ', '',[rfReplaceAll, rfIgnoreCase]);
  delete(str,8,length(str)-7);
  cadena:=str;
 // cadena:=Copy(str, Length(str)+1- 6, 7);
//  str:= StringReplace(str, '=-', '',[rfReplaceAll, rfIgnoreCase]);
  if visor=cadena then
  begin
      estable:=true;
      tpesar.Enabled:=true;
      vestable.Brush.Color:=clgreen;
  end else
         begin
            estable:=false;
            tpesar.Enabled:=false;
            vestable.Brush.Color:=clred;
         end;

  visor:=cadena;
  try
    peso2:=strtofloat(cadena)*10;
    cadena:=floattostr(peso2);
    except
        on error: exception do
        begin
           peso2:=0;
           cadena:='------';
        end;
    end;

  lpeso.caption :=cadena;
  lpesotrabajador.caption :=cadena;
  //end;
//end;
end;

end;


procedure Tpprincipal.tpesarTimer(Sender: TObject);
var    pesoletras:string;
       peso,peso2,peso3,pesoconerror:real;
       anyo,mes,dia:word;
       vanyo,vmes,vdia,vfecha:string;
       piezas:integer;
begin

//    qpesadassector.close;
//    qpesadassector.Open;
    qmprimas.Locate('id',variedad,[locaseinsensitive]);
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    if length(vmes)=1 then vmes:='0'+vmes;
    if length(vdia)=1 then vdia:='0'+vdia;
    vfecha:=vanyo+'-'+vmes+'-'+vdia;
    tcalendario_laboral.refresh;
    tcalendario_laboral.locate('fecha',vfecha,[locaseinsensitive,lopartialkey]);

    pesoletras:=lpeso.Caption;

    try
    peso2:=strtofloat(pesoletras);
    except
        on error: exception do
        begin
           peso2:=0;
        end;
    end;
//

    bloqueominimo:=qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat;
    bloqueominimo:=bloqueominimo*(porcentagebloqueo/100);   // bloqueominimo/1.2
    if (peso2>bloqueominimo) and a_cero then
    begin
       bloqueado:=true;
    end;

    if bloqueado and (peso2<0.100) and a_cero and desbloqueado then
    begin
       desbloqueado:=false;
       bloqueado:=false;
       tpesar.Enabled:=false;
       tsincronizar.Enabled:=false;
       puerto1.Connected:=false;
       fdesbloqueo := Tfdesbloqueo.create(nil);
       try
         fdesbloqueo.showmodal();

       finally
         fdesbloqueo.free;
         desbloqueado:=true;
         tpesar.Enabled:=true;
         puerto1.Connected:=true;
         qdesbloqueos.Open;
         qdesbloqueos.append;
         qdesbloqueos.FieldByName('envasadora').Value:=pprincipal.qenvasadoras.FieldByName('trabajador').asstring;
         qdesbloqueos.FieldByName('mesa').Value:=pprincipal.lmesa.Caption;
         qdesbloqueos.FieldByName('bascula').Value:=pprincipal.lbascula.Caption;
         qdesbloqueos.FieldByName('estado').Value:=1;
         qdesbloqueos.FieldByName('fecha').Value:=date;
         qdesbloqueos.FieldByName('hora').value:=time;
         qdesbloqueos.Post;
         qdesbloqueos.Close;
         tsincronizar.Enabled:=true;
       end;
       puerto1.Connected:=true;
    end;

//    peso2:=peso2*1000;
    if qproductos.FieldByName('pesadomanual').Asinteger=1 then
    begin
        try
         tboton.Enabled:=true;
         lpesominimo.Caption:='';
         lpesomaximo.Caption:='';
         peso3:=strtofloat(pesoletras);

          except
              on error: exception do
              begin
                 peso3:=0;
              end;
          end;
    end;

    if qproductos.FieldByName('pesadomanual').Asinteger=0 then
    begin

        lpesominimo.Caption:='Peso Minimo: '+floattostr(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat);
        lpesomaximo.Caption:='Peso Maximo: '+floattostr(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('errorpeso').AsFloat);
        peso:=(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat);//*1000;
        pesoconerror:=(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('errorpeso').AsFloat);//*1000;

        if (peso2<peso) and a_cero then
        begin
           if vpesopieza=0 then vpesopieza:=1;
           lpiezas.caption:='+'+floattostr(trunc((peso*1000-peso2*1000)/vpesopieza)+1);
           ppesadas.Color:=clyellow;
        end;
        if (peso2>=peso) and (peso2<=pesoconerror) and (estable) and (a_cero) then
        begin
            ppesadas.Color:=cllime;
            lpiezas.Caption:='0';
            if qproductos.FieldByName('mostrar_boton').asinteger=1 then tboton.Enabled:=true
            else
                begin
                    tboton.Enabled:=true;
                end;
        end;
        if (peso2>pesoconerror) and a_cero then
        begin
           if vpesopieza=0 then vpesopieza:=1;
           lpiezas.caption:='-'+floattostr(trunc((peso2*1000-pesoconerror*1000)/vpesopieza)+1);
           ppesadas.Color:=clred;
        end;
    end;

end;

procedure Tpprincipal.Ta_ceroTimer(Sender: TObject);
var pesoletras:string;
    peso2:real;
begin
    pesoletras:=lpeso.Caption;

    try
    peso2:=strtofloat(pesoletras);
    except
        on error: exception do
        begin
           peso2:=-1;
        end;
    end;
    pesar.Visible:=false;

    if qproductos.FieldByName('pesadomanual').Asinteger=1 then
    begin
        ppesadas.Caption:='RETIRE EL ENVASE';
        lpeso.Visible:=false;
        lpiezas.Caption:='0';
        tpesar.Enabled:=false;
        ppesadas.Color:=clfuchsia;
        pesar.Visible:=false;

        if peso2=0 then
        begin
            a_cero:=true;
            ta_cero.Enabled:=false;
            ppesadas.Caption:='';

        end;
        if a_cero then
        begin
          ppesadas.Color:=clBtnFace;
          tpesar.Enabled:=true;
          lpeso.Visible:=true;
        end;

    end;
    if qproductos.FieldByName('pesadomanual').Asinteger=0 then
    begin
//        ppesadas.Color:=clred;
        ppesadas.Caption:='RETIRE EL ENVASE';
        lpiezas.Caption:='0';
        lpeso.visible:=false;
        ppesadas.Color:=clfuchsia;
        if peso2=0 then
        begin
            a_cero:=true;
            ta_cero.Enabled:=false;
            ppesadas.Caption:='';
        end;
        if a_cero then
        begin
          ppesadas.Color:=clBtnFace;
          tpesar.Enabled:=true;
          lpeso.Visible:=true;
        end;
    end;

end;

procedure Tpprincipal.TbotonTimer(Sender: TObject);
var pesoletras:string;
    peso,peso2,pesoconerror:real;
begin
    pesoletras:=lpeso.Caption;
    try
    peso2:=strtofloat(pesoletras);
    except
        on error: exception do
        begin
           peso2:=-1;
        end;
    end;
//
    peso:=(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat);//*1000;
    pesoconerror:=(qproductos.FieldByName('peso').AsFloat+qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('errorpeso').AsFloat);//*1000;
    if (qproductos.FieldByName('pesadomanual').AsInteger=1) and a_cero then
    begin
        if estable and (peso2>0)then
        begin
            pesar.visible:=true;
            pesovalido:=peso2;
            tpesar.enabled:=true;
        end
        else
        begin
           pesar.visible:=false;
           tpesar.enabled:=false;
        end;
    end;
    if (qproductos.FieldByName('pesadomanual').AsInteger=0) and (qproductos.FieldByName('mostrar_boton').AsInteger=1) and a_cero then
    begin
        if estable then
        begin
            pesar.visible:=true;
            pesovalido:=peso2;
            tpesar.enabled:=true;
        end
        else
        begin
           pesar.visible:=false;
           tpesar.enabled:=false;
        end;
    end;
 if (qproductos.FieldByName('pesadomanual').AsInteger=0) and (qproductos.FieldByName('mostrar_boton').AsInteger=0) and a_cero then
    begin
        if estable then
        begin
        if (peso2>=peso) and (peso2<=pesoconerror) and (estable) and (a_cero) then
          begin
            lc_produccion.Open;
            lc_produccion.Append;
            lc_produccion.FieldByName('fecha').value:=date;//gfecha;
            lc_produccion.FieldByName('hora').value:=time;
            lc_produccion.FieldByName('mesa').value:=lmesa.Caption;
            lc_produccion.FieldByName('bascula').value:=lbascula.Caption;
            lc_produccion.FieldByName('idt').value:=qenvasadoras.FieldByName('idt').asinteger;
            lc_produccion.FieldByName('embasadora').value:=qenvasadoras.FieldByName('trabajador').asstring;
            lc_produccion.FieldByName('materia_prima').value:=qmprimas.FieldByName('id').asstring;
            lc_produccion.FieldByName('producto').value:=qproductos.FieldByName('codigo').asstring;
            lc_produccion.FieldByName('tara').value:=qproductos.FieldByName('tara').asfloat;
            lc_produccion.FieldByName('peso_teorico').value:=qproductos.FieldByName('tara').AsFloat+qproductos.FieldByName('peso').AsFloat;
            lc_produccion.FieldByName('peso_real').Value:=peso2;
            lc_produccion.FieldByName('estado').Value:=1;
            lc_produccion.Post;
            ppesadas.Caption:='PESADA REALIZADA';

            a_cero:=false;
            ta_cero.Enabled:=true;
            estable:=false;
            bloqueado:=false;
          end;
        end
        else
        begin
           pesar.visible:=false;
           tpesar.enabled:=false;
        end;
    end;
end;

procedure Tpprincipal.tcomprobarTimer(Sender: TObject);
var idproducto,idmprima:string;
begin
 tcomprobar.Interval:=60000;
//    dbservidor.Connected:=false;
    try
    idproducto:=qproductos.FieldByName('codigo').AsString;
    qproductos.connection:=dbservidor;
    qproductos.sql.clear;
    qproductos.sql.add('select * from productos WHERE (codigo) in (select codigo from productos_sector ');
    qproductos.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by descripcion');

    try
      try
      qproductos.Close;
      qproductos.ParamByName('MESA').AsInteger:=strtoint(tmesa);
      qproductos.open;
      except
          qproductos.Close;
          qproductos.ParamByName('MESA').AsInteger:=strtoint(tmesa);
          qproductos.connection:=dbagrigest;
          qproductos.SQL.Clear;
          qproductos.SQL.Add('SELECT * FROM productos WHERE activo=1 ORDER BY descripcion');
          qproductos.Open;
      end;
    finally
      qproductos.Locate('codigo',idproducto,[locaseinsensitive]);
      if qproductos.Active and (qproductos.RecordCount>0) then comboproducto.KeyValue:=qproductos.FieldByName('codigo').AsString;
      if (not qproductos.Active) or (qproductos.RecordCount=0) then
      begin
          idproducto:=qproductos.FieldByName('codigo').AsString;
          qproductos.close;
          qproductos.sql.clear;
          qproductos.sql.add('select * from productos WHERE ACTIVO=1 ORDER BY descripcion');
          qproductos.open;
          qproductos.Locate('codigo',idproducto,[locaseinsensitive]);
      end;
    end;

    idmprima:=combovariedad.Text;//.AsString;
    qmprimas.sql.clear;
    qmprimas.sql.add('select * from MATERIAS_PRIMAS WHERE (idempresa,id) in (select ide,mprima from materias_primas_sector ');
    qmprimas.SQL.Add(' where idsector=(select idsector from sectores_mesas where id=:MESA)) order by variedad');
    qmprimas.ParamByName('MESA').AsInteger:=strtoint(tmesa);
    try
      try
        qmprimas.Open;
      except
        try
          qmprimas.Close;
          qmprimas.Connection:=dbagrigest;
          qmprimas.SQL.Clear;
          qmprimas.SQL.Add('SELECT * FROM materias_primas WHERE activo=1 ORDER BY variedad');
          qmprimas.Open;
        except
        end;
      end;
    finally
    if qmprimas.Active then
    begin
      qmprimas.Locate('id',idmprima,[locaseinsensitive]);
      if qmprimas.RecordCount>0 then combovariedad.KeyValue:=qmprimas.FieldByName('id').AsString;
      if (qmprimas.RecordCount=0) or (dbservidor.Params.Values['Server']='localhost') then
      begin
          qmprimas.close;
          qmprimas.sql.clear;
          qmprimas.sql.add('SELECT * FROM materias_primas WHERE activo=1 ORDER BY descripcion');
          try
            qmprimas.open;
            qmprimas.Locate('id',idmprima,[locaseinsensitive]);
          except
          end;
      end;
    end;

    end;

    if qenvasadoras.RecordCount=1 then comboenvasadoras.KeyValue:=qenvasadoras.FieldByName('idt').asstring;
    variedad:=qmprimas.FieldByName('id').asstring;
    lvariedad.caption:=idmprima;//qmprimas.FieldByName('id').AsString;
    producto:=qproductos.FieldByName('codigo').AsString;
//    dbservidor.Connected:=false;
    timer4.Enabled:=false;
    except
    tcomprobar.Interval:=5000;
      try
         DBservidor.connected:=true;
         lconectado.caption:='CONECTADO A: ' +thost;
         timer4.enabled:=true;
      except
         dbservidor.Params.Values['Server']:='localhost';
         dbservidor.Params.Values['User_Name']:='root';
         dbservidor.Params.Values['Password']:='';
         lesclavo.Color:=clred;
         lconectado.caption:='CONECTADO A: EQUIPO LOCAL';
         dbservidor.Connected:=true;
         timer4.enabled:=false;
      end;

    end;
end;

procedure Tpprincipal.Timer4Timer(Sender: TObject);
var       anyo,mes,dia:word;
       vanyo,vmes,vdia,vfecha:string;
begin

      qmovimientos_mesa.close;
      qmovimientos_mesa.SQL.Clear;
      qmovimientos_mesa.sql.add(' select * from movimiento_mesas_local where mesa='+''''+lmesa.Caption+''''+' and salida_real is null ');
      qmovimientos_mesa.sql.add(' order by trabajador');
      qmovimientos_mesa.open;
    decodedate(date,anyo,mes,dia);
    vanyo:=floattostr(anyo);
    vmes:=floattostr(mes);
    vdia:=floattostr(dia);
    if length(vmes)=1 then vmes:='0'+vmes;
    if length(vdia)=1 then vdia:='0'+vdia;
    vfecha:=vanyo+'-'+vmes+'-'+vdia;
    tcalendario_laboral.refresh;
    tcalendario_laboral.locate('fecha',vfecha,[locaseinsensitive,lopartialkey]);



end;

procedure Tpprincipal.tsincronizarTimer(Sender: TObject);
var sreal,sajustada,hreal,hajustada:string;
begin
  // La replicación se gestiona de forma asíncrona mediante TSyncThread
  if treplicacion <> '1' then
  begin
    PCONEXION.Color := clRed;
    lesclavo.Caption := 'Sincronización deshabilitada';
  end;
 {
    tsincronizar.Enabled:=false;

    try

       try
        if dbservidor.Connected =false then
        begin
            dbservidor.Connect;
        end;
//       dbservidor.reConnect;
       finally


           tsincronizar.Enabled:=true;
           PCONEXION.Visible:=TRUE;
           PCONEXION.Caption:='CONECTADO';
           PCONEXION.Color:=clLime;
       end;
    except
        on error: exception do
        begin
             PCONEXION.Visible:=TRUE;
             PCONEXION.Caption:='SIN CONEXION';
             PCONEXION.Color:=clRed;
             dbservidor.connected:=false;
             tsincronizar.Enabled:=true;
        end;

    end;
      }
end;



procedure Tpprincipal.OnSyncStatusChange(Sender: TObject; Status: TConnectionStatus; const Msg: string);
begin
  lesclavo.Caption := Msg;
  if Status = csConnected then
  begin
    PCONEXION.Caption := 'CONECTADO';
    PCONEXION.Color := clLime;
  end
  else
  begin
    PCONEXION.Caption := 'SIN CONEXION';
    PCONEXION.Color := clRed;
  end;
end;

procedure Tpprincipal.OnLogoutRequest(Sender: TObject; WorkerID: Integer);
begin
  lpesotrabajador.Caption := 'Sesión Cerrada Remotamente';
  Edit1.Text := '';
  Edit2.Text := '';
  lpeso.Caption := '0.00';
  ShowMessage('Sesión cerrada automáticamente debido a inicio de actividad en otro puesto.');
end;

procedure Tpprincipal.DesbloquearTerminal;
begin
  bloqueado := False;
  tpesar.Enabled := True;
  if not puerto1.Connected then
    puerto1.Connected := True;
end;


end.