unit UReporte;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, frxClass,
  frxDBSet, DB, ADODB, DBCtrls, Grids, Wwdbigrd, Wwdbgrid, frxRich,
  ComCtrls, dateutils, frxDCtrl, ExtCtrls, DBGrids, frxOLE, Spin;

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;
    frxDialogControls1: TfrxDialogControls;
    QConsultaOficial: TWideStringField;
    QConsultaDirector: TWideStringField;
    Label4: TLabel;
    Label5: TLabel;
    ParFechini: TDateTimePicker;
    Label6: TLabel;
    ParFechaFin: TDateTimePicker;
    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;
    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);
  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;

{$R *.dfm}
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: integer;
begin
 pesos:= Trunc(QConsulta.FieldByName('honorarios').AsCurrency) ;
 centavos:=Round(Frac(QConsulta.FieldByName('honorarios').AsCurrency)*100);
 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(DTPFechini.DateTime, DTPFechaFin.DateTime);
  {  if CBParcialidades.Text = 'Una' then
   begin
    QConsulta.FieldByName('Parcialidades').AsString:=  'UNA PARCIALIDAD A PARTIR DEL ' + inttostr(DayOf(Parfechini.DateTime)) +  ' DEL MES DE ' +  meses[MonthOf(Parfechini.DateTime)]+ ' DE ' + inttostr(yearof(Parfechini.DateTime)) +
                                                       ' AL ' + inttostr(DayOf(Parfechafin.DateTime)) +
                                                       ' DEL MES DE ' +  meses[MonthOf(Parfechafin.DateTime)]+ ' DE ' + inttostr(yearof(Parfechafin.DateTime));

   end;

   if CBParcialidades.Text = 'Dos' then
   begin
    QConsulta.FieldByName('Parcialidades').AsString:=  'DOS PARCIALIDADES A PARTIR DEL ' + inttostr(DayOf(Parfechini.DateTime)) +  ' DEL MES DE ' +  meses[MonthOf(Parfechini.DateTime)]+ ' DE ' + inttostr(yearof(Parfechini.DateTime)) +
                                                       ' AL ' + inttostr(DayOf(Parfechafin.DateTime)) +
                                                       ' DEL MES DE ' +  meses[MonthOf(Parfechafin.DateTime)]+ ' DE ' + inttostr(yearof(Parfechafin.DateTime));

   end;
    if CBParcialidades.Text = 'Tres' then
   begin
    QConsulta.FieldByName('Parcialidades').AsString:=  'TRES PARCIALIDADES A PARTIR DEL ' + inttostr(DayOf(Parfechini.DateTime)) +  ' DEL MES DE ' +  meses[MonthOf(Parfechini.DateTime)]+ ' DE ' + inttostr(yearof(Parfechini.DateTime)) +
                                                       ' AL ' + inttostr(DayOf(Parfechafin.DateTime)) +
                                                       ' DEL MES DE ' +  meses[MonthOf(Parfechafin.DateTime)]+ ' DE ' + inttostr(yearof(Parfechafin.DateTime));

   end;    }

    if SpinEdit1.Text = '1' then
   begin
    QConsulta.FieldByName('Parcialidades').AsString:=  'UNA PARCIALIDAD A PARTIR DEL ' + inttostr(DayOf(Parfechini.DateTime)) +  ' DEL MES DE ' +  meses[MonthOf(Parfechini.DateTime)]+ ' DE ' + inttostr(yearof(Parfechini.DateTime)) +
                                                       ' AL ' + inttostr(DayOf(Parfechafin.DateTime)) +
                                                       ' DEL MES DE ' +  meses[MonthOf(Parfechafin.DateTime)]+ ' DE ' + inttostr(yearof(Parfechafin.DateTime));

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


  QConsulta.FieldByName('FechaEmision').AsString:= 'A LOS '+ xIntToLletras(DayOf(fechaEmision.DateTime)) + ' DÍAS DEL MES DE ' +  meses[MonthOf(fechaEmision.DateTime)] +
                                                  ' DEL AÑO ' + xIntToLletras(YearOf(fechaEmision.DateTime));
  QConsulta.FieldByName('FechaCorta').AsString:= inttostr(DayOf(FechaEmision.datetime)) + ' DE ' + meses[MonthOf(FechaEmision.DateTime)] + ' DE ' + inttostr(YearOf(fechaEmision.DateTime));
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/oficio.fr3');
if  LCBTipoTrab.KeyValue = 2 then
   frxReport1.LoadFromFile(ruta + 'Reportes/oficio_2.fr3');
if  LCBTipoTrab.KeyValue = 3 then
   frxReport1.LoadFromFile(ruta + 'Reportes/oficio_3.fr3');
 Qconsulta.Active:= false;
 Qconsulta.Active:= true;
 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.SpeedButton1Click(Sender: TObject);
begin
 FElegir.QElegir.Active:= false;
 FElegir.QElegir.SQL:= QConsulta.SQL;
 FElegir.QElegir.Active:= true;
 FElegir.Showmodal;
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.
