Bueno, este es mi código que no funciona:
da error 4102: falta contraparte. Llevo repasándolo bastantes horas y nada. Luego llamo a la AEAT:
Pero... ¿podeis x favor, decirme como haceis para enviar el XML? porque viendo el tiempo que estoy perdiendo con esto, puedo intentar componer el XML.
hay unas pocas constantes que hay que añadir, e iria justo debajo de: setCERTIFICADO(CERTIFICADO);
CONST
_PRESENTADOR='xxxxx';
_NIF_EMISOR='xxxxxxx';
_NIF_CLI='xxxxxx';
_NOMBRE_CLI='xxxxxx';
Código:
try
/////////////////////////////////////////////////////////////////////////////
//// PRESENTADOR OSEA -> NOSOTROS //////////////////////////////////////
// se crea el objeto que se va a enviar:
/////////////////////////////////////////////////////////////////////////////
ASuministroLRFacturasEmitidas := SuministroLRFacturasEmitidas.Create;
ASuministroLRFacturasEmitidas.Cabecera := CabeceraSii.Create;
// DATOS:
ASuministroLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0); // 0.1
ASuministroLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaESType.Create;
ASuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=_PRESENTADOR; // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
ASuministroLRFacturasEmitidas.Cabecera.Titular.NIF:=_NIF_EMISOR; // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)
// (0) A0 - ALTA
// (1) A1- MODIFICACION
// (2) A4- MODIFICACION REGIMEN VIAJEROS
ASuministroLRFacturasEmitidas.Cabecera.TipoComunicacion:=ClaveTipoComunicacionType(0);
//se crea un array con el numero de facturas que se van a emitir
//en este ejemplo solo 1, pero pueden ser mas
SetLength(ARegistroLRFacturasEmitidas, 1);
//se introducen los datos de cada una de las facturas
// for i := Low(ARegistroLRFacturasEmitidas) to High(ARegistroLRFacturasEmitidas) do
// begin
//Se crean todas las estructuras de datos de la consulta
ARegistroLRFacturasEmitidas[0]:=LRfacturasEmitidasType.Create;
ARegistroLRFacturasEmitidas[0].IDFactura:=IDFacturaExpedidaType.create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida:=FacturaExpedidaType.create; // <- clase para tipo de factura
ARegistroLRFacturasEmitidas[0].PeriodoImpositivo:=PeriodoImpositivo.Create;
ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.Ejercicio:='2016'; // AÑO
ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.periodo :=TipoPeriodoType(11); // PERIODO 01- ENERO ... 12-DICIEMBRE (0A - ANUAL )
With ARegistroLRFacturasEmitidas[0].IDFactura do
begin
IDEmisorFactura:= IDEmisorFactura3.Create;
IDEmisorFactura.NIF :=_NIF_EMISOR; // NUESTRO NIF, COMO EMISOR = TITULAR LIBRO REGISTRO = CERTIFICADO DIGITAL
NumSerieFacturaEmisor:='20169999F'; // NUMERO Y SERIE DE LA FACTURA entiendo: 9999999X
FechaExpedicionFacturaEmisor:='15/12/2016'; // FECHA DE EXPEDICION FACTURA (dd-mm-yyyy)
end;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.tipofactura:=ClaveTipoFacturaType(0); // F1- FACTURA / F2 TICKET / ...
ARegistroLRFacturasEmitidas[0].FacturaExpedida.ClaveRegimenEspecialOTrascendencia:=IdOperacionesTrascendenciaTributariaType(0); // 01-REGIMEN COMUN / 02-BIENES USADOS... 15-EXPORTACION
ARegistroLRFacturasEmitidas[0].FacturaExpedida.ImporteTotal:='121'; // TOTAL (opcional)
ARegistroLRFacturasEmitidas[0].FacturaExpedida.descripcionOperacion:='Nuestra Factura'; // DESCRIPCION FACTURA (LIBRE)
// CONTRAPARTE:
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte:=PersonaFisicaJuridicaType.Create; // CREAR CLIENTE:
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NombreRazon:=_NOMBRE_CLI; // NOMBRE DEL CLIENTE
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIFRepresentante:='';
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIF:=_NIF_CLI; // NIF DEL CLIENTE
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro:=IDOtroType.Create; // identifiacion del nif.
//ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.CodigoPais:=countryType2(10);
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.IDType:=PersonaFisicaJuridicaIDTypeType(0); // 2-NIF / 3-PASAPORTE / 4- DOCUMENTO OFICIAL IDENT. PAIS RESIDENCIA
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.ID:=''; // documento pais residencia (extranjero)
// EMPEZAMOS CON LOS DESGLOSES (IVAs)
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose.create; // ATENCION: TipoDesglose2 (facturas) TipoDesglose (inmuebles)
setLength(IVAS,1); // numeros de iVAs en factura
IVAS[0]:=DetalleIVA2.create; // CREAR primer IVA
IVAS[0].BaseImponible:='100'; // BASE IMPONIBLE
IVAS[0].TipoImpositivo:='21'; // IVA %
IVAS[0].CuotaRepercutida:='21'; // IMPORTE IVA
IVAS[0].TipoRecargoEquivalencia:='0'; // REQ %
IVAS[0].CuotaRecargoEquivalencia:='0'; // IMPORTE RECARGO
// opcion 1
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura:=TipoSinDesgloseType.create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta:=SujetaType.create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.noexenta:=NoExenta.create;
// ASIGNAR IVAS
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desglosefactura.sujeta.noexenta.desgloseIVA:=IVAS;
// opcion 2 : (nada)
(*
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:=TipoConDesgloseType.create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega:=TipoSinDesgloseType.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta:=SujetaType.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta.noexenta:=NoExenta.Create;
// ASIGNAR IVAS
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta.noexenta.desgloseIVA:=IVAS;
*)
//se añade el array de facturas creado anteriormente
ASuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas:=ARegistroLRFacturasEmitidas;
try
// se hace la llamada a la funcion suministrada por el WS
result := GetsiiSOAP.SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
//mostrar los resultados devueltos por la llamada
for i := low(result.RespuestaLinea) to High(result.RespuestaLinea) do begin
with result.RespuestaLinea[i] do begin
Memo1.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' ' + IDFactura.NumSerieFacturaEmisorResumenFin + ' ' + IDFactura.FechaExpedicionFacturaEmisor);
//si el estado no es correcto, se muestran los errores
if EstadoRegistro <> EstadoRegistroType(0) then
begin
Memo1.lines.add('Error no.: ' + InttoStr(CodigoErrorRegistro));
Memo1.lines.add(DescripcionErrorRegistro);
end;
end;
end;
except
On E:Exception do
//El proceso de envio dio error
MessageDlg(E.Message, mtError, [mbOK], 0);
end;
finally
// se eliminan los objetos creados
ASuministroLRFacturasEmitidas.Free;
result.Free;
end;