Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Ley antifraude 2021 (VERIFACTU) - Programas informáticos (https://www.clubdelphi.com/foros/showthread.php?t=95235)

Eugenio S 02-03-2024 11:06:56

No estoy muy seguro: "es la fecha de operación y no la de emisión, la que dicta ..."
 
Cita:

Empezado por sglorka (Mensaje 554659)
Yo creo que se han liado en la respuesta de las FAQs. La respuesta de verifactu a la consulta que les planteé sobre este tema la publiqué en este foro y claramente dijeron que no habían reglas de validación que impidieran emitir una factura con fecha de expedición menor que la fecha de emisión del registro de facturación. En general, el 90% de los SIF son terminales de punto de venta y la norma general y que yo acato es que la fecha de expedición siempre debe ser igual a la fecha del día en que se emite porque no tiene sentido emitir a un cliente final una factura con fecha de ayer.
Pero los SIF de sistemas de gestión que recolectan operaciones de todo tipo, clientes finales, empresarios, etc utilizan series distintas para los clientes empresas y para los clientes particulares, de tal forma que, yo puedo seguir emitiendo facturas en la serie 1 (clientes particulares) y reservar la serie 2 para aquellos clientes de final de mes que hay que emitirles la factura resumen.
Piensa en una estación de servicio que suministra combustible el día 29/02/2024 a las 23:59:59 mediante un albarán de entrega a una flota de furgones de una empresa. Hasta el día siguiente. 01/03/2024 no va a poder emitir la factura para poder incluir todas la operaciones. Dicha factura tendrá que emitirla con fecha de expedición 29/02/2024. Aunque podría emitirla antes del 16 de marzo pero la empresa destinataria se quejaría porque diría que quiere la factura a final de mes para que le entre en la declaración de impuestos de febrero. (OJO no quiero liarla más, pero si se emite dicha factura entre el 1 y 16 de marzo dicha factura hay que declararla en el mes de febrero, no de marzo, ya que es la fecha de operación y no la de emisión, la que dicta el periodo de devengo del impuesto)

Siempre he tenido bastante lio con esto, puedes indicarme algún sitio que nos pueda aclarar que fecha debe considerarse para la declaración de impuestos? (303, 300, 347... ) a mi entender es la fecha de expedición y no la de operación.

Saludos al grupo y muchas gracias por vuestros aportes.

Delphier 02-03-2024 11:37:20

A mí , me convence esta explicación, pero implica que no se pueden hacer facturas con la fecha de expedición ni posterior , ni futura, que os parece?

"
El reglamento que regula las obligaciones de facturación obliga a señalar tres fechas en cada factura:

La fecha de expedición, también llamada fecha de emisión, que al final es la fecha de la factura de toda la vida.

La fecha de Operación ,el día en que se han efectuado las operaciones. Por lo general, suele ser la fecha en la que se ha transferido el control de los bienes o servicios. Por tanto, suele marcar en qué período entra para la liquidación del IRPF o sociedades.

La fecha de realización del pago anticipado. Esto es importante en el IVA, ya que, si cobras por adelantado, en ese momento se devenga el IVA.
"

Eugenio S 02-03-2024 11:54:12

La fecha de expedición, también llamada fecha de emisión, que al final es la fecha de la factura de toda la vida.
A mi entender es la fecha válida para IVA, IRPF, Sociedades y el impuesto que sea, de ahí la duda con el comentario anterior.

La fecha de Operación ,el día en que se han efectuado las operaciones. Por lo general, suele ser la fecha en la que se ha transferido el control de los bienes o servicios. Por tanto, suele marcar en qué período entra para la liquidación del IRPF o sociedades.
Conforme que es la fecha que se efectuó la operación, pero no que sea la que marque el periodo impositivo.

La fecha de realización del pago anticipado. Esto es importante en el IVA, ya que, si cobras por adelantado, en ese momento se devenga el IVA.
Si cobras algo por adelantado estas obligado a emitir una factura y será esa factura la que en su periodo devengara el IVA

La ley indica que si es veri*factu la fecha de expedición no puede ser de días anteriores, el día 02/01 no podras emitir facturas con fecha de expedición 31/12
y nos dicen que usemos la fecha de operación para indicar el 31/12

Eso plantea problemas con las liquidaciones que ya no serán del ejercicio pasado (cuarto trimestre), si no de este último (primer trimestre)

Pero sigo con la duda anterior: ¿Es la fecha de expedición o la fecha de operación la que determina el periodo impositivo?? a mi entender es la fecha de expedición.

Eugenio S 02-03-2024 12:05:07

Rectificación fechas de devengo de impuestos
 
Indagando con el Asistente Virtual de AEAT obtengo la siguiente respuesta:


AEAT Respuesta

Con carácter general, en las prestaciones de servicios se devenga el impuesto cuando se presten los servicios o ejecuten las operaciones, o una vez finalizada la prestación del servicio (ejemplos: en la asistencia jurídica prestada por abogados se devenga cuando concluye el procedimiento judicial; en la instalación eléctrica en un local se devenga cuando finaliza la instalación).

En las entregas de bienes se devenga el impuesto cuando el bien se pone a disposición del cliente.

En ambos casos si se efectúan cobros anticipados el devengo se produce en el momento del cobro anticipado. Por el contrario, el aplazamiento en el pago es irrelevante.

El momento del devengo será el que determine la obligación de expedir factura y repercutir la cuota de IVA, así como el período en que debe declararse el IVA devengado.

Tenga en cuenta que en operaciones continuadas o periódicas (tracto sucesivo) o de periodicidad de pago superior a un año natural, existen reglas especiales que puede consultar marcando la primera opción de las que aparecen al final de esta respuesta.

En el caso de que el cliente sea empresario o profesional, la factura podrá expedirse hasta el 15 del mes siguiente, pero deberá declararse en el periodo en el que se ha producido el devengo de la operación o el pago anticipado.

sglorka 02-03-2024 22:07:18

Cita:

Empezado por ramherfer (Mensaje 554689)
Ya que tienes toda la razón....

Pues bueno formulada está la pregunta a la AEAT. Yo habiendo recapacitado y analizado entiendo lo que indicas, la fecha de operación debe ser 31/12/2024 tambien a efectos de liquidación de iva, momento de la entrega de bienes o prestación de servicios y otros asuntos y que la fecha de expedición y generación del registro sería 02/01/2024.

Si os fijais en la ultima hoja excel - Anexo_OM_RD-1007-2023(v0.5.0_2023-12-20).xlsx - Disponemos de tres campos FechaExpedicionFacturaEmisor, FechaOperacion y FechaGenRegistro.

Entiendo que en el documento factura se debiera especificar la fecha de expedición y la fecha de operación para que el cliente tenga claro como debe actuar con esa factura y que la fecha de operación debiera prevalecer sobre la fecha de expedición a efectos fiscales ya que es la que se especifica el momento de entrega de bienes y/o prestación de servicios.

Por ley, la fecha de expedición de una factura para un cliente particular no puede exceder del último día del mes en que se haya hecho la operación. Por lo tanto, si la fecha de operación es 31/12/2023 no te queda otra que la fecha de expedición sea 31/12/2023.

sglorka 02-03-2024 22:25:56

Cita:

Empezado por Eugenio S (Mensaje 554697)
Indagando con el Asistente Virtual de AEAT obtengo la siguiente respuesta:


AEAT Respuesta

Con carácter general, en las prestaciones de servicios se devenga el impuesto cuando se presten los servicios o ejecuten las operaciones, o una vez finalizada la prestación del servicio (ejemplos: en la asistencia jurídica prestada por abogados se devenga cuando concluye el procedimiento judicial; en la instalación eléctrica en un local se devenga cuando finaliza la instalación).

En las entregas de bienes se devenga el impuesto cuando el bien se pone a disposición del cliente.

En ambos casos si se efectúan cobros anticipados el devengo se produce en el momento del cobro anticipado. Por el contrario, el aplazamiento en el pago es irrelevante.

El momento del devengo será el que determine la obligación de expedir factura y repercutir la cuota de IVA, así como el período en que debe declararse el IVA devengado.

Tenga en cuenta que en operaciones continuadas o periódicas (tracto sucesivo) o de periodicidad de pago superior a un año natural, existen reglas especiales que puede consultar marcando la primera opción de las que aparecen al final de esta respuesta.

En el caso de que el cliente sea empresario o profesional, la factura podrá expedirse hasta el 15 del mes siguiente, pero deberá declararse en el periodo en el que se ha producido el devengo de la operación o el pago anticipado.

El devengo del impuesto lo marca la fecha de operación, momento en que se transfiere el control de bienes o se termina la prestación de un servicio. Luego, dependiendo de si el cliente es empresa o no , tendrás un tiempo para emititr la factura. https://sede.agenciatributaria.gob.e...cutir-iva.html

sglorka 03-03-2024 10:38:41

Este mensaje no es válido

sglorka 03-03-2024 10:40:27

este mensaje no es válido

ermendalenda 03-03-2024 15:22:13

Cita:

Empezado por sglorka (Mensaje 554704)
El devengo del impuesto lo marca la fecha de operación, momento en que se transfiere el control de bienes o se termina la prestación de un servicio. Luego, dependiendo de si el cliente es empresa o no , tendrás un tiempo para emititr la factura. https://sede.agenciatributaria.gob.e...cutir-iva.html

Veo esto lógico, pero hay una cosa que no entiendo, lss facturas sustitutivas tienen un tratamiento especial? Me explico,, si me piden hoy una factura sustitutiva de tiquets de hace 3 años, la fecha de expedicion es la de hoy, pero labfecha de operación fué hace 4 años, en realidad esa fecha de expedición no les sirve para nada, no?

sglorka 03-03-2024 18:12:29

Cita:

Empezado por ermendalenda (Mensaje 554711)
Veo esto lógico, pero hay una cosa que no entiendo, lss facturas sustitutivas tienen un tratamiento especial? Me explico,, si me piden hoy una factura sustitutiva de tiquets de hace 3 años, la fecha de expedicion es la de hoy, pero labfecha de operación fué hace 4 años, en realidad esa fecha de expedición no les sirve para nada, no?

La fecha de operación de una factura de canje es la fecha de operación de la factura simplificada que sustituye. Si la factura de canje sustituye a más de una factura (en este caso las facturas debes ser del mismo mes natural y del mismo cliente) la fecha de operación es la más reciente del mes natural, en este caso no se llama sustitutiva sino recapitulativa.
En ambos casos, el impuesto ya ha sido devengado/liquidado por tu parte (cuando se emitieron las simplificadas), por lo tanto, no hay movimiento en el IVA en el día en que generas la sustitutiva y la fecha de operación sigue significando lo mismo, el periodo en que se tuvo que haber devengado el impuesto.

Hay que tener cuidado con lo siguiente. Si utilizamos la clave F3 para informar esta factura de canje, lo dicho anteriormente respecto de las fechas de operación es correcto.

Pero si informamos la sustitución con dos facturas, una factura simplificada de abono F2 en negativo con fecha de expedición la del día en curso (que anula la factura simplificada con anterioridad) y otro factura completa F1 en positivo con fecha de expedición la del día en curso (que completa la factura simplificada que queremos sustituir), entonces las fechas de operación de ambas deberían ser igual a la fecha de expedición. Esto lo deduzco de la respuesta que me dieron en VeriFactu ante esta consulta que les planteé.

"Respondiendo a su consulta le confirmamos que, en su caso, debería realizar un nuevo registro de facturación de tipo F1 y que no es necesario (ni tampoco posible al estar controlado por una validación del sistema) informar la factura simplificada sustituida."

ermendalenda 03-03-2024 18:41:57

Cita:

Empezado por sglorka (Mensaje 554715)
....
En ambos casos, el impuesto ya ha sido devengado/liquidado por tu parte (cuando se emitieron las simplificadas), por lo tanto, no hay movimiento en el IVA en el día en que generas la sustitutiva y la fecha de operación sigue significando lo mismo, el periodo en que se tuvo que haber devengado el impuesto.
[/i]

Gracias por la contestación,
El cliente puede deducirse ese iva actualmente si emito una F3 con el mismo ejenplo, fecha operacion hace 3 años, y no se lo dedujo en la fecha de operación?

sglorka 03-03-2024 19:04:07

Cita:

Empezado por ermendalenda (Mensaje 554716)
Gracias por la contestación,
El cliente puede deducirse ese iva actualmente si emito una F3 con el mismo ejenplo, fecha operacion hace 3 años, y no se lo dedujo en la fecha de operación?

Sí , claro

keys 04-03-2024 08:23:39

Cita:

Empezado por ermendalenda (Mensaje 554692)
Perdonad aue me he perdido un poco No sé si alguien lo ha planteado/contestado.
La diferencia entre la fecha de operación y expedición supongo que también está algo reglamentado, no creo que pueda ser más de x días des0ues dd ka de operacion o maximo al dia 15 del mes siguiente para empresarios y autonomos y dentro del mismo mes para emision a particulares, enfín supongo qir algo así como lo que se aplica para las recapitulativas con los albaranes.
Por otro lado me quedan más dudas
Que es la fecha de operación, la fecha del servicio o la fecha en que me lo pagan?
Por otro lado veo que también hay una fecha de pagos acta que tendrá otro tratamiento fiscal, no?
Vaya lio tengo. Creo que voy a hacer coincidir todas las fechas con la de expedición menos en la de las sustitutiva que hay que poner la fecha de cada tiquet, que, además esto es otro cantar, si un cliente me pide la factura sustitutiva he leído en varios foros de asesorías que hay que poner que el iva no es deducible por que ya se dedujo el tiquet, y esto lo veo una tremenda tontería, por que si me piden una sustitutiva es por que normalmente no se lo dedujeron en su momento, a no ser que necesiten el comprobante de autoria de que r3almente fue el receptor.
Aunque creo que la fecha de deducción debe ser la de operación o al menos el mes de la fecha de operación, corregidme si me equivoco.
Cuantos líos fiscales Dios, que yo soy programador y ni los asesores aclaran bien, pero yo tengo que saberlo todo. Es increible.

De momento sólo hay tres fechas.

FechaExpedicionFacturaEmisor : Que es la fecha de Expedición de la factura. Es decir el día que la hace. Esto esta pendiente que digan si puede ser o no anterior a la fecha actual.
FechaOperación: Es la fecha en la que se soportara fiscalmente la factura.(Si es una rectificativa la misma que la fecha de expedición de la que rectifica)
FechaGenRegistro : Es al fecha que que se genera el registro de facturación. Que además tiene Hora y uso horario.

No hay más. No hay fechas de pago. Eso es para la factura eléctronica no para Verifactu.

Neftali [Germán.Estévez] 04-03-2024 08:35:15

Cita:

Empezado por Delphier (Mensaje 554688)
Antes de nada , saludar al foro y dar las gracias a todos los que han escrito, me han ayudado mucho a decidir como empezar , con la pereza que me daba.:mad::mad::)

Como soy novato en el foro , es mi primer post y os cuento como lo voy a plantear Inicialmente, modo básico y esquemático , por si le sirve a alguien o por si alguien más experto me recomienda que abandone las cervecitas urgentemente :)


Hola Delphier, gracias por participar en el foro.
Ya que eres nuevo, te doy la bienvenida. Recordarte que revises La guía de estilo de los foros.
He modificado tu mensaje para añadir TAGs a los códigos dentro del mensaje.

Gracias de nuevo por los códigos.

ermendalenda 04-03-2024 08:40:37

Cita:

Empezado por sglorka (Mensaje 554717)
Sí , claro

ok, gracias

ermendalenda 04-03-2024 08:41:45

Cita:

Empezado por keys (Mensaje 554721)
De momento sólo hay tres fechas.

FechaExpedicionFacturaEmisor : Que es la fecha de Expedición de la factura. Es decir el día que la hace. Esto esta pendiente que digan si puede ser o no anterior a la fecha actual.
FechaOperación: Es la fecha en la que se soportara fiscalmente la factura.(Si es una rectificativa la misma que la fecha de expedición de la que rectifica)
FechaGenRegistro : Es al fecha que que se genera el registro de facturación. Que además tiene Hora y uso horario.

No hay más. No hay fechas de pago. Eso es para la factura eléctronica no para Verifactu.

Gracias, esperaremos un poco más a ver que novedades nos traen.

ermendalenda 04-03-2024 08:44:42

Rectificar Destinatario
 
Hola,
No se si es posible emitir registro de modificación de factura para modificación de la contraparte, si es posible, ¿alguien me puede "prestar" un xml para emitir una rectificativa de modificación de la contraparte/destinatario? (se lo devolveré sin defectos:D)


Gracias y feliz lunes.

ramherfer 04-03-2024 17:09:19

Cita:

Empezado por keys (Mensaje 554673)
Según TicketBai, y lo que interpreto de las preguntas que han colgado. La fecha de operación sería el 31/12/2023 y la fecha de factura/expedición sería el 02/01/2024.

Pero bueno creo que lo mejor es hacer la pregunta a hacienda. Yo se la hice hace unos días y me dijeron que hasta que no salga la normativa no me iban a contestar. Y en la impresión de la factura tienes que indicar las dos fechas, para que así el cliente sepa como la tiene que contabilizar.

Por eso el SII de compras tiene un campo Fecha Operación, otro Fecha de Expedición y uno tercero de Fecha de Registro contable.

Un Saludo

Aquí la respuesta de la AEAT,
Aquien del foro comento que le habian respondido lo mismo. Asi que habrá que imaginar y analizar la lógica aplicandola o esperar....


Buenos días:

El desarrollo normativo(*) aún no está completado y se encuentra en fase de estudio y elaboración definitiva. Por ello, sería aventurado adelantarle alguna respuesta con el riesgo de que esta cambiara tras la publicación oficial en el BOE de la orden ministerial y en la Sede electrónica de la AEAT de la documentación que completará dicha orden. Además, es muy probable que la lectura de dicha documentación oficial pudiera responder total o parcialmente su consulta. Por lo tanto, le emplazamos a que espere a dicho momento en el que podrá disponer de toda la información oficial necesaria. Si entonces aún siguiera teniendo dudas, por favor, remítanoslas por esta misma vía.

En cualquier caso, ya hemos tomado nota de sus consultas y se tendrá en cuenta para su estudio y, en su caso, incorporación a la documentación final del proyecto.

Muchas gracias por contactar con la AEAT.

(*) Artículos 29.2.j) y 201 bis de la Ley 58/2003, de 17 de diciembre, General Tributaria, y Real Decreto 1007/2023, de 5 de diciembre, por el que se aprueba el Reglamento que establece los requisitos que deben adoptar los sistemas y programas informáticos o electrónicos que soporten los procesos de facturación de empresarios y profesionales, y la estandarización de formatos de los registros de facturación. La orden ministerial que desarrollará el RD 1007/2023, publicada en enero de 2024 en el portal del Ministerio de Hacienda para dar cumplimiento a su trámite de audiencia e información pública, está en fase de estudio y elaboración definitiva, así como la documentación que completará dicha orden y que estará disponible en la Sede electrónica de la AEAT tras la aprobación y publicación oficial de la orden ministerial.

ramherfer 04-03-2024 17:24:27

Cita:

Empezado por Delphier (Mensaje 554688)
Antes de nada , saludar al foro y dar las gracias a todos los que han escrito, me han ayudado mucho a decidir como empezar , con la pereza que me daba.:mad::mad::)

Como soy novato en el foro , es mi primer post y os cuento como lo voy a plantear Inicialmente, modo básico y esquemático , por si le sirve a alguien o por si alguien más experto me recomienda que abandone las cervecitas urgentemente :)

Es verdad que cuando me ponga seguro pueden cambiar cosas , es solo un planteamiento incial para empezar a trabajar, no entro en los requisitos de huella,firma etc....

En principio la idea es no tocar las tablas actuales de facturas ,etc. que ya existen en mi sistema.

1.- Voy a crear una tabla nueva para guardar los registros verifactu de cada factura

básicamente tendrá:

campo que identifica la factura en el fichero de facturas
campo para guardar el xml "RegistroFacturacion"
campo para guardar el número de envío , si 0 = Pendiente de enviar.

seguro que al final tenga que añadir alguno más....


2.- Voy a crear una tabla nueva para guardar los registros de los envíos verifactu

campo con un código interno de envío
campo para guardar el xml AltaFactuSistemaFacturacion enviado.
campo para guardar la respuesta de la aeat.

seguro que al final tenga que añadir alguno más....


Cada factura que se genere usare Fact.RegistroFacturacion.ObjectToSOAP para obtener el xml y guardarlo en la tabla de los registros verifactu.

Partiendo del código de Neftali , aqui va un ejemplo de como obtener el xml con ObjectToSOAP , solo hay que meter en el Form un XMLDocument1, TOPToSoapDomConvert

Código Delphi [-]
procedure TForm4.Button7Click(Sender: TObject);
var
  ARootNode, ElemNode, NewNode: IXMLNode;
  RefId,Swdsl : String;
begin
  XMLDocument1.Active := True;

  XMLDocument1.Version:='1.0';
  XMLDocument1.Encoding:='utf-8';

  with XMLDOcument1 do
  begin
    ARootNode := CreateNode('RegistroFacturacion');
  end;


  // Factura ejemplo
  var fact:FacturasEmitidasType;
  fact := FacturasEmitidasType.Create;
  fact.RegistroFacturacion := RegistroFacturacionType.Create;
  fact.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;
  fact.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := '23/123456';
  fact.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := '31/12/23';
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF := '3333333';
  fact.RegistroFacturacion.DescripcionOperacion := 'venta de mercaderías';

    // Resto de datos de la factura....

  Swdsl := "no puedo poner enlaces   xxxxxenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl";


  newNode := Fact.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, OPToSoapDomConvert1, 'RegistroFacturacionType', Swdsl, 'T',[], RefId  ); 

  XMLDocument1.DocumentElement := ARootNode;
  Memo1.Lines.Clear;
  Memo1.Lines.Add(XMLDocument1.XML.Text);
  XMLDocument1.Active := False;


  fact.DisposeOf;
  fact.RegistroFacturacion.DisposeOf;

end;


Luego al generar los envíos , aprovechar el ejemplo de Neftali para ir recogiendo los RegistroFacturacion guardados con SOAPToObject

Código Delphi [-]
procedure TForm4.Button5Click(Sender: TObject);
var
  arrayDetalles : array of DetalleType;
  RegistroAltaFacturas: Array_Of_FacturasEmitidasType;
  x : Integer;
begin
  var alta:AltaFactuSistemaFacturacion := AltaFactuSistemaFacturacion.Create;

  // Cabecera
  var cab := Cabecera.Create;
  cab.IDVersion := VersionType._1_0;

  cab.ObligadoEmision := PersonaFisicaJuridicaESType.Create;
  cab.ObligadoEmision.NombreRazon := 'Empresa pruebas';
  cab.ObligadoEmision.NIF := '11111111H';
  cab.TipoRegistroAEAT := TipoRegistroAEATType.T0;
  cab.FechaFinVeriFactu := '01/01/2026';
  alta.Cabecera := cab;


  for x := 0 to 1 do
  Begin


    // Factura
    var fact:FacturasEmitidasType;
    fact := FacturasEmitidasType.Create;


    fact.RegistroFacturacion := RegistroFacturacionType.Create;
    fact.RegistroFacturacion.SOAPToObject()  // Codigo pendiente de poner y probar , solo es para mostrar el planteamiento , pero es el contrario de ObjectToSOAP

 
   // Lista de facturas del envío
   SetLength(RegistroAltaFacturas, x+1);

    RegistroAltaFacturas[x] := fact;

  end;


  // Factura 1
  alta.RegistroAltaFacturas := RegistroAltaFacturas;




  // envío
  try
    var res:RespuestaAltaFactuSistemaFacturacion := RespuestaAltaFactuSistemaFacturacion.Create;
    res := GetsfSOAP(False, '', HTTPRIO1).AltaFactuSistemaFacturacion(alta);

    ShowMessage('Se ha realizado el envío; ' + sLineBreak +
                '   CSV: ' + res.CSV  + sLineBreak +
                '   TimeStamp: ' + res.DatosPresentacion.TimestampPresentacion
                );
  except
    on E:Exception do begin
      ShowMessage(Format('Error al realizar el envío; (%s)-%s',[E.ClassName, E.Message]));
    end;
  end;
end;

Un Saludo a todos y no me metáis mucha caña :)

Pues he probado la primera parte y me genera el fichero xml, pero con unos NS1, NS2, NSn y type que no se si será correcto guardar cada registro de facturación con esta codificación:
Código:

<RegistroFacturacion xmlns:NS1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl" xmlns:NS2="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:NS3="http://www.w3.org/2001/XMLSchema" xmlns:NS4="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS5="http://www.w3.org/2001/XMLSchema-instance">
<NS1:RegistroFacturacionType id="1" type="NS2:RegistroFacturacionType">
<IDFactura href="#2"/>
<NombreRazonEmisor type="NS3:string"/>
<TipoRegistroSIF type="NS2:TipoRegistroSIFType">S0</TipoRegistroSIF>
<TipoFactura type="NS2:ClaveTipoFacturaType">F1</TipoFactura>
<DescripcionOperacion type="NS3:string">venta de mercaderías</DescripcionOperacion>
<Desglose type="NS4:Array" NS4:arrayType="NS2:DetalleType[0]"/>
<ImporteTotal type="NS3:string"/>
<EncadenamientoRegistroAnterior NS5:nil="true"/>
<SistemaInformatico NS5:nil="true"/>
<FechaGenRegistro NS5:type="NS3:string"/>
<HoraGenRegistro NS5:type="NS3:string"/>
<HusoHorarioGenRegistro NS5:type="NS2:HusoHorarioGenRegistroType">01</HusoHorarioGenRegistro>
</NS1:RegistroFacturacionType>
<NS2:IDFactura id="2" type="NS2:IDFacturaExpedidaType">
<IDEmisorFactura href="#3"/>
<NumSerieFacturaEmisor type="NS3:string">23/123456</NumSerieFacturaEmisor>
<FechaExpedicionFacturaEmisor type="NS3:string">31/12/23</FechaExpedicionFacturaEmisor>
</NS2:IDFactura>
<NS2:IDEmisorFactura id="3" type="NS2:IDEmisorFactura">
<NIF type="NS3:string">3333333</NIF>
</NS2:IDEmisorFactura>
</RegistroFacturacion>

En principio me parece bueno y funciona, correcto ya no se si decir si sería correcto. Hay mucha gente más capacitada que yo para calificarlo si sería correcto o no.

Sería muy interesante probar la segunda parte (envío) y que intentaré probar durante la semana. El planteamiento en mi humilde opinión parece bueno de narices.

ermendalenda 04-03-2024 21:01:23

Cita:

Empezado por ramherfer (Mensaje 554731)
Aquí la respuesta de la AEAT,
Aquien del foro comento que le habian respondido lo mismo. Asi que habrá que imaginar y analizar la lógica aplicandola o esperar....


Buenos días:

El desarrollo normativo(*) aún no está completado y se encuentra en fase de estudio y elaboración definitiva. Por ello, sería aventurado adelantarle alguna respuesta con el riesgo de que esta cambiara tras la publicación oficial en el BOE de la orden ministerial y en la Sede electrónica de la AEAT de la documentación que completará dicha orden. Además, es muy probable que la lectura de dicha documentación oficial pudiera responder total o parcialmente su consulta. Por lo tanto, le emplazamos a que espere a dicho momento en el que podrá disponer de toda la información oficial necesaria. Si entonces aún siguiera teniendo dudas, por favor, remítanoslas por esta misma vía.

En cualquier caso, ya hemos tomado nota de sus consultas y se tendrá en cuenta para su estudio y, en su caso, incorporación a la documentación final del proyecto.

Muchas gracias por contactar con la AEAT.

(*) Artículos 29.2.j) y 201 bis de la Ley 58/2003, de 17 de diciembre, General Tributaria, y Real Decreto 1007/2023, de 5 de diciembre, por el que se aprueba el Reglamento que establece los requisitos que deben adoptar los sistemas y programas informáticos o electrónicos que soporten los procesos de facturación de empresarios y profesionales, y la estandarización de formatos de los registros de facturación. La orden ministerial que desarrollará el RD 1007/2023, publicada en enero de 2024 en el portal del Ministerio de Hacienda para dar cumplimiento a su trámite de audiencia e información pública, está en fase de estudio y elaboración definitiva, así como la documentación que completará dicha orden y que estará disponible en la Sede electrónica de la AEAT tras la aprobación y publicación oficial de la orden ministerial.

A una pregunta radicalmente distinta me respondieron exactamente lo mismo, un copia y pega.
Tiene contenido muy usado por los IAChats jeje.

keys 05-03-2024 10:08:10

Cita:

Empezado por ermendalenda (Mensaje 554739)
A una pregunta radicalmente distinta me respondieron exactamente lo mismo, un copia y pega.
Tiene contenido muy usado por los IAChats jeje.

Yo creo que ya no contestan hasta que este la normativa definitiva. A mi me contestaron lo mismo

ermendalenda 05-03-2024 14:10:38

Bd C.p.
 
Buenas, estoy intentando hacer una BD con las relaciones de los
Códigos Postales con la Poblacion/Nombre Municipio/CodigoMunicipio/CodigoUnidadPoblacion/Provincias/Autonomia
He visto que hay cosas de Pago, bastante caras.
A ver quien quiere colaborar haciendo alguna Autonomia para que compartamos, yo creo que lo mejor que puedo conseguir es Andalucia de una fuente fiable, las demas autonomias las puedo conseguir pero la fuente que encuentro por internet es bastante regular.
Esto creo que nos va a ayudar que las facturas tengan los datos más fiables posible y posteriormente para Facturae. Al menos para tener algo y evitrar en la medida de lo posible errores de los operadores, ya sé que después necesita de actualización, pero al menos tendremos bastante.
Saludos

rci 05-03-2024 16:07:27

mensaje para eliminar

rci 05-03-2024 16:09:14

Cita:

Empezado por ermendalenda (Mensaje 554752)
Buenas, estoy intentando hacer una BD con las relaciones de los
Códigos Postales con la Poblacion/Nombre Municipio/CodigoMunicipio/CodigoUnidadPoblacion/Provincias/Autonomia
He visto que hay cosas de Pago, bastante caras.
A ver quien quiere colaborar haciendo alguna Autonomia para que compartamos, yo creo que lo mejor que puedo conseguir es Andalucia de una fuente fiable, las demas autonomias las puedo conseguir pero la fuente que encuentro por internet es bastante regular.
Esto creo que nos va a ayudar que las facturas tengan los datos más fiables posible y posteriormente para Facturae. Al menos para tener algo y evitrar en la medida de lo posible errores de los operadores, ya sé que después necesita de actualización, pero al menos tendremos bastante.
Saludos

A lo mejor me equivoco pero, puede que en la web del Instituto Nacional de Estadística encuentres lo que buscas.

Hay varias "bases de datos" en varias versiones y diría que encontrarás buena parte de la información que comentas.
En el siguiente enlace puedes ver la relación de datos a 1 de enero del 2024

https://ine.es/dyngs/INEbase/es/oper...=1254735976614

Si no es esto lo que buscas, disculpa la confusión

Saludos

ermendalenda 05-03-2024 18:33:01

Cita:

Empezado por rci (Mensaje 554755)
A lo mejor me equivoco pero, puede que en la web del Instituto Nacional de Estadística encuentres lo que buscas.

Hay varias "bases de datos" en varias versiones y diría que encontrarás buena parte de la información que comentas.
En el siguiente enlace puedes ver la relación de datos a 1 de enero del 2024

https://ine.es/dyngs/INEbase/es/oper...=1254735976614

Si no es esto lo que buscas, disculpa la confusión

Saludos

Gracias eso es parte, pero hay un trabajo de relacionar el código postal(correos) con el código del municipio(ine)
Las bases de datos que he encontrado con esta relación son bastantes defectuosoas, entre otras cosas por que en jn mismo xodigo postal puede estar enmedio de 2 zonas de municipios según el ine y viceversa.
Eñ código postal es el que se usa para las facturas . Pero en lss facturas electrónicas hay campos en los que pide los códigos de municipios.

ermendalenda 05-03-2024 18:58:23

Análisis video seminario
 
He visto algún punto del seminario sobre la reglamentación y me da la sensación de que va a crear alguna confusión:
* Si eres verifactu, no tendrás que conservar los registros de facturación, puesto que los vas a enviar.
OJO, con este punto. Lo que enviamos con verifactu es un resumen de la factura, no van los Items/conceptos, punto muy importante. Lo que tenemos que tener claro es que lo que no hay que conservar son esos XML que enviamos, pero no olvidemos que el reglamento de facturación obliga a la conservación de las facturas 5 años y que ai hablamos de tiquets o factura simplificada el cliente noss puede solicitar la sustitutiva hasta 4 años después, así que olvidaos de dejar de hacer copias de seguridad
*El envío instantáneo no es estrictamente instantáneo, eso es lo que han dicho, pero si intentas el envío y ves que no hay conexión, marcado mejor como incidencia, es un punto importante, aún no sabemos que margen de tiempo es el que nos dan para que no nos "llamen la atención", pero está claro que sí vemos que es un margen corto tendremos que exponerles la problemática de nuestros casos, por ejemplo un punto de venta con un router de datos con sim en una zona de pica cobertura, un tpv con pocos recursos que no puede estar enviando constantemente, El envio de los datos através de un tercero, que a veces dependerá de la carga de envíos de ese tercero.Total yo veo bien 24 horas los diss laborables y 72 los fines de semana, y en comdiciones normales:D si no hay problemas. Este tiempo que pongan, parece ser que, también marcará la alerta que los usuarios que lean el QR reciban si no lo hemos subido aún.
*Rotura de encadenamiento. Por otro lado hablan de que si enviamos registros con errores de hash será un error leve, otros errores tendremos que tratarlo para sustituir el registro , ya nos dirán como. Pero lo que más me importaba parece que lo van a tratar de una forma "lógica", si se produce una rotura de encadenamiento, lo auditarán, o sea, analizarán si merece la pena escalarlo. Así que supongo que sí un negocio, que normalmente envia correctamente y son ventas pequeñas, un día puede tenerr un problema y que no les llamen la atención

Delphier 05-03-2024 19:42:21

Generación RegistroFacturacion ALTA y XML para guardar y leer después
 
Pues lo dicho , aquí va mi primer ptototipo de unit para verifactu , con el código para generar un RegistroFacturacion de una factura y extraer el XML , por si le sirve a alguien para algo.
Evidentemente los campos y als tablas son los míos y no va a funcionar directamente, pero el esqueleto del registrofafcturacion de Alta está. :)


Código Delphi [-]
unit UVerifactu;

interface

Uses

System.SysUtils,
Xml.xmldom,
Xml.XMLIntf,
Xml.XMLDoc,
Data.Win.ADODB,
System.DateUtils,
Vcl.Dialogs,
Udatam, // Use interno propio
System.hash,
System.StrUtils,
GesAdoDataset, // Use interno propio
SistemaFacturacionSOAPv12,
Soap.InvokeRegistry,
Soap.OPConvert,
Soap.SOAPDomConv,
Soap.OPToSOAPDomConv;

function Trimestre(Dia:TDate):integer;
function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
function TipoCalificacionOperacion : CalificacionOperacionType;
function TipoOperacionExenta : OperacionExentaType;

function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);


function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;


implementation

Uses Ur_user; // Use interno propio

function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;
Begin

// NIF (RegistroFactura/RegistroAlta/IDFactura/IDEmisorFactura/NIF)
// NumserieFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/NumSerieFacturaEmisor)
// FechaExpedicionFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/FechaExpedicionFacturaEmisor)
// TipoRegistroSIF (RegistroFactura/RegistroAlta/TipoRegistroSIF)
// TipoFactura (RegistroFactura/RegistroAlta/TipoFactura)
// CuotaTotal (RegistroFactura/RegistroAlta/CuotaTotal)
// ImporteTotal (RegistroFactura/RegistroAlta/ImporteTotal)
// HuellaRegistroAnterior (RegistroFactura/RegistroAlta/EncadenamientoRegistroAnterior/HuellaRegistroAnterior)
// FechaHoraHusoGenRegistro (RegistroFactura/RegistroAlta/FechaHoraHusoGenRegistro)

// formato fECHAS verifactu (dd-mm-yyyy)

 // Ejemplo cadena
 {
 CadenaVerifactu :=
 'BXXXXXXXXXX'+
 'F1-01-150'+
 '27-02-2024'+
 'VERIFACTU'+ // ???
 'F1'+
 '1000'+
 '1210'+
 '27-02-2024 11:19:00';
  }

 Result := THashSHA2.GetHashString(CadenaVerifactu,THashSHA2.TSHA2Version.SHA256);


End;



function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
var NombreTabla,NombreVista,IdFactura : String;
var DTFactura,DTDesgloseIvas : TGesAdoDataset;
begin



  // Buscamos pro tabla
  NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
  NombreVista := 'Vista'+NombreTabla;


  // Vamos a Buscar la Factura
  DTFactura      := f_crear_dataset(Conexion,DTFactura,'DTFactura','');
  DTDesgloseIvas := f_crear_dataset(Conexion,DTDesgloseIvas,'DTDesgloseIvas','');

  DTFactura.TableName := NombreTabla;
  DTFactura.VistaName := NombreVista;



  DTFactura.CommandText := 'Select * From '+NombreVista+' where Identificador = :Identificador';
  f_valor_parametro_tabla(DTFactura,'Identificador',IdDocumento);
  f_open_adodataset(DTFactura,ltReadOnly);

  DTDesgloseIvas.CommandText := 'Select * From DocumentosDesgloseIvas where IdDocumento = :Identificador';
  f_valor_parametro_tabla(DTDesgloseIvas,'Identificador',IdDocumento);
  f_open_adodataset(DTDesgloseIvas,ltReadOnly);


  IdFactura := DTFactura.FieldByName('Identificador').AsString;

  ///EsPrimera factura del ejercicio?

  //vamos vamos


  // Factura ejemplo

  var Factura :FacturasEmitidasType;
  Factura := FacturasEmitidasType.Create;

  Factura.RegistroFacturacion := RegistroFacturacionType.Create;
  Factura.DatosControl  := DatosControlType.Create;



  //IdFactura
  Factura.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;

  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF   := Datam.TBEmpresa.FieldByName('NIF').AsString;
  Factura.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := DTFactura.FieldByName('ReferenciaDocumento').AsString;
  Factura.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
  [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

  Factura.RegistroFacturacion.NombreRazonEmisor := Datam.TBEmpresa.FieldByName('C_EMPRESA').AsString;
  Factura.RegistroFacturacion.TipoRegistroSIF   := TipoRegistroSIFType.S0; // averiguar cuando usar //S0  Alta inicial del registro de facturación en el SIF ,  
//S1  Alta sustitutiva del registro de facturación en el SIF,  
//S2  Anulación inicial del registro de facturación en el SIF,  
//S3  Anulación sustitutiva del registro de facturación en el SIF
  Factura.RegistroFacturacion.TipoFactura       := TipoFacturaVerifactu(DTFactura);
  if Length(Trim(DTFactura.FieldByName('CorrectionMethod1').AsString)) > 0 then
  Factura.RegistroFacturacion.TipoRectificativa := TipoRectificativaVerifactu(DTFactura.FieldByName('CorrectionMethod1').AsString);


    // Rectificads por direfencias  "Factura.RegistroFacturacion.FacturasRectificadas"
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.I then
    Begin
      AgregarRelacionRectificadasPorDiferencias(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


    // por sustitucion
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.S then
    Begin
      AgregarRelacionRectificadasPorSustitucion(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


  Factura.RegistroFacturacion.FechaOperacion := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)
  Factura.RegistroFacturacion.DescripcionOperacion := 'Venta';
  Factura.RegistroFacturacion.FacturaSimplificadaArticulos7_2_7_3 := SimplificadaCualificadaType.N; // Factura simplificada Articulo 7,2 Y 7,3 RD 1619/2012. 
//Si no se informa este campo se entenderá que tiene valor  “N , si l afacutra simplificada tiene nif i datos
  Factura.RegistroFacturacion.FacturaSinIdentifDestinatarioArticulo6_1_d := CompletaSinDestinatarioType.N; //si es simplificada N ordinaria S , por aclarar
  Factura.RegistroFacturacion.Macrodato := MacrodatoType.N; // S  Sí - N  No


  // Tervero No aplicamos ->
  // Factura.RegistroFacturacion.EmitidaPorTercerosODestinatario := ''; //TercerosODestinatarioType.D;
  //   Factura.RegistroFacturacion.Tercero

     { el ejemplo
    // Detalle
    var detalle := DetalleType.Create;
    detalle.CuotaRepercutida := '100';
    detalle.TipoImpositivo := '21';
    SetLength(arrayDetallesDesglose, 1);
    arrayDetallesDesglose[0] := detalle;



    // desglose
    var desglose: DesgloseType := DesgloseType.Create();
    SetLength(Desglose, 1);
    Desglose[0] := detalle;
    fact.RegistroFacturacion.Desglose := Desglose;
    }


  //Factura.RegistroFacturacion.Destinatarios := En simplificadas ?????

  // Destinatario
  var Destinatario := PersonaFisicaJuridicaType.Create;
  Destinatario.NombreRazon := DTFactura.FieldByName('NOMB').AsString;
  Destinatario.NIF         := DTFactura.FieldByName('NIF').AsString;

  Destinatario.IDOtro := IDOtroType.Create;
  //Destinatario.IDOtro.CodigoPais := '';

  //PersonaFisicaJuridicaIDTypeType ->
  //02  NIF-IVA
  //03  Pasaporte
  //04  Documento oficial de identificación expedido por el país o territorio de residencia
  //05  Certificado de residencia
  //06  Otro documento probatorio
  //07  No censado

  Destinatario.IDOtro.IdType := PersonaFisicaJuridicaIDTypeType._02;
  Destinatario.IDOtro.ID     := DTFactura.FieldByName('NIF').AsString;

  // Los destinatarios , la lista
  var ListaDestinatarios : Destinatarios := Destinatarios.Create();
  SetLength(ListaDestinatarios, 1);
  ListaDestinatarios[0] := Destinatario;
  Factura.RegistroFacturacion.Destinatarios := ListaDestinatarios;




  Factura.RegistroFacturacion.Cupon := CuponType.N;


//vamos por aqui




      // Desglose de IVAS
      var ListaDesglose : DesgloseType := DesgloseType.Create();
      var Orden := 0;
      while not DTDesgloseIvas.Eof do
      Begin

          var DetalleDesglose := DetalleType.Create;;

          DetalleDesglose.ClaveRegimen :=
          ClaveRegimenVerifactu(DTFactura.Connection,DTFactura.FieldByName('RegimenIva').AsInteger); //'L8';

          DetalleDesglose.CalificacionOperacion := TipoCalificacionOperacion; //L9

          // Si es exenta , motivo
          if (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N1)
          or (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N2) then
          DetalleDesglose.OperacionExenta := TipoOperacionExenta; //L10

          DetalleDesglose.TipoImpositivo := FormatFloat('0.00',DTDesgloseIvas.FieldByName('IVA').AsFloat);
          DetalleDesglose.BaseImponibleOimporteNoSujeto := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIMP').AsFloat);;
          DetalleDesglose.BaseImponibleACoste := '0.00';
          DetalleDesglose.CuotaRepercutida := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIVA').AsFloat);
          DetalleDesglose.TipoRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('REC').AsFloat);
          DetalleDesglose.CuotaRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASREC').AsFloat);

       DTDesgloseIvas.Next;

           // desglose

        SetLength(ListaDesglose, Orden+1);
        ListaDesglose[Orden] := DetalleDesglose ;


       Orden := Orden + 1;

      end;

      Factura.RegistroFacturacion.Desglose := ListaDesglose;


    Factura.RegistroFacturacion.ImporteTotal := FormatFloat('0.00',DTFactura.FieldByName('TOTA').AsCurrency);

    // EncadenamientoFacturaAnterior
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior := EncadenamientoFacturaAnteriorType.Create;
    //Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.IDEmisorFacturaRegistroAnterior := '' ;
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.NumSerieFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.FechaExpedicionFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.HuellaRegistroAnterior := '';



    Factura.RegistroFacturacion.SistemaInformatico := SistemaInformaticoType.Create;
    Factura.RegistroFacturacion.SistemaInformatico.NombreRazon := '';
    Factura.RegistroFacturacion.SistemaInformatico.NIF         := '';

    Factura.RegistroFacturacion.SistemaInformatico.IDOtro := IDOtroType.Create;
    //Factura.RegistroFacturacion.SistemaInformatico.IDOtro.CodigoPais
    Factura.RegistroFacturacion.SistemaInformatico.IDOtro.IDType := PersonaFisicaJuridicaIDTypeType._02;

    Factura.RegistroFacturacion.SistemaInformatico.NombreSistemaInformatico := '';
    Factura.RegistroFacturacion.SistemaInformatico.IdSistemaInformatico     := '';
    Factura.RegistroFacturacion.SistemaInformatico.Version                  := '';
    Factura.RegistroFacturacion.SistemaInformatico.NumeroInstalacion        := '';
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleSoloVerifactu := SiNoType.S;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleOtros         := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleMultiOT       := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.NumeroOTAlta := '1';


    Factura.RegistroFacturacion.FechaGenRegistro := '';
    Factura.RegistroFacturacion.HoraGenRegistro  := '';
    Factura.RegistroFacturacion.HusoHorarioGenRegistro := HusoHorarioGenRegistroType._02; //L13 provisional
    Factura.RegistroFacturacion.NumRegistroAcuerdoFacturacion := '';
    Factura.RegistroFacturacion.IdAcuerdoSistemaInformatico   := '';


  DTFactura.DisposeOf;

  Showmessage('// Extraemos XML');

  var ARootNode,newNode : IXMLNode;
  var RefId,Swdsl : String;
  var XML : TXMLDocument;
  XML := TXMLDocument.Create(Fr_user);

  XML.Active := True;
  XML.Version:='1.0';
  XML.Encoding:='utf-8';


  ARootNode := XML.CreateNode('RegistroFacturacion');

  var MOPToSoapDomConvert : TOPtoSOAPDomConvert;
  MOPToSoapDomConvert := TOPtoSOAPDomConvert.Create(Fr_user);

  MOPToSoapDomConvert.Encoding := 'utf-8';

  MOPToSoapDomConvert.Options :=
  [TSOAPConvertOption.soSendMultiRefObj,
  TSOAPConvertOption.soTryAllSchema,
  TSOAPConvertOption.soRootRefNodesToBody,
  TSOAPConvertOption.soCacheMimeResponse,
  TSOAPConvertOption.soUTF8EncodeXML,
  TSOAPConvertOption.soSOAP12];

  try

   Swdsl := 'no puedo poner enlaces 2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl';

   try
   newNode := Factura.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, MOPToSoapDomConvert, 'RegistroFacturacionType',
   Swdsl,'T',[ocoDontPrefixNode,ocoDontPutTypeAttr], RefId  ); //ocoDontPrefixNode

   XML.DocumentElement := ARootNode;
   XML.XML.SaveToFile('RegistroFacturacion.xml',TEncoding.UTF8);
   XML.Active := False;

   Except
   On E : Exception do
   Begin
    Showmessage(E.Message);
    XML.DocumentElement := ARootNode;
    XML.XML.SaveToFile('RegistroFacturacionError.xml',TEncoding.UTF8);
    XML.Active := False;
   End;

   end;

  finally
    XML.DisposeOf;
    MOPToSoapDomConvert.disposeOf;
    Factura.DisposeOf;

  end;


End;



function Trimestre(Dia:TDate):integer;
var mes,Trimestre : Integer;
begin

  Mes := monthof(dia);
  case mes of
  1 : Trimestre := 1;
  2 : Trimestre := 1;
  3 : Trimestre := 1;
  4 : Trimestre := 2;
  5 : Trimestre := 2;
  6 : Trimestre := 2;
  7 : Trimestre := 3;
  8 : Trimestre := 3;
  9 : Trimestre := 3;
  10: Trimestre := 4;
  11: Trimestre := 4;
  12: Trimestre := 4;
  end;


 result:= Trimestre;

end;

function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
var TipoVerifactu : ClaveTipoFacturaType;
var TablaMaestra : Integer;
Begin


  //F1  Factura (art. 6, 7.2 y 7.3 del RD 1619/2012)   // Factura ordinadia normal
  //F2  Factura Simplificada y Facturas sin identificación del destinatario art. 6.1.d) RD 1619/2012
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?

  //R1  Factura Rectificativa (Error fundado en derecho y Art. 80 Uno Dos y Seis LIVA) // Resolucion Judicial
  //R2  Factura Rectificativa (Art. 80.3)   // Impago
  //R3  Factura Rectificativa (Art. 80.4)   // Impago
  //R4  Factura Rectificativa (Resto) // Lo normal , por error
  //R5  Factura Rectificativa en facturas simplificadas

  // A ver que de que tabla es la factura
  TablaMaestra :=
  f_devolver_valor_campo(0,DTFactura.Connection,'N','Tablas','Nombre','Codigo',DTFactura.TableName);

  // Ordinarias
  if TablaMaestra = 24 then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F1
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;

  // Simplificadas
  if TablaMaestra = 3 then
  Begin

    // SImplificada ordinaria
    if DTFactura.FieldByName('Tipo').AsInteger = 1 then
    TipoVerifactu := ClaveTipoFacturaType.F2;

    // Es rectificativa //R5  Factura Rectificativa en facturas simplificadas
    if DTFactura.FieldByName('Tipo').AsInteger = 6 then
    TipoVerifactu := ClaveTipoFacturaType.R5;

  End;



  //Factura de canje de simplificads y recapitulativas
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?
  if (TablaMaestra = 252) or (TablaMaestra = 248) then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F3
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;




  Result := TipoVerifactu;

End;


function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
var TipoVerifactu : ClaveTipoRectificativaType;
Begin

  //S  Por sustitución
  //I  Por diferencias

  // Si es rectificativa

    //Sustitucion
    if CorrectionMethod = '01' then TipoVerifactu := ClaveTipoRectificativaType.S;

    //Diferencias
    if CorrectionMethod = '02' then TipoVerifactu := ClaveTipoRectificativaType.I;


  Result := TipoVerifactu;

End;


procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

   //El fichero de lista de rectificadas por diferecnias
   DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

   try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;

   DTRectificadas.Connection  :=  Conexion;
   DTRectificadas.TableName   := 'FacturasRectificadas';
   DTRectificadas.CommandText :=
   'Select * from '+NombreVista+' where Identificador in '+
   '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

   f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
   f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

   f_open_adodataset(DTRectificadas,ltReadOnly);


   Orden := 0;
   BaseRectificadas    := 0;
   IvaRectificadas     := 0;
   RecargoRectificadas := 0;

   var ListaRectificadas : FacturasRectificadas := FacturasRectificadas.Create();
   while not DTRectificadas.Eof do
   Begin

    BaseRectificadas    := BaseRectificadas    + DTRectificadas.FieldByName('BASIMP').AsCurrency;
    IvaRectificadas     := IvaRectificadas     + DTRectificadas.FieldByName('BASIVA').AsCurrency;
    recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

    // Añadimos la factura recitificada por diferencias
    var FacturaRectificada := IDFacturaARType.Create;
    FacturaRectificada.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
    FacturaRectificada.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
 [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

    SetLength(ListaRectificadas, Orden+1);
    ListaRectificadas[Orden] := FacturaRectificada;

    Orden := Orden + 1;

    DTRectificadas.Next;
   End;
   f_close_adodataset(DTRectificadas);
   Factura.RegistroFacturacion.FacturasRectificadas := ListaRectificadas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);

  finally
   DTRectificadas.DisposeOf;
  end;

end;


procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

  //El fichero de lista de rectificadas por Sustitucion
  DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

  try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;


    //El fichero de lista de rectificadas por Sustitucion
    DTRectificadas.Connection  :=  Conexion;
    DTRectificadas.TableName   := 'FacturasRectificadas';
    DTRectificadas.CommandText :=
    'Select * from '+NombreVista+' where Identificador in '+
    '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

    f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
    f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

    f_open_adodataset(DTRectificadas,ltReadOnly);


    // Cada factura Sustituida
    Orden := 0;
    BaseRectificadas    := 0;
    IvaRectificadas     := 0;
    RecargoRectificadas := 0;

    var ListaFacturasSustituidas : FacturasSustituidas := FacturasSustituidas.Create();
    while not DTRectificadas.Eof do
    Begin

     BaseRectificadas    := BaseRectificadas + DTRectificadas.FieldByName('BASIMP').AsCurrency;
     IvaRectificadas     := IvaRectificadas + DTRectificadas.FieldByName('BASIVA').AsCurrency;
     recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

     // Añadimos la factura recitificada sustitutiva
     var FacturaSustitutiva := IDFacturaARType.Create;
     FacturaSustitutiva.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
     FacturaSustitutiva.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)


     SetLength(ListaFacturasSustituidas, Orden+1);
     ListaFacturasSustituidas[Orden] := FacturaSustitutiva;


     Orden := Orden + 1;

     DTRectificadas.Next;

    End;
    f_close_adodataset(DTRectificadas);
    Factura.RegistroFacturacion.FacturasSustituidas := ListaFacturasSustituidas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);


  finally
   DTRectificadas.DisposeOf;
  end;



end;


function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
var CodigoVerifactu : String;
var TypeRegimen : IdOperacionesTrascendenciaTributariaType;
Begin

  //'L8';

// 01  Operación de régimen general.
// 02  Exportación.
// 03  Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.
// 04  Régimen especial del oro de inversión.
// 05  Régimen especial de las agencias de viajes.
// 06  Régimen especial grupo de entidades en IVA (Nivel Avanzado)
// 07  Régimen especial del criterio de caja.
// 08  Operaciones sujetas al IPSI  / IGIC (Impuesto sobre la Producción, los Servicios y la Importación  / Impuesto General Indirecto Canario).
// 09  Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012)
// 10  Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, 
// asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.
// 11  Operaciones de arrendamiento de local de negocio.
// 12  Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.
// 13  Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.
// 14  Régimen simplificado
// 15  Recargo de equivalencia.
// 16  Régimen especial de la agricultura


  // Falta ponde ren la carga inicial
  CodigoVerifactu := f_devolver_valor_campo(0,Conexion,'C','RegimenesIVA','Codigo','CodVerifactu',RegimenIva);


   Case IndexStr(CodigoVerifactu, ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16']) of
   0  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   1  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._02;
   2  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._03;
   3  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._04;
   4  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._05;
   5  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._06;
   6  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._07;
   7  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._08;
   8  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._09;
   9  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._10;
   10 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._11;
   11 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._12;
   12 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._13;
   13 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._14;
   14 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._15;
   15 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._16;
   else
   Begin
     TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   End;
  end;

  Result := TypeRegimen;


End;


function TipoCalificacionOperacion : CalificacionOperacionType;
Begin

// L9

// S1  Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.
// S2  Operación Sujeta y No exenta - Con Inversión del sujeto pasivo
// N1  Operación No Sujeta artículo 7, 14, otros.
// N2  Operación No Sujeta por Reglas de localización.

  Result := CalificacionOperacionType.S1;

End;


function TipoOperacionExenta : OperacionExentaType;
Begin

  //L10 - solo si exenta de IVA

// E0  Exenta sin especificar causa
// E1  Exenta por el artículo 20
// E2  Exenta por el artículo 21
// E3  Exenta por el artículo 22
// E4  Exenta por los artículos 23 y 24
// E5  Exenta por el artículo 25
// E6  Exenta por otros

  result := OperacionExentaType.E0;

End;


end.


Luego el código en bruto para recogerlo:

Código Delphi [-]
  XMLDocument1.XML.LoadFromFile('RegistroFacturacion.xml');
  XMLDocument1.Active := True;

  var fact2:FacturasEmitidasType;
  fact2 := FacturasEmitidasType.Create;
  fact2.RegistroFacturacion := RegistroFacturacionType.Create;

  ARootNode := XMLDocument1.DocumentElement;

  var MySOAPDomConv: TSOAPDomConv;
  MySOAPDomConv:= TSOAPDomConv.Create(Self);

  fact2.RegistroFacturacion.SOAPToObject(ARootNode.ChildNodes[0] , ARootNode.ChildNodes[0] , MySOAPDomConv);

  Showmessage('2 '+
  fact2.RegistroFacturacion.DescripcionOperacion+' '+
  fact2.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor);



  fact2.DisposeOf;
  fact2.RegistroFacturacion.DisposeOf;

xevi 05-03-2024 19:46:58

Estaría bien poder ver ese xml final generado que enviarías con ese procedimiento

Delphier 05-03-2024 20:01:32

Aquí va , no entraba en el otro post.
Saludos


Código:

<?xml version="1.0"?>
<RegistroFacturacion xmlns:NS1="no puedo poner enlaces w3.org/2001/XMLSchema" xmlns:NS2="no puedo poner enlaces .agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:NS3="no puedo poner enlaces w3.org/2003/05/soap-encoding" xmlns:NS4="no puedo poner enlaces .org/2001/XMLSchema-instance">
    <RegistroFacturacionType id="1">
        <IDFactura id="2">
            <IDEmisorFactura id="3">
                <NIF type="NS1:string">BXXXXXXXX</NIF>
            </IDEmisorFactura>
            <NumSerieFacturaEmisor type="NS1:string">2022-F1-PC-0000000055</NumSerieFacturaEmisor>
            <FechaExpedicionFacturaEmisor type="NS1:string">10-05-2022</FechaExpedicionFacturaEmisor>
        </IDFactura>
        <NombreRazonEmisor type="NS1:string">EMPRESA TEST, S.L.</NombreRazonEmisor>
        <TipoRegistroSIF type="NS2:TipoRegistroSIFType">S0</TipoRegistroSIF>
        <TipoFactura type="NS2:ClaveTipoFacturaType">F1</TipoFactura>
        <FacturasSustituidas type="NS3:Array" NS3:itemType="NS2:IDFacturaARType" NS3:arraySize="0"/>
        <ImporteRectificacion NS3:id="4">
            <BaseRectificada type="NS1:string">0</BaseRectificada>
            <CuotaRectificada type="NS1:string">0</CuotaRectificada>
            <CuotaRecargoRectificado type="NS1:string">0</CuotaRecargoRectificado>
        </ImporteRectificacion>
        <FechaOperacion type="NS1:string">10-05-2022</FechaOperacion>
        <DescripcionOperacion type="NS1:string">Venta</DescripcionOperacion>
        <FacturaSimplificadaArticulos7.2_7.3 type="NS2:SimplificadaCualificadaType">N</FacturaSimplificadaArticulos7.2_7.3>
        <FacturaSinIdentifDestinatarioArticulo6.1.d type="NS2:CompletaSinDestinatarioType">N</FacturaSinIdentifDestinatarioArticulo6.1.d>
        <Macrodato type="NS2:MacrodatoType">N</Macrodato>
        <Destinatarios type="NS3:Array" NS3:itemType="NS2:PersonaFisicaJuridicaType" NS3:arraySize="1">
            <item NS3:id="5" type="NS2:PersonaFisicaJuridicaType">
                <NombreRazon type="NS1:string">Cliente demo </NombreRazon>
                <NIF type="NS1:string">XXXXXXXXJ</NIF>
                <IDOtro NS3:id="6" type="NS2:IDOtroType">
                    <IDType type="NS2:PersonaFisicaJuridicaIDTypeType">02</IDType>
                    <ID type="NS1:string">XXXXXXXXJ</ID>
                </IDOtro>
            </item>
        </Destinatarios>
        <Cupon type="NS2:CuponType">N</Cupon>
        <Desglose type="NS3:Array" NS3:itemType="NS2etalleType" NS3:arraySize="1">
            <item NS3:id="7" type="NS2etalleType">
                <ClaveRegimen type="NS2:IdOperacionesTrascendenciaTributariaType">01</ClaveRegimen>
                <CalificacionOperacion type="NS2:CalificacionOperacionType">S1</CalificacionOperacion>
                <TipoImpositivo type="NS1:string">4,00</TipoImpositivo>
                <BaseImponibleOimporteNoSujeto type="NS1:string">1347,18</BaseImponibleOimporteNoSujeto>
                <BaseImponibleACoste type="NS1:string">0.00</BaseImponibleACoste>
                <CuotaRepercutida type="NS1:string">53,89</CuotaRepercutida>
                <TipoRecargoEquivalencia type="NS1:string">0,00</TipoRecargoEquivalencia>
                <CuotaRecargoEquivalencia type="NS1:string">0,00</CuotaRecargoEquivalencia>
            </item>
        </Desglose>
        <ImporteTotal type="NS1:string">1401,07</ImporteTotal>
        <EncadenamientoRegistroAnterior NS3:id="8">
            <IDEmisorFacturaRegistroAnterior NS4:nil="true"/>
            <NumSerieFacturaRegistroAnterior NS4:type="NS1:string"/>
            <FechaExpedicionFacturaRegistroAnterior NS4:type="NS1:string"/>
            <HuellaRegistroAnterior NS4:type="NS1:string"/>
        </EncadenamientoRegistroAnterior>
        <SistemaInformatico NS3:id="9">
            <NombreRazon NS4:type="NS1:string"/>
            <NIF NS4:type="NS1:string"/>
            <IDOtro NS3:id="10">
                <IDType NS4:type="NS2:PersonaFisicaJuridicaIDTypeType">02</IDType>
                <ID NS4:type="NS1:string"/>
            </IDOtro>
            <NombreSistemaInformatico NS4:type="NS1:string"/>
            <IdSistemaInformatico NS4:type="NS1:string"/>
            <Version NS4:type="NS1:string"/>
            <NumeroInstalacion NS4:type="NS1:string"/>
            <TipoUsoPosibleSoloVerifactu NS4:type="NS2:SiNoType">S</TipoUsoPosibleSoloVerifactu>
            <TipoUsoPosibleOtros NS4:type="NS2:SiNoType">N</TipoUsoPosibleOtros>
            <TipoUsoPosibleMultiOT NS4:type="NS2:SiNoType">N</TipoUsoPosibleMultiOT>
            <NumeroOTAlta NS4:type="NS1:string">1</NumeroOTAlta>
        </SistemaInformatico>
        <FechaGenRegistro NS4:type="NS1:string"/>
        <HoraGenRegistro NS4:type="NS1:string"/>
        <HusoHorarioGenRegistro NS4:type="NS2:HusoHorarioGenRegistroType">02</HusoHorarioGenRegistro>
        <NumRegistroAcuerdoFacturacion NS4:type="NS1:string"/>
        <IdAcuerdoSistemaInformatico NS4:type="NS1:string"/>
    </RegistroFacturacionType>
</RegistroFacturacion>


ramherfer 05-03-2024 21:59:15

Cita:

Empezado por Delphier (Mensaje 554762)
Aquí va , no entraba en el otro post.
Saludos



<?xml version="1.0"?>
<RegistroFacturacion
xmlns:NS1="no puedo poner enlaces w3.org/2001/XMLSchema"
xmlns:NS2="no puedo poner enlaces .agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"
xmlns:NS3="no puedo poner enlaces w3.org/2003/05/soap-encoding"
xmlns:NS4="no puedo poner enlaces .org/2001/XMLSchema-instance">
<RegistroFacturacionType id="1">
<IDFactura id="2">
<IDEmisorFactura id="3">
<NIF type="NS1:string">BXXXXXXXX</NIF>
</IDEmisorFactura>
<NumSerieFacturaEmisor type="NS1:string">2022-F1-PC-0000000055</NumSerieFacturaEmisor>
<FechaExpedicionFacturaEmisor type="NS1:string">10-05-2022</FechaExpedicionFacturaEmisor>
</IDFactura>
<NombreRazonEmisor type="NS1:string">EMPRESA TEST, S.L.</NombreRazonEmisor>
<TipoRegistroSIF type="NS2:TipoRegistroSIFType">S0</TipoRegistroSIF>
<TipoFactura type="NS2:ClaveTipoFacturaType">F1</TipoFactura>
<FacturasSustituidas type="NS3:Array" NS3:itemType="NS2:IDFacturaARType" NS3:arraySize="0"/>
<ImporteRectificacion NS3:id="4">
<BaseRectificada type="NS1:string">0</BaseRectificada>
<CuotaRectificada type="NS1:string">0</CuotaRectificada>
<CuotaRecargoRectificado type="NS1:string">0</CuotaRecargoRectificado>
</ImporteRectificacion>
<FechaOperacion type="NS1:string">10-05-2022</FechaOperacion>
<DescripcionOperacion type="NS1:string">Venta</DescripcionOperacion>
<FacturaSimplificadaArticulos7.2_7.3 type="NS2:SimplificadaCualificadaType">N</FacturaSimplificadaArticulos7.2_7.3>
<FacturaSinIdentifDestinatarioArticulo6.1.d type="NS2:CompletaSinDestinatarioType">N</FacturaSinIdentifDestinatarioArticulo6.1.d>
<Macrodato type="NS2:MacrodatoType">N</Macrodato>
<Destinatarios type="NS3:Array" NS3:itemType="NS2:PersonaFisicaJuridicaType" NS3:arraySize="1">
<item NS3:id="5" type="NS2:PersonaFisicaJuridicaType">
<NombreRazon type="NS1:string">Cliente demo </NombreRazon>
<NIF type="NS1:string">XXXXXXXXJ</NIF>
<IDOtro NS3:id="6" type="NS2:IDOtroType">
<IDType type="NS2:PersonaFisicaJuridicaIDTypeType">02</IDType>
<ID type="NS1:string">XXXXXXXXJ</ID>
</IDOtro>
</item>
</Destinatarios>
<Cupon type="NS2:CuponType">N</Cupon>
<Desglose type="NS3:Array" NS3:itemType="NS2:DetalleType" NS3:arraySize="1">
<item NS3:id="7" type="NS2:DetalleType">
<ClaveRegimen type="NS2:IdOperacionesTrascendenciaTributariaType">01</ClaveRegimen>
<CalificacionOperacion type="NS2:CalificacionOperacionType">S1</CalificacionOperacion>
<TipoImpositivo type="NS1:string">4,00</TipoImpositivo>
<BaseImponibleOimporteNoSujeto type="NS1:string">1347,18</BaseImponibleOimporteNoSujeto>
<BaseImponibleACoste type="NS1:string">0.00</BaseImponibleACoste>
<CuotaRepercutida type="NS1:string">53,89</CuotaRepercutida>
<TipoRecargoEquivalencia type="NS1:string">0,00</TipoRecargoEquivalencia>
<CuotaRecargoEquivalencia type="NS1:string">0,00</CuotaRecargoEquivalencia>
</item>
</Desglose>
<ImporteTotal type="NS1:string">1401,07</ImporteTotal>
<EncadenamientoRegistroAnterior NS3:id="8">
<IDEmisorFacturaRegistroAnterior NS4:nil="true"/>
<NumSerieFacturaRegistroAnterior NS4:type="NS1:string"></NumSerieFacturaRegistroAnterior>
<FechaExpedicionFacturaRegistroAnterior NS4:type="NS1:string"></FechaExpedicionFacturaRegistroAnterior>
<HuellaRegistroAnterior NS4:type="NS1:string"></HuellaRegistroAnterior>
</EncadenamientoRegistroAnterior>
<SistemaInformatico NS3:id="9">
<NombreRazon NS4:type="NS1:string"></NombreRazon>
<NIF NS4:type="NS1:string"></NIF>
<IDOtro NS3:id="10">
<IDType NS4:type="NS2:PersonaFisicaJuridicaIDTypeType">02</IDType>
<ID NS4:type="NS1:string"></ID>
</IDOtro>
<NombreSistemaInformatico NS4:type="NS1:string"></NombreSistemaInformatico>
<IdSistemaInformatico NS4:type="NS1:string"></IdSistemaInformatico>
<Version NS4:type="NS1:string"></Version>
<NumeroInstalacion NS4:type="NS1:string"></NumeroInstalacion>
<TipoUsoPosibleSoloVerifactu NS4:type="NS2:SiNoType">S</TipoUsoPosibleSoloVerifactu>
<TipoUsoPosibleOtros NS4:type="NS2:SiNoType">N</TipoUsoPosibleOtros>
<TipoUsoPosibleMultiOT NS4:type="NS2:SiNoType">N</TipoUsoPosibleMultiOT>
<NumeroOTAlta NS4:type="NS1:string">1</NumeroOTAlta>
</SistemaInformatico>
<FechaGenRegistro NS4:type="NS1:string"></FechaGenRegistro>
<HoraGenRegistro NS4:type="NS1:string"></HoraGenRegistro>
<HusoHorarioGenRegistro NS4:type="NS2:HusoHorarioGenRegistroType">02</HusoHorarioGenRegistro>
<NumRegistroAcuerdoFacturacion NS4:type="NS1:string"></NumRegistroAcuerdoFacturacion>
<IdAcuerdoSistemaInformatico NS4:type="NS1:string"></IdAcuerdoSistemaInformatico>
</RegistroFacturacionType>
</RegistroFacturacion>

Y si pudiesemos ver el contenido del archivo Ur_user para saber como interviene y la estructura de las tablas que intervienen en el procedimiento, esto sería muy fácil trasladar a otros sistemas, vamos que, esto sería la mama de Tarzán para empezar. Esas estructuras para poder interpretar al 100% el procedimiento. ¡Ojo! es una sugerencia personal, ya que me ayudaría mucho, es decir, ciento por ciento.

Delphier 05-03-2024 22:28:42

No hay nada relevante en Ur_user , simplemente es el form inicial de la aplicación que usé como comodín para crear el TXMLDocument.Create , ya que TXMLDocument da errores si lo creas con nil TXMLDocument.Create(nil) = Errores , Otra solución es usar Application , así funciona y no necesitas un Form ni crear un THackForm.


Añades Vcl.Forms en el uses y los creas XML := TXMLDocument.Create(Application);

Código Delphi [-]

 Showmessage('// Extraemos XML');

  var ARootNode,newNode : IXMLNode;
  var RefId,Swdsl : String;
  var XML : TXMLDocument;
  XML := TXMLDocument.Create(Application);

  XML.Active := True;
  XML.Version:='1.0';
  XML.Encoding:='utf-8';


  ARootNode := XML.CreateNode('RegistroFacturacion');

  var MOPToSoapDomConvert : TOPtoSOAPDomConvert;
  MOPToSoapDomConvert := TOPtoSOAPDomConvert.Create(Application);

  MOPToSoapDomConvert.Encoding := 'utf-8';


En cuanto a las bases de datos , la llamada a la función GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;

TablaMaestra en mi caso el el Numero de Tabla de facturas , yo tengo varias FacturasSimplificadas, Facturas ordinarias, facturas de canje, facturas recapitulativas y IdDocumento es el identificador de la factura que quiero generar.


DTDesgloseIvas , es la tabla donde guardo el detalle de los Ivas de las facturas.

DTRectificadas es una tabla donde guardo el detalle de las Facturas que Rectifica cada factura si es rectificativa o sustitutiva

No hay más en este caso.



Saludos

Neftali [Germán.Estévez] 06-03-2024 08:22:52

Cita:

Empezado por Delphier (Mensaje 554760)
...aquí va mi primer ptototipo de unit para verifactu , con el código para generar un RegistroFacturacion de una factura y extraer el XML , por si le sirve a alguien para algo.

Gracias.
Añado el link al segundo mensaje del hilo.

newtron 06-03-2024 10:09:09

Cita:

Empezado por Delphier (Mensaje 554760)
Pues lo dicho , aquí va mi primer ptototipo de unit para verifactu , con el código para generar un RegistroFacturacion de una factura y extraer el XML , por si le sirve a alguien para algo.
Evidentemente los campos y als tablas son los míos y no va a funcionar directamente, pero el esqueleto del registrofafcturacion de Alta está. :)

Código Delphi [-]
...Código...
https://www.clubdelphi.com/foros/showpost.php?p=554760&postcount=1427

Luego el código en bruto para recogerlo:

Código Delphi [-]
...Código...
https://www.clubdelphi.com/foros/showpost.php?p=554760&postcount=1427

Gracias compañero.

Delphier 06-03-2024 10:44:33

Una reflexión
 
He leído en varios posts , que hay gente, que me ha parecido entender, que tiene la idea de no guardar los Registros de Facturación o los Envíos en base a que la normativa parece que no obliga a guardar esos datos si los envías.

La reflexión es la siguiente:

Seguro que es buena idea relacionarte con la AEAT sin guardar registro de todo lo que envías y las respuestas que recibes?

Yo personalmente voy a guardar TODO , independientemente de si el usuario quiere enviar o no , me parece mala idea no tener registros de todo , teniendo en cuenta que la AEAT puede pedir explicaciones i/o responsabilidades al desarrollador del software, si hubiera que entrar en discusiones con la AEAT o con el Usuario de si se ha enviado o no , de si se ha enviado mal, etc....

Creo que es mejor Registrarlo todo en el software para poder tener defensa y razones en caso de discrepancias , además de poder controlar , sobre todo al principio , de que todo se registra correctamente y no hay bugs.


Dicho queda.
Saludos

Delphier 06-03-2024 13:01:20

Cita:

Empezado por Delphier (Mensaje 554760)
Pues lo dicho , aquí va mi primer ptototipo de unit para verifactu , con el código para generar un RegistroFacturacion de una factura y extraer el XML , por si le sirve a alguien para algo.
Evidentemente los campos y als tablas son los míos y no va a funcionar directamente, pero el esqueleto del registrofafcturacion de Alta está. :)


Código Delphi [-]
unit UVerifactu;

interface

Uses

System.SysUtils,
Xml.xmldom,
Xml.XMLIntf,
Xml.XMLDoc,
Data.Win.ADODB,
System.DateUtils,
Vcl.Dialogs,
Udatam, // Use interno propio
System.hash,
System.StrUtils,
GesAdoDataset, // Use interno propio
SistemaFacturacionSOAPv12,
Soap.InvokeRegistry,
Soap.OPConvert,
Soap.SOAPDomConv,
Soap.OPToSOAPDomConv;

function Trimestre(Dia:TDate):integer;
function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
function TipoCalificacionOperacion : CalificacionOperacionType;
function TipoOperacionExenta : OperacionExentaType;

function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);


function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;


implementation

Uses Ur_user; // Use interno propio

function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;
Begin

// NIF (RegistroFactura/RegistroAlta/IDFactura/IDEmisorFactura/NIF)
// NumserieFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/NumSerieFacturaEmisor)
// FechaExpedicionFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/FechaExpedicionFacturaEmisor)
// TipoRegistroSIF (RegistroFactura/RegistroAlta/TipoRegistroSIF)
// TipoFactura (RegistroFactura/RegistroAlta/TipoFactura)
// CuotaTotal (RegistroFactura/RegistroAlta/CuotaTotal)
// ImporteTotal (RegistroFactura/RegistroAlta/ImporteTotal)
// HuellaRegistroAnterior (RegistroFactura/RegistroAlta/EncadenamientoRegistroAnterior/HuellaRegistroAnterior)
// FechaHoraHusoGenRegistro (RegistroFactura/RegistroAlta/FechaHoraHusoGenRegistro)

// formato fECHAS verifactu (dd-mm-yyyy)

 // Ejemplo cadena
 {
 CadenaVerifactu :=
 'BXXXXXXXXXX'+
 'F1-01-150'+
 '27-02-2024'+
 'VERIFACTU'+ // ???
 'F1'+
 '1000'+
 '1210'+
 '27-02-2024 11:19:00';
  }

 Result := THashSHA2.GetHashString(CadenaVerifactu,THashSHA2.TSHA2Version.SHA256);


End;



function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
var NombreTabla,NombreVista,IdFactura : String;
var DTFactura,DTDesgloseIvas : TGesAdoDataset;
begin



  // Buscamos pro tabla
  NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
  NombreVista := 'Vista'+NombreTabla;


  // Vamos a Buscar la Factura
  DTFactura      := f_crear_dataset(Conexion,DTFactura,'DTFactura','');
  DTDesgloseIvas := f_crear_dataset(Conexion,DTDesgloseIvas,'DTDesgloseIvas','');

  DTFactura.TableName := NombreTabla;
  DTFactura.VistaName := NombreVista;



  DTFactura.CommandText := 'Select * From '+NombreVista+' where Identificador = :Identificador';
  f_valor_parametro_tabla(DTFactura,'Identificador',IdDocumento);
  f_open_adodataset(DTFactura,ltReadOnly);

  DTDesgloseIvas.CommandText := 'Select * From DocumentosDesgloseIvas where IdDocumento = :Identificador';
  f_valor_parametro_tabla(DTDesgloseIvas,'Identificador',IdDocumento);
  f_open_adodataset(DTDesgloseIvas,ltReadOnly);


  IdFactura := DTFactura.FieldByName('Identificador').AsString;

  ///EsPrimera factura del ejercicio?

  //vamos vamos


  // Factura ejemplo

  var Factura :FacturasEmitidasType;
  Factura := FacturasEmitidasType.Create;

  Factura.RegistroFacturacion := RegistroFacturacionType.Create;
  Factura.DatosControl  := DatosControlType.Create;



  //IdFactura
  Factura.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;

  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF   := Datam.TBEmpresa.FieldByName('NIF').AsString;
  Factura.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := DTFactura.FieldByName('ReferenciaDocumento').AsString;
  Factura.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
  [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

  Factura.RegistroFacturacion.NombreRazonEmisor := Datam.TBEmpresa.FieldByName('C_EMPRESA').AsString;
  Factura.RegistroFacturacion.TipoRegistroSIF   := TipoRegistroSIFType.S0; // averiguar cuando usar //S0  Alta inicial del registro de facturación en el SIF ,  
//S1  Alta sustitutiva del registro de facturación en el SIF,  
//S2  Anulación inicial del registro de facturación en el SIF,  
//S3  Anulación sustitutiva del registro de facturación en el SIF
  Factura.RegistroFacturacion.TipoFactura       := TipoFacturaVerifactu(DTFactura);
  if Length(Trim(DTFactura.FieldByName('CorrectionMethod1').AsString)) > 0 then
  Factura.RegistroFacturacion.TipoRectificativa := TipoRectificativaVerifactu(DTFactura.FieldByName('CorrectionMethod1').AsString);


    // Rectificads por direfencias  "Factura.RegistroFacturacion.FacturasRectificadas"
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.I then
    Begin
      AgregarRelacionRectificadasPorDiferencias(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


    // por sustitucion
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.S then
    Begin
      AgregarRelacionRectificadasPorSustitucion(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


  Factura.RegistroFacturacion.FechaOperacion := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)
  Factura.RegistroFacturacion.DescripcionOperacion := 'Venta';
  Factura.RegistroFacturacion.FacturaSimplificadaArticulos7_2_7_3 := SimplificadaCualificadaType.N; // Factura simplificada Articulo 7,2 Y 7,3 RD 1619/2012. 
//Si no se informa este campo se entenderá que tiene valor  “N , si l afacutra simplificada tiene nif i datos
  Factura.RegistroFacturacion.FacturaSinIdentifDestinatarioArticulo6_1_d := CompletaSinDestinatarioType.N; //si es simplificada N ordinaria S , por aclarar
  Factura.RegistroFacturacion.Macrodato := MacrodatoType.N; // S  Sí - N  No


  // Tervero No aplicamos ->
  // Factura.RegistroFacturacion.EmitidaPorTercerosODestinatario := ''; //TercerosODestinatarioType.D;
  //   Factura.RegistroFacturacion.Tercero

     { el ejemplo
    // Detalle
    var detalle := DetalleType.Create;
    detalle.CuotaRepercutida := '100';
    detalle.TipoImpositivo := '21';
    SetLength(arrayDetallesDesglose, 1);
    arrayDetallesDesglose[0] := detalle;



    // desglose
    var desglose: DesgloseType := DesgloseType.Create();
    SetLength(Desglose, 1);
    Desglose[0] := detalle;
    fact.RegistroFacturacion.Desglose := Desglose;
    }


  //Factura.RegistroFacturacion.Destinatarios := En simplificadas ?????

  // Destinatario
  var Destinatario := PersonaFisicaJuridicaType.Create;
  Destinatario.NombreRazon := DTFactura.FieldByName('NOMB').AsString;
  Destinatario.NIF         := DTFactura.FieldByName('NIF').AsString;

  Destinatario.IDOtro := IDOtroType.Create;
  //Destinatario.IDOtro.CodigoPais := '';

  //PersonaFisicaJuridicaIDTypeType ->
  //02  NIF-IVA
  //03  Pasaporte
  //04  Documento oficial de identificación expedido por el país o territorio de residencia
  //05  Certificado de residencia
  //06  Otro documento probatorio
  //07  No censado

  Destinatario.IDOtro.IdType := PersonaFisicaJuridicaIDTypeType._02;
  Destinatario.IDOtro.ID     := DTFactura.FieldByName('NIF').AsString;

  // Los destinatarios , la lista
  var ListaDestinatarios : Destinatarios := Destinatarios.Create();
  SetLength(ListaDestinatarios, 1);
  ListaDestinatarios[0] := Destinatario;
  Factura.RegistroFacturacion.Destinatarios := ListaDestinatarios;




  Factura.RegistroFacturacion.Cupon := CuponType.N;


//vamos por aqui




      // Desglose de IVAS
      var ListaDesglose : DesgloseType := DesgloseType.Create();
      var Orden := 0;
      while not DTDesgloseIvas.Eof do
      Begin

          var DetalleDesglose := DetalleType.Create;;

          DetalleDesglose.ClaveRegimen :=
          ClaveRegimenVerifactu(DTFactura.Connection,DTFactura.FieldByName('RegimenIva').AsInteger); //'L8';

          DetalleDesglose.CalificacionOperacion := TipoCalificacionOperacion; //L9

          // Si es exenta , motivo
          if (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N1)
          or (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N2) then
          DetalleDesglose.OperacionExenta := TipoOperacionExenta; //L10

          DetalleDesglose.TipoImpositivo := FormatFloat('0.00',DTDesgloseIvas.FieldByName('IVA').AsFloat);
          DetalleDesglose.BaseImponibleOimporteNoSujeto := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIMP').AsFloat);;
          DetalleDesglose.BaseImponibleACoste := '0.00';
          DetalleDesglose.CuotaRepercutida := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIVA').AsFloat);
          DetalleDesglose.TipoRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('REC').AsFloat);
          DetalleDesglose.CuotaRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASREC').AsFloat);

       DTDesgloseIvas.Next;

           // desglose

        SetLength(ListaDesglose, Orden+1);
        ListaDesglose[Orden] := DetalleDesglose ;


       Orden := Orden + 1;

      end;

      Factura.RegistroFacturacion.Desglose := ListaDesglose;


    Factura.RegistroFacturacion.ImporteTotal := FormatFloat('0.00',DTFactura.FieldByName('TOTA').AsCurrency);

    // EncadenamientoFacturaAnterior
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior := EncadenamientoFacturaAnteriorType.Create;
    //Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.IDEmisorFacturaRegistroAnterior := '' ;
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.NumSerieFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.FechaExpedicionFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.HuellaRegistroAnterior := '';



    Factura.RegistroFacturacion.SistemaInformatico := SistemaInformaticoType.Create;
    Factura.RegistroFacturacion.SistemaInformatico.NombreRazon := '';
    Factura.RegistroFacturacion.SistemaInformatico.NIF         := '';

    Factura.RegistroFacturacion.SistemaInformatico.IDOtro := IDOtroType.Create;
    //Factura.RegistroFacturacion.SistemaInformatico.IDOtro.CodigoPais
    Factura.RegistroFacturacion.SistemaInformatico.IDOtro.IDType := PersonaFisicaJuridicaIDTypeType._02;

    Factura.RegistroFacturacion.SistemaInformatico.NombreSistemaInformatico := '';
    Factura.RegistroFacturacion.SistemaInformatico.IdSistemaInformatico     := '';
    Factura.RegistroFacturacion.SistemaInformatico.Version                  := '';
    Factura.RegistroFacturacion.SistemaInformatico.NumeroInstalacion        := '';
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleSoloVerifactu := SiNoType.S;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleOtros         := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleMultiOT       := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.NumeroOTAlta := '1';


    Factura.RegistroFacturacion.FechaGenRegistro := '';
    Factura.RegistroFacturacion.HoraGenRegistro  := '';
    Factura.RegistroFacturacion.HusoHorarioGenRegistro := HusoHorarioGenRegistroType._02; //L13 provisional
    Factura.RegistroFacturacion.NumRegistroAcuerdoFacturacion := '';
    Factura.RegistroFacturacion.IdAcuerdoSistemaInformatico   := '';


  DTFactura.DisposeOf;

  Showmessage('// Extraemos XML');

  var ARootNode,newNode : IXMLNode;
  var RefId,Swdsl : String;
  var XML : TXMLDocument;
  XML := TXMLDocument.Create(Fr_user);

  XML.Active := True;
  XML.Version:='1.0';
  XML.Encoding:='utf-8';


  ARootNode := XML.CreateNode('RegistroFacturacion');

  var MOPToSoapDomConvert : TOPtoSOAPDomConvert;
  MOPToSoapDomConvert := TOPtoSOAPDomConvert.Create(Fr_user);

  MOPToSoapDomConvert.Encoding := 'utf-8';

  MOPToSoapDomConvert.Options :=
  [TSOAPConvertOption.soSendMultiRefObj,
  TSOAPConvertOption.soTryAllSchema,
  TSOAPConvertOption.soRootRefNodesToBody,
  TSOAPConvertOption.soCacheMimeResponse,
  TSOAPConvertOption.soUTF8EncodeXML,
  TSOAPConvertOption.soSOAP12];

  try

   Swdsl := 'no puedo poner enlaces 2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl';

   try
   newNode := Factura.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, MOPToSoapDomConvert, 'RegistroFacturacionType',
   Swdsl,'T',[ocoDontPrefixNode,ocoDontPutTypeAttr], RefId  ); //ocoDontPrefixNode

   XML.DocumentElement := ARootNode;
   XML.XML.SaveToFile('RegistroFacturacion.xml',TEncoding.UTF8);
   XML.Active := False;

   Except
   On E : Exception do
   Begin
    Showmessage(E.Message);
    XML.DocumentElement := ARootNode;
    XML.XML.SaveToFile('RegistroFacturacionError.xml',TEncoding.UTF8);
    XML.Active := False;
   End;

   end;

  finally
    XML.DisposeOf;
    MOPToSoapDomConvert.disposeOf;
    Factura.DisposeOf;

  end;


End;



function Trimestre(Dia:TDate):integer;
var mes,Trimestre : Integer;
begin

  Mes := monthof(dia);
  case mes of
  1 : Trimestre := 1;
  2 : Trimestre := 1;
  3 : Trimestre := 1;
  4 : Trimestre := 2;
  5 : Trimestre := 2;
  6 : Trimestre := 2;
  7 : Trimestre := 3;
  8 : Trimestre := 3;
  9 : Trimestre := 3;
  10: Trimestre := 4;
  11: Trimestre := 4;
  12: Trimestre := 4;
  end;


 result:= Trimestre;

end;

function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
var TipoVerifactu : ClaveTipoFacturaType;
var TablaMaestra : Integer;
Begin


  //F1  Factura (art. 6, 7.2 y 7.3 del RD 1619/2012)   // Factura ordinadia normal
  //F2  Factura Simplificada y Facturas sin identificación del destinatario art. 6.1.d) RD 1619/2012
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?

  //R1  Factura Rectificativa (Error fundado en derecho y Art. 80 Uno Dos y Seis LIVA) // Resolucion Judicial
  //R2  Factura Rectificativa (Art. 80.3)   // Impago
  //R3  Factura Rectificativa (Art. 80.4)   // Impago
  //R4  Factura Rectificativa (Resto) // Lo normal , por error
  //R5  Factura Rectificativa en facturas simplificadas

  // A ver que de que tabla es la factura
  TablaMaestra :=
  f_devolver_valor_campo(0,DTFactura.Connection,'N','Tablas','Nombre','Codigo',DTFactura.TableName);

  // Ordinarias
  if TablaMaestra = 24 then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F1
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;

  // Simplificadas
  if TablaMaestra = 3 then
  Begin

    // SImplificada ordinaria
    if DTFactura.FieldByName('Tipo').AsInteger = 1 then
    TipoVerifactu := ClaveTipoFacturaType.F2;

    // Es rectificativa //R5  Factura Rectificativa en facturas simplificadas
    if DTFactura.FieldByName('Tipo').AsInteger = 6 then
    TipoVerifactu := ClaveTipoFacturaType.R5;

  End;



  //Factura de canje de simplificads y recapitulativas
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?
  if (TablaMaestra = 252) or (TablaMaestra = 248) then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F3
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;




  Result := TipoVerifactu;

End;


function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
var TipoVerifactu : ClaveTipoRectificativaType;
Begin

  //S  Por sustitución
  //I  Por diferencias

  // Si es rectificativa

    //Sustitucion
    if CorrectionMethod = '01' then TipoVerifactu := ClaveTipoRectificativaType.S;

    //Diferencias
    if CorrectionMethod = '02' then TipoVerifactu := ClaveTipoRectificativaType.I;


  Result := TipoVerifactu;

End;


procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

   //El fichero de lista de rectificadas por diferecnias
   DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

   try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;

   DTRectificadas.Connection  :=  Conexion;
   DTRectificadas.TableName   := 'FacturasRectificadas';
   DTRectificadas.CommandText :=
   'Select * from '+NombreVista+' where Identificador in '+
   '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

   f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
   f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

   f_open_adodataset(DTRectificadas,ltReadOnly);


   Orden := 0;
   BaseRectificadas    := 0;
   IvaRectificadas     := 0;
   RecargoRectificadas := 0;

   var ListaRectificadas : FacturasRectificadas := FacturasRectificadas.Create();
   while not DTRectificadas.Eof do
   Begin

    BaseRectificadas    := BaseRectificadas    + DTRectificadas.FieldByName('BASIMP').AsCurrency;
    IvaRectificadas     := IvaRectificadas     + DTRectificadas.FieldByName('BASIVA').AsCurrency;
    recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

    // Añadimos la factura recitificada por diferencias
    var FacturaRectificada := IDFacturaARType.Create;
    FacturaRectificada.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
    FacturaRectificada.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
 [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

    SetLength(ListaRectificadas, Orden+1);
    ListaRectificadas[Orden] := FacturaRectificada;

    Orden := Orden + 1;

    DTRectificadas.Next;
   End;
   f_close_adodataset(DTRectificadas);
   Factura.RegistroFacturacion.FacturasRectificadas := ListaRectificadas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);

  finally
   DTRectificadas.DisposeOf;
  end;

end;


procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

  //El fichero de lista de rectificadas por Sustitucion
  DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

  try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;


    //El fichero de lista de rectificadas por Sustitucion
    DTRectificadas.Connection  :=  Conexion;
    DTRectificadas.TableName   := 'FacturasRectificadas';
    DTRectificadas.CommandText :=
    'Select * from '+NombreVista+' where Identificador in '+
    '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

    f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
    f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

    f_open_adodataset(DTRectificadas,ltReadOnly);


    // Cada factura Sustituida
    Orden := 0;
    BaseRectificadas    := 0;
    IvaRectificadas     := 0;
    RecargoRectificadas := 0;

    var ListaFacturasSustituidas : FacturasSustituidas := FacturasSustituidas.Create();
    while not DTRectificadas.Eof do
    Begin

     BaseRectificadas    := BaseRectificadas + DTRectificadas.FieldByName('BASIMP').AsCurrency;
     IvaRectificadas     := IvaRectificadas + DTRectificadas.FieldByName('BASIVA').AsCurrency;
     recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

     // Añadimos la factura recitificada sustitutiva
     var FacturaSustitutiva := IDFacturaARType.Create;
     FacturaSustitutiva.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
     FacturaSustitutiva.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)


     SetLength(ListaFacturasSustituidas, Orden+1);
     ListaFacturasSustituidas[Orden] := FacturaSustitutiva;


     Orden := Orden + 1;

     DTRectificadas.Next;

    End;
    f_close_adodataset(DTRectificadas);
    Factura.RegistroFacturacion.FacturasSustituidas := ListaFacturasSustituidas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);


  finally
   DTRectificadas.DisposeOf;
  end;



end;


function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
var CodigoVerifactu : String;
var TypeRegimen : IdOperacionesTrascendenciaTributariaType;
Begin

  //'L8';

// 01  Operación de régimen general.
// 02  Exportación.
// 03  Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.
// 04  Régimen especial del oro de inversión.
// 05  Régimen especial de las agencias de viajes.
// 06  Régimen especial grupo de entidades en IVA (Nivel Avanzado)
// 07  Régimen especial del criterio de caja.
// 08  Operaciones sujetas al IPSI  / IGIC (Impuesto sobre la Producción, los Servicios y la Importación  / Impuesto General Indirecto Canario).
// 09  Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012)
// 10  Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, 
// asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.
// 11  Operaciones de arrendamiento de local de negocio.
// 12  Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.
// 13  Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.
// 14  Régimen simplificado
// 15  Recargo de equivalencia.
// 16  Régimen especial de la agricultura


  // Falta ponde ren la carga inicial
  CodigoVerifactu := f_devolver_valor_campo(0,Conexion,'C','RegimenesIVA','Codigo','CodVerifactu',RegimenIva);


   Case IndexStr(CodigoVerifactu, ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16']) of
   0  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   1  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._02;
   2  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._03;
   3  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._04;
   4  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._05;
   5  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._06;
   6  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._07;
   7  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._08;
   8  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._09;
   9  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._10;
   10 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._11;
   11 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._12;
   12 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._13;
   13 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._14;
   14 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._15;
   15 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._16;
   else
   Begin
     TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   End;
  end;

  Result := TypeRegimen;


End;


function TipoCalificacionOperacion : CalificacionOperacionType;
Begin

// L9

// S1  Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.
// S2  Operación Sujeta y No exenta - Con Inversión del sujeto pasivo
// N1  Operación No Sujeta artículo 7, 14, otros.
// N2  Operación No Sujeta por Reglas de localización.

  Result := CalificacionOperacionType.S1;

End;


function TipoOperacionExenta : OperacionExentaType;
Begin

  //L10 - solo si exenta de IVA

// E0  Exenta sin especificar causa
// E1  Exenta por el artículo 20
// E2  Exenta por el artículo 21
// E3  Exenta por el artículo 22
// E4  Exenta por los artículos 23 y 24
// E5  Exenta por el artículo 25
// E6  Exenta por otros

  result := OperacionExentaType.E0;

End;


end.


Luego el código en bruto para recogerlo:

Código Delphi [-]
  XMLDocument1.XML.LoadFromFile('RegistroFacturacion.xml');
  XMLDocument1.Active := True;

  var fact2:FacturasEmitidasType;
  fact2 := FacturasEmitidasType.Create;
  fact2.RegistroFacturacion := RegistroFacturacionType.Create;

  ARootNode := XMLDocument1.DocumentElement;

  var MySOAPDomConv: TSOAPDomConv;
  MySOAPDomConv:= TSOAPDomConv.Create(Self);

  fact2.RegistroFacturacion.SOAPToObject(ARootNode.ChildNodes[0] , ARootNode.ChildNodes[0] , MySOAPDomConv);

  Showmessage('2 '+
  fact2.RegistroFacturacion.DescripcionOperacion+' '+
  fact2.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor);



  fact2.DisposeOf;
  fact2.RegistroFacturacion.DisposeOf;



Si se quiere el XML más "limpio" , solo hay que jugar con las opciones de TOPToSoapDomConvert , por ejemplo:

Código Delphi [-]
 MOPToSoapDomConvert.Options :=
  [
  TSOAPConvertOption.soXXXXHdr,
  TSOAPConvertOption.soDontSendEmptyNodes,
  TSOAPConvertOption.soUTF8InHeader,
  TSOAPConvertOption.soSendUntyped,
  TSOAPConvertOption.soSendMultiRefObj,
  TSOAPConvertOption.soTryAllSchema,
  TSOAPConvertOption.soRootRefNodesToBody,
  TSOAPConvertOption.soCacheMimeResponse,
  TSOAPConvertOption.soUTF8EncodeXML,
  TSOAPConvertOption.soSOAP12];

espinete 07-03-2024 14:07:38

Gran aporte, Delphier!

Yo el año pasado empecé a hacer algo, pero lo dejé porque veía que la cosa no avanzaba. De hecho la web de la AEAT sobre VeriFactu estuvo casi un año en la versión 0.1.

Sin duda cuando lo retome en breve, tu post será de gran ayuda.

Gracias a la experiencia que hemos cogido todos con TicketBAI, no creo que nos encontremos con problemas serios, salvo las dudas de siempre, que seguimos teniendo con TicketBAI 2 años después: fechas de la factura, rectificativas, anular/borrar/cancelar/modificar facturas, etc.
Pero a nivel técnico, todo debería estar ya en el foro.


Cita:

Empezado por Delphier (Mensaje 554760)
Pues lo dicho , aquí va mi primer ptototipo de unit para verifactu , con el código para generar un RegistroFacturacion de una factura y extraer el XML , por si le sirve a alguien para algo.
Evidentemente los campos y als tablas son los míos y no va a funcionar directamente, pero el esqueleto del registrofafcturacion de Alta está. :)


Código Delphi [-]
unit UVerifactu;

interface

Uses

System.SysUtils,
Xml.xmldom,
Xml.XMLIntf,
Xml.XMLDoc,
Data.Win.ADODB,
System.DateUtils,
Vcl.Dialogs,
Udatam, // Use interno propio
System.hash,
System.StrUtils,
GesAdoDataset, // Use interno propio
SistemaFacturacionSOAPv12,
Soap.InvokeRegistry,
Soap.OPConvert,
Soap.SOAPDomConv,
Soap.OPToSOAPDomConv;

function Trimestre(Dia:TDate):integer;
function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
function TipoCalificacionOperacion : CalificacionOperacionType;
function TipoOperacionExenta : OperacionExentaType;

function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);


function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;


implementation

Uses Ur_user; // Use interno propio

function GenerarHashRegistroVerifactu(CadenaVerifactu : String) : String;
Begin

// NIF (RegistroFactura/RegistroAlta/IDFactura/IDEmisorFactura/NIF)
// NumserieFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/NumSerieFacturaEmisor)
// FechaExpedicionFacturaEmisor (RegistroFactura/RegistroAlta/IDFactura/FechaExpedicionFacturaEmisor)
// TipoRegistroSIF (RegistroFactura/RegistroAlta/TipoRegistroSIF)
// TipoFactura (RegistroFactura/RegistroAlta/TipoFactura)
// CuotaTotal (RegistroFactura/RegistroAlta/CuotaTotal)
// ImporteTotal (RegistroFactura/RegistroAlta/ImporteTotal)
// HuellaRegistroAnterior (RegistroFactura/RegistroAlta/EncadenamientoRegistroAnterior/HuellaRegistroAnterior)
// FechaHoraHusoGenRegistro (RegistroFactura/RegistroAlta/FechaHoraHusoGenRegistro)

// formato fECHAS verifactu (dd-mm-yyyy)

 // Ejemplo cadena
 {
 CadenaVerifactu :=
 'BXXXXXXXXXX'+
 'F1-01-150'+
 '27-02-2024'+
 'VERIFACTU'+ // ???
 'F1'+
 '1000'+
 '1210'+
 '27-02-2024 11:19:00';
  }

 Result := THashSHA2.GetHashString(CadenaVerifactu,THashSHA2.TSHA2Version.SHA256);


End;



function GenerarRegistroFacturacion_AltaVerifactu(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdDocumento : String) : String;
var NombreTabla,NombreVista,IdFactura : String;
var DTFactura,DTDesgloseIvas : TGesAdoDataset;
begin



  // Buscamos pro tabla
  NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
  NombreVista := 'Vista'+NombreTabla;


  // Vamos a Buscar la Factura
  DTFactura      := f_crear_dataset(Conexion,DTFactura,'DTFactura','');
  DTDesgloseIvas := f_crear_dataset(Conexion,DTDesgloseIvas,'DTDesgloseIvas','');

  DTFactura.TableName := NombreTabla;
  DTFactura.VistaName := NombreVista;



  DTFactura.CommandText := 'Select * From '+NombreVista+' where Identificador = :Identificador';
  f_valor_parametro_tabla(DTFactura,'Identificador',IdDocumento);
  f_open_adodataset(DTFactura,ltReadOnly);

  DTDesgloseIvas.CommandText := 'Select * From DocumentosDesgloseIvas where IdDocumento = :Identificador';
  f_valor_parametro_tabla(DTDesgloseIvas,'Identificador',IdDocumento);
  f_open_adodataset(DTDesgloseIvas,ltReadOnly);


  IdFactura := DTFactura.FieldByName('Identificador').AsString;

  ///EsPrimera factura del ejercicio?

  //vamos vamos


  // Factura ejemplo

  var Factura :FacturasEmitidasType;
  Factura := FacturasEmitidasType.Create;

  Factura.RegistroFacturacion := RegistroFacturacionType.Create;
  Factura.DatosControl  := DatosControlType.Create;



  //IdFactura
  Factura.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;

  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  Factura.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF   := Datam.TBEmpresa.FieldByName('NIF').AsString;
  Factura.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := DTFactura.FieldByName('ReferenciaDocumento').AsString;
  Factura.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
  [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

  Factura.RegistroFacturacion.NombreRazonEmisor := Datam.TBEmpresa.FieldByName('C_EMPRESA').AsString;
  Factura.RegistroFacturacion.TipoRegistroSIF   := TipoRegistroSIFType.S0; // averiguar cuando usar //S0  Alta inicial del registro de facturación en el SIF ,  
//S1  Alta sustitutiva del registro de facturación en el SIF,  
//S2  Anulación inicial del registro de facturación en el SIF,  
//S3  Anulación sustitutiva del registro de facturación en el SIF
  Factura.RegistroFacturacion.TipoFactura       := TipoFacturaVerifactu(DTFactura);
  if Length(Trim(DTFactura.FieldByName('CorrectionMethod1').AsString)) > 0 then
  Factura.RegistroFacturacion.TipoRectificativa := TipoRectificativaVerifactu(DTFactura.FieldByName('CorrectionMethod1').AsString);


    // Rectificads por direfencias  "Factura.RegistroFacturacion.FacturasRectificadas"
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.I then
    Begin
      AgregarRelacionRectificadasPorDiferencias(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


    // por sustitucion
    if Factura.RegistroFacturacion.TipoRectificativa = ClaveTipoRectificativaType.S then
    Begin
      AgregarRelacionRectificadasPorSustitucion(DTFactura.Connection,TablaMaestra,IdFactura,Factura);
    End;


  Factura.RegistroFacturacion.FechaOperacion := StringReplace(DTFactura.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)
  Factura.RegistroFacturacion.DescripcionOperacion := 'Venta';
  Factura.RegistroFacturacion.FacturaSimplificadaArticulos7_2_7_3 := SimplificadaCualificadaType.N; // Factura simplificada Articulo 7,2 Y 7,3 RD 1619/2012. 
//Si no se informa este campo se entenderá que tiene valor  “N , si l afacutra simplificada tiene nif i datos
  Factura.RegistroFacturacion.FacturaSinIdentifDestinatarioArticulo6_1_d := CompletaSinDestinatarioType.N; //si es simplificada N ordinaria S , por aclarar
  Factura.RegistroFacturacion.Macrodato := MacrodatoType.N; // S  Sí - N  No


  // Tervero No aplicamos ->
  // Factura.RegistroFacturacion.EmitidaPorTercerosODestinatario := ''; //TercerosODestinatarioType.D;
  //   Factura.RegistroFacturacion.Tercero

     { el ejemplo
    // Detalle
    var detalle := DetalleType.Create;
    detalle.CuotaRepercutida := '100';
    detalle.TipoImpositivo := '21';
    SetLength(arrayDetallesDesglose, 1);
    arrayDetallesDesglose[0] := detalle;



    // desglose
    var desglose: DesgloseType := DesgloseType.Create();
    SetLength(Desglose, 1);
    Desglose[0] := detalle;
    fact.RegistroFacturacion.Desglose := Desglose;
    }


  //Factura.RegistroFacturacion.Destinatarios := En simplificadas ?????

  // Destinatario
  var Destinatario := PersonaFisicaJuridicaType.Create;
  Destinatario.NombreRazon := DTFactura.FieldByName('NOMB').AsString;
  Destinatario.NIF         := DTFactura.FieldByName('NIF').AsString;

  Destinatario.IDOtro := IDOtroType.Create;
  //Destinatario.IDOtro.CodigoPais := '';

  //PersonaFisicaJuridicaIDTypeType ->
  //02  NIF-IVA
  //03  Pasaporte
  //04  Documento oficial de identificación expedido por el país o territorio de residencia
  //05  Certificado de residencia
  //06  Otro documento probatorio
  //07  No censado

  Destinatario.IDOtro.IdType := PersonaFisicaJuridicaIDTypeType._02;
  Destinatario.IDOtro.ID     := DTFactura.FieldByName('NIF').AsString;

  // Los destinatarios , la lista
  var ListaDestinatarios : Destinatarios := Destinatarios.Create();
  SetLength(ListaDestinatarios, 1);
  ListaDestinatarios[0] := Destinatario;
  Factura.RegistroFacturacion.Destinatarios := ListaDestinatarios;




  Factura.RegistroFacturacion.Cupon := CuponType.N;


//vamos por aqui




      // Desglose de IVAS
      var ListaDesglose : DesgloseType := DesgloseType.Create();
      var Orden := 0;
      while not DTDesgloseIvas.Eof do
      Begin

          var DetalleDesglose := DetalleType.Create;;

          DetalleDesglose.ClaveRegimen :=
          ClaveRegimenVerifactu(DTFactura.Connection,DTFactura.FieldByName('RegimenIva').AsInteger); //'L8';

          DetalleDesglose.CalificacionOperacion := TipoCalificacionOperacion; //L9

          // Si es exenta , motivo
          if (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N1)
          or (DetalleDesglose.CalificacionOperacion = CalificacionOperacionType.N2) then
          DetalleDesglose.OperacionExenta := TipoOperacionExenta; //L10

          DetalleDesglose.TipoImpositivo := FormatFloat('0.00',DTDesgloseIvas.FieldByName('IVA').AsFloat);
          DetalleDesglose.BaseImponibleOimporteNoSujeto := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIMP').AsFloat);;
          DetalleDesglose.BaseImponibleACoste := '0.00';
          DetalleDesglose.CuotaRepercutida := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASIVA').AsFloat);
          DetalleDesglose.TipoRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('REC').AsFloat);
          DetalleDesglose.CuotaRecargoEquivalencia := FormatFloat('0.00',DTDesgloseIvas.FieldByName('BASREC').AsFloat);

       DTDesgloseIvas.Next;

           // desglose

        SetLength(ListaDesglose, Orden+1);
        ListaDesglose[Orden] := DetalleDesglose ;


       Orden := Orden + 1;

      end;

      Factura.RegistroFacturacion.Desglose := ListaDesglose;


    Factura.RegistroFacturacion.ImporteTotal := FormatFloat('0.00',DTFactura.FieldByName('TOTA').AsCurrency);

    // EncadenamientoFacturaAnterior
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior := EncadenamientoFacturaAnteriorType.Create;
    //Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.IDEmisorFacturaRegistroAnterior := '' ;
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.NumSerieFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.FechaExpedicionFacturaRegistroAnterior := '';
    Factura.RegistroFacturacion.EncadenamientoRegistroAnterior.HuellaRegistroAnterior := '';



    Factura.RegistroFacturacion.SistemaInformatico := SistemaInformaticoType.Create;
    Factura.RegistroFacturacion.SistemaInformatico.NombreRazon := '';
    Factura.RegistroFacturacion.SistemaInformatico.NIF         := '';

    Factura.RegistroFacturacion.SistemaInformatico.IDOtro := IDOtroType.Create;
    //Factura.RegistroFacturacion.SistemaInformatico.IDOtro.CodigoPais
    Factura.RegistroFacturacion.SistemaInformatico.IDOtro.IDType := PersonaFisicaJuridicaIDTypeType._02;

    Factura.RegistroFacturacion.SistemaInformatico.NombreSistemaInformatico := '';
    Factura.RegistroFacturacion.SistemaInformatico.IdSistemaInformatico     := '';
    Factura.RegistroFacturacion.SistemaInformatico.Version                  := '';
    Factura.RegistroFacturacion.SistemaInformatico.NumeroInstalacion        := '';
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleSoloVerifactu := SiNoType.S;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleOtros         := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.TipoUsoPosibleMultiOT       := SiNoType.N;
    Factura.RegistroFacturacion.SistemaInformatico.NumeroOTAlta := '1';


    Factura.RegistroFacturacion.FechaGenRegistro := '';
    Factura.RegistroFacturacion.HoraGenRegistro  := '';
    Factura.RegistroFacturacion.HusoHorarioGenRegistro := HusoHorarioGenRegistroType._02; //L13 provisional
    Factura.RegistroFacturacion.NumRegistroAcuerdoFacturacion := '';
    Factura.RegistroFacturacion.IdAcuerdoSistemaInformatico   := '';


  DTFactura.DisposeOf;

  Showmessage('// Extraemos XML');

  var ARootNode,newNode : IXMLNode;
  var RefId,Swdsl : String;
  var XML : TXMLDocument;
  XML := TXMLDocument.Create(Fr_user);

  XML.Active := True;
  XML.Version:='1.0';
  XML.Encoding:='utf-8';


  ARootNode := XML.CreateNode('RegistroFacturacion');

  var MOPToSoapDomConvert : TOPtoSOAPDomConvert;
  MOPToSoapDomConvert := TOPtoSOAPDomConvert.Create(Fr_user);

  MOPToSoapDomConvert.Encoding := 'utf-8';

  MOPToSoapDomConvert.Options :=
  [TSOAPConvertOption.soSendMultiRefObj,
  TSOAPConvertOption.soTryAllSchema,
  TSOAPConvertOption.soRootRefNodesToBody,
  TSOAPConvertOption.soCacheMimeResponse,
  TSOAPConvertOption.soUTF8EncodeXML,
  TSOAPConvertOption.soSOAP12];

  try

   Swdsl := 'no puedo poner enlaces 2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl';

   try
   newNode := Factura.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, MOPToSoapDomConvert, 'RegistroFacturacionType',
   Swdsl,'T',[ocoDontPrefixNode,ocoDontPutTypeAttr], RefId  ); //ocoDontPrefixNode

   XML.DocumentElement := ARootNode;
   XML.XML.SaveToFile('RegistroFacturacion.xml',TEncoding.UTF8);
   XML.Active := False;

   Except
   On E : Exception do
   Begin
    Showmessage(E.Message);
    XML.DocumentElement := ARootNode;
    XML.XML.SaveToFile('RegistroFacturacionError.xml',TEncoding.UTF8);
    XML.Active := False;
   End;

   end;

  finally
    XML.DisposeOf;
    MOPToSoapDomConvert.disposeOf;
    Factura.DisposeOf;

  end;


End;



function Trimestre(Dia:TDate):integer;
var mes,Trimestre : Integer;
begin

  Mes := monthof(dia);
  case mes of
  1 : Trimestre := 1;
  2 : Trimestre := 1;
  3 : Trimestre := 1;
  4 : Trimestre := 2;
  5 : Trimestre := 2;
  6 : Trimestre := 2;
  7 : Trimestre := 3;
  8 : Trimestre := 3;
  9 : Trimestre := 3;
  10: Trimestre := 4;
  11: Trimestre := 4;
  12: Trimestre := 4;
  end;


 result:= Trimestre;

end;

function TipoFacturaVerifactu(DTFactura : TGesAdoDataset) : ClaveTipoFacturaType;
var TipoVerifactu : ClaveTipoFacturaType;
var TablaMaestra : Integer;
Begin


  //F1  Factura (art. 6, 7.2 y 7.3 del RD 1619/2012)   // Factura ordinadia normal
  //F2  Factura Simplificada y Facturas sin identificación del destinatario art. 6.1.d) RD 1619/2012
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?

  //R1  Factura Rectificativa (Error fundado en derecho y Art. 80 Uno Dos y Seis LIVA) // Resolucion Judicial
  //R2  Factura Rectificativa (Art. 80.3)   // Impago
  //R3  Factura Rectificativa (Art. 80.4)   // Impago
  //R4  Factura Rectificativa (Resto) // Lo normal , por error
  //R5  Factura Rectificativa en facturas simplificadas

  // A ver que de que tabla es la factura
  TablaMaestra :=
  f_devolver_valor_campo(0,DTFactura.Connection,'N','Tablas','Nombre','Codigo',DTFactura.TableName);

  // Ordinarias
  if TablaMaestra = 24 then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F1
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;

  // Simplificadas
  if TablaMaestra = 3 then
  Begin

    // SImplificada ordinaria
    if DTFactura.FieldByName('Tipo').AsInteger = 1 then
    TipoVerifactu := ClaveTipoFacturaType.F2;

    // Es rectificativa //R5  Factura Rectificativa en facturas simplificadas
    if DTFactura.FieldByName('Tipo').AsInteger = 6 then
    TipoVerifactu := ClaveTipoFacturaType.R5;

  End;



  //Factura de canje de simplificads y recapitulativas
  //F3  Factura emitida en sustitución de facturas simplificadas facturadas y declaradas // Canje i Recapitulativa?
  if (TablaMaestra = 252) or (TablaMaestra = 248) then
  Begin

    // Es rectificativa u Ordinaria
    if DTFactura.FieldByName('TipoRectificativo').AsInteger = 0 then
    TipoVerifactu := ClaveTipoFacturaType.F3
    else
    TipoVerifactu := ClaveTipoFacturaType.R4;

  End;




  Result := TipoVerifactu;

End;


function TipoRectificativaVerifactu(CorrectionMethod : String) : ClaveTipoRectificativaType;
var TipoVerifactu : ClaveTipoRectificativaType;
Begin

  //S  Por sustitución
  //I  Por diferencias

  // Si es rectificativa

    //Sustitucion
    if CorrectionMethod = '01' then TipoVerifactu := ClaveTipoRectificativaType.S;

    //Diferencias
    if CorrectionMethod = '02' then TipoVerifactu := ClaveTipoRectificativaType.I;


  Result := TipoVerifactu;

End;


procedure AgregarRelacionRectificadasPorDiferencias(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

   //El fichero de lista de rectificadas por diferecnias
   DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

   try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;

   DTRectificadas.Connection  :=  Conexion;
   DTRectificadas.TableName   := 'FacturasRectificadas';
   DTRectificadas.CommandText :=
   'Select * from '+NombreVista+' where Identificador in '+
   '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

   f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
   f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

   f_open_adodataset(DTRectificadas,ltReadOnly);


   Orden := 0;
   BaseRectificadas    := 0;
   IvaRectificadas     := 0;
   RecargoRectificadas := 0;

   var ListaRectificadas : FacturasRectificadas := FacturasRectificadas.Create();
   while not DTRectificadas.Eof do
   Begin

    BaseRectificadas    := BaseRectificadas    + DTRectificadas.FieldByName('BASIMP').AsCurrency;
    IvaRectificadas     := IvaRectificadas     + DTRectificadas.FieldByName('BASIVA').AsCurrency;
    recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

    // Añadimos la factura recitificada por diferencias
    var FacturaRectificada := IDFacturaARType.Create;
    FacturaRectificada.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
    FacturaRectificada.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
 [rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)

    SetLength(ListaRectificadas, Orden+1);
    ListaRectificadas[Orden] := FacturaRectificada;

    Orden := Orden + 1;

    DTRectificadas.Next;
   End;
   f_close_adodataset(DTRectificadas);
   Factura.RegistroFacturacion.FacturasRectificadas := ListaRectificadas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);

  finally
   DTRectificadas.DisposeOf;
  end;

end;


procedure AgregarRelacionRectificadasPorSustitucion(Conexion : TAdoConnection ; TablaMaestra : Integer ; IdFactura : String; Factura :FacturasEmitidasType);
var DTRectificadas : TGesAdoDataset;
var BaseRectificadas,IvaRectificadas,RecargoRectificadas : Currency;
var Orden : Integer;
var NombreTabla,NombreVista : String;
Begin

  //El fichero de lista de rectificadas por Sustitucion
  DTRectificadas := f_crear_dataset(Conexion,DTRectificadas,'DTRectificadas','');

  try

   // Buscamos pro tabla
   NombreTabla := f_devolver_valor_campo(0,Conexion,'C','Tablas','Codigo','Nombre',TablaMaestra);
   NombreVista := 'Vista'+NombreTabla;


    //El fichero de lista de rectificadas por Sustitucion
    DTRectificadas.Connection  :=  Conexion;
    DTRectificadas.TableName   := 'FacturasRectificadas';
    DTRectificadas.CommandText :=
    'Select * from '+NombreVista+' where Identificador in '+
    '(Select IdFacturaRectificada from FacturasRectificadas where (TablaFacturas = :TablaMaestra) and (IdFactura = :IdFactura)) ';

    f_valor_parametro_tabla(DTRectificadas,'TablaMaestra',TablaMaestra);
    f_valor_parametro_tabla(DTRectificadas,'IdFactura',IdFactura);

    f_open_adodataset(DTRectificadas,ltReadOnly);


    // Cada factura Sustituida
    Orden := 0;
    BaseRectificadas    := 0;
    IvaRectificadas     := 0;
    RecargoRectificadas := 0;

    var ListaFacturasSustituidas : FacturasSustituidas := FacturasSustituidas.Create();
    while not DTRectificadas.Eof do
    Begin

     BaseRectificadas    := BaseRectificadas + DTRectificadas.FieldByName('BASIMP').AsCurrency;
     IvaRectificadas     := IvaRectificadas + DTRectificadas.FieldByName('BASIVA').AsCurrency;
     recargoRectificadas := RecargoRectificadas + DTRectificadas.FieldByName('BASREC').AsCurrency;

     // Añadimos la factura recitificada sustitutiva
     var FacturaSustitutiva := IDFacturaARType.Create;
     FacturaSustitutiva.NumSerieFacturaEmisor        := DTRectificadas.FieldByName('ReferenciaDocumento').AsString;
     FacturaSustitutiva.FechaExpedicionFacturaEmisor := StringReplace(DTRectificadas.FieldByName('FECH').AsString,FormatSettings.DateSeparator,'-',
[rfReplaceAll, rfIgnoreCase]); // (dd-mm-yyyy)


     SetLength(ListaFacturasSustituidas, Orden+1);
     ListaFacturasSustituidas[Orden] := FacturaSustitutiva;


     Orden := Orden + 1;

     DTRectificadas.Next;

    End;
    f_close_adodataset(DTRectificadas);
    Factura.RegistroFacturacion.FacturasSustituidas := ListaFacturasSustituidas;

    // La Suma de las bases rectificads i/o sustituidas
    Factura.RegistroFacturacion.ImporteRectificacion := DesgloseRectificacionType.Create;
    Factura.RegistroFacturacion.ImporteRectificacion.BaseRectificada         := CurrToStr(BaseRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRectificada        := CurrToStr(IvaRectificadas);
    Factura.RegistroFacturacion.ImporteRectificacion.CuotaRecargoRectificado := CurrToStr(RecargoRectificadas);


  finally
   DTRectificadas.DisposeOf;
  end;



end;


function ClaveRegimenVerifactu(Conexion : TAdoConnection ; RegimenIva : Integer) : IdOperacionesTrascendenciaTributariaType;
var CodigoVerifactu : String;
var TypeRegimen : IdOperacionesTrascendenciaTributariaType;
Begin

  //'L8';

// 01  Operación de régimen general.
// 02  Exportación.
// 03  Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.
// 04  Régimen especial del oro de inversión.
// 05  Régimen especial de las agencias de viajes.
// 06  Régimen especial grupo de entidades en IVA (Nivel Avanzado)
// 07  Régimen especial del criterio de caja.
// 08  Operaciones sujetas al IPSI  / IGIC (Impuesto sobre la Producción, los Servicios y la Importación  / Impuesto General Indirecto Canario).
// 09  Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012)
// 10  Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, 
// asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.
// 11  Operaciones de arrendamiento de local de negocio.
// 12  Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.
// 13  Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.
// 14  Régimen simplificado
// 15  Recargo de equivalencia.
// 16  Régimen especial de la agricultura


  // Falta ponde ren la carga inicial
  CodigoVerifactu := f_devolver_valor_campo(0,Conexion,'C','RegimenesIVA','Codigo','CodVerifactu',RegimenIva);


   Case IndexStr(CodigoVerifactu, ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16']) of
   0  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   1  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._02;
   2  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._03;
   3  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._04;
   4  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._05;
   5  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._06;
   6  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._07;
   7  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._08;
   8  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._09;
   9  : TypeRegimen := IdOperacionesTrascendenciaTributariaType._10;
   10 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._11;
   11 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._12;
   12 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._13;
   13 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._14;
   14 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._15;
   15 : TypeRegimen := IdOperacionesTrascendenciaTributariaType._16;
   else
   Begin
     TypeRegimen := IdOperacionesTrascendenciaTributariaType._01;
   End;
  end;

  Result := TypeRegimen;


End;


function TipoCalificacionOperacion : CalificacionOperacionType;
Begin

// L9

// S1  Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.
// S2  Operación Sujeta y No exenta - Con Inversión del sujeto pasivo
// N1  Operación No Sujeta artículo 7, 14, otros.
// N2  Operación No Sujeta por Reglas de localización.

  Result := CalificacionOperacionType.S1;

End;


function TipoOperacionExenta : OperacionExentaType;
Begin

  //L10 - solo si exenta de IVA

// E0  Exenta sin especificar causa
// E1  Exenta por el artículo 20
// E2  Exenta por el artículo 21
// E3  Exenta por el artículo 22
// E4  Exenta por los artículos 23 y 24
// E5  Exenta por el artículo 25
// E6  Exenta por otros

  result := OperacionExentaType.E0;

End;


end.


Luego el código en bruto para recogerlo:

Código Delphi [-]
  XMLDocument1.XML.LoadFromFile('RegistroFacturacion.xml');
  XMLDocument1.Active := True;

  var fact2:FacturasEmitidasType;
  fact2 := FacturasEmitidasType.Create;
  fact2.RegistroFacturacion := RegistroFacturacionType.Create;

  ARootNode := XMLDocument1.DocumentElement;

  var MySOAPDomConv: TSOAPDomConv;
  MySOAPDomConv:= TSOAPDomConv.Create(Self);

  fact2.RegistroFacturacion.SOAPToObject(ARootNode.ChildNodes[0] , ARootNode.ChildNodes[0] , MySOAPDomConv);

  Showmessage('2 '+
  fact2.RegistroFacturacion.DescripcionOperacion+' '+
  fact2.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor);



  fact2.DisposeOf;
  fact2.RegistroFacturacion.DisposeOf;


keno_71 07-03-2024 19:29:04

Gracias Delphier!!

ermendalenda 11-03-2024 13:11:46

Esto tiene pinta que va a sufrir otro retraso.

espinete 11-03-2024 14:43:10

Cita:

Empezado por ermendalenda (Mensaje 554869)
Esto tiene pinta que va a sufrir otro retraso.

Yo lo daba por sentado.

Si TicketBAI se retrasó varias veces, y solo son 3 provincias, imagínate con toda España. Hace unos días hablé con una asesoría contable y fiscal y me dijeron que les parece todo esto una locura, que ve imposible que entre en vigor el año que viene y que iban a agruparse y enviar un escrito a la AEAT para pedir que lo retrasaran.

A lo mejor nos sorprende y al final sí sale adelante, pero lo dudo.

ermendalenda 11-03-2024 15:55:38

Cita:

Empezado por espinete (Mensaje 554871)
Yo lo daba por sentado.

Si TicketBAI se retrasó varias veces, y solo son 3 provincias, imagínate con toda España. Hace unos días hablé con una asesoría contable y fiscal y me dijeron que les parece todo esto una locura, que ve imposible que entre en vigor el año que viene y que iban a agruparse y enviar un escrito a la AEAT para pedir que lo retrasaran.

A lo mejor nos sorprende y al final sí sale adelante, pero lo dudo.

Efectivamente, ya hay quejas oficiales.


La franja horaria es GMT +2. Ahora son las 03:19:43.

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