unit fprincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Menus, Vcl.ImgList,
  Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Grids, Vcl.DBGrids,data.db,
  Vcl.Mask, Vcl.DBCtrls, Vcl.ExtDlgs, Data.Win.ADODB, frxClass,
  frxDBSet, frxExportPDF, frxExportCSV, ZAbstractConnection, ZConnection,
  ZAbstractRODataset, ZAbstractDataset, ZDataset, Vcl.Touch.Keyboard;

type
  Tprincipal = class(TForm)
    ImageList1: TImageList;
    hora: TTimer;
    temporizador: TTimer;
    tiempo5: TTimer;
    MainMenu1: TMainMenu;
    Mantenimient1: TMenuItem;
    rabajadores1: TMenuItem;
    Controlhorario1: TMenuItem;
    CalendarioLaboral1: TMenuItem;
    Panel1: TPanel;
    Panel7: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    lfecha: TLabel;
    lhora: TLabel;
    Panel2: TPanel;
    btAsalir: TButton;
    Panel3: TPanel;
    Panel6: TPanel;
    Label5: TLabel;
    ltrabajador: TLabel;
    ltexto: TLabel;
    Edit1: TEdit;
    DBGrid1: TDBGrid;
    teclado: TTouchKeyboard;
    chkteclado: TCheckBox;
    Label3: TLabel;
    lregistros: TLabel;
    procedure buscarfichasExit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dstclientesStateChange(Sender: TObject);
    procedure dsttrabajosStateChange(Sender: TObject);
    procedure buscarfichasEnter(Sender: TObject);
    procedure btTnuevoClick(Sender: TObject);
    procedure btTerminarClick(Sender: TObject);
    procedure horaTimer(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure temporizadorTimer(Sender: TObject);
    procedure tiempo5Timer(Sender: TObject);
    procedure rabajadores1Click(Sender: TObject);
    procedure Controlhorario1Click(Sender: TObject);
    procedure CalendarioLaboral1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit1Enter(Sender: TObject);
    procedure chktecladoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure AppMessage(var Msg: Tmsg; var Handled:Boolean);
  end;

var
  principal: Tprincipal;
  vertodos:integer;
  ajusteentrada,ajustesalida:real;
  contando,desdegrid,desdetrabajador:boolean;
  filtro:string;
  fecha:string;
const
  rojo=$00AAAAFF;
  amarillo=$00B9FFFF;
  verde=$00C7FBAA;
  azul=$00FFFFBB;

implementation

uses fdatos, fempleados, fticados, fcalendario;
{$R *.dfm}




procedure Tprincipal.btTerminarClick(Sender: TObject);
var horaajustada,ahora,control: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;
begin
/// obtengo el id del nempleado

    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;
    dm.qcalendario.SQL.Clear;
    dm.qcalendario.SQL.Add('select * from calendario_laboral where fecha='+''''+vfecha+'''');
    dm.qcalendario.open;
//    qcalendario.locate('fecha',vfecha,[locaseinsensitive,lopartialkey]);
    ahora:=time();
    control:=strtotime('15:00:00');
    if ahora<control then
    begin
          descuento:=0;//15*(tcalendario_laboralalmuerzo.asinteger);
    end;
    control:=strtotime('17:00:00');
    if ahora>control then
    begin
          descuento:=0;//15*(tcalendario_laboralmerienda.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;

    dm.qticados.Edit;
    dm.qticadossalida_real.Value:=time;
    dm.qticados.Post;
    dm.qticados.Refresh;





    dbgrid1.SetFocus;
    edit1.Clear;
    edit1.SetFocus;
    desdegrid:=false;
    ltrabajador.caption:='';


end;

procedure Tprincipal.btTnuevoClick(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

    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;

    horaajustada:=encodetime(horaaj,minutosaj,0,0);


    dm.qaux2.SQL.Clear;
    dm.qaux2.sql.add('select * from ticados where idt='+dm.trabajadores.fields[1].asstring+' and salida_real is null ');
    dm.qaux2.open;

    if dm.qaux2.RecordCount=0  then
    begin


        dm.qmovimientos.Open;
        dm.qmovimientos.append;
        dm.qmovimientosid.Value:=tid;
        dm.qmovimientosfecha.Value:=date;//gfecha;
        dm.qmovimientosidt.Value:=dm.trabajadores.Fields[1].Asinteger;
        dm.qmovimientostrabajador.Value:=dm.trabajadores.Fields[0].AsString;
        dm.qmovimientosentradam.Value:=time;
        dm.qmovimientos.post;
        dm.qmovimientos2.close;
        dm.qmovimientos2.open;

    end;

//    qtrabajosalmacen.Close;
end;

end;


procedure Tprincipal.buscarfichasEnter(Sender: TObject);
begin
    //buscarfichas.Text:='';
end;

procedure Tprincipal.buscarfichasExit(Sender: TObject);
begin
 {   if buscarfichas.text<>'' then
    begin
        filtro:='%'+buscarfichas.Text+'%';
        qclientes.Close;
        qclientes.open;
    end else
       begin
         filtro:='';
        qclientes.Close;
        qclientes.open;
       end;}
end;
procedure Tprincipal.CalendarioLaboral1Click(Sender: TObject);
begin
   calendario.showmodal();
end;

procedure Tprincipal.chktecladoClick(Sender: TObject);
begin
    if chkteclado.Checked then teclado.Visible:=true else  teclado.Visible:=false;


end;

procedure Tprincipal.Controlhorario1Click(Sender: TObject);
begin
    ticados.showmodal();
end;

procedure Tprincipal.dstclientesStateChange(Sender: TObject);
begin
{   if tclientes.State in [dsedit,dsinsert] then
   begin
       btcnuevo.Enabled:=false;
       btcborrar.Enabled:=false;
       btcmodificar.Enabled:=false;
       btcguardar.Enabled:=true;
       btccancelar.Enabled:=true;
       Pclientesdatos.Enabled:=true;
   end else
   begin
       btcnuevo.Enabled:=true;
       btcborrar.Enabled:=true;
       btcmodificar.Enabled:=true;
       btcguardar.Enabled:=false;
       btccancelar.Enabled:=false;
       Pclientesdatos.Enabled:=false;
   end;}
end;

procedure Tprincipal.dsttrabajosStateChange(Sender: TObject);
begin
{   if ttrabajos.State in [dsedit,dsinsert] then
   begin
       bttnuevo.Enabled:=false;
       bttborrar.Enabled:=false;
       bttmodificar.Enabled:=false;
       bttguardar.Enabled:=true;
       bttcancelar.Enabled:=true;
       Ptrabajosdatos.visible:=true;
   end else
   begin
       bttnuevo.Enabled:=true;
       bttborrar.Enabled:=true;
       bttmodificar.Enabled:=true;
       bttguardar.Enabled:=false;
       bttcancelar.Enabled:=false;
       Ptrabajosdatos.visible:=false;
   end;}
end;

procedure Tprincipal.Edit1Change(Sender: TObject);
begin
    tiempo5.enabled:=false;
end;

procedure Tprincipal.Edit1Enter(Sender: TObject);
begin
    if chkteclado.Checked then  teclado.Visible:=true else teclado.Visible:=false;
end;

procedure Tprincipal.Edit1Exit(Sender: TObject);
var horaajustada:ttime;
    hora,minutos,horaaj,minutosaj:word;
    dhora,dminutos,dsegundos,dmilisegundos:word;
    horasfact:real;
    letra:char;
    nif:string;
    tid,estexto:integer;
    horarealanterior,horaajustadaanterior:real;
    x: Integer;
begin
    if edit1.text<>'' then
    begin
    teclado.Visible:=false;
    estexto:=0;
    nif:=edit1.Text;
    for x := 1 to length(nif) do
    begin
        letra:=nif[x];
        if letra in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] then estexto:=1;
    end;
    if estexto=0 then
    begin
       tid:=strtoint(nif);
       dm.qtrabajadores.Close;
       dm.qtrabajadores.SQL.Clear;
       dm.qtrabajadores.SQL.Add('select * from trabajadores where id='+inttostr(tid)); // esta linea para todos menos asencio
//       dm.qtrabajadores.SQL.Add('select * from trabajadores where nif='+inttostr(tid)); //esta linea para asencio solo
       dm.qtrabajadores.open;
     end else
     begin
       dm.qtrabajadores.Close;
       dm.qtrabajadores.SQL.Clear;
       dm.qtrabajadores.SQL.Add('select * from trabajadores where nif='+''''+edit1.Text+'''');
       dm.qtrabajadores.open;
     end;
     if dm.qtrabajadores.recordcount>0 then
       begin
            dm.qaux2.Close;
            dm.qaux2.SQL.Clear;
            dm.qaux2.sql.add('select * from ticados where idt='+dm.qtrabajadoresid.asstring+'  and salida_real is null order by fecha');
            dm.qaux2.open;
          if dm.qaux2.RecordCount=0  then
            begin
                decodetime(now,dhora,dminutos,dsegundos,dmilisegundos);
                dm.qticados.Open;
                dm.qticados.append;
                dm.qticadosfecha.Value:=date;//gfecha;
                dm.qticadosidt.Value:=dm.qtrabajadoresid.Asinteger;
                dm.qticadostrabajador.Value:=dm.qtrabajadoresnombre.AsString;
                dm.qticadosentrada_real.Value:=time;
                dm.qticadoscentro.Value:=dm.centrotrabajo;
                dm.qticados.post;
                ltrabajador.Caption:=dm.qtrabajadoresnombre.AsString;
                dm.qmovimientos2.close;
                dm.qmovimientos2.open;
                contando:=true;
                panel6.Color:=clLime;
    //            panel7.Color:=clLime;
                temporizador.Enabled:=true;
                tiempo5.enabled:=false;
                ltexto.Caption:='ENTRADA ACEPTADA';
                edit1.Text:='';
                edit1.Visible:=false;

             end else
                begin
                if dm.qaux2fecha.AsDateTime=date then
                begin
                  dm.qaux2.Edit;
                  dm.qaux2salida_real.Value:=time;
                  dm.qaux2.Post;
                  ltrabajador.Caption:=dm.qtrabajadoresnombre.AsString;
                  dm.qmovimientos2.close;
                  dm.qmovimientos2.open;
                  contando:=true;
                  panel6.Color:=clLime;
                  ltexto.Caption:='SALIDA ACEPTADA';
                  temporizador.Enabled:=true;
                  tiempo5.enabled:=false;
                  edit1.Text:='';
                  edit1.Visible:=false;
                end else
                  begin
                  dm.qaux2.Edit;
                  dm.qaux2salida_real.Value:=strtotime('23:59:59');
                  dm.qaux2.Post;
                  dm.qticados.Open;
                  dm.qticados.append;
                  dm.qticadosfecha.Value:=date;//gfecha;
                  dm.qticadosidt.Value:=dm.qtrabajadoresid.Asinteger;
                  dm.qticadostrabajador.Value:=dm.qtrabajadoresnombre.AsString;
                  dm.qticadosentrada_real.Value:=strtotime('00:00:01');
                  dm.qticadossalida_real.Value:=time;
                  dm.qticados.post;
                  ltrabajador.Caption:=dm.qtrabajadoresnombre.AsString;
                  dm.qmovimientos2.close;
                  dm.qmovimientos2.open;
                  contando:=true;
                  panel6.Color:=clLime;
                  ltexto.Caption:='SALIDA ACEPTADA';
                  temporizador.Enabled:=true;
                  tiempo5.enabled:=false;
                  edit1.Text:='';
                  edit1.Visible:=false;
                  end;
                end;
        end else
              begin
                contando:=true;
                panel6.Color:=clRED;
                temporizador.Enabled:=true;
                tiempo5.enabled:=false;
                ltexto.Caption:='TRABAJADOR NO ENCONTRADO';
                edit1.Text:='';
                edit1.Visible:=false;
              end;
    end;
    tiempo5.enabled:=true;
end;

procedure Tprincipal.FormCreate(Sender: TObject);
begin
    Application.OnMessage :=  AppMessage;
end;

procedure Tprincipal.FormShow(Sender: TObject);
begin
    contando:=false;
    edit1.SetFocus;
    try
//    dm.qmovimientos2.close;
    dm.qmovimientos2.open;
    except
      showmessage('Error de conexion con la base de datos');

    end;
end;

procedure Tprincipal.horaTimer(Sender: TObject);
var dia,mes,anyo:word;
    diasem:integer;
    tdiasem:string;
begin
    decodedate(date(),anyo,mes,dia);
    diasem:=dayofweek(date());
    case diasem of
        2:tdiasem:='Lunes';
        3:tdiasem:='Martes';
        4:tdiasem:='Miercoles';
        5:tdiasem:='Jueves';
        6:tdiasem:='Viernes';
        7:tdiasem:='Sabado';
        1:tdiasem:='Domingo';

    end;
    fecha:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);
    lfecha.Caption:=tdiasem+' '+datetostr(date());
    lhora.Caption:=timetostr(time);
    if contando then
    begin
        panel6.Color:=clLime;
        ltexto.Visible:=true;
        contando:=false;
    end;
    try
    dm.qmovimientos2.close;
    dm.qmovimientos2.Prepare;
    dm.qmovimientos2.ParamByName('CENTRO').AsString:=dm.centrotrabajo;
    dm.qmovimientos2.open;
    lregistros.Caption:=inttostr(dm.qmovimientos2.RecordCount);
    except
    begin
      hora.Enabled:=false;
    end;

    end;
end;


procedure Tprincipal.rabajadores1Click(Sender: TObject);
begin
    empleados.showmodal();
end;

procedure Tprincipal.temporizadorTimer(Sender: TObject);
begin

if contando then
begin
end else
  begin
        panel6.Color:=clBtnFace;
        panel7.Color:=clBtnFace;
        ltexto.Visible:=FALSE;
        temporizador.Enabled:=false;
        tiempo5.Enabled:=true;
        ltrabajador.Caption:='';
        edit1.Visible:=true;
        edit1.Text:='';
        edit1.SetFocus;
  end;

end;

procedure Tprincipal.tiempo5Timer(Sender: TObject);
begin
    edit1.SetFocus;
    edit1.Text:='';
end;

Procedure Tprincipal.AppMessage(var Msg: TMSg; Var Handled:Boolean);
 var
  actual : TWincontrol;
 begin
 if Msg.message = WM_KEYDOWN then
    begin

    // esto es para controlar que con la flecha abajo se desplegen las
    // listas

    if Msg.wParam = VK_DOWN then
      begin
      Actual := Screen.ActiveControl;
      if Actual is TDBLookupComboBox then
            if not TDBLookupComboBox(Screen.ActiveForm.ActiveControl).listVisible then
               TDBLookupComboBox(Screen.ActiveForm.ActiveControl).DropDown;

      // si utilizas las RX
   {   if Actual is TRxDBLookupCombo then
            if not TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).listVisible then
               TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).DropDown;

    }
      if Actual is TComboBox then
         SendMessage(TComboBox(Screen.ActiveForm.ActiveControl).Handle,CB_SHOWDROPDOWN,-1,0);

      if (Actual is TCustomEdit) then
          Msg.wParam := VK_TAB;
      // se pueden añadir mas controles....

      end;

    // y aqui es el control del intro.
    if Msg.wParam = VK_RETURN THEN
       begin
       Actual := Screen.ActiveControl;
       // para los edit.
       if (Actual is TCustomEdit) and
          not (Actual is TCustomMemo) then
          Msg.wParam := VK_TAB;

       // para los memo. Con ctrl + enter se salta de linea dentro del
       // memo, si solo es intro salta al siguiente control
       if (Actual is TCustomMemo) and
          (HiWord(GetKeyState(VK_CONTROL)) = 0)then
          Msg.wParam := VK_TAB;

       // para los lookup
       if Actual is TDBLookupComboBox then
          if not TDBLookupComboBox(Actual).listVisible then
             Msg.wParam := VK_TAB;

       // Si utilizas las RX
{       if Actual is TRxDBLookupCombo then
          if not TRxDBLookupCombo(Actual).listVisible then
             Msg.wParam := VK_TAB;
 }
       // Los combobox
       if Actual is TCustomComboBox then
          if not TCustomComboBox(Actual).DroppedDown then
             Msg.wParam := VK_TAB;

       // el radiobutton
       if Actual is TRadioButton then
          Msg.wParam := VK_TAB;

       // en el grid
       if Actual is TDBGrid then
          if (TDBGrid(Actual).ReadOnly) or
             (HiWord(GetKeyState(VK_CONTROL)) = 1)then
             Msg.wParam := VK_TAB;

       // o esto otro Con Ctrl + intro siguiente celda con
       // ctrl + shift + intro celda anterior
       // es complicado pero es por no liar con el intro solo
       // que siempre pasa de un control a otro.
       if Actual is TDBGrid then
          begin
          if (TDBGrid(Actual).ReadOnly) or
             (HiWord(GetKeyState(VK_CONTROL)) = 0) then
             Msg.wParam := VK_TAB
          else
             if not(HiWord(GetKeyState(VK_SHIFT)) = 0) then
                begin
                if TDBGrid(Actual).selectedindex > 0 then             { increment the field }
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex -1
                else
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).fieldcount -1;
                end
             else
                begin
                if TDBGrid(Actual).selectedindex < (TDBGrid(Actual).fieldcount -1) then             { increment the field }
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex +1
                else
                   TDBGrid(Actual).selectedindex := 0;
                end;
          end;


       // ListBox
       if Actual is TCustomListBox then
          Msg.wParam := VK_TAB;

       // TabControl
       if Actual is TCustomTabControl then
          Msg.wParam := VK_TAB;

       // Aqui se pondrían todos los controles que usamos en la
       // aplicación y necesitamos cambiar el tab por intro.
       // de esta forma te despreocupas de cuantos añades y es más
       // limpio el código

       end;
    end;
 end;


end.
