Este es mi código para consultar facturas emitidas, colocando sus resultados en una base de datos.
Código:
// memoErrores.lines.Clear;
if dbRespuesta.active then dbRespuesta.Active:=false;
dbRespuesta.FieldDefs.Clear;
dbRespuesta.FieldDefs.Add('numero',ftstring,30,false);
dbRespuesta.FieldDefs.Add('fecha',ftDate,0,false);
dbRespuesta.FieldDefs.Add('cliente',ftstring,100,false);
dbRespuesta.FieldDefs.Add('nif',ftstring,50,false);
dbRespuesta.FieldDefs.Add('tipo',ftstring,5,false);
dbRespuesta.FieldDefs.Add('exenta',ftstring,5,false);
dbRespuesta.FieldDefs.Add('tipostr',ftstring,50,false);
dbRespuesta.FieldDefs.Add('regimen',ftstring,5,false);
dbRespuesta.FieldDefs.Add('operacion',ftstring,200,false);
dbRespuesta.FieldDefs.Add('terceros',ftstring,5,false);
dbRespuesta.FieldDefs.Add('total',ftfloat,0,false);
dbRespuesta.FieldDefs.Add('cobros',ftstring,5,false);
dbRespuesta.FieldDefs.Add('noexenta',ftstring,5,false);
dbRespuesta.FieldDefs.Add('estado',ftstring,100,false);
dbRespuesta.FieldDefs.Add('descripcio',ftstring,300,false);
for h := 0 to 6 do
begin
dbRespuesta.FieldDefs.Add('iva'+inttostr(h),ftFloat,0,false);
dbRespuesta.FieldDefs.Add('impiva'+inttostr(h),ftFloat,0,false);
dbRespuesta.FieldDefs.Add('baseimp'+inttostr(h),ftFloat,0,false);
end;
dbRespuesta.CreateTable;
dbRespuesta.Active:=true;
//***CSY
CERTIFICADO := BUSCAR_CERTIFICADO(comboBox1.text); //<----- SELECCIONAR CERTIFICADO
if(CERTIFICADO = nil) then begin
ShowMessage('No encuento el certificado');
Exit();
end;
emitidas.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL(comboBox1.text);
//****
try
/////////////////////////////////////////////////////////////////////////////
//// PRESENTADOR OSEA -> NOSOTROS //////////////////////////////////////
// se crea el objeto que se va a enviar:
/////////////////////////////////////////////////////////////////////////////
aConsultaLRFacturasEmitidas := ConsultaLRFacturasEmitidas.Create;
aConsultaLRFacturasEmitidas.Cabecera:=CabeceraConsultaSii.Create;
// DATOS:
aConsultaLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0); // 0.1
aConsultaLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaUnicaESType.Create;
aConsultaLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=_PRESENTADOR; // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
aConsultaLRFacturasEmitidas.Cabecera.Titular.NIF:=_NIF_EMISOR; // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)
aConsultaLRFacturasEmitidas.FiltroConsulta:=LRFiltroEmitidasType.Create;
aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo:=PeriodoImpositivo.Create;
aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Ejercicio:=edit2.text;
aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Periodo:=TipoPeriodoType( comboBox2.itemIndex );
try
// se hace la llamada a la funcion suministrada por el WS
result := GetsiiSOAP(true,'',emitidas).ConsultaLRFacturasEmitidas(aConsultaLRFacturasEmitidas);
memoComs.Lines.Add( getEnumName(typeInfo(ResultadoConsultaType), ord(result.resultadoConsulta) ) );
//mostrar los resultados devueltos por la llamada
for i := low(result.RegistroRespuestaConsultaLRFacturasEmitidas) to High(result.RegistroRespuestaConsultaLRFacturasEmitidas) do
begin
_noexenta:='';
_numero:='';
_fechaStr:='';
_tipo:='';
_tipoStr:='';
_regimen:='';
_operacion:='';
_exenta:='';
_terceros:='';
_cliente:='';
_nif:='';
_tipodesglose:='';
_cobros:='';
_estado:='';
_estadoFactura:='';
_ImporteTotal:=0;
_descripcion:='';
with result.RegistroRespuestaConsultaLRFacturasEmitidas[i] do
begin
try
if result.RegistroRespuestaConsultaLRFacturasEmitidas[i].datosfacturaemitida.tipodesglose.desglosetipooperacion<>nil then
_exenta:=GetEnumName( TypeInfo(CausaExencionType),ord(DatosFacturaEmitida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.exenta.CausaExencion));
except
end;
_tipo:=GetEnumName(TypeInfo(clavetipoFacturaType), Ord(DatosFacturaEmitida.TipoFactura));
_tipoSTR:=tipoSTR( DatosFacturaEmitida.TipoFactura );
_regimen:=GetEnumName( TypeInfo(IdOperacionesTrascendenciaTributariaType), Ord(DatosFacturaEmitida.ClaveRegimenEspecialOTrascendencia) );
_ImporteTotal:=strToFloat( SII_Numero( DatosFacturaEmitida.ImporteTotal ) );
_operacion:=DatosFacturaEmitida.DescripcionOperacion;
_terceros:=GetEnumName(typeInfo( EmitidaPorTercerosType ), ord( DatosFacturaEmitida.EmitidaPorTerceros ) );
_numero:=IDFactura.NumSerieFacturaEmisor;
try
if DatosFacturaEmitida.contraparte<>nil then // POR SI NO LLEVA CONTRAPARTE:
begin
_cliente:=DatosFacturaEmitida.contraparte.NombreRazon;
_NIF:=DatosFacturaEmitida.contraparte.NIF;
if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>nil then
begin
_tipodesglose:=GetEnumName( typeInfo(TipoOperacionSujetaNoExentaType), ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta) );
_noexenta:=getEnumName(typeInfo( TipoOperacionSujetaNoExentaType ) , ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta ) );
end;
if DatosFacturaEmitida.contraparte.IDOtro<>nil then
begin
if _NIF='' then
_NIF:=DatosFacturaEmitida.contraparte.IDOtro.ID;
end;
end
else // POSIBLE ERROR:
BEGIN
_cliente:='SIN CLIENTE';
MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' SIN CLIENTE');
end;
if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
begin
for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
begin
with DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA[h] do
begin
base[h]:= strTofloat( SII_numero( baseImponible ) );
tipo[h]:=strTofloat(SII_numero( tipoImpositivo ) );
cuota[h]:=strTofloat(SII_numero( cuotarepercutida ) );
end;
end;
end;
_cobros:=getEnumName( typeInfo(FacturaARType), ord(DatosFacturaEmitida.Cobros) );
_fechaStr:=copy(IDFactura.FechaExpedicionFacturaEmisor,1,10);
_fechaStr:=stringReplace(_fechaStr,'-','/',[rfReplaceAll]);
_fecha:=strTodate( _fechaStr );
_estado:=estadoFactura.EstadoRegistro;
_descripcion:=DatosFacturaEmitida.DescripcionOperacion;
MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' ' + IDFactura.NumSerieFacturaEmisorResumenFin + ' ' + IDFactura.FechaExpedicionFacturaEmisor);
// guardar en la base de datos:
dbRespuesta.Insert;
dbRespuesta.fieldbyName('numero').Text:=_numero;
dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
dbRespuesta.fieldbyName('cliente').Text:=_cliente;
dbRespuesta.fieldbyName('nif').Text:=_nif;
dbRespuesta.fieldbyName('tipo').Text:=_tipo;
dbRespuesta.fieldbyName('tipostr').Text:=_tipostr;
dbRespuesta.fieldbyName('exenta').Text:=_exenta;
dbRespuesta.fieldbyName('regimen').Text:=_regimen;
dbRespuesta.fieldbyName('operacion').Text:=_operacion;
dbRespuesta.fieldbyName('terceros').Text:=_terceros;
dbRespuesta.fieldbyName('total').asfloat:=_ImporteTotal;
dbRespuesta.fieldbyName('cobros').text:=_cobros;
dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
dbRespuesta.fieldbyName('estado').text:=_estado;
dbRespuesta.fieldbyName('descripcio').text:=_descripcion;
dbRespuesta.fieldbyName('Noexenta').text:=_noexenta;
if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
begin
for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
begin
dbRespuesta.fieldbyName('iva'+inttostr(h)).asfloat:=tipo[h];
dbRespuesta.fieldbyName('impiva'+inttostr(h)).asfloat:=cuota[h];
dbRespuesta.fieldbyName('baseimp'+inttostr(h)).asfloat:=base[h];
end;
end;
dbRespuesta.Post;
except
On E:Exception do
begin
MemoErrores.lines.Add(_numero);
MemoErrores.lines.Add(E.Message);
MemoErrores.lines.Add('--------------------');
end;
end;
end;
end;
except
On E:Exception do
//El proceso de envio dio error
MemoErrores.lines.Add(E.Message);
end;
finally
// se eliminan los objetos creados
aConsultaLRFacturasEmitidas.Free;
result.Free;
dbRespuesta.Active:=true;
end;
end;
Y Ahora me faltaria:
* Facturas recibidas intracomunitarias y autofactura....
* Factura a Canarias?
Aunque lo estoy mirando ahora,
¿Por favor, podeis postear algún ejemplo? ...
Saludos !