unit UExtempo;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
  Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Buttons, Vcl.Mask, Vcl.DBCtrls, JvExStdCtrls,
  JvCombobox, JvDBCombobox, Vcl.ExtCtrls, Data.Win.ADODB, System.DateUtils, system.StrUtils;

type
  TExtemporaneos = class(TForm)
    PBim: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    JvDBComboBox1: TJvDBComboBox;
    JvDBComboBox2: TJvDBComboBox;
    DBEdit1: TDBEdit;
    BtnNuevo: TBitBtn;
    BtnEditar: TBitBtn;
    BtnGuardar: TBitBtn;
    BtnCancelar: TBitBtn;
    BtnEliminar: TBitBtn;
    btnBuscar: TBitBtn;
    BitBtn2: TBitBtn;
    Panel1: TPanel;
    Label4: TLabel;
    BitBtn1: TBitBtn;
    FechaEm: TDateTimePicker;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    DBGrid1: TDBGrid;
    TBimestresExt: TADOTable;
    TImporta: TADOTable;
    DSBimestresExt: TDataSource;
    ADOConnection1: TADOConnection;
    OpenDialog1: TOpenDialog;
    guardar: TSaveDialog;
    QTools: TADOQuery;
    DSQTools: TDataSource;
    DSNodos: TDataSource;
    TNodos: TADOTable;
    TNodosBim: TADOTable;
    DSNodosBim: TDataSource;
    TEncabezado: TADOTable;
    BitBtn3: TBitBtn;
    CBVivienda: TCheckBox;
    CBSoloViv: TCheckBox;
    procedure BtnNuevoClick(Sender: TObject);
    procedure BtnEditarClick(Sender: TObject);
    procedure BtnEliminarClick(Sender: TObject);
    procedure BtnGuardarClick(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn8Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure DSBimestresExtStateChange(Sender: TObject);
    procedure btnBuscarClick(Sender: TObject);
    procedure TBimestresExtAfterScroll(DataSet: TDataSet);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Extemporaneos: TExtemporaneos;

implementation

{$R *.dfm}

uses Udm, UElegirHojaExt, UBuscarBimExt, UBuscarEmp;

Function ObtenerSumatoria(Qvar: TAdoQuery; IdBim: integer): real;
 var
   parEmp: string;
 begin
   parEmp:= 'Select sum(Ahorro_ST) As Resul from EmpleadosBim where IdBimestre = '+inttostr(IdBim);
   with qvar do
    begin
      active:= false;
      sql.Clear;
      sql.Add(parEmp);
      active:= true
    end;
   result:= qvar.FieldByName('Resul').AsFloat;
 end;

 Function AgregarCar(cadena: string; conta: integer; carac: string) : string;
var
 i, long: byte;
 cad: string;
begin
 cad := '';
 long := conta - length(trim(cadena));
 for i := 1 to long do
  begin
   cad:= carac + cad;
  end;
  Result:= cad + trim(cadena);
end;

function AgregarEspacios(cadena: string; conta: integer): string ;
var
 i, long: byte;
 cadi: string;
begin
 cadi := '';
 long := conta - length(trim(cadena));
 for i := 1 to long do
  begin
   cadi:= cadi + ' ';
  end;
  result:= trim(cadena) + cadi;
end;

function formatear_fecha(fecha: Tdatetime): string;
  var
    texto: string;
begin
  texto := datetostr(fecha);
  result:=  AnsiRightStr(texto, 4) + copy(texto, 4, 2) + AnsiLeftStr(texto,2);
end;

function formatear_cantidades(cantidad : real): string;
 var
   canti, formato: string;
 begin
    //canti := floattostr(cantidad);
    formato:= StringReplace(FormatFloat('0.00',cantidad) , '.', '', [rfReplaceAll]);
    formato:= StringReplace(formato , ',', '', [rfReplaceAll]);
    result:= formato;
 end;

 Procedure Crear_encabezado_Ext(cabeza: TAdoTable; numreg:integer; fecha: Tdate; var enca: AnsiString; periodo:Ansistring);
    var
      linea, canti: AnsiString;
      sumato: real;
   begin
     canti:= '';
     linea:= '01098106' + cabeza.FieldByName('ClaveEntOr').AsString;  //clave entidad origen
     linea:= linea + cabeza.FieldByName('TipoEntDes').AsString; //Tipo entidad destino
     linea:= linea + cabeza.FieldByName('ClaveEntDes').AsString; //Clave entidad destino
     linea:= linea + formatear_fecha(fecha); //fecha de transmision
     linea:= linea + cabeza.FieldByName('TipoPago').AsString; //Tipo de Pago
     linea:= linea + periodo; //Período de pago
     linea:= linea + cabeza.FieldByName('RFCDep').AsString; //RFC Dependencia
     linea:= linea + AgregarEspacios(cabeza.FieldByName('NomDep').AsString, 130); //Nombre Dependencia
     linea:= linea + cabeza.FieldByName('IdcenPagSAR').AsString; //Identificador de centro de pago
     linea:= linea + cabeza.FieldByName('ClaveRamo').AsString; //clave de ramo
     linea:= linea + cabeza.FieldByName('ClavePag').AsString; //clave de pagaduría
     linea:= linea + AgregarEspacios(cabeza.FieldByName('CalleDep').AsAnsiString, 40); //Calle y Número, domicilio dependencia
     linea:= linea + AgregarEspacios(cabeza.FieldByName('ColoniaDep').AsString, 25); //Colonia Dependencia
     linea:= linea + AgregarEspacios(cabeza.FieldByName('MunicipioDep').AsString, 25); //Municipio Dependencia
     linea:= linea + cabeza.FieldByName('CodPos').AsString; //Código postal
     linea:= linea + AgregarEspacios(cabeza.FieldByName('Entidad').AsString, 23); //Entidad Federativa
     linea:= linea + cabeza.FieldByName('TelDep').AsString; //Teléfono Dependencia
     //linea:= linea + formatear_fecha(fecha); //fecha de Aportación
     canti:= inttostr(numreg);
     canti := AgregarCar(canti, 9, '0');
     linea:= linea + canti;  // Número de registros de pagos extemporaneos
     linea:= linea + '000000000'; //Número de registros de pagos por Laudos
     linea:= linea + canti;  // Número de registros totales
     linea:= linea + AgregarEspacios('',55); //Filler
     //linea:= linea + AgregarEspacios('',2); //Resultado
     linea:= linea + AgregarEspacios('',11); //Motivos de rechazo
     enca:= linea;
   end;

procedure TExtemporaneos.BitBtn1Click(Sender: TObject);
var
   Llave, bd: string;
 begin
if OpenDialog1.Execute then
  begin
     bd:= OpenDialog1.FileName;
      if bd <> '' then
      begin
        ADOConnection1.Connected := false;
        Llave:= 'Provider=Microsoft.ACE.OLEDB.12.0; User ID=Admin;Data Source=';
        Llave := Llave + bd + ';Mode=Share Deny None;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"';
        ADOConnection1.ConnectionString:= Llave;
        ADOConnection1.Connected:= true;
        ADOConnection1.GetTableNames(FElegirHojaExt.Combobox1.Items,false);
        FElegirHojaExt.Combobox1.Text := FElegirHojaExt.Combobox1.Items[0];
        FElegirHojaExt.Showmodal;
      end
      else
        messagedlg('El usuario canceló la operación',mtinformation,[mbok],0);
 end;
end;

procedure TExtemporaneos.BitBtn2Click(Sender: TObject);
begin
close
end;

procedure TExtemporaneos.BitBtn3Click(Sender: TObject);
begin
 FBuscarEmp.txtBus.clear;
 if FBuscarEmp.showmodal = mrok then
   TNodos.locate('NumEmp;IdBimestre', varArrayOf([FBuscarEmp.Qbuscar.FieldByname('NumEmp').AsString, TBimestresExt.FieldByname('IdBimestre').AsInteger]), []);
end;

procedure TExtemporaneos.BitBtn5Click(Sender: TObject);
begin
 if messageDLG('Esto eliminará todas las aportaciones, ¿está seguro (a)?',mtconfirmation,[mbyes, mbno],0)= mryes then
   begin
     with Qtools do
      begin
        active:= false;
        sql.Clear;
        sql.Add('Delete from EmpleadosBimExt where IdBimestre = ' + inttostr(TBimestresExt.FieldByName('IdBimestre').AsInteger));
        execSQL;
        TNodos.Active:= false;
        TNodos.Active:= true;
      end;
   end;
end;
procedure TExtemporaneos.BitBtn6Click(Sender: TObject);
 var
  periodo, canti: AnsiString;
  linea, prueb: AnsiString;
  filas: longint;
  Datos : TextFile;
  suma, cantit: real;
begin
 if TNodos.RecordCount > 0 then
 begin
  TEncabezado.Active:= false;
  TEncabezado.Active:= true;
  linea:='';
  periodo := inttostr(TBimestresExt.FieldByName('Anio').AsInteger) + '0' + inttostr(TBimestresExt.FieldByName('Bimestre').AsInteger);
  Crear_encabezado_ext(TEncabezado, TNodos.RecordCount, FechaEm.Date, linea, periodo);
   if guardar.Execute then
   begin
     AssignFile(Datos, Guardar.FileName);
     Rewrite(Datos);
     TNodos.First;
     Screen.Cursor:= CrHourGlass;
     writeln(Datos,linea);
     linea:= '';
     suma:= 0;
     while not(TNodos.Eof) do
     begin
       QTools.Active:= false;
       QTools.SQL.Clear;
       QTools.SQL.Add('Select * from Empleados where NumEmp = ' +   chr(39) + AgregarCar(TNodos.FieldByName('NumEmp').AsString, 10, '0') + chr(39));
       QTools.Active:= true;
       linea:= 'E'; //detalle moviemiento
       linea:= linea + AgregarEspacios(trim(QTools.FieldByName('Rfc').AsString), 13);//  RFC
       linea:= linea + AgregarEspacios(trim(QTools.FieldByName('Curp').AsString), 18);//  CURP
       linea:= linea + AgregarEspacios(trim(QTools.FieldByName('NSS').AsString), 11);//  NSS
       linea:= linea + AgregarEspacios(QTools.FieldByName('Apaterno').AsAnsiString, 40);//  Apellido Paterno
       linea:= linea + AgregarEspacios(QTools.FieldByName('Amaterno').AsAnsiString, 40);//  Apellido Materno
       linea:= linea + AgregarEspacios(QTools.FieldByName('Nombres').AsAnsiString, 40);//  Nombres
       //prueb:= QTools.FieldByName('Nombres').AsAnsiString + ' ' + QTools.FieldByName('Apaterno').AsAnsiString + ' ' + QTools.FieldByName('Amaterno').AsAnsiString;
       //StringReplace(prueb, '?','Ñ', [rfReplaceAll]);
       //memo1.Lines.Add(prueb);
       linea:= linea + QTools.FieldByName('Cve_Pagaduria').AsString;//  Clave de pagaduría
       linea:= linea + AgregarEspacios(QTools.FieldByName('Cve_ramo').AsString, 20);//  Clave de Reparto
       linea:= linea + trim(TNodos.FieldByName('NumEmp').AsString);//  Número de Empleado
       linea:= linea + AgregarEspacios(TEncabezado.FieldByName('Cve_entidad').AsString, 3);//  Clave Entidad Receptora
       //linea:= linea + '300';  //Clave Entidad Receptora temporal
       linea:= linea + '02'; //Tipo de pago
       linea:= linea + periodo;  //periodo
       linea:= linea + AgregarCar(TNodos.FieldByName('DiasCot').AsString, 3,'0'); //Dias de cotización
       linea:= linea + AgregarCar(TNodos.FieldByName('DiasInc').AsString, 3,'0'); //Dias de Incapacidad
       linea:= linea + AgregarCar(TNodos.FieldByName('DiasAus').AsString, 3,'0'); //Dias de Ausentismo

       if CBSoloViv.Checked then   //Sólo vivienda
       begin
        cantit:=TNodos.FieldByName('SueldoBas').AsFloat + TNodos.FieldByName('Vivienda').AsFloat ; //sumamos vivienda y sueldo
        canti:= AgregarCar(formatear_cantidades(cantit),7,'0'); //formateo vivienda
        linea:= linea + '0000000';  //Sueldo Básico de cotizacion al CV Bimestral
        linea:= linea + '0000000';  //Sueldo Básico de cotizacion al RCV
        linea:= linea +  canti //Sueldo Básico al fondo de vivienda
       end
       else
        begin
           canti:= AgregarCar(formatear_cantidades(TNodos.FieldByName('SueldoBas').AsFloat),7,'0'); //formateo Sueldo Básico
           linea:= linea +  canti; //Sueldo Básico
           linea:= linea +  canti; //Sueldo Básico de cotizacion al RCV
           if CbVivienda.Checked then
           linea:= linea + AgregarCar(formatear_cantidades(TNodos.FieldByName('Vivienda').AsFloat),7,'0')
           else //Sueldo Básico al fondo de vivienda
            linea:= linea + '0000000'; //Sueldo Básico al fondo de vivienda
        end;

       if (TNodos.FieldByName('PagosFijos').AsFloat = 0) then
       canti:= '000000000000'
       else
       canti:= AgregarCar(formatear_cantidades(TNodos.FieldByName('PagosFijos').AsFloat),12,'0'); //formateo Pagos fijos
       linea:= linea +  canti; //Pagos fijos retiro
       linea:= linea +  canti; //Pagos fijos por cesantia trabajador
       linea:= linea +  canti; //Pagos fijos por cesantia patrón
       linea:= linea +  canti; //Pago fijo00000000000 FOVISSSTE
       linea:= linea + TNodos.FieldByName('AhorroSol').AsString; //Aportación Ahorro Solidario
       linea:= linea + AgregarCar(formatear_cantidades(TNodos.FieldByName('ImporteSol').AsFloat),7,'0'); //ImporteAhorroSolidario
       linea:= linea + '0'; //Tipo de Importe
       linea:= linea + AgregarEspacios('',25); //Uso futuro
       linea:= linea + AgregarEspacios('',78); //Filler
       linea:= linea + AgregarEspacios('',11); //motivos de rechazo
       //formatear cadena con caracteres, "ñ"
       //StringReplace(linea, '?','Ñ', [rfReplaceAll]);
       writeln(Datos, linea);
      linea:= '';
      TNodos.Next;
     end;
     CloseFile(Datos);
   messagedlg('Conversión terminada',mtinformation,[mbok],0);
   Screen.Cursor:= CrDefault;
   end;
 end
 else
   MessageDLG('No existen registros para exportar', mterror,[mbok],0);
end;

procedure TExtemporaneos.BitBtn8Click(Sender: TObject);
begin
 TBimestresExt.Cancel
end;

procedure TExtemporaneos.btnBuscarClick(Sender: TObject);
var
   anioactual, mesactual: integer;
begin
  anioactual := YearOf(Now);
  mesactual := MonthOf(Now);
  //FBuscarbim.CBAnio.Text:= inttostr(anioactual);
  FBuscarBimestreExt.QBimestres.Active:=false;
  FBuscarBimestreExt.QBimestres.Active:=true;
  if (FBuscarBimestreExt.ShowModal = mrok) and (FBuscarBimestreExt.QBimestres.RecordCount > 0) then
  begin
    TBimestresExt.Locate('IdBimestre',FBuscarBimestreExt.QBimestres.FieldByName('IdBimestre').AsInteger,[]);
    Tnodos.Active:= true;
    bitbtn3.Enabled:=true;
  end;

end;

procedure TExtemporaneos.BtnEditarClick(Sender: TObject);
begin
 TbimestresExt.Edit;
end;

procedure TExtemporaneos.BtnEliminarClick(Sender: TObject);
begin
 TBimestresExt.Delete;
end;

procedure TExtemporaneos.BtnGuardarClick(Sender: TObject);
begin
  TBimestresExt.Post
end;

procedure TExtemporaneos.BtnNuevoClick(Sender: TObject);
begin
TBimestresExt.Insert;
end;

procedure TExtemporaneos.DSBimestresExtStateChange(Sender: TObject);
begin
if TBimestresExt.state in [dsinsert, dsedit] then
    begin
      BtnGuardar.Enabled:= true;
      BtnCancelar.Enabled:= true;
      BtnEditar.Enabled:= false;
      BtnNuevo.Enabled:= false;
      btnBuscar.Enabled:= false;
    end
    else
     begin
      BtnGuardar.Enabled:= false;
      BtnCancelar.Enabled:= false;
      BtnEditar.Enabled:= true;
      BtnNuevo.Enabled:= true;
      btnBuscar.Enabled:= true;
     end;
end;

procedure TExtemporaneos.FormCreate(Sender: TObject);
begin
 FechaEm.Date:= date;
end;

procedure TExtemporaneos.TBimestresExtAfterScroll(DataSet: TDataSet);
begin
  TNodos.Filtered:= false;
  TNodos.Filter:= 'IdBimestre = ' + QuotedStr(inttostr(TBimestresExt.FieldByname('IdBimestre').ASinteger));
  TNodos.Filtered:= true;
  TNodos.Active:= false;
  TNodos.Active:= true;
end;

end.
