Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Tema Cerrado
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por sglorka Ver Mensaje
Podéis encontrar información de operaciones desde península a Canarias, Ceuta y Melilla dentro de las Faqs del SII
https://sede.agenciatributaria.gob.e...00dc381e0aRCRD

Si entrar en mucho detalle en este proyecto que está desarrollando Seccion_31, si me aceptáis un consejo, podría decir que este módulo debería cumplir un objetivo muy específico, y sería el de gestionar la cola de envío de facturas emitidas por un ERP a la Aeat, recoger las respuestas y entregarlas al ERP.
Yo creo que trasladar la gestión de, con qué claves, debe enviarse un RF correspondiente a una factura emitida de Península a Canarias, debería ser objetivo del ERP que es quien lleva la lógica de negocio. Trasladar esto al componente de comunicación no me parece que cumpla con los estándares de estructuración y escalabilidad.
En el caso de Canarias, depende de si la entrega de bienes es trasladada o no desde península, de si es el vendedor es el que paga los portes, de si existe un establecimiento o sucursal de esa empresa en Canarias, todas estas circunstancias derivan en claves distintas para el registro como podéis ver en el link que adjunto.
Pero bueno, es sólo una opinión

Puede que tengas razon. Mi opinion, hoy es esta:

Para crear exenciones esta el array de exenciones que creo podria cubrir los casos manualmente desde el ERP sin mas tratamiento.

Ahora bien, quisiera incluir el caso mas comun de envio a canarias, que por cierto NO se encuentra descrito en ese documento del SII, que ya lei.

Si no hay una respuesta, anulare la opcion y ya. ¿que le vamos a hacer?

Saludos !
  #2  
Antiguo 25-02-2025
sglorka sglorka is offline
Miembro
 
Registrado: mar 2017
Ubicación: Tenerife
Posts: 558
Poder: 10
sglorka Va por buen camino
La respuesta sí está en el documento
"Ejemplo 3. Un empresario con domicilio fiscal en Madrid que aplica el SII transporta una partida de mercancías a Canarias para efectuar una venta en dicho territorio:
Si el vendedor satisface el IGIC de la importación, registrará este traslado de la mercancía desde Península a Canarias como una importación (tipo de factura: F5) no sujeta con clave 08. La posterior venta localizada en Canarias se informará con la clave 08.
Si el comprador satisface el IGIC de la importación, el vendedor registrará la operación como una exportación con la clave 02."


Lo más normal es que sea el comprador el que satisfaga el Igic de importación, estás en el segundo caso, por lo tanto y en el 99% de los casos, una empresa en península que no tiene sucursal en Canarias, informa su venta con la clave de régimen tributario 02 Exportación y como desglose exenta tipo E2. Exenta por el artículo 21
Si no es una entrega de bienes sino una prestación de servicios entonces la clave de régimen es 08 y el desglose es N2 No sujeta por reglas de localización
  #3  
Antiguo 26-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por sglorka Ver Mensaje
La respuesta sí está en el documento
"Ejemplo 3. Un empresario con domicilio fiscal en Madrid que aplica el SII transporta una partida de mercancías a Canarias para efectuar una venta en dicho territorio:
Si el vendedor satisface el IGIC de la importación, registrará este traslado de la mercancía desde Península a Canarias como una importación (tipo de factura: F5) no sujeta con clave 08. La posterior venta localizada en Canarias se informará con la clave 08.
Si el comprador satisface el IGIC de la importación, el vendedor registrará la operación como una exportación con la clave 02."


Lo más normal es que sea el comprador el que satisfaga el Igic de importación, estás en el segundo caso, por lo tanto y en el 99% de los casos, una empresa en península que no tiene sucursal en Canarias, informa su venta con la clave de régimen tributario 02 Exportación y como desglose exenta tipo E2. Exenta por el artículo 21
Si no es una entrega de bienes sino una prestación de servicios entonces la clave de régimen es 08 y el desglose es N2 No sujeta por reglas de localización
Muchas Gracias por la aclaracion

Canarias:

02 Exportación y como desglose exenta tipo E2

Cita:
Que es justo como lo había dejado: (ver mensaje anterior) y es como me aparecía aceptado por la AEAT

Tipo de factura: F1
Clave régimen: 02
Operación exenta: E2
Ya esta aclarado entonces,

Me temo entonces que ramherfer debera dejarlo como E2 y no como E5.

Saludos !


Con este ultimo ajuste, las automatizaciones previstas, para iva normal, eu, exportacion y canarias (añadire ceuta y melilla) quedan finalizadas.
  #4  
Antiguo 26-02-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 162
Poder: 14
ramherfer Va por buen camino
vale, me estoy dando cuenta que me define el registro así
Cita:
<Desglose>
<DetalleDesglose>
<ClaveRegimen>01</ClaveRegimen>
<OperacionExenta>E2</OperacionExenta>
<BaseImponibleOimporteNoSujeto>31.80</BaseImponibleOimporteNoSujeto>
</DetalleDesglose>
</Desglose>
y este es el error que devuelve:

Cita:
<tikR:Operacion>
<tik:TipoOperacion>Alta</tik:TipoOperacion>
</tikR:Operacion>
<tikR:EstadoRegistro>Incorrecto</tikR:EstadoRegistro>
<tikR:CodigoErrorRegistro>1199</tikR:CodigoErrorRegistro>
<tikRescripcionErrorRegistro>Si Impuesto es '01' (IVA), '03' (IGIC) o no se cumplimenta y ClaveRegimen es 01 no pueden marcarse las OperacionExenta E2, E3.</tikRescripcionErrorRegistro>
Pero no se porque está poniendo ClaveRegimen 01.

No habría que añadir esta línea en uVerifactuFuncs en el caso especifico de canarias:

Código:
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._02;
dado que pone ClaveRegimen 01
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
  #5  
Antiguo 27-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
vale, me estoy dando cuenta que me define el registro así


y este es el error que devuelve:



Pero no se porque está poniendo ClaveRegimen 01.

No habría que añadir esta línea en uVerifactuFuncs en el caso especifico de canarias:

Código:
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._02;
dado que pone ClaveRegimen 01
efectivamente,

en la futura version 1.3 ya aparece la correccion:


Código:
              else  // caso especifico Canarias ceuta y melilla entrega de bienes
              begin
                   DetalleDesglose.ClaveRegimen     := IdOperacionesTrascendenciaTributariaType._02;
                   DetalleDesglose.OperacionExenta  := OperacionExentaType.E2;
              end;
uVerifactuFuncs

linea 1600 aprox. donde se vuelve a reajustar el regimen para canarias en el "else".

Saludos

recompila la DLL y ya.
  #6  
Antiguo 27-02-2025
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 140
Poder: 7
CarlosMz Va por buen camino
Consulta

en el método de la demo procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);

¿No debería también guardar la huella y lo disponible en registros de facturación para incorrectos ?

Algo así:

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

  j:integer;

  _ok,_oke,_err: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('');


      _ok   :=0;    // nº facturas OK
      _oke  :=0;    // nº facturas OK ( pero aceptadas con errores )
      _err  :=0;    // nº facturas con errores  (no aceptadas)

      for j:=0 to resultado.nFacturas-1 do
      begin
            factura  := resultado.facturas[j].NumSerieFactura;
            emisor   := resultado.facturas[j].IDEmisorFactura;
            estado   := resultado.facturas[j].estado;
            error    := inttostr(resultado.facturas[j].errorcodigo);
            desError := resultado.facturas[j].descripcionError;

            memoRes.Lines.Add( factura + ' ' + estado + ' '+error+' '+desError );     // ver en pantalla

            if resultado.facturas[j].OK then   // Es correcto ó aceptado con errores
            begin
                // colocar el csv y huella en la factura
                if facturasEnviadas.locate('emisor;NumSerieFactura',vararrayof([emisor, factura ]),[]) then
                begin
                    FacturasEnviadas.edit;
                    FacturasEnviadas.fieldbyName('csv').text      :=resultado.CSV;
                    FacturasEnviadas.FieldByName('huella').text   :=resultado.facturas[j].huellaFactura;
                    FacturasEnviadas.fieldbyName('situacion').text:=estado;
                    FacturasEnviadas.post;
                end;
                if resultado.facturas[j].aceptadoConErrores then inc(_oke) else inc(_ok);
            end
            else
            begin
                FacturasEnviadas.edit;
                    FacturasEnviadas.fieldbyName('csv').text      :=resultado.CSV;
                    FacturasEnviadas.FieldByName('huella').text   :=resultado.facturas[j].huellaFactura;
                    FacturasEnviadas.fieldbyName('situacion').text:=estado;
                    FacturasEnviadas.post;
                inc(_err);                            // Es erronea
            end;
      end;

      memoRes.Lines.Add('');
      memoRes.Lines.Add('Facturas Aceptadas: '+inttostr(_ok) );
      memoRes.Lines.Add('Facturas Aceptadas Con Errores: '+inttostr(_oke) );
      memoRes.Lines.Add('Facturas Con Errores: '+inttostr(_err) );

      // tiempo de espera:
      if resultado.tiempoDeEspera<>'' then memoRes.Lines.Add('Se Ha Establecido Un Tiempo De Espera Proximo Envio De '+resultado.tiempoDeEspera);
end;
  #7  
Antiguo 27-02-2025
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 140
Poder: 7
CarlosMz Va por buen camino
Creo que hay un error en la función asignaTipoNif, en la línea

"if factura.clientetipoNIF='ES' then"

quedaría así:

Código Delphi [-]
procedure asignaTipoNif(var factura:TRegistroFactura);
begin
      if factura.clientetipoNIF<>'' then exit;

      if factura.clienteCodPais='ES' then
          factura.clientetipoNIF:='02'
      else
          if CodpaisEuropea(factura.clienteCodPais) then
              factura.clientetipoNIF:='04'
          else
              factura.clientetipoNIF:='06';
end;
  #8  
Antiguo 28-02-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 162
Poder: 14
ramherfer Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
Puede que tengas razon. Mi opinion, hoy es esta:

Para crear exenciones esta el array de exenciones que creo podria cubrir los casos manualmente desde el ERP sin mas tratamiento.

Ahora bien, quisiera incluir el caso mas comun de envio a canarias, que por cierto NO se encuentra descrito en ese documento del SII, que ya lei.

Si no hay una respuesta, anulare la opcion y ya. ¿que le vamos a hacer?

Saludos !
¿Donde se encuentra el array de exenciones para darle un vistazo o te refieres a los datos tal y como aparecen en la hoja excel y que el erp puede enviar?

Yo no anularía nada y se va viendo. Por el momento pueden haber algunas lagunas, que se irán adaptando o dejando que el erp envíe la información.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
  #9  
Antiguo 01-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
¿Donde se encuentra el array de exenciones para darle un vistazo o te refieres a los datos tal y como aparecen en la hoja excel y que el erp puede enviar?

Yo no anularía nada y se va viendo. Por el momento pueden haber algunas lagunas, que se irán adaptando o dejando que el erp envíe la información.

donde esta el del iva:


Código:
  TRegistroFacturaExentas=record
          tipoExenta           :string[2];
          calificacionOperacion:string[2];
          claveRegimen         :string[2];

          baseImp   :currency;
  end;

En TRegistroFactura=record

        nexentas            :integer;
        exenta              :array[0..maxivas] of TRegistroFacturaExentas;
Que por cierto,tenemos que comprobar que su planteamiento sea correcto y que funcione ok.
  #10  
Antiguo 01-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
por ahorrarme tiempo,

¿cuando una factura NO pasa por algun error, se interrumpe el envio de las siguientes? yo en las pruebas si he visto que se interrumpia el envio del resto, pero ahora no estoy seguro.

lo digo por no perder el encadenamiento.

saludos !
  #11  
Antiguo 03-03-2025
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 140
Poder: 7
CarlosMz Va por buen camino
Buenos días
¿No se devuelve el array de resultados con las aceptadas, aceptadas con errores y rechazadas ?
  #12  
Antiguo 03-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por CarlosMz Ver Mensaje
Buenos días
¿No se devuelve el array de resultados con las aceptadas, aceptadas con errores y rechazadas ?
Si, tal cual lo devuelve la AEAT sin procesar, solo trasladando los datos al record

slds
  #13  
Antiguo 03-03-2025
Quim Herrera Quim Herrera is offline
Miembro
 
Registrado: may 2004
Posts: 44
Poder: 0
Quim Herrera Va por buen camino
No sé si ya lo habéis detectado, creo que hay un error en uVerifactuFuncs.pas en TEventosWebNode.WebNodeBeforePost al validar un NIF con P12 o PFX en la asignación del nombre del archivo y password:

Código Delphi [-]
 if sesion=-1 then // viene de un validador de nif
  begin
      pass:=nifValidator;
      cert:=nifValidatorPass;
  end
  else     // viene de un objeto verifactu

deberia ser:

Código Delphi [-]
  if sesion=-1 then // viene de un validador de nif
  begin
      cert:=nifValidator;
      pass:=nifValidatorPass;
  end
  else     // viene de un objeto verifactu
Saludos
  #14  
Antiguo 04-03-2025
Avatar de DarkDudae
DarkDudae DarkDudae is offline
Miembro
 
Registrado: abr 2006
Posts: 177
Poder: 21
DarkDudae Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
por ahorrarme tiempo,

¿cuando una factura NO pasa por algun error, se interrumpe el envio de las siguientes? yo en las pruebas si he visto que se interrumpia el envio del resto, pero ahora no estoy seguro.

lo digo por no perder el encadenamiento.

saludos !
No, no se interrumpe.

He probado a hacer un envío con 4 facturas. La segunda de ellas con el NIF incorrecto. Las otras 3 se envían sin problemas.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro.
  #15  
Antiguo 05-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por DarkDudae Ver Mensaje
No, no se interrumpe.

He probado a hacer un envío con 4 facturas. La segunda de ellas con el NIF incorrecto. Las otras 3 se envían sin problemas.
aparentemente la huella, seria la misma para la siguiente ¿no? entiendo que no habria problema de encadenamiento, al enviar la que falta, subsanado el error.


los datos de huella son ciertos, ocurra el fallo que ocurra:

Código:
  CadenaTemporalHuella:= 'IDEmisorFactura='+         alta.IDFactura.IDEmisorFactura+'&'+
                           'NumSerieFactura='+         alta.IDFactura.NumSerieFactura+'&'+
                           'FechaExpedicionFactura='+  alta.IDFactura.FechaExpedicionFactura+'&'+
                           'TipoFactura='+             TipoFacturaVerifactuToString( alta.TipoFactura )+'&'+
                           'CuotaTotal='+              alta.CuotaTotal+'&'+
                           'ImporteTotal='+            alta.ImporteTotal+'&'+
                           'Huella='+                  huellaAnterior+'&'+
                           'FechaHoraHusoGenRegistro='+alta.FechaHoraHusoGenRegistro.NativeToXS;
Saludos !


La carga del certificado PFX o P12 no tengo ni idea, hay algun usuario que le funcionó (podeis revisar el hilo). Lamentablemente mas alla de eso no tengo tiempo para comprobar, pero mirare un poco por google. El codigo es copy-paste de uno que supuestamente funcionaba.

( ¿has aplicado la correccion de Quim Herrera ? )

Saludos !
  #16  
Antiguo 05-03-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 472
Poder: 10
seccion_31 Va por buen camino
El usuario garada tiene un codigo ligeramente distinto en:

https://www.clubdelphi.com/foros/showthread.php?t=95356

dale una mirada al hilo.

Este es el codigo, señalo en rojo, lo que puede ser distinto. la carga del pfx la deja libre, sin determinar.

Código:
procedure HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);

  procedure CheckError(Puntero: Pointer);
  begin
    if not Assigned(Puntero) then
      RaiseLastOSError;
  end;

const
  INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
  Pass = 'LaContraseña';
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_DATA_BLOB;
  PFX: AnsiString;
begin
  pStore := nil;
  pCert := nil;

  PFX := FuncionQueLeaElFicheroPFX;

  try
    DataBlob.cbData := Length(PFX);
    DataBlob.pbData := @PFX[1];

    // Almacen temporal con el contenido del PFX
    pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), {PKCS12_NO_PERSIST_KEY + }PKCS12_INCLUDE_EXTENDED_PROPERTIES);
    CheckError(pStore);

    // Buscar un certificado con clave privada
    // Solo debería haber uno
    pCert := CertFindCertificateInStore(pStore,
                                        X509_ASN_ENCODING,
                                        0,
                                        CERT_FIND_HAS_PRIVATE_KEY, //CERT_FIND_ANY,
                                        nil,
                                        nil);
    CheckError(pCert);

    // Pasarlo al servicio
    InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT));
  finally
    if Assigned(pCert) then
      CertFreeCertificateContext(pCert);

    if Assigned(pStore) then
      CertCloseStore(pStore, 0);
  end;
end;
  #17  
Antiguo 05-03-2025
Avatar de DarkDudae
DarkDudae DarkDudae is offline
Miembro
 
Registrado: abr 2006
Posts: 177
Poder: 21
DarkDudae Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
aparentemente la huella, seria la misma para la siguiente ¿no? entiendo que no habria problema de encadenamiento, al enviar la que falta, subsanado el error.
Cada registro de facturación tiene que tener su huella y su encadenamiento, independientemente de que la AEAT lo haya rechazado por, por ejemplo, un NIF incorrecto.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro.
Tema Cerrado


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 00:06:05.


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