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)

PepCat 29-05-2017 11:18:44

Cita:

Empezado por razorxxx (Mensaje 517286)


¿Alguna idea sobre cómo detectar cuando no existe CodigoPais en la respuesta?

Gracias de antemano!

has probado a comprobar si CodigoPais esta vacío antes de hacer la conversión.

seccion_31 29-05-2017 11:22:05

hola !

sobre que no funcionaria el sistema el dia 8 Julio fue por que no esperaramos a transmitir las facturas al ultimo dia, el dia 8. ya que seguramente colapsara.


Tengo una duda que no veo claro a ver si podeis ayudarme:

quiero anular una factura completamente: por ejemplo 1200. (para luego hacer una nueva con el nuevo importe) ¿Como la anularía? entiendo que debería ser por ... diferencia, es decir generar una contraria por valor de -1200. Quiero evitarme el proceso de sustitución, porque....

En la reunión el inspector menciono que era mejor hacerlo asi, emitir una negativa completa y después volver a hacer una nueva.

Saludos !

razorxxx 29-05-2017 11:22:15

Cita:

Empezado por PepCat (Mensaje 517287)
has probado a comprobar si CodigoPais esta vacío antes de hacer la conversión.

Trato de hacer algo como If DatosFacturaEmitida.Contraparte.IDOtro.CodigoPais <> nil Then, pero el Delphi me tira el error "Incompatible types".

¿Cómo hacéis vosotros la comparación?

keys 29-05-2017 11:26:11

Cita:

Empezado por razorxxx (Mensaje 517289)
Trato de hacer algo como If DatosFacturaEmitida.Contraparte.IDOtro.CodigoPais <> nil Then, pero el Delphi me tira el error "Incompatible types".

¿Cómo hacéis vosotros la comparación?

Mira que te devuelve la agencia en el caso del que el pais este en blanco y pones la condición antes de hacer la búsqueda. El CodigoPais no puede ser nunca nil, el que puede ser nil es IDOTRO.

seccion_31 29-05-2017 11:27:46

hay que verificiar los nulos. según la estructura que devuelve ciertos objetos "del árbol" no están creados

igual seria:

DatosFacturaEmitida.Contraparte.IDOtro<>nil

uuummm

edito:

y codigopaís no puede compararse con nulo.

saludos !

vboloradito 29-05-2017 11:28:18

Cita:

Empezado por seccion_31 (Mensaje 517288)
hola !

sobre que no funcionaria el sistema el dia 8 Julio fue por que no esperaramos a transmitir las facturas al ultimo dia, el dia 8. ya que seguramente colapsara.


Tengo una duda que no veo claro a ver si podeis ayudarme:

quiero anular una factura completamente: por ejemplo 1200. (para luego hacer una nueva con el nuevo importe) ¿Como la anularía? entiendo que debería ser por ... diferencia, es decir generar una contraria por valor de -1200. Quiero evitarme el proceso de sustitución, porque....

En la reunión el inspector menciono que era mejor hacerlo asi, emitir una negativa completa y después volver a hacer una nueva.

Saludos !

En teoria lo correcto es hacer una factura rectificativa por sustitución Lo que tu intentas hacer es una factura de Abono y eso no es "legal", pero es lo que todo el mundo hace y parece que hacienda se ha visto obligada a aceptarlo porque sino esto no tiraba para adelante.
Yo todas las facturas rectificativas las envio como diferencia.

razorxxx 29-05-2017 11:30:35

Cita:

Empezado por keys (Mensaje 517290)
Mira que te devuelve la agencia en el caso del que el pais este en blanco y pones la condición antes de hacer la búsqueda. El CodigoPais no puede ser nunca nil, el que puede ser nil es IDOTRO.

Lo que dije antes, me devuelve 0, que correspondería al país Afganistán. ¿Pero qué ocurriría en los casos en los que de verdad la factura sea para alguien de Afganistán?

Lo curioso es que aún devolviendo 0, no me genera la etiqueta CodigoPais en el XML de respuesta.

¿Alguna otra idea?

seccion_31 29-05-2017 11:31:10

si, eso lo entiendo

pero entiendo que la diferencia, la haría por el total de la factura que voy a abonar?

nadie esta planteándolo asi?

lo digo porque el inspector fue muy claro, intentando simplificarlo.

Saludos !

vboloradito 29-05-2017 11:35:10

Cita:

Empezado por CMB (Mensaje 517230)
¿Qué es exactamente lo que fallará el 8 de julio?

Saludos,

¿Fallara el dia 8 o el dia 12.?

En 2017 son 8 dias sin contar fines de semana u festivos nacionales. El dia 1 es sabado.
Entonces los 8 dias se cumplen el dia 12?

keys 29-05-2017 11:38:39

Cita:

Empezado por razorxxx (Mensaje 517293)
Lo que dije antes, me devuelve 0, que correspondería al país Afganistán. ¿Pero qué ocurriría en los casos en los que de verdad la factura sea para alguien de Afganistán?

Lo curioso es que aún devolviendo 0, no me genera la etiqueta CodigoPais en el XML de respuesta.

¿Alguna otra idea?

Si viene 0 en el pais y el idotro esta relleno, dependera del CID, ya que si es 02 tiene que ser o español o intracomunitario. Es decir con el CID <> 2 el pais es el que devuelve Afganistan, en caso de CID = 02 y PAis = 0 el pais esta en blanco.

newtron 29-05-2017 12:00:17

Cita:

Empezado por seccion_31 (Mensaje 517294)
si, eso lo entiendo

pero entiendo que la diferencia, la haría por el total de la factura que voy a abonar?

nadie esta planteándolo asi?

lo digo porque el inspector fue muy claro, intentando simplificarlo.

Saludos !

A ver.... todo depende de lo que te quieras complicar la vida porque hay varias formas de hacerlo. Puedes anular la factura y hacer otra correcta con otro número, puedes hacer una rectificativa por sustitución o directamente puedes hacer una negativa que sería una rectificativa por diferencias y otra que sería la correcta. Yo en particular creo que la última opción es la más fácil de manejar tanto para el programa como para el usuario.

De todas formas todo eso está explicado en el documento de "preguntas frecuentes" a partir de la página 16

Saludos

seccion_31 29-05-2017 12:04:03

si, al final lo haremos por diferencia.

pero ya te digo lo que hablo el inspector....

por diferencia según he hablado con contabilidad será lo mas correcto. en el peor peor de los casos la diferencia será por el importe total.

gracias.

seccion_31 29-05-2017 12:05:11

Cita:

Empezado por vboloradito (Mensaje 517295)
¿Fallara el dia 8 o el dia 12.?

En 2017 son 8 dias sin contar fines de semana u festivos nacionales. El dia 1 es sabado.
Entonces los 8 dias se cumplen el dia 12?

jajajaja... no se, no he visto el calendario.

es lo que dijo el inspector...

también dijo que .... "Si el SII sigue el año que viene...."

asi que imaginaros.

razorxxx 29-05-2017 12:17:32

Cita:

Empezado por keys (Mensaje 517296)
Si viene 0 en el pais y el idotro esta relleno, dependera del CID, ya que si es 02 tiene que ser o español o intracomunitario. Es decir con el CID <> 2 el pais es el que devuelve Afganistan, en caso de CID = 02 y PAis = 0 el pais esta en blanco.

Entendido y funcionando.

Gracias!

No obstante, veo en la unit generada por el WSDL Importer que existe el valor booleano "CodigoPais_Specified". ¿No debería ser ésta la variable a chequear en caso de que el CodigoPais esté vacío?

seccion_31 29-05-2017 14:39:38

tranquilos que no hay que esperar al dia 8 o al 12, ahora mismo falla:

"Error en el soporte del canal seguro"

Intentas acceder via web y tampoco.

Saludos !

seccion_31 29-05-2017 15:25:26

ahora ya va de nuevo. (la web)

desde aplicación sigue fallando.

edito:

en web error 403 (antes 999)
y en aplicación falla igual.

afxe 29-05-2017 15:59:02

Sobre error de las 13 facturas
 
Saludos a todos.
Como otros, he tenido el problema del fallo de falta de certificado cuando se envía más de 12 facturas... he releído varias veces este hilo (uffff) y la verdad es que está empezando a ser poco aclaratorio remitirse aquí para encontrar soluciones... Pero he encontrado algo que os puede ser de ayuda. El método que se posteó al principio, y del cual casi todos hemos empezado a tirar, proponía:
Código Delphi [-]
procedure TFrmMain.HTTPRIO_EMIHTTPWebNode1BeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  Store : IStore;
  Certs : ICertificates;
  Cert : ICertificate2;
  CertContext : ICertContext;
  PCertContext : PCCERT_CONTEXT;
  V : OleVariant;
  Certificado : String;
const
  INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
begin
  V := BUSCAR_CERTIFICADO(cbCertificados.text); // subject del certificado instalado: Nombre de la empresa, no el HASH
  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 ); // Buscar certificado por nombre
  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( 'Certificado SSL. Algo ha fallado.' );
    end;
  end;
end;

la función BUSCA_CERTIFICADO pasando como parámetro el nombre del certificado te devolvía el GetCertSerialNumber de dicho certificado, el cual hay que usar en otro sitio, pero no aquí, ya que hay que hacer el Store.Certificates.Find pasando el "nombre del certificado" no su SerialNumber, por lo cual debería ser
Código Delphi [-]
V := cbCertificados.Text;
Así se traga todas las facturas que le eches. Esto lo he sacado también de algún ejemplo que han posteado en este hilo, por lo cual quien haya tirado de ese ejemplo estaría trabajando sin problemas, y los estamos tirando desde el inicio, y no habíamos vuelto a repasar esa parte, a la de 13 facturas.... Curiosamente, si enviabas las facturas en bloques de 10, o una a una, todo funcionaba sin problemas, a pesar de que realmente, no estábamos cargando en la Api el certificado. ¿?¿?¿?

No sé si cuando dejemos de estar en pruebas cascará el programa si no cargamos el certificado correctamente.

Galahad 29-05-2017 16:03:04

cuotadeducible
 
una pregunta rápida.

Me acabo de dar cuenta que en el campo 'cuotadeducible' de facturas recibidas, hasta ahora siempre estaba poniendo la base imponible (aquí en este hilo hay varios ejemplos en los que se hace así también). ¿ Es esto correcto ?, Creo que no , entiendo que el campo cuotadeducible deberia de tener el importe de los impuestos (ivas) que el cliente se puede deducir de la factura del proveedor.

Lo que no entiendo es como he mandado más de 5000 facturas de prueba con eso y no me ha dado ningún error. ¿ o es que estoy equivocado y realmente se manda la base impoinible ? .

En caso de que se mande el importe de iva, supongo que si tiene recargo tambien.

Saludos...

CMB 29-05-2017 16:08:10

Cita:

Empezado por Galahad (Mensaje 517308)
una pregunta rápida.
Me acabo de dar cuenta que en el campo 'cuotadeducible' de facturas recibidas, hasta ahora siempre estaba poniendo la base imponible (aquí en este hilo hay varios ejemplos en los que se hace así también). ¿ Es esto correcto ?, Creo que no , entiendo que el campo cuotadeducible deberia de tener el importe de los impuestos (ivas) que el cliente se puede deducir de la factura del proveedor.
Lo que no entiendo es como he mandado más de 5000 facturas de prueba con eso y no me ha dado ningún error. ¿ o es que estoy equivocado y realmente se manda la base impoinible ? .
En caso de que se mande el importe de iva, supongo que si tiene recargo tambien.
Saludos...

No tiene por qué dar error. En la gran mayoría de los casos, la cuota deducible es igual que la base imponible. Pero puede haber casos en que no. Si en una gran superficie te hacen una factura que incluye un pen drive y 1 kg de manzanas, por ejemplo, te podrás deducir el pen drive pero no la fruta.

Esta innovación supongo que será para el contraste, pues el total factura tiene que coincidir con lo que declare tu proveedor, independientemente de que te lo puedas deducir todo o sólo una parte.

seccion_31 29-05-2017 16:10:17

al final lo de enviar mas de 12 facturas se soluciono:

Código:

procedure TfEmitidas.emitidasHTTPWebNode1BeforePost(
  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:=comboBox1.Text;

    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 ); { Buscar certificado por nombre }
    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( 'Internet SSL certificate. Something went wrong' );
        end;
    end;
 end;

(en comboBox1 tengo el nombre del certificado)


La franja horaria es GMT +2. Ahora son las 04:44:49.

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