Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #261  
Antiguo 20-03-2025
starlet starlet is offline
Miembro
NULL
 
Registrado: sep 2012
Posts: 9
Poder: 0
starlet Va por buen camino
Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,
Responder Con Cita
  #262  
Antiguo 21-03-2025
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Cita:
Empezado por starlet Ver Mensaje
Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,
El formulario principal tiene visible = false
Ponlo a true
Responder Con Cita
  #263  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por mqm Ver Mensaje
El formulario principal tiene visible = false
Ponlo a true
gracias

que horror, se debio quedar a false en algun momento y como en D7 se abre sin problema ni cuenta me di.

gracias por todos los apoyos, y gracias a los que habeis contribuido, porque hemos pasado por varias fases:

al principio era un servidor de mensajes, que luego gracias a darkdudae y su aviso, paso a ser DLL, que parece mas profesional
a los usuarios del foro que han contribuido para aislar el xml del registro y poder archivarlo, cosa que no tenia ni idea
y finalmente el tema de comprender el encadenamiento que estaba muy equivocado.

fallos, no se si saldran muchos mas, ahora, tampoco se si falta alguna caracteristica clave como las dos ultimas mencionadas arriba.

Un saludo a todos, y me alegro de que este sirviendo para su fin.
Responder Con Cita
  #264  
Antiguo 22-03-2025
starlet starlet is offline
Miembro
NULL
 
Registrado: sep 2012
Posts: 9
Poder: 0
starlet Va por buen camino
Cita:
Empezado por mqm Ver Mensaje
El formulario principal tiene visible = false
Ponlo a true
Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.
Responder Con Cita
  #265  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por starlet Ver Mensaje
Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.
Has instalado el capicom ?
Responder Con Cita
  #266  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por ontisoft Ver Mensaje
Hola de nuevo. Llevo un par de meses desconectado y veo que este proyecto a seguido avanzando bastante.
Gracias a todos por vuestro esfuerzo y trabajo.

Yo comencé con la demo trasteando y probando con Delphi 12 y tenia muy buena pinta.

Pero por lo que veo ahora os centráis mas en un componente DLL para Delphi 7.

Mi pregunta es, las mejoras de la DLL ¿se están llevando también a la demo inicial, o ya solo os centráis en la DLL?

¿La DLL se puede integrar también en Delphi 12 o solo es para versiones antiguas?

Quiero ponerme ya en serio con este asunto, y si puedo aportar algo en el proceso lo hare encantado.
La demo inicial sigue los cambios de la DLL. Incluso muy mejorada.

En principio la DLL y el componente se puede usar desde cualquier versión. De delphi.

Si vas a usar la DLL puedes ver la llamada desde el.componente.

También podrías usar la unidad de funciones sin su encapsulado de DLL llamando sin más a su unidad

Última edición por seccion_31 fecha: 22-03-2025 a las 12:24:22.
Responder Con Cita
  #267  
Antiguo 22-03-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #268  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

Un saludo,
Podrías hacer una consulta simple
Responder Con Cita
  #269  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,
Con la DLL el log quedo obsoleto
Responder Con Cita
  #270  
Antiguo 22-03-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
Podrías hacer una consulta simple
No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #271  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.
también me había planteado comprobar el estado de la AEAT pero solo al abrir el programa.

Incluso habia pensado hacer una función de ese tipo, a ver si hay otra forma...

Con otro tema: Pensé en validar el.vies y está la función dentro, pero no me válida casi nunca y lo dejé por imposible.


Slds,!
Responder Con Cita
  #272  
Antiguo 22-03-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #273  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas
Con tu permiso lo coloco en el componente

Slds !
Responder Con Cita
  #274  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
verificar que la AEAT esta ahi.

He usado el codigo de ramherfer con algun cambio para que me funcionara, y hoy da como activa la web de la aeat cuando tiene un error, el tipico del fin de semana:

Cita:
Descripción: UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON 00C90081, TYPE OF RESOURCE 00000210, AND RESOURCE NAME DBTCCSOR.TSTCCSOR.00000001. SQLCODE=-904, SQLSTATE=57011, DRIVER=4.33.43
La pagina existe, y por tanto aparece como activa, pero con error. Entrar en analizar su contenido me parece un poco exagerado. Es mi opinión. Ademas de necesitar las dlls adiciones para que funcione el ssl.

Por lo que creo que es mejor incorporar una consulta, la mas simple, de un día determinado, por ejemplo del día siguiente. (no se si dejara).

Otro tema es la frecuencia de revision planteada.

Saludos !

Nota: ya esta incpororada la funcion, para ello consulta una factura, llamada PING en el periodo y fecha actuales con el certificado de la sesion. Es inmediato y seguro.

Última edición por seccion_31 fecha: 22-03-2025 a las 17:16:00.
Responder Con Cita
  #275  
Antiguo 22-03-2025
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Buenas session_31.
Yo lo que hago en tu componente es lo que dices, una consulta inexstente y listo.

Código Delphi [-]
procedure TForm1.VerificaConexíonClick(Sender: TObject);
var
   ejercicio, periodo, numero: string;
   desde, hasta: TDatetime;
   resultado: TConsultaResultado;
begin
   // Datos esenciales de inicio de sesion para consulta
   VeriFactuD7.Certificado               := comboCertificados.text;
   VerifactuD7.Emisor.NombreRazonEmisor  := editEmisor.Text;
   VerifactuD7.Emisor.nifEmisor          := editNIFEmisor.Text;
   VerifactuD7.Simular                   := false;
   VerifactuD7.urlEndPoint               := editURL.text;

   // si se filtra por sistema informatico colocar los datos
   if filtroSIF.checked then
   begin
       VerifactuD7.SistemaInformatico.razonSocial       := editRazonSocial.Text;
       VerifactuD7.SistemaInformatico.nif               := editNIF.Text;
       VerifactuD7.SistemaInformatico.nombre            := editNombre.Text;
       VerifactuD7.SistemaInformatico.ID                := editID.Text;
       VerifactuD7.SistemaInformatico.Version           := editVersion.Text;
       VerifactuD7.SistemaInformatico.NumeroInstalacion := editInstalacion.Text;
   end;

   // Archivo XML vacío que se guardará como referencia de la consulta
   VeriFactuD7.filenameXML_Envio       := xmlEnvioConsulta;
   VeriFactuD7.filenameXML_Respuesta   := xmlRespuestaConsulta; 

   // Iniciar Sesión
   if not VeriFactuD7.inicio then
   begin
       ShowMessage('Error Iniciando Sesion');
       Exit;
   end;

     // Asignar parámetros mínimos válidos
     ejercicio := IntToStr(YearOf(Now));   // Año actual
     periodo := FormatDateTime('mm', Now); // Mes actual
     numero := '';                         // Consulta sin número específico
     desde := Now;                         // Fecha actual como ejemplo
     hasta := Now;                         // Mismo día para una consulta mínima válida

   // Intentar la consulta vacía
   if VeriFactuD7.consulta(ejercicio, periodo, numero, desde, hasta, filtroSIF.Checked, resultado) then
   begin
       ShowMessage('Conexión exitosa con el servidor.');
   end
   else
   begin
       ShowMessage('Error en la conexión: ' + resultado.errorDes);
   end;

   // Terminar sesión
   VeriFactuD7.final('');
end;
Responder Con Cita
  #276  
Antiguo 22-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
si, creo que la consulta inexistente es lo mejor.

ahora se reducira a:

Código:
            VeriFactuD7.Certificado              :=comboCertificados.text;
            VerifactuD7.Emisor.NombreRazonEmisor :=editEmisor.Text;
            VerifactuD7.Emisor.nifEmisor         :=editNIFEmisor.Text;
            VerifactuD7.urlEndPoint              :=editURL.text;   // endpoint de la AEAT

            if veriFactuD7.VerifactuActivo then
                statusBar1.panels[1].Text:='AEAT Activa'
            else
                statusBar1.panels[1].Text:='AEAT Inactiva';

y si tienes el certificado ya cargado mucho menos codigo. Sin iniciar sesion.

Ya esta incluido el ejemplo en la Demo

Y la publicare la semana del 31 ; ) como version 2.1 con los cambios que vayan apareciendo.

Saludos !

: )

y buenas tardes

Última edición por seccion_31 fecha: 22-03-2025 a las 17:47:04.
Responder Con Cita
  #277  
Antiguo 25-03-2025
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025
Responder Con Cita
  #278  
Antiguo 25-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
Ya esta corregido !

gracias por el aviso.

Por cierto starlet ¿has podido probar la demo?


slds !

Cita:
Empezado por mqm Ver Mensaje
en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025
Responder Con Cita
  #279  
Antiguo 26-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 292
Poder: 9
seccion_31 Va por buen camino
parece que han cambiado esto en la normativa: desde el 18 de marzo:

Cita:
15.6.9 ClaveRegimen 18. Recargo de equivalencia
- Sólo se puede cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia
cuando CalificacionOperacion es “S1”.
- Si CalificacionOperacion es “S1”:
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA), sólo
se podrá cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia si
ClaveRegimen igual a “18”.
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA) y
ClaveRegimen igual a “18”, es oblig
Cita:
1.0.3 18/03/2025 Se incluye nuevo “Aceptado con errores” al hacer
un mal uso del primer registro.
Se incluye nueva validación para la clave de
régimen 18 (Recargo de equivalencia)
Se elimina validación de NIFs iguales entre emisor
y destinatario (Facturas de autoconsumo)
Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !
Responder Con Cita
  #280  
Antiguo 26-03-2025
delphiGar delphiGar is offline
Miembro
 
Registrado: ago 2024
Posts: 163
Poder: 1
delphiGar Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
parece que han cambiado esto en la normativa: desde el 18 de marzo:





Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !
Esto lo estamos comentado en dos hilos distinto, pero te resumo:

Si la factura lleva Recago de Equivalencia la ClaveRegimen tiene que ser 18, y aclaro, si la emite es por que puede hacerlo con recargo. Si esta en Recargo de Equivalencia el OT no puede emitir facturas con RE, por lo tanto sera la clave 01 u otra.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Verifactu o por requerimiento (no-verifactu) ¿decisión del usuario? Maska10 Temas legales 2 07-12-2024 12:34:47
Demo de una applicación para una estación de enfermera con RAD Studio AgustinOrtu La Taberna 1 21-07-2015 17:41:35
Demo Delphi, EMail Caral Internet 1 19-12-2006 00:37:56
Demo de delphi 2005 mazinger Varios 2 18-12-2004 09:23:09
El Rave que viene con Delphi es una Demo? apicito Impresión 0 04-06-2003 11:33:36


La franja horaria es GMT +2. Ahora son las 23:46:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi