unit UReporte;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, frxClass,
  frxDBSet, DB, ADODB, DBCtrls, Grids, frxRich,
  ComCtrls, dateutils, ExtCtrls, DBGrids, frxOLE, Spin, Vcl.Mask, JvExMask,
  JvToolEdit, JvDBLookup, JvDBLookupComboEdit, JvExStdCtrls, JvEdit,
  JvDBSearchEdit;

type
  TFReporte = class(TForm)
    CBDireccion: TCheckBox;
    LCBDireccion: TDBLookupComboBox;
    QConsulta: TADOQuery;
    DSConsulta: TDataSource;
    BitBtn1: TBitBtn;
    frxReport1: TfrxReport;
    frxDBDataset1: TfrxDBDataset;
    QConsultaEmpleado: TWideStringField;
    QConsultaRFC: TWideStringField;
    QConsultaCalle: TWideStringField;
    QConsultaNo: TWideStringField;
    QConsultaColonia: TWideStringField;
    QConsultaCP: TWideStringField;
    QConsultaArea: TWideStringField;
    QConsultaPrograma: TWideStringField;
    QConsultaPuesto: TWideStringField;
    QConsultaHonorarios: TBCDField;
    QConsultaFechaAlta: TDateTimeField;
    QConsultaSexo: TWideStringField;
    QConsultaarticulo: TWideStringField;
    QConsultadenominacion: TWideStringField;
    QConsultaLetras: TStringField;
    frxRichObject1: TfrxRichObject;
    QConsultaobligacion: TWideStringField;
    QConsultaEncargado: TWideStringField;
    QConsultaPuestoEnc: TWideStringField;
    Label1: TLabel;
    DTPFechini: TDateTimePicker;
    Label2: TLabel;
    Label3: TLabel;
    DTPFechaFin: TDateTimePicker;
    QConsultaperiodo: TStringField;
    QConsultaOficial: TWideStringField;
    QConsultaDirector: TWideStringField;
    Label4: TLabel;
    Bevel1: TBevel;
    Label7: TLabel;
    FechaEmision: TDateTimePicker;
    QConsultaParcialidades: TStringField;
    QConsultaFechaEmision: TStringField;
    BitBtn2: TBitBtn;
    QConsultaLugar: TWideStringField;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    CBNombre: TCheckBox;
    ENombre: TEdit;
    EApaterno: TEdit;
    EAMaterno: TEdit;
    TDirecciones: TADOTable;
    DSDirecciones: TDataSource;
    DBGrid1: TDBGrid;
    Label8: TLabel;
    LCBTipoTrab: TDBLookupComboBox;
    TTipoTrab: TADOTable;
    DSTipoTrab: TDataSource;
    QConsultaFechaCorta: TStringField;
    QConsultaEdoCivil: TWideStringField;
    QConsultaDescripcion: TMemoField;
    frxOLEObject1: TfrxOLEObject;
    SpeedButton1: TSpeedButton;
    QMostrar: TADOQuery;
    QConsultaNacionalidad: TWideStringField;
    QConsultajefe: TBooleanField;
    QConsultaCompensacion: TWideStringField;
    QConsultaDespensa: TWideStringField;
    QConsultaCanasta: TWideStringField;
    QConsultaConcepto: TWideStringField;
    QConsultaTipoEmpleo: TIntegerField;
    QConsultaPersonalide: TAutoIncField;
    QConsultaCatAreaside: TAutoIncField;
    QConsultaNombre: TWideStringField;
    QConsultaApaterno: TWideStringField;
    QConsultaAMaterno: TWideStringField;
    QConsultaElegido: TBooleanField;
    QConsultaSuplente: TWideStringField;
    QConsultavida_cara: TWideStringField;
    QConsultaVivienda: TWideStringField;
    SpinEdit1: TSpinEdit;
    QConsultaSuplencia: TWideStringField;
    QConsultaEdad: TFloatField;
    QConsultaTransporte: TWideStringField;
    QConsultasueldoconpar: TCurrencyField;
    QConsultacveINE: TWideStringField;
    QConsultahoraentrada: TWideStringField;
    QConsultahorasalida: TWideStringField;
    QConsultaFechaInicio: TDateField;
    QConsultahoraslaborales: TWideStringField;
    SpeedButton2: TSpeedButton;
    CBGuardarCon: TCheckBox;
    TRegistroF: TADOTable;
    QConsultaTipo: TWideStringField;
    QConsultaNomPuestoDir: TWideStringField;
    QConsultaNomPuestoOf: TWideStringField;
    procedure QConsultaCalcFields(DataSet: TDataSet);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
      { Public declarations }
  end;

  const
   dias : array[1..7] of string =('LUNES','MARTES','MIERCOLES','JUEVES','VIERNES','SÁBADO','DOMINGO');
   meses : array[1..12] of string =('ENERO','FEBRERO','MARZO','ABRIL','MAYO','JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OCTUBRE','NOVIEMBRE','DICIEMBRE');

var
  FReporte: TFReporte;



implementation

uses Udm, UPrincipal, UElegir, UBuscarDir;

{$R *.dfm}
Procedure RegistrarFechas(QOperacion: TAdoQuery; FechaFinal: TDatetime; FechaEmision: TDatetime);
 begin
  QOperacion.First;
  FReporte.TRegistroF.Active:=true;
  while not(Qoperacion.Eof) do
  begin
    FReporte.TRegistroF.Insert;
    FReporte.TRegistroF.FieldByName('IdPersonal').AsInteger:= QOperacion.FieldByName('Personal.ide').AsInteger;
    FReporte.TRegistroF.FieldByName('FechaInicio').AsDatetime:= QOperacion.FieldByName('FechaInicio').AsDatetime;
    FReporte.TRegistroF.FieldByName('FechaFinal').AsDatetime:= FechaFinal;
    FReporte.TRegistroF.FieldByName('FechaEmision').AsDatetime:= FechaEmision;
    FReporte.TRegistroF.Post;
    Qoperacion.Next;
  end;
 end;

function xIntToLletras(Numero:LongInt):String;

  function xxIntToLletras(Valor:LongInt):String;
  const
   aUnidad : array[1..15] of string =
     ('UN','DOS','TRES','CUATRO','CINCO','SEIS',
      'SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
      'TRECE','CATORCE','QUINCE');
   aCentena: array[1..9]  of string =
     ('CIENTO','DOSCIENTOS','TRESCIENTOS',
      'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS',
      'SETECIENTOS','OCHOCIENTOS','NOVECIENTOS');
   aDecena : array[1..9]  of string =
    ('DIECI','VEINTI','TREINTA','CUARENTA','CINCUENTA',
     'SESENTA','SETENTA','OCHENTA','NOVENTA');
  var 
   Centena, Decena, Unidad, Doble: LongInt;
   Linea: String;
  begin 
   if valor=100 then Linea:=' CIEN '
   else begin 
     Linea:='';
     Centena := Valor div 100;
     Doble   := Valor - (Centena*100);
     Decena  := (Valor div 10) - (Centena*10);
     Unidad  := Valor - (Decena*10) - (Centena*100);
 
     if Centena>0 then Linea := Linea + Acentena[centena]+' ';
 
     if Doble>0 then begin 
       if Doble=20 then Linea := Linea +' VEINTE '
         else begin 
          if doble<16 then Linea := Linea + aUnidad[Doble]
            else begin 
                 Linea := Linea +' '+ Adecena[Decena];
                 if (Decena>2) and (Unidad<>0) then Linea := Linea+' Y ';
                 if Unidad>0 then Linea := Linea + aUnidad[Unidad];
            end; 
         end; 
     end; 
   end; 
   Result := Linea;
  end; 
 
var 
   Millones,Miles,Unidades: Longint;
   Linea : String;
begin 
  {Inicializamos el string que contendrá las letras según el valor
  numérico}
  if numero=0 then Linea := 'CERO'
  else if numero<0 then Linea := 'MENOS '
       else if numero=1 then 
            begin 
              Linea := 'UN';
              xIntToLletras := Linea;
              exit
            end 
            else if numero>1 then Linea := '';
 
  {Determinamos el Nº de millones, miles y unidades de numero en
  positivo}
  Numero   := Abs(Numero);
  Millones := numero div 1000000;
  Miles     := (numero - (Millones*1000000)) div 1000;
  Unidades  := numero - ((Millones*1000000)+(Miles*1000));

  {Vamos poniendo en el string las cadenas de los números(llamando
  a subfuncion)}
  if Millones=1 then Linea:= Linea + ' UN MILLON '
  else if Millones>1 then Linea := Linea + xxIntToLletras(Millones)
                                   + ' MILLONES ';

  if Miles =1 then Linea:= Linea + ' MIL '
  else if Miles>1 then Linea := Linea + xxIntToLletras(Miles)+
                                ' MIL ';

  if Unidades >0 then Linea := Linea + xxIntToLletras(Unidades);
 
  xIntToLletras := Linea;
end;

function PeriodoLetras(fechini: TDatetime; fechafin: TDatetime): string;
 var
   letras: string;
begin
   //anio:=
   letras:= inttostr(DayOf(fechini)) + ' DEL MES DE ' + meses[MonthOf(fechini)] + ' DEL AÑO ' + inttostr(yearof(fechini));
   letras := letras + ' Y CONCLUIRÁ EL ' + inttostr(DayOf(fechafin)) + ' DE ' + meses[MonthOf(fechafin)] + ' DEL AÑO ' + inttostr(yearof(fechafin));
   result:= letras;
end;


procedure TFReporte.QConsultaCalcFields(DataSet: TDataSet);
var
 pesos, centavos, posteriores: integer;
 fecha_inicio, fecha_final, Fecha_emision: TDateTime;
begin
//posteriores:= 0;
fecha_inicio:=  DTPFechini.DateTime;
fecha_final:=  DTPfechafin.DateTime;
Fecha_emision:= FechaEmision.datetime;
//if  (QConsulta.FieldByName('FechaAlta').AsDateTime >= strtodate('01/01/2017'))  then
//begin
   posteriores:= 1;
//end;
{if  (QConsulta.FieldByName('FechaAlta').AsDateTime < strtodate('01/01/2017')) then
begin
{fecha_inicio:=  DTPFechini.DateTime;
fecha_final:=  DTPfechafin.DateTime;
Fecha_emision:= FechaEmision.datetime;   }
//end
{else
 begin
  fecha_inicio:=  QConsulta.FieldByName('FechaAlta').AsDateTime;
  fecha_final:=  DTPfechafin.DateTime;
  Fecha_emision:= QConsulta.FieldByName('FechaAlta').AsDateTime;
  posteriores:= 1;
 end;    }
if  (LCBTipoTrab.KeyValue = 1) AND (posteriores = 0) then
begin
 pesos:= Trunc(QConsulta.FieldByName('honorarios').AsCurrency * strtoint(spinedit1.Text)) ;
 centavos:=Round(Frac(QConsulta.FieldByName('honorarios').AsCurrency * strtoint(spinedit1.Text) )*100);
end
else
begin
  pesos:= Trunc(QConsulta.FieldByName('honorarios').AsCurrency ) ;
 centavos:=Round(Frac(QConsulta.FieldByName('honorarios').AsCurrency )*100);
end;
 if centavos = 0 then
  QConsulta.FieldByName('letras').AsString:= Uppercase(xIntToLletras(pesos) + ' PESOS 00')
 else
  QConsulta.FieldByName('letras').AsString:= Uppercase(xIntToLletras(pesos) + ' PESOS '+ inttostr(centavos));
  QConsulta.FieldByName('periodo').AsString:= PeriodoLetras(fecha_inicio, fecha_final);
    if (SpinEdit1.Text = '1') AND (posteriores = 0) then
    begin
     QConsulta.FieldByName('Parcialidades').AsString:=  'EN UNA PARCIALIDAD A PARTIR DEL ' + inttostr(DayOf(fecha_inicio)) +  ' DEL MES DE ' +  meses[MonthOf(fecha_inicio)]+ ' DE ' + inttostr(yearof(fecha_inicio)) +
                                                       ' AL ' + inttostr(DayOf(fecha_final)) + ' DEL MES DE ' +  meses[MonthOf(fecha_final)]+ ' DE ' + inttostr(yearof(fecha_final));

    end
   else
     begin
     if (posteriores = 0) then

       QConsulta.FieldByName('Parcialidades').AsString:= 'EN ' + xIntToLletras(strtoint(SpinEdit1.Text)) + ' PARCIALIDADES A PARTIR DEL ' + inttostr(DayOf(fecha_inicio)) +  ' DEL MES DE ' +  meses[MonthOf(fecha_inicio)]+ ' DE ' + inttostr(yearof(fecha_inicio)) +
                                                       ' AL ' + inttostr(DayOf(fecha_final)) +  ' DEL MES DE ' +  meses[MonthOf(fecha_final)]+ ' DE ' + inttostr(yearof(fecha_final))
        else
           QConsulta.FieldByName('Parcialidades').AsString:= ' A PARTIR DEL ' + inttostr(DayOf(fecha_inicio)) +  ' DEL MES DE ' +  meses[MonthOf(fecha_inicio)]+ ' DE ' + inttostr(yearof(fecha_inicio)) +
                                                       ' AL ' + inttostr(DayOf(fecha_final)) +
                                                       ' DEL MES DE ' +  meses[MonthOf(fecha_final)]+ ' DE ' + inttostr(yearof(fecha_final));
     end;


  QConsulta.FieldByName('FechaEmision').AsString:= 'A LOS '+ xIntToLletras(DayOf(Fecha_emision)) + ' DÍAS DEL MES DE ' +  meses[MonthOf(Fecha_emision)] +
                                                  ' DEL AÑO ' + xIntToLletras(YearOf(Fecha_emision));
  QConsulta.FieldByName('FechaCorta').AsString:= inttostr(DayOf(Fecha_emision)) + ' DE ' + meses[MonthOf(Fecha_emision)] + ' DE ' + inttostr(YearOf(Fecha_emision));
  if  (LCBTipoTrab.KeyValue = 1) AND (posteriores = 0) then
  QConsulta.FieldByName('sueldoconpar').AsCurrency:=  QConsulta.FieldByName('honorarios').AsCurrency * strtoint(spinedit1.Text)
  else
  QConsulta.FieldByName('sueldoconpar').AsCurrency:=  QConsulta.FieldByName('honorarios').AsCurrency;
  QConsulta.FieldByName('FechaInicio').AsDateTime:= fecha_inicio;
end;

procedure TFReporte.BitBtn1Click(Sender: TObject);
 var
  ruta: string;
begin
 ruta:= ExtractFilePath(application.ExeName);
 //frxReport1.Variables.Variables['fecha_inicio'] := '01 de enero';
 if  LCBTipoTrab.KeyValue = 1 then
   frxReport1.LoadFromFile(ruta + 'Reportes/asimilados.fr3');
if  LCBTipoTrab.KeyValue = 2 then
   frxReport1.LoadFromFile(ruta + 'Reportes/oficio_2.fr3');
if  LCBTipoTrab.KeyValue = 3 then
   frxReport1.LoadFromFile(ruta + 'Reportes/eventual.fr3');
if  LCBTipoTrab.KeyValue = 4 then
   frxReport1.LoadFromFile(ruta + 'Reportes/suplentes.fr3');
if  LCBTipoTrab.KeyValue = 5 then
   frxReport1.LoadFromFile(ruta + 'Reportes/eventual_especial.fr3');
 Qconsulta.Active:= false;
 Qconsulta.Active:= true;
 if CBGuardarCon.Checked then
  RegistrarFechas(QConsulta, DTPFechafin.DateTime, FechaEmision.DateTime);
 frxReport1.ShowReport();
end;

procedure TFReporte.BitBtn2Click(Sender: TObject);
begin
  Form1.TEmpleados.Locate('ide', Qconsulta.fieldByName('personal.ide').AsInteger, []);
  close;
end;

procedure TFReporte.BitBtn4Click(Sender: TObject);
 var
 instruccion, condicion: string;
begin
 QConsulta.active:= false;
 condicion:= '';
 {instruccion:= 'SELECT Personal.ide, Personal.Titulo+ '+ chr(39)+ ' ' + chr(39) + ' + Personal.Nombre+' + chr(39)+ ' ' + chr(39) +  '+Personal.Apaterno+ ' + chr(39)+ ' ' + chr(39) +  ' +Personal.AMaterno AS Empleado, ' +
  ' Personal.RFC, Personal.Calle, Personal.No, Personal.Colonia, Personal.CP, CatAreas.Area, CatProgramas.Programa, CatPuestos.Puesto, Personal.Honorarios, ' +
  ' Personal.FechaAlta, IIf(Personal.Sexo='+ chr(39)+'F'+ chr(39)+','+ chr(39)+'LA'+ chr(39)+','+ chr(39)+'EL'+ chr(39)+') AS articulo, ' +
  ' IIF(Personal.TipoEmpleo = 1, IIf(Personal.Sexo=' + chr(39)+ 'F' + chr(39)+ ',' + chr(39)+ 'PRESTADORA' + chr(39)+ ','+ chr(39)+' PRESTADOR' + chr(39)+ '),  IIf(Personal.Sexo='+ chr(39)+'F'+ chr(39)+','+ chr(39)+'TRABAJADORA'+ chr(39)+','
  + chr(39)+ 'TRABAJADOR'+ chr(39)+ ')) AS denominacion, ' + ' IIf(Personal.Sexo='+ chr(39) + 'F'+ chr(39) + ','+ chr(39) + 'OBLIGADA' + chr(39) + ','+ chr(39)+'OBLIGADO' + chr(39) +') AS obligacion, CatAreas.Encargado, CatAreas.PuestoEnc, '+
  ' Directivos.OficialMay AS Oficial, Directivos.Director, Personal.EdoCivil, Personal.FechaNac,' +
  ' DateDiff("aaaa",[Personal]![FechaNac],Now()) As Edad, IIf(Personal.Sexo=' + chr(39) + 'F'+ chr(39) +', IIf(Personal.EdoCivil = '+ chr(39) +'CASADO (A)'+ chr(39) +','+ chr(39) + 'CASADA'+ chr(39) +', '+ chr(39) +'SOLTERA'+ chr(39) +
  '), IIf(Personal.EdoCivil = '+ chr(39) +'CASADO (A)'+ chr(39) +', '+ chr(39) +'CASADO'+ chr(39) +', '+ chr(39) +'SOLTERO'+ chr(39) +')) As EdoCivil, ' + ' CatLugares.Lugar, CatPuestos.Descripcion, Personal.Elegido, CatNacionalidad.Nacionalidad,' +
  ' IIf(Personal.Sexo='+ chr(39) +'F'+ chr(39) +','+ chr(39) +'FEMENINO'+ chr(39) +','+ chr(39) +'MASCULINO'+ chr(39) +' ) AS Sexo, Personal.jefe ,  iif( Personal.Compensacion is null or  Personal.Compensacion = 0,'+ chr(39) + chr(39) + ' , '+ chr(39) +
  ' UNA COMPENSACION  MENSUAL DE $' + chr(39) + ' + Cstr(Personal.Compensacion)) AS Compensacion, Personal.Vivienda, iif( Personal.Despensa is null or  Personal.Despensa = 0,'+ chr(39) + chr(39) + ', '+ chr(39) + 'UNA DESPENSA  MENSUAL DE  $'+ chr(39) + '+ Cstr( Personal.Despensa)) AS Despensa,'+
  ' Personal.Canasta, Personal.Suplente,' + ' Personal.Concepto, Personal.Vacaciones FROM (((((Personal LEFT JOIN CatAreas ON Personal.Area = CatAreas.ide) LEFT JOIN ' +
  ' CatProgramas ON Personal.Programa = CatProgramas.ide) LEFT JOIN CatPuestos ON Personal.Puesto = CatPuestos.ide) LEFT JOIN Directivos ON CatAreas.Directivos = Directivos.ide) LEFT JOIN CatLugares ON Personal.Lugar = CatLugares.ide)'+
  ' LEFT JOIN CatNacionalidad ON Personal.Nacionalidad = CatNacionalidad.ide';  }

   if CBDireccion.Checked then
   begin
    condicion:=' (CatAreas.ide = ' + inttostr(LCBDireccion.KeyValue) + ')';
   end;
   if CBNombre.Checked then
    begin
     if length(condicion) > 0 then
       condicion:= condicion + ' AND ';
       condicion:= condicion + ' (Nombre LIKE ' + chr(39) + '%' + ENombre.Text +  '%' + chr(39) + ')';
       condicion:= condicion + ' AND (Apaterno LIKE ' + chr(39) + '%' + EAPaterno.Text +  '%' + chr(39) + ')';
       condicion:= condicion + ' AND (AMaterno LIKE ' + chr(39) + '%' + EAMaterno.Text +  '%' + chr(39) + ')';
    end;
     if length(condicion) > 0 then
       condicion:= condicion + ' AND ';
       condicion:= condicion + ' (TipoEmpleo = ' + inttostr(LCBTipoTrab.KeyValue) + ')';
    instruccion := 'Select * from Reporte Where ';
    instruccion := instruccion + condicion;
    QConsulta.sql.clear;
    QConsulta.Sql.add(instruccion);
    //showmessage(instruccion);
    QConsulta.active:= true;

end;

procedure TFReporte.BitBtn3Click(Sender: TObject);
begin
close
end;

procedure TFReporte.FormCreate(Sender: TObject);
begin
 TDirecciones.Active:= true;
 TtipoTrab.Active:= true;
 LCBTipoTrab.KeyValue := TTipotrab.fieldByName('ide').AsInteger;
 DTPFechini.Date:= date;
 FechaEmision.Date:= date;
 DTPFechaFin.date:= date;
end;

procedure TFReporte.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=VK_F2) then
  SpeedButton2.OnClick(SpeedButton2);
end;

procedure TFReporte.SpeedButton1Click(Sender: TObject);
begin
 FElegir.Edit1.Clear;
 FElegir.QElegir.Active:= false;
 FElegir.QElegir.SQL:= QConsulta.SQL;
 FElegir.consulta := QConsulta.SQL.Text;
 FElegir.QElegir.Active:= true;
 FElegir.Showmodal;
end;

procedure TFReporte.SpeedButton2Click(Sender: TObject);
begin
 if FBuscarDir.ShowModal = mrok then
 begin
  // Tdirecciones.Locate('ide', FBuscarDir.QBuscarDir.FieldByName('Ide').AsString, []);
   LCBDireccion.KeyValue := FBuscarDir.QBuscarDir.FieldByName('Ide').AsString
 end;
end;

procedure TFReporte.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 QMostrar.Active:= false;
 QMostrar.SQL.clear;
 QMostrar.SQL.add('update Personal set Elegido = 0');
 QMostrar.ExecSQL;
end;

end.
