Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice (https://www.clubdelphi.com/foros/showthread.php?t=91252)

nuevo1234 30-05-2017 19:53:22

[quote=nuevo1234;517387]EFECTIVAMENTE:

1.- NIF que, aunque correcto formalmente, no se corresponda con el nombre del titular adjuntado (no identificado). RECHAZA LA FACTURA (OJO PUEDE RECHAZARLA POR ESTAR MAL EL NOMBRE Y BIEN EL NIF). Por eso importante poner: primer apellido segundo apellido y nombre sin signos de puntuación
2.- NIF que, aunque formalmente correcto, no corresponda a ningún sujeto registrado por la administracion (NIF no censado). LA ACEPTA CON ERRORES(IMPORTANTE DIFERENCIA:SE ACEPTA LA FACTURA PERO SE MARCA QUE SE HA ENVIADO POR NO CENSADO)


Por tanto:
Es muy importante informar el nombre en el siguiente orden: primer apellido segundo apellido y nombre sin signos de puntuación.
Porque puede no identificar los NIF por esta razón y rechazar el envio de esa factura


En cuanto al NO CENSADO.
Para los casos en que se haya rechazado una factura emitida, en un segundo reintento, porque la información de identificación del destinatario (NIF y nombre) no figure censada en la AEAT, la forma de proceder para enviar dicha factura se realizará a través del bloque IdOtro con los
siguientes contenidos:

Código país: ES
Clave ID: 07. No censado
Número Id: NIF no censado del receptor de la factura
Apellidos y nombre: Nombre del no censado receptor de la factura.

En este caso, la factura figurará como aceptada con errores. A través de esta vía, también se intentará su validación contra el censo, de manera que podría lograse su identificación, aunque la factura figurará como aceptada con errores. En cualquier caso un error de formato en el NIF supondrá un RECHAZO de la factura.[/QUOT

Un apunte más siempre que metemos un Nif por el modo 07.No censado se acepta con errores y entra diciendo Nif no censado. Si el Nif está bien formado. Cuando metemos Nif de la forma normal pues responder con Nif no identificado y rechazo. Por eso hay dos mensajes diferentes. Espero haber aclarado algo

brincola 30-05-2017 20:44:47

Cita:

Empezado por javipes (Mensaje 517378)
buff! tengo un lío tremendo... si he conseguido generar el suministro de facturas emitidas, siguiendo lo que he visto en el hilo,
¿como puedo ver el contenido del xml ANTES de llamar a GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASumLRFacturasEmitidas); ?

seguro que es muy sencillo

Quítate 1300 (o sea, mira la entrada 53). Allí habla de introducir este evento:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
SOAPRequest.Size:=0;
ss:=TFileStream.Create('C:\1.xml', fmOpenRead);
SOAPRequest.Position := 0;
SOAPRequest.CopyFrom( ss, ss.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

No lo he probado aún, pero tiene sentido.

CMB 30-05-2017 20:53:01

Más de 86.000 vistas
 
Y ya van más de 86.000 vistas!!! Y 1.363 respuestas.

brincola 30-05-2017 22:01:58

Cita:

Empezado por brincola (Mensaje 517391)
Quítate 1300 (o sea, mira la entrada 53). Allí habla de introducir este evento:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
SOAPRequest.Size:=0;
ss:=TFileStream.Create('C:\1.xml', fmOpenRead);
SOAPRequest.Position := 0;
SOAPRequest.CopyFrom( ss, ss.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

No lo he probado aún, pero tiene sentido.

Ahora, ya probándolo, yo haría la siguiente corrección:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmOpenWrite);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

Pero esto aún da un problema: no genera el fichero. Hay que crearlo previamente (copy con 1.xml y terminarlo con Ctrl Z si lo quieres vacío).


Los TFileStream son un poco tozudos a veces con los share y demás permisos (Read, Write, etc).
Con paciencia y un poco de tiempo acabar de perfilar para corregir este problema.

brincola 30-05-2017 22:38:10

Cita:

Empezado por brincola (Mensaje 517394)
Ahora, ya probándolo, yo haría la siguiente corrección:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

Pero esto aún da un problema: no genera el fichero. Hay que crearlo previamente (copy con 1.xml y terminarlo con Ctrl Z si lo quieres vacío).


Los TFileStream son un poco tozudos a veces con los share y demás permisos (Read, Write, etc).
Con paciencia y un poco de tiempo acabar de perfilar para corregir este problema.

Con esto como definitivo:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

... ya vale.

RubenMon 30-05-2017 23:41:15

Hola.

Un pequeño aporte.
Me he liado bastante para pasar de texto al indice de las enumeraciones de los XMLNS que genera Delphi. Por ejemplo para saber el índice del país a partir del código del país en texto.
He visto algunas soluciones en otras respuestas pero hacía falta declarar listas o arrays auxiliares.

Una pequeña función puede ayudar en estos casos:

Código:

function IndiceEnum(Info: PTypeInfo; const Name: string): Integer;
var
  InternalName: string;
begin
  InternalName := RemClassRegistry.GetInternalPropName(Info, Name);
  Result := GetEnumValue(Info, InternalName);
  if Result < 0 then
    raise Exception.CreateFmt('Valor %s no encontrado en enumeracion %s', [Name, Info^.Name]);
end;

y en el código se puede colocar

Código:

FacturaExpedida.Contraparte.IDOtro.CodigoPais := CountryType2(IndiceEnum(TypeInfo(CountryType2), Pais));
Donde "Pais" es una variable de tipo "string" que contiene el código del país ('FR', 'IT', etc);

La misma función se puede utilizar con otras enumeraciones que estén declaradas en los XLMNS.

Rubén.

barnarasta 31-05-2017 01:21:22

Sobre el tema de los NIF censados o NO CENSADOS yo tengo un caso curioso:

IBRAHIMI EL BABANI RACHID 54677557W
El la busqueda por nif https://www1.agenciatributaria.gob.e...BUGC-JDIT/Cnec
da como correcto y al realizar el envio de EMITIDAS la rechaza como NO CENSADO.

brincola 31-05-2017 01:33:28

Interesante, RubenMon.

keys 31-05-2017 08:37:49

Cita:

Empezado por joefrommalaka (Mensaje 517368)
Por cierto si envío el archivo xml mediante la web https://www7.aeat.es/static_files/co...teWSAEAT2.html se envía correctamente.

Hola. Este problema ya esta resuelto en enlaces anteriores, es la forma de asignar el certificado. Se soluciono con las capicom. Yo he llegado a enviar un bloque de 10000 facturas para ver si funcionaba y todo correcto.

Te pongo el codigo pero revisa los post anteriores. En el evento OnbeforePost del objeto HttpTrio tienes que poner lo siguiente

Código Delphi [-]
  procedure TFSIIConsultar.SoapeadorHTTPWebNode1BeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
     Store : IStore;
     Certs : ICertificates;
     Cert : ICertificate2;
     CertContext : ICertContext;
     PCertContext : PCCERT_CONTEXT;
     V : OleVariant;
  
 const
     INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
 begin

     V := Certificado;

     Store := CoStore.Create;
     Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
     Certs := Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False );

     if Certs.Count > 0 then
     begin

         Cert:=IInterface(Certs.Item[1]) as ICertificate2;

         CertContext:=Cert as ICertContext;
         CertContext.Get_CertContext(Integer(PCertContext));


        

         if InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,Sizeof(CERT_CONTEXT)) = False then
          begin
             showmessage('ERROR');
          end;
     end
     else
      begin
        showmessage('ERROR');
      end;
 end;

Galahad 31-05-2017 09:02:53

Cita:

Empezado por newtron (Mensaje 517382)
Aunque esto está engordando demasiado y se hace complicado, revisa el hilo (de principio en adelante) y verás que esa pregunta ya está contestada aunque ahora mismo no recuerdo exactamente cómo era.

Saludos

Hola, tienes que utilizar el/los eventos del componente httprio beforeexecute o afterexecute, te mando un ejemplo de código..



Cita:

procedure TFModelo_SII.HTTPRIO1BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
var
ss:TFileStream;
cfichero: string;
begin
cfichero := montar_fichero_sii( date,time,'nombredefichero.xml');
if FileExists( cfichero ) then
DeleteFile( cfichero);

ss:=TFileStream.Create( cfichero, fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest, SOAPRequest.size);
ss.Free;
SOAPRequest.Position := 0;
end;



AlSan 31-05-2017 09:13:03

Cita:

Empezado por barnarasta (Mensaje 517413)
Sobre el tema de los NIF censados o NO CENSADOS yo tengo un caso curioso:

IBRAHIMI EL BABANI RACHID 54677557W
El la busqueda por nif https://www1.agenciatributaria.gob.e...BUGC-JDIT/Cnec
da como correcto y al realizar el envio de EMITIDAS la rechaza como NO CENSADO.


A mí me pasa CASI lo mismo que a tí. En ese enlace de la AEAT me da OK ("La persona consultada ha sido identificada en el censo de la AEAT").

Pero en el alta de facturas emitidas, enviando el nombre completo en la forma "Apellidos Nombre" (esta vez sin comas ni nada):

Código:

              <sii:Contraparte>
                  <sii:NombreRazon>APELLIDO1 APELLIDO2 NOMBRE</sii:NombreRazon>
                  <sii:NIF>42******R</sii:NIF>
              </sii:Contraparte>

me rechazan la factura dando error de NO IDENTIFICADO (error 1117), que es diferente de "no censado" (error 2011).


Entonces hago un intento reenviándolo como no censado, tal como está documentado:

Código:

              <sii:Contraparte>
                  <sii:NombreRazon>APELLIDO1 APELLIDO2 NOMBRE</sii:NombreRazon>
                  <sii:IDOtro>
                    <sii:CodigoPais>ES</sii:CodigoPais>
                    <sii:IDType>07</sii:IDType>
                    <sii:ID>42******R</sii:ID>
                  </sii:IDOtro>
              </sii:Contraparte>

y entonces es cuando me la acepta con errores, como no censado.

Entiendo que a partir de este punto ya no podemos hacer nada más (no tengo manera de averiguar y por tanto corregir nada más de la contraparte). Nosotros ya habremos cumplido con nuestra obligación de informar a la AEAT de la factura, con toda la información de que disponíamos.

Supongo que si en el futuro algún día conseguimos saber algo más de ese NIF y/o el nombre correcto de su titular, siempre podremos emitir una modificación de esa factura ("A1")...

P.D. - En casi todos los casos que me estoy encontrando, los nombres corresponden claramente a personas extranjeras...

xamminf 31-05-2017 09:24:49

Para el caso 2. ¿ Como sabemos que el primer rechazo es por el nif no censado ? ¿ Devuelve algun codigo de error ?
¿ A alguien le ha pasado que el ws de calidad de datos no identifique a alguna empresa grande como a Telefonica ?


[quote=nuevo1234;517390]
Cita:

Empezado por nuevo1234 (Mensaje 517387)
EFECTIVAMENTE:

1.- NIF que, aunque correcto formalmente, no se corresponda con el nombre del titular adjuntado (no identificado). RECHAZA LA FACTURA (OJO PUEDE RECHAZARLA POR ESTAR MAL EL NOMBRE Y BIEN EL NIF). Por eso importante poner: primer apellido segundo apellido y nombre sin signos de puntuación
2.- NIF que, aunque formalmente correcto, no corresponda a ningún sujeto registrado por la administracion (NIF no censado). LA ACEPTA CON ERRORES(IMPORTANTE DIFERENCIA:SE ACEPTA LA FACTURA PERO SE MARCA QUE SE HA ENVIADO POR NO CENSADO)


Por tanto:
Es muy importante informar el nombre en el siguiente orden: primer apellido segundo apellido y nombre sin signos de puntuación.
Porque puede no identificar los NIF por esta razón y rechazar el envio de esa factura


En cuanto al NO CENSADO.
Para los casos en que se haya rechazado una factura emitida, en un segundo reintento, porque la información de identificación del destinatario (NIF y nombre) no figure censada en la AEAT, la forma de proceder para enviar dicha factura se realizará a través del bloque IdOtro con los
siguientes contenidos:

Código país: ES
Clave ID: 07. No censado
Número Id: NIF no censado del receptor de la factura
Apellidos y nombre: Nombre del no censado receptor de la factura.

En este caso, la factura figurará como aceptada con errores. A través de esta vía, también se intentará su validación contra el censo, de manera que podría lograse su identificación, aunque la factura figurará como aceptada con errores. En cualquier caso un error de formato en el NIF supondrá un RECHAZO de la factura.[/QUOT

Un apunte más siempre que metemos un Nif por el modo 07.No censado se acepta con errores y entra diciendo Nif no censado. Si el Nif está bien formado. Cuando metemos Nif de la forma normal pues responder con Nif no identificado y rechazo. Por eso hay dos mensajes diferentes. Espero haber aclarado algo


brincola 31-05-2017 09:47:48

[quote=xamminf;517423]Para el caso 2. ¿ Como sabemos que el primer rechazo es por el nif no censado ? ¿ Devuelve algun codigo de error ?
¿ A alguien le ha pasado que el ws de calidad de datos no identifique a alguna empresa grande como a Telefonica ?


Para responder a tu primera pregunta, léete el post anterior al tuyo. Verás que cada caso genera un error diferente:

"... me rechazan la factura dando error de NO IDENTIFICADO (error 1117), que es diferente de "no censado" (error 2011)."

brincola 31-05-2017 09:57:30

Cita:

Empezado por Galahad (Mensaje 517421)
Hola, tienes que utilizar el/los eventos del componente httprio beforeexecute o afterexecute, te mando un ejemplo de código..

Si cfichero existe, no es preciso borrarlo, ya que el parámetro fmCreate en ss:=TFileStream.Create( cfichero, fmCreate);'machaca' (rewrite) el fichero si existe.

¿Dónde está la implementación de montar_fichero_sii( date,time,'nombredefichero.xml')? Gracias.

joefrommalaka 31-05-2017 10:01:13

Cita:

Empezado por keys (Mensaje 517420)
Hola. Este problema ya esta resuelto en enlaces anteriores, es la forma de asignar el certificado. Se soluciono con las capicom. Yo he llegado a enviar un bloque de 10000 facturas para ver si funcionaba y todo correcto.

Muchas gracias keys, probaré con las capicom a ver que tal. Aunque me resulta curioso que si funcione el certificado cuando envío 15 facturas y no funcione cuando envío 25.

keys 31-05-2017 10:05:15

Cita:

Empezado por joefrommalaka (Mensaje 517429)
Muchas gracias keys, probaré con las capicom a ver que tal. Aunque me resulta curioso que si funcione el certificado cuando envío 15 facturas y no funcione cuando envío 25.

Eso nos pasaba a todos, creo recordar que el problema era a partir de 13 facturas.

asgarramantes 31-05-2017 10:09:17

power shell
 
Cita:

Empezado por marine (Mensaje 517085)
pregunta... en vuestros desarrollos obteneis el certificado "fisico" ???

El objetivo es saber si de alguna manera se podría obtener una cadena de validación donde no sea necesario tener instalado el certificado en el equipo .

El desarrollo lo estoy haciendo en vb.NEt

Primero que todo, dar las gracias a todos los integrantes de este maravilloso foro.

Por si puede interesarse a alguien,, utilizo curl para mandar los ficheros a la AEAT, pero ya tengo otra forma de mandar los ficheros
aunque solo funciona bien con Windows 10, con Windows 7 estoy en ello cuando tengo algún ratito,,, lo ejecutáis desde cualquier programa, para que mande el fichero, el curl que se ejecuta desde powershell es UN CURL que es un alias de invoke-webrequest

saludos


pego un fichero ps1, ya que no me los deja subir
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import('C:\CURL\ECO.pfx','vicentin','DefaultKeySet')


CURL Https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP -certificate $cert –infile ENVIOS.XML -outfile MSG.XML –contentType "text/xml" -method POST

seccion_31 31-05-2017 10:14:05

sobre el NIF , el nombre y el no censado según lo que se hablo en la reunión:

Dijeron que efectivamente el NIF debe corresponde con el nombre, pero que se podía colocar apellidos nombre, o viceversa, que la AEAT tenia un algoritmo para solucionar esto.

Sobre el NIF no identificado, cuando ocurre esto en el primer envio se da como no censado (o no identificado no recuerdo bien el termino exacto), entonces se activa una rutina que comprueba contra la policía ese nif y se añade a la base de datos de la AEAT. Un segundo intento de envio unos minutos mas tarde (segundos dijo el informatico) ya daría como aceptado el NIF. Sin tocar nada.

NO deberíamos tener muchas facturas enviadas como 07 NO censado. Eso será causa de inspección.

Cuando el informatico de la AEAT introdujo una factura de prueba (con el inspector delante), coloco el NIF, y en al introducir el nombre dijo "pongo XXXXX que mas da, eso no se comprueba". y se quedo tan tranquilo. La factura fue aceptada.

Saludos !

seccion_31 31-05-2017 10:15:39

Cita:

Empezado por keys (Mensaje 517430)
Eso nos pasaba a todos, creo recordar que el problema era a partir de 13 facturas.

yo subi un .rar con todo listo para instarlo. búscalo.

slds.

Galahad 31-05-2017 10:16:26

Facturas Simplificadas
 
Alguién tiene un ejemplo de una factura simplificada. En el documento aparece como no obligatorio el campo nif, pero si no se lo indico , al serializar el xml,
se queda así esa factura:

Cita:


<FacturaExpedida>
<TipoFactura>F2</TipoFactura>
<ClaveRegimenEspecialOTrascendencia>01</ClaveRegimenEspecialOTrascendencia>
<ImporteTotal>22.00</ImporteTotal>
<DescripcionOperacion>VENTAS DE MATERIAL INFORMÁTICO</DescripcionOperacion>
<Contraparte>
<NombreRazon>CLIENTES VARIOS</NombreRazon>
<NIF/>
</Contraparte>
<TipoDesglose>
<DesgloseFactura>
<Sujeta>
<NoExenta>
<TipoNoExenta>S1</TipoNoExenta>
<DesgloseIVA>
<DetalleIVA>
<TipoImpositivo>21.00</TipoImpositivo>
<BaseImponible>18.18</BaseImponible>
<CuotaRepercutida>3.82</CuotaRepercutida>
</DetalleIVA>
</DesgloseIVA>
</NoExenta>
</Sujeta>
</DesgloseFactura>
</TipoDesglose>
</FacturaExpedida>


¿ Alguien sabe porque se incluye la clave <nif> sin indicarsela ?, ¿ o tiene algún ejemplo de un xml de una factura simplificada ?


La franja horaria es GMT +2. Ahora son las 15:36:54.

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