QuiqueSalamanca |
07-04-2020 15:27:52 |
Cita:
Empezado por Neftali [Germán.Estévez]
(Mensaje 536622)
Tal vez deberías mostrar qué código estás utilizamdo y dónde te está dando error.
Ese error es muy genérico como para darte una solución que sea algo más concreta que "utilizar correctamente los interfaces".
|
Hola Germán!
Pues estoy utilizando el código del proyecto que subió newtron.
Código:
procedure TfrmAEATSII.sbInformarEmitidasClick(Sender: TObject);
var
i:LongInt;
ASuministroLRFacturasEmitidas:SuministroLRFacturasEmitidas;
ARegistroLRFacturasEmitidas:Array_Of_LRfacturasEmitidasType;
result:RespuestaLRFacturasEmitidas;
CERTIFICADO :Pointer;
IVAS: DesgloseIva2;
cTotal : Currency;
j : integer;
a,mes,d:word;
begin
if comboBox1.itemindex<0 then exit;
//***CSY
CERTIFICADO := BUSCAR_CERTIFICADO(comboBox1.text);
if(CERTIFICADO = nil) then begin
ShowMessage('No encuento el certificado');
Exit();
end;
setCERTIFICADO(CERTIFICADO);
//****
try
ASuministroLRFacturasEmitidas := SuministroLRFacturasEmitidas.Create;
ASuministroLRFacturasEmitidas.Cabecera := CabeceraSii.Create;
// DATOS:
ASuministroLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(1); // 0.1
ASuministroLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaESType.Create;
ASuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=edEmpresa.Text; // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
ASuministroLRFacturasEmitidas.Cabecera.Titular.NIF:=BBDD.zSacaNombre('EMPRESAS', 'IDEmpresa=' + Empresa.ToString,
'CIF'); // 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);
///wlpl/SSII-FACT/ws/fr/SiiFactFRV1SOAP
//Se crean todas las estructuras de datos de la consulta
SetLength(ARegistroLRFacturasEmitidas, 1);
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:=edEjercicio.text; // AÑO
decodeDate(spEnlaceLoad.FieldByName('FechaDoc').AsDateTime,a,mes,d);
ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.periodo :=TipoPeriodoType(mes - 1); // PERIODO 01- ENERO ... 12-DICIEMBRE (0A - ANUAL )
With ARegistroLRFacturasEmitidas[0].IDFactura do
begin
IDEmisorFactura:= IDEmisorFactura3.Create;
IDEmisorFactura.NIF :=BBDD.zSacaNombre('EMPRESAS', 'IDEmpresa=' + Empresa.ToString,
'CIF'); // NUESTRO NIF, COMO EMISOR = TITULAR LIBRO REGISTRO = CERTIFICADO DIGITAL
NumSerieFacturaEmisor:=spEnlaceLoad.FieldByName('NUMDOC').AsString; // NUMERO Y SERIE DE LA FACTURA entiendo: 9999999X
FechaExpedicionFacturaEmisor:=FormatDateTime('dd-mm-yyyy',
spEnlaceLoad.FieldByName('FechaDoc').AsDateTime); // 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
cTotal := spEnlaceLoad.FieldByName('Base').Value +
spEnlaceLoad.FieldByName('CuotaIVA').Value +
spEnlaceLoad.FieldByName('CuotaReq').Value;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.ImporteTotal:=StringReplace(StringReplace(CurrToStr(cTotal), '.', '', []), ',', '.', []); // 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:=spEnlaceLoad.FieldByName('Nombre').Value; // NOMBRE DEL CLIENTE
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIFRepresentante:='';
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIF:=spEnlaceLoad.FieldByName('NIF').Value; // NIF DEL CLIENTE
(*
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro:=IDOtroType.Create; // identifiacion del nif.
//ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.CodigoPais:=countryType2(10); // EN CASO DE ESPAÑA NO ES NECESARIO
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.IDType:=PersonaFisicaJuridicaIDTypeType(0); // 2-NIF / 3-PASAPORTE / 4- DOCUMENTO OFICIAL IDENT. PAIS RESIDENCIA
ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.ID:=''; // EN CASO DE 3 Ó 4 INDICAR EL ID.
*)
// EMPEZAMOS CON LOS DESGLOSES (IVAs)
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose.create; // ATENCION: TipoDesglose2 (facturas) TipoDesglose (inmuebles)
BBDD.zSetSQL( zDataSet2, 'SELECT * FROM T_FACTURASVENTA_IMP WHERE ID=' + spEnlaceLoad.FieldByName('IDDOC').AsString);
BBDD.zExec( zDataSet2 );
setLength(IVAS, zDataSet2.RecordCount); // numeros de iVAs en factura
j := 0;
zDataSet2.First;
while not zDataSet2.Eof do
begin
IVAS[j]:=DetalleIVA2.create; // CREAR primer IVA
IVAS[j].BaseImponible:= StringReplace(StringReplace(zDataSet2.FieldByName('Base').AsString,
'.', '', []), ',', '.', []); // BASE IMPONIBLE
IVAS[j].TipoImpositivo:=StringReplace(StringReplace(zDataSet2.FieldByName('PORCIVA').AsString,
'.', '', []), ',', '.', []); // IVA %
IVAS[j].CuotaRepercutida:=StringReplace(StringReplace(zDataSet2.FieldByName('CUOTA').AsString,
'.', '', []), ',', '.', []); // IMPORTE IVA
IVAS[j].TipoRecargoEquivalencia:='0'; // REQ %
IVAS[j].CuotaRecargoEquivalencia:='0'; // IMPORTE RECARGO
zDataSet2.Next;
Inc(j);
end;
// 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;
// documento pais residencia (extranjero)
//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(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas); //<-- Puñetero error Interface not supported
//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;
Memo1.Visible := True;
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;
//https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl
end;
Y la función GetsiiSOAP es:
Código:
function GetsiiSOAP(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): siiSOAP;
const
//defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl';
defWSDL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
defURL = 'http://schemas.xmlsoap.org/wsdl/';
defSvc = 'siiService';
//defPrt = 'SuministroFacturasPruebas';
defPrt = 'SuministroFactEmitidasPruebas';
var
RIO: THTTPRIO;
begin
UseWSDL:=True;
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as siiSOAP);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
Básicamente he cogido el código, y para probar si me funcionaba con una sola factura.
Tengo un TADOStoredProcedure que me devuelve las facturas del Libro de IVA y es con lo que relleno los campos que se envían. Hay también funciones que devuelven datos de la BBDD que, depurando, devuelven los valores correctos.
El error es en el envío.
Gracias!
|