unit fticados;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, frxClass, frxDBSet, Data.DB,
  ZAbstractDataset, ZDataset, ZAbstractRODataset, Vcl.StdCtrls, Vcl.ComCtrls,
  Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Vcl.ImgList, frxExportPDF,
  frxExportCSV, ComObj, Excel2000;

type
  Tticados = class(TForm)
    frxCSVExport1: TfrxCSVExport;
    frxPDFExport1: TfrxPDFExport;
    ImageList1: TImageList;
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    buscarempleado: TEdit;
    tgrupo: TComboBox;
    DBGrid1: TDBGrid;
    Panel3: TPanel;
    gridnormal: TDBGrid;
    gridampliado: TDBGrid;
    Panel4: TPanel;
    Label3: TLabel;
    Label4: TLabel;
    DBText1: TDBText;
    Label5: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    Panel5: TPanel;
    Button2: TButton;
    Panel6: TPanel;
    Button1: TButton;
    qempleados: TZReadOnlyQuery;
    qticados: TZQuery;
    qticadosid: TLargeintField;
    qticadoside: TSmallintField;
    qticadosfecha: TDateField;
    qticadosidt: TIntegerField;
    qticadosTRABAJADOR: TWideStringField;
    qticadosentradam: TTimeField;
    qticadossalidam: TTimeField;
    qticadossalidam_m: TTimeField;
    qticadoshorasm: TFloatField;
    qticadoshorasm_m: TFloatField;
    qticadosentradat: TTimeField;
    qticadossalidat: TTimeField;
    qticadossalidat_m: TTimeField;
    qticadoshorast: TFloatField;
    qticadoshorast_m: TFloatField;
    qticadosnum_horas: TFloatField;
    qticadosnum_horas_m: TFloatField;
    qticadosimprimir: TIntegerField;
    qticadosobservaciones: TWideStringField;
    qticadosfestivo: TIntegerField;
    qtotalhoras: TZQuery;
    qtotalhorastotalhoras: TFloatField;
    qtotalhorasidt: TIntegerField;
    rTicados: TfrxReport;
    ticadosdb: TfrxDBDataset;
    dsqempleados: TDataSource;
    dsqticados: TDataSource;
    dstotalhoras: TDataSource;
    pmodificaciones: TPanel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    lad: TComboBox;
    lentsal: TComboBox;
    Edit1: TEdit;
    Button3: TButton;
    CheckBox1: TCheckBox;
    btJexcel: TButton;
    CheckBox2: TCheckBox;
    gridtotales: TDBGrid;
    qtotales: TZQuery;
    dsqtotales: TDataSource;
    qtotalesnum_horas: TFloatField;
    qtotalestrabajador: TWideStringField;
    qtotalesidt: TIntegerField;
    ticados2: TfrxDBDataset;
    procedure tgrupoChange(Sender: TObject);
    procedure buscarempleadoChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure qticadosAfterPost(DataSet: TDataSet);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Panel5Click(Sender: TObject);
    procedure qempleadosBeforeOpen(DataSet: TDataSet);
    procedure buscarempleadoEnter(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure gridampliadoDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure fdesdeChange(Sender: TObject);
    procedure btJexcelClick(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure fdesdeExit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
   procedure ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

  end;

var
  ticados: Tticados;
  filtrotrabajadores,tlimitado:string;
  grupo:integer;
  desdeactualizar:integer;
const
  rojo=$00AAAAFF;
  amarillo=$00B9FFFF;
  verde=$00C7FBAA;
  azul=$00FFFFBB;
implementation
uses fdatos;

{$R *.dfm}
procedure tticados.ExportaraExcel(FileNameXLS, SheetName: String; DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

  procedure ProgressBarInit;
  begin
    ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
    ProgressBarXls.Position := 0;
    ProgressBarXls.Visible := True;
  end;

const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posición en la DB y desactivar que se mueva el registro
  PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
  DBGrid.DataSource.DataSet.DisableControls;
  DBGrid.DataSource.DataSet.First;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // Crear instancia de la aplicación Excel
  Excel := CreateOleObject('Excel.Application');

  // Evitar que nos pregunte si deseamos sobreescribir el archivo
  Excel.DisplayAlerts := False;

  // Agregar libro de trabajo
  WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

  // Tomar una referencia a la hoja creada
  WorkSheet := WorkBook.WorkSheets[1];

  // Se  describe el nombre de la hoja
  WorkSheet.Name := SheetName;

  // Llenamos las celdas
  //    Toma en cuenta que las columnas y filas empiezan en 1, y que en el
  // WorkSheet.Cells[I, J], I es la fila y J es la columna.

  //   Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
  // excluyendo los campos que están ocultos
  for J := 0 to DBGrid.FieldCount -1 do
    if DBGrid.Fields[J].Visible then
    begin
      // Poner la fuente de letra en Negrita
      WorkSheet.Cells[1, J +1].Font.Bold := True;
      // Centrar la celda
//      WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
      // Asignamos Valor del titulo del DBrid
      WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
    end;

  // Guardar los registros
  for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
  begin
    // Identificamos los campos y lo grabamos según su tipo
    for J := 0 to DBGrid.FieldCount -1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numérico con decimales
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
        else // Todo lo demas caracteres
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
      end;

    // Saltamos de registro
    DBGrid.DataSource.DataSet.Next;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Position := ProgressBarXls.Position +1;
  end;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarXls.Visible := False;

  // Redimensionar todas las celdas para que esten según su tamaño
  WorkSheet.Cells.Columns.AutoFit;

  // Guardar el archivo
  WorkBook.SaveAs(FileNameXLS);

  // Cierra el archivo
  WorkBook.Close(FileNameXLS);

  // Salir de Excel
  Excel.Quit;

  // posicionar el registro donde estaba
  DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
  DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
  DBGrid.DataSource.DataSet.EnableControls;
end;

procedure Tticados.btJexcelClick(Sender: TObject);
var  archivo:string;
begin
    if gridampliado.Visible then
    begin
        archivo:='c:\controlgest\TICADOS.xlsx';
        try
        Exportaraexcel(archivo,'TICADOS',GRIDampliado);
        finally
          showmessage('Los datos han sido exportados correctamente a C:\controlgest');
        end;
    end;
    if gridnormal.Visible then
    begin
        archivo:='c:\controlgest\TICADOS.xlsx';
        try
        Exportaraexcel(archivo,'TICADOS',GRIDnormal);
        finally
          showmessage('Los datos han sido exportados correctamente a C:\controlgest');
        end;
    end;
    if gridtotales.Visible then
    begin
        archivo:='c:\controlgest\TICADOS.xlsx';
        try
        Exportaraexcel(archivo,'TICADOS',GRIDtotales);
        finally
          showmessage('Los datos han sido exportados correctamente a C:\controlgest');
        end;
    end;

end;

procedure Tticados.buscarempleadoChange(Sender: TObject);
var dia,mes,anyo:word;
    tdesde,thasta:string;
begin
    decodedate(fdesde.Date,anyo,mes,dia);
    tdesde:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);
    decodedate(fhasta.Date,anyo,mes,dia);
    thasta:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);

    qticados.SQL.Clear;
    qticados.SQL.Add('select * from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' order by idt,fecha desc,entradam,entradat');
    qtotalhoras.SQL.Clear;
    qtotalhoras.SQL.Add('select idt,sum(num_horas) as totalhoras from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' group by idt order by idt');
    filtrotrabajadores:='%'+buscarempleado.Text+'%';
    qempleados.Close;
    qempleados.open;
    qtotalhoras.Open;
    qticados.Open;

end;

procedure Tticados.buscarempleadoEnter(Sender: TObject);
begin
   buscarempleado.Text:='';
end;

procedure Tticados.Button1Click(Sender: TObject);
begin
   qticados.Delete;
end;

procedure Tticados.Button2Click(Sender: TObject);
begin
    ticadosdb.Datasource:=dsqticados;
    rTicados.Report.Clear;
    rTicados.LoadFromFile('c:\controlgest\informes\controlhorario.fr3');
    rTicados.Variables.Variables['tdesde']:=QUOTEDSTR('Desde: '+datetostr(fdesde.Date));
    rTicados.Variables.Variables['thasta']:=QUOTEDSTR('Hasta: '+DATETOSTR(fhasta.DATE));
    rticados.Report.FileName:='Control horario ' + qticadostrabajador.asstring;
    rticados.ShowReport();
    rTicados.Clear;
    ticadosdb.Datasource:=dsqtotales;
    rTicados.Report.Clear;
    rTicados.LoadFromFile('c:\controlgest\informes\controlhorariototales.fr3');
    rTicados.Variables.Variables['tdesde']:=QUOTEDSTR('Desde: '+datetostr(fdesde.Date));
    rTicados.Variables.Variables['thasta']:=QUOTEDSTR('Hasta: '+DATETOSTR(fhasta.DATE));
    rticados.Report.FileName:='Control horario ';
    rticados.ShowReport();
    rTicados.Clear

end;

procedure Tticados.Button3Click(Sender: TObject);
var ad,entsal,segundos:integer;
begin
    desdeactualizar:=1;
    ad:=lad.ItemIndex;
    entsal:=lentsal.ItemIndex;
    segundos:=strtoint(edit1.text);
    if ad=0 then
    begin
        case entsal of
            0:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadosentradam.Value:=qticadosentradam.AsDateTime+segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            1:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadossalidam.Value:=qticadossalidam.AsDateTime+segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            2:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadosentradat.Value:=qticadosentradat.AsDateTime+segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            3:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadossalidat.Value:=qticadossalidat.AsDateTime+segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
        end;
    end;
    if ad=1 then
    begin
        case entsal of
            0:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadosentradam.Value:=qticadosentradam.AsDateTime-segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            1:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadossalidam.Value:=qticadossalidam.AsDateTime-segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            2:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadosentradat.Value:=qticadosentradat.AsDateTime-segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
            3:
            begin
              qticados.First;
              while not qticados.Eof do
              begin
                 qticados.Edit;
                 qticadossalidat.Value:=qticadossalidat.AsDateTime-segundos/1440;
                 qticados.post;
                 qticados.Next;
              end;
            end;
        end;
    end;
    qticados.Refresh;
    desdeactualizar:=0;
end;

procedure Tticados.CheckBox1Click(Sender: TObject);
begin
    if checkbox1.Checked then
    begin
     qticados.Close;
     qtotalhoras.Close;
     qticados.MasterSource:=nil;
     qticados.Open;
     qtotalhoras.MasterSource:=nil;
     qtotalhoras.Open;
     qtotales.MasterSource:=nil;
     qtotales.Open;
//     checkbox2.Visible:=true;
    end else
    begin
     qticados.Close;
     qtotalhoras.Close;
     qticados.MasterSource:=dsqempleados;
     qticados.Open;
     qtotalhoras.MasterSource:=dsqempleados;
     qtotalhoras.Open;
     qtotales.MasterSource:=dsqempleados;
     qtotales.Open;
//     checkbox2.Visible:=false;
    end;
end;

procedure Tticados.CheckBox2Click(Sender: TObject);
begin
    if checkbox2.Checked then
    begin
       if checkbox1.Checked then
       begin
          qticados.Close;
          qtotalhoras.Close;
          qticados.MasterSource:=nil;
          qticados.Open;
          qtotalhoras.MasterSource:=nil;
          qtotalhoras.Open;
          qtotales.MasterSource:=nil;
          qtotales.Open;
       end else
       begin
         qticados.Close;
         qtotalhoras.Close;
         qticados.MasterSource:=dsqempleados;
         qticados.Open;
         qtotalhoras.MasterSource:=dsqempleados;
         qtotalhoras.Open;
         qtotales.MasterSource:=dsqempleados;
         qtotales.Open;
       end;

        gridtotales.Visible:=true;
        gridnormal.Visible:=false;
        gridampliado.Visible:=false;
        gridtotales.Columns[2].Title.caption:='Horas desde el '+datetostr(fdesde.Date)+' hasta el '+datetostr(fhasta.Date);
    end else
    begin
       if checkbox1.Checked then
       begin
          qticados.Close;
          qtotalhoras.Close;
          qticados.MasterSource:=nil;
          qticados.Open;
          qtotalhoras.MasterSource:=nil;
          qtotalhoras.Open;
          qtotales.MasterSource:=nil;
          qtotales.Open;
       end else
       begin
         qticados.Close;
         qtotalhoras.Close;
         qticados.MasterSource:=dsqempleados;
         qticados.Open;
         qtotalhoras.MasterSource:=dsqempleados;
         qtotalhoras.Open;
         qtotales.MasterSource:=dsqempleados;
         qtotales.Open;
       end;
        gridtotales.Visible:=false;
        gridnormal.Visible:=true;
        gridampliado.Visible:=false;
    end;
end;

procedure Tticados.fdesdeChange(Sender: TObject);
var dia,mes,anyo:word;
    tdesde,thasta:string;
begin
    decodedate(fdesde.Date,anyo,mes,dia);
    tdesde:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);
    decodedate(fhasta.Date,anyo,mes,dia);
    thasta:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);

    qticados.SQL.Clear;
    qticados.SQL.Add('select * from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' order by idt,fecha desc,entradam,entradat');
    qticados.Open;
    qtotalhoras.SQL.Clear;
    qtotalhoras.SQL.Add('select idt,sum(num_horas) as totalhoras from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' group by idt order by idt');
    qtotalhoras.Open;
    qtotales.SQL.Clear;
    qtotales.SQL.Add('select idt,trabajador,sum(num_horas) as num_horas from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' group by idt order by trabajador');
    qtotales.Open;
end;

procedure Tticados.fdesdeExit(Sender: TObject);
var dia,mes,anyo:word;
    tdesde,thasta:string;
begin
    decodedate(fdesde.Date,anyo,mes,dia);
    tdesde:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);
    decodedate(fhasta.Date,anyo,mes,dia);
    thasta:=inttostr(anyo)+'/'+inttostr(mes)+'/'+inttostr(dia);

    qticados.SQL.Clear;
    qticados.SQL.Add('select * from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' order by idt,fecha desc,entradam,entradat');
    qticados.Open;
    qtotalhoras.SQL.Clear;
    qtotalhoras.SQL.Add('select idt,sum(num_horas) as totalhoras from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' group by idt order by idt');
    qtotalhoras.Open;
    qtotales.SQL.Clear;
    qtotales.SQL.Add('select idt,trabajador,sum(num_horas) as num_horas from ticadoscompleto where fecha>='+''''+tdesde+''''+' and fecha<='+''''+thasta+''''+' group by idt order by idt');
    qtotales.Open;

end;

procedure Tticados.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   qticados.Close;
   qtotalhoras.Close;
   qempleados.Close
end;

procedure Tticados.FormShow(Sender: TObject);
begin

   gridampliado.Visible:=false;
   panel6.Visible:=false;
   pmodificaciones.Visible:=false;
   gridnormal.Visible:=true;
   desdeactualizar:=0;
   qticados.open;
   qtotalhoras.open;
   qempleados.open;
   fdesde.Date:=date()-1;
   fhasta.Date:=date();
   fdesde.SetFocus;
   tgrupo.SetFocus;

end;

procedure Tticados.gridampliadoDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if qticadosfestivo.Asinteger=1 then
    begin
        Gridampliado.Canvas.brush.Color := rojo;
    end;

    gridampliado.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure Tticados.Panel5Click(Sender: TObject);
begin
   if gridnormal.visible then
   begin
      gridampliado.Visible:=true;
      panel6.Visible:=true;
      gridnormal.Visible:=false;
      pmodificaciones.visible:=true;
   end else
   begin
      gridampliado.Visible:=false;
      panel6.Visible:=false;
      gridnormal.Visible:=true;
      pmodificaciones.visible:=false;
   end
end;

procedure Tticados.qempleadosBeforeOpen(DataSet: TDataSet);
var filtro:string;
begin
    if filtrotrabajadores<>'' then
    begin
       if grupo<>0 then
       begin
          filtro:=filtro+ ' where nombre like('+''''+filtrotrabajadores+''''+') and activo='+inttostr(grupo)
       end
       else
       begin
         filtro:=filtro+ ' where nombre like('+''''+filtrotrabajadores+''''+')';
       end;
    end;
    if filtrotrabajadores='' then
    begin
       if grupo<>0 then filtro:=filtro+ ' where activo='+inttostr(grupo) else filtro:='';
    end;


    qempleados.SQL.Clear;
    qempleados.SQL.Add('select id, nombre from trabajadores ' + filtro +' order by nombre')
end;

procedure Tticados.qticadosAfterPost(DataSet: TDataSet);
begin
  if desdeactualizar=0 then qticados.Refresh;// Refresh;
  qtotalhoras.Refresh;
end;

procedure Tticados.tgrupoChange(Sender: TObject);
begin
  grupo:=tgrupo.ItemIndex;
  qempleados.Close;
  qempleados.Open;
end;

end.
