Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1421  
Antiguo 05-03-2024
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.027
Poder: 22
keys Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
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
Responder Con Cita
  #1422  
Antiguo 05-03-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 865
Poder: 3
ermendalenda Va por buen camino
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

Última edición por ermendalenda fecha: 05-03-2024 a las 14:16:33.
Responder Con Cita
  #1423  
Antiguo 05-03-2024
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 143
Poder: 4
rci Va por buen camino
mensaje para eliminar

Última edición por rci fecha: 05-03-2024 a las 16:09:28. Razón: error
Responder Con Cita
  #1424  
Antiguo 05-03-2024
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 143
Poder: 4
rci Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
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
Responder Con Cita
  #1425  
Antiguo 05-03-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 865
Poder: 3
ermendalenda Va por buen camino
Cita:
Empezado por rci Ver Mensaje
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.
Responder Con Cita
  #1426  
Antiguo 05-03-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 865
Poder: 3
ermendalenda Va por buen camino
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 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

Última edición por ermendalenda fecha: 05-03-2024 a las 19:01:43.
Responder Con Cita
  #1427  
Antiguo 05-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Poder: 0
Delphier Va por buen camino
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;

Última edición por Neftali [Germán.Estévez] fecha: 06-03-2024 a las 08:20:35. Razón: Correccion ancho columna
Responder Con Cita
  #1428  
Antiguo 05-03-2024
xevi xevi is offline
Registrado
 
Registrado: feb 2024
Posts: 5
Poder: 0
xevi Va por buen camino
Estaría bien poder ver ese xml final generado que enviarías con ese procedimiento
Responder Con Cita
  #1429  
Antiguo 05-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Poder: 0
Delphier Va por buen camino
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>

Última edición por Neftali [Germán.Estévez] fecha: 06-03-2024 a las 08:27:49. Razón: Añadir TAGs al mensaje ([CODE])
Responder Con Cita
  #1430  
Antiguo 05-03-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 51
Poder: 11
ramherfer Va por buen camino
Cita:
Empezado por Delphier Ver Mensaje
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="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"></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.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #1431  
Antiguo 05-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Poder: 0
Delphier Va por buen camino
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
Responder Con Cita
  #1432  
Antiguo 06-03-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Delphier Ver Mensaje
...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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #1433  
Antiguo 06-03-2024
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por Delphier Ver Mensaje
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.
__________________
Be water my friend.

Última edición por Neftali [Germán.Estévez] fecha: 06-03-2024 a las 10:17:21. Razón: Editar la sintaxis....
Responder Con Cita
  #1434  
Antiguo 06-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Poder: 0
Delphier Va por buen camino
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
Responder Con Cita
  #1435  
Antiguo 06-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Poder: 0
Delphier Va por buen camino
Cita:
Empezado por Delphier Ver Mensaje
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];
Responder Con Cita
  #1436  
Antiguo 07-03-2024
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
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 Ver Mensaje
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;
Responder Con Cita
  #1437  
Antiguo 07-03-2024
keno_71 keno_71 is offline
Miembro
 
Registrado: feb 2008
Posts: 27
Poder: 0
keno_71 Va por buen camino
Gracias Delphier!!
Responder Con Cita
  #1438  
Antiguo 11-03-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 865
Poder: 3
ermendalenda Va por buen camino
Esto tiene pinta que va a sufrir otro retraso.
Responder Con Cita
  #1439  
Antiguo 11-03-2024
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Poder: 16
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
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.
Responder Con Cita
  #1440  
Antiguo 11-03-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 865
Poder: 3
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
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.
Responder Con Cita
Respuesta



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

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hijo de Informáticos gluglu Humor 3 13-03-2007 11:05:35
Adictos informaticos ... Trigger Humor 2 11-10-2004 12:18:32
Nosotros los Informáticos Trigger Humor 1 10-10-2004 14:58:09
Patrón de los Informáticos. obiwuan Varios 20 10-09-2003 14:44:54
Chistes Informaticos jhonny Humor 2 11-08-2003 21:59:09


La franja horaria es GMT +2. Ahora son las 00:46:04.


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