Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice (https://www.clubdelphi.com/foros/showthread.php?t=91252)

mrobles 02-07-2018 10:01:58

Al parecer implemente los cambios básicos, y todo va perfecto, pero, ¿hay algo mas aparte de eso que se me pasara y me pueda afectar?

Cita:

- Se renombran estas etiquetas en la nueva versión: 

<PeriodoImpositivo> se renombra a <PeriodoLiquidacion>  
<EmitidaPorTerceros> se renombra a <EmitidaPorTercerosODestinatario> 
<ImporteTransmisionSujetoAIVA> se renombra a <ImporteTransmisionInmueblesSujetoAIVA> 
- En el libro de emitidas de la nueva versión, dentro del bloque <TipoDesglose> se añade la etiqueta <DetalleExenta> para permitir el desglose del importe exento en función de las distintas causas de exención que pasan a ser compatibles.

** El campo que se necesitaba hace 1 año "referencia externa"
PD: Me siento raro siendo el único en PHP(Laravel) aquí

paquimd 02-07-2018 10:35:43

url Definitivas
 
Hola. Llevo un rato buscando las WSDL de la versión de producción de la 1.1. y no las encuentro por ninguna parte. ¿Alguien las ha visto?


Gracias

mrobles 02-07-2018 10:42:42

Cita:

Empezado por paquimd (Mensaje 527404)
Hola. Llevo un rato buscando las WSDL de la versión de producción de la 1.1. y no las encuentro por ninguna parte. ¿Alguien las ha visto?


Gracias

Los WSDL de la versión 1.1 utilizan los mismos namespace y URLs que la versión 1.0. Pero se referencia a los nuevos esquemas XSD de la 1.1, ya que la etiqueta <squemaLocation> está "apuntando" a los esquemas XSD de la 1.1.

Puede comprobarlo importando por ejemplo el nuevo WSDL de la URL: https://www2.agenciatributaria.gob.e...tEmitidas.wsdl y ver que genera los XML de la versión 1.1. correctamente.

Virman 02-07-2018 13:06:26

Error al intentar rellenar Detalle Exenta de Emitidas
 
Buenos días, cuando intento rellenar la parte exenta del detalle de una factura emitida, me crea un objeto null que causa exception en mi código.

La causaExención la creo de la siguiente forma:

tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = ((CausaExencionType)(numTipo));

Pero al intentar asignarle un valor me lanza error:
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = 'tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion' inició una excepción de tipo 'System.NullReferenceException'

Esto con la versión anterior (1.0) del SII no me daba problemas, a alguien más le pasa? Cómo debemos crear el objeto para adjuntar una causa de exención?

mrobles 02-07-2018 13:16:43

Cita:

Empezado por Virman (Mensaje 527407)
Buenos días, cuando intento rellenar la parte exenta del detalle de una factura emitida, me crea un objeto null que causa exception en mi código.

La causaExención la creo de la siguiente forma:

tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = ((CausaExencionType)(numTipo));

Pero al intentar asignarle un valor me lanza error:
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = 'tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion' inició una excepción de tipo 'System.NullReferenceException'

Esto con la versión anterior (1.0) del SII no me daba problemas, a alguien más le pasa? Cómo debemos crear el objeto para adjuntar una causa de exención?

Es uno de los 4 puntos de cambio basicos

Código:

<sii:TipoDesglose>
 <sii:DesgloseFactura>
 <sii:Sujeta>
 <sii:Exenta>
 <sii:DetalleExenta>
 <sii:CausaExencion>E2</sii:CausaExencion>
 <sii:BaseImponible>22.07</sii:BaseImponible>
 </sii:DetalleExenta>
 </sii:Exenta>
 </sii:Sujeta>
 </sii:DesgloseFactura>
 </sii:TipoDesglose>

Cita:

- En el libro de emitidas de la nueva versión, dentro del bloque <TipoDesglose> se añade la etiqueta <DetalleExenta> para permitir el desglose del importe exento en función de las distintas causas de exención que pasan a ser compatibles.

Virman 02-07-2018 13:44:04

Cita:

Empezado por mrobles (Mensaje 527408)
Es uno de los 4 puntos de cambio basicos

Código:

<sii:TipoDesglose>
 <sii:DesgloseFactura>
 <sii:Sujeta>
 <sii:Exenta>
 <sii:DetalleExenta>
 <sii:CausaExencion>E2</sii:CausaExencion>
 <sii:BaseImponible>22.07</sii:BaseImponible>
 </sii:DetalleExenta>
 </sii:Exenta>
 </sii:Sujeta>
 </sii:DesgloseFactura>
 </sii:TipoDesglose>


Pero lo que no entiendo es que yo ya estoy declarando la parte exenta como tipo DetalleExenta, por lo que no entiendo que al crear el objeto de tipo:

tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];

CausaExencion me devuelva null.

Os incluyo más líneas del proyecto:
TipoConDesgloseType tipoConDesglose = new TipoConDesgloseType();

tipoConDesglose.Entrega = new TipoSinDesgloseType();

tipoConDesglose.Entrega.Sujeta = new SujetaType();

if ((campos[54] != null && !campos[54].Equals(String.Empty)) || !campos[55].Equals(String.Empty))
{
if (!campos[54].Equals(String.Empty))
{
for (int numTipo = 0; numTipo < 6; numTipo++)
{
if (campos[54].Equals(((CausaExencionType)(numTipo)).ToString()))
{
tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = ((CausaExencionType)(numTipo));
break;
}
}
}
}

Virman 02-07-2018 15:12:17

Cita:

Empezado por Virman (Mensaje 527409)
Pero lo que no entiendo es que yo ya estoy declarando la parte exenta como tipo DetalleExenta, por lo que no entiendo que al crear el objeto de tipo:

tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];

CausaExencion me devuelva null.

Os incluyo más líneas del proyecto:
TipoConDesgloseType tipoConDesglose = new TipoConDesgloseType();

tipoConDesglose.Entrega = new TipoSinDesgloseType();

tipoConDesglose.Entrega.Sujeta = new SujetaType();

if ((campos[54] != null && !campos[54].Equals(String.Empty)) || !campos[55].Equals(String.Empty))
{
if (!campos[54].Equals(String.Empty))
{
for (int numTipo = 0; numTipo < 6; numTipo++)
{
if (campos[54].Equals(((CausaExencionType)(numTipo)).ToString()))
{
tipoConDesglose.Entrega.Sujeta.Exenta = new DetalleExentaType[1];
tipoConDesglose.Entrega.Sujeta.Exenta[0].CausaExencion = ((CausaExencionType)(numTipo));
break;
}
}
}
}

Ya he visto el problema, gracias por la ayuda, faltaba esta línea:
tipoConDesglose.Entrega.Sujeta.Exenta[0] = new DetalleExentaType();

Sumsuna 02-07-2018 20:14:26

Problema con PeriodoLiquidacion
 
Buenas a todos,
Con la nueva version 1.1 tengo un problema con la nueva etiqueta PeriodoLiquidacion ya que aunque le programa me compila bien justo cuando llega a esta línea me da una excepción y no continua


ARegistroLRFacturasEmitidas[0].PeriodoLiquidacion.Ejercicio:=edtYear.Text;

Gracias de antemano

Sumsuna 02-07-2018 20:46:08

Cita:

Empezado por Sumsuna (Mensaje 527420)
Buenas a todos,
Con la nueva version 1.1 tengo un problema con la nueva etiqueta PeriodoLiquidacion ya que aunque le programa me compila bien justo cuando llega a esta línea me da una excepción y no continua


ARegistroLRFacturasEmitidas[0].PeriodoLiquidacion.Ejercicio:=edtYear.Text;

Gracias de antemano

Me respondo a mi misma, tenía que crear primero con esto ya me va bien

ALRFiltroEmitidasType.PeriodoLiquidacion:=PeriodoLiquidacion11.Create;
ARegistroLRFacturasEmitidas[0].PeriodoLiquidacion.Ejercicio:=edtYear.Text;

didou 03-07-2018 10:09:01

desglose facturas emitidas exentas
 
Buenos días, alguién seria tan amable de colgar un ejemplo Delphi de como informar el detalle de facturas emitidas exentas con la versión 1.1, con la 1.0 yo tenia lo siguiente:

// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta := Exenta2.Create;
// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta.CausaExencion := GetCausaExencion;
// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta.BaseImponible := ReplaceStr(FloatToStr(vImpBase), ',', '.');

no consigo hacerlo con la 1.1, muchas gracias.

newtron 03-07-2018 10:48:44

Cita:

Empezado por didou (Mensaje 527432)
Buenos días, alguién seria tan amable de colgar un ejemplo Delphi de como informar el detalle de facturas emitidas exentas con la versión 1.1, con la 1.0 yo tenia lo siguiente:

// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta := Exenta2.Create;
// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta.CausaExencion := GetCausaExencion;
// vLREmitidas[vIdx].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta.BaseImponible := ReplaceStr(FloatToStr(vImpBase), ',', '.');

no consigo hacerlo con la 1.1, muchas gracias.


Yo lo hago de esta manera, a ver si esto te sirve...


Código Delphi [-]
              setLength(IVAS,1);                       // numeros de iVAs en factura
              IVAS[0]:=DetalleIVAEmitidaType.create;             // CREAR primer IVA
              IVAS[0].BaseImponible:='0';
              IVAS[0].TipoImpositivo:='0';
              IVAS[0].CuotaRepercutida:='0';
              IVAS[0].TipoRecargoEquivalencia:='';    // REQ %
              IVAS[0].CuotaRecargoEquivalencia:='';   // IMPORTE RECARGO
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:=TipoConDesgloseType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega:=TipoSinDesgloseType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta:=SujetaType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta:=NoExenta2.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta.TipoNoExenta:=TipoOperac  ionSujetaNoExentaType(1);
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta.DesgloseIVA := IVAS;


La variable IVAS es un array del tipo DesgloseIva3


Saludos

Edito: Ahora la verdad es que estoy mirando y no me cuadra mucho que siendo exenta "cuele" con un tipo Sujeta.Noexenta....

inyu 03-07-2018 11:29:41

¿A alguien más le está dando este mensaje ?

There was no endpoint listening at https://www1.aeat.es/wlpl/SSII-FACT/...iiFactFRV1SOAP that could accept the message.

Sólo me funcionan las de pre-produccion (www7).

didou 03-07-2018 11:42:52

Cita:

Empezado por newtron (Mensaje 527433)
Yo lo hago de esta manera, a ver si esto te sirve...


Código Delphi [-]
              setLength(IVAS,1);                       // numeros de iVAs en factura
              IVAS[0]:=DetalleIVAEmitidaType.create;             // CREAR primer IVA
              IVAS[0].BaseImponible:='0';
              IVAS[0].TipoImpositivo:='0';
              IVAS[0].CuotaRepercutida:='0';
              IVAS[0].TipoRecargoEquivalencia:='';    // REQ %
              IVAS[0].CuotaRecargoEquivalencia:='';   // IMPORTE RECARGO
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:=TipoConDesgloseType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega:=TipoSinDesgloseType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta:=SujetaType.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta:=NoExenta2.Create;
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta.TipoNoExenta:=TipoOperac  ionSujetaNoExentaType(1);
              ARegistroLRFacturasEmitidas[N].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.NoExenta.DesgloseIVA := IVAS;


La variable IVAS es un array del tipo DesgloseIva3


Saludos

Edito: Ahora la verdad es que estoy mirando y no me cuadra mucho que siendo exenta "cuele" con un tipo Sujeta.Noexenta....

Hola Newtron, gracias por intentarlo pero lo que me das es para entregas y yo quiero para facturaexpedida.,tipodesglose.desglosefactura.sujeta.exenta

Hay un tipo detalleExentaType ue yo creo de la siguiente manera
setLength(vEXEN, 1);
vEXEN[0] := DetalleExentaType.Create;
vEXEN[0].CausaExencion := GetCausaExencion;
vEXEN[0].BaseImponible := ReplaceStr(FloatToStr(vImpBase), ',', '.');

pero después no consigo meter el array vEXEN dentro del facturaexpedida.,tipodesglose.desglosefactura.sujeta.exenta

pero gracias de todos modos y a ver si alguien me puede ayudar.

pmbcn 03-07-2018 13:32:13

Cita:

Empezado por vicdeju (Mensaje 527198)
Buenos días PepCat,
Muchas gracias, con esto lo tengo solucionado.

Un saludo.

Hola a todos,
Tengo el mismo problema pero los Dua pongo datos del emisor 'nombre' y como NIF pongo Otro documento probatorio. Y luego en el encabezamiento los datos son de nuestra empresa.

Cómo solucionais este error?
Podría presentarse está importación con este error sin tener que subsanar?
Gracias a todos por vuestros comentarios!

Galahad 03-07-2018 18:09:40

Cita:

Empezado por didou (Mensaje 527435)
Hola Newtron, gracias por intentarlo pero lo que me das es para entregas y yo quiero para facturaexpedida.,tipodesglose.desglosefactura.sujeta.exenta

Hay un tipo detalleExentaType ue yo creo de la siguiente manera
setLength(vEXEN, 1);
vEXEN[0] := DetalleExentaType.Create;
vEXEN[0].CausaExencion := GetCausaExencion;
vEXEN[0].BaseImponible := ReplaceStr(FloatToStr(vImpBase), ',', '.');

pero después no consigo meter el array vEXEN dentro del facturaexpedida.,tipodesglose.desglosefactura.sujeta.exenta

pero gracias de todos modos y a ver si alguien me puede ayudar.


Hola
¿ has probado esto ?


ARegistroLRFacturasEmitidas[ncontfacturas].FacturaExpedida.TipoDesglose.desglosefactura.sujeta.Exenta:= vexen;


Yo acabo de adaptarlo y por lo menos el compilador no se queja... :D

Galahad 03-07-2018 20:20:58

Cita:

Empezado por Galahad (Mensaje 527442)
Hola
¿ has probado esto ?


ARegistroLRFacturasEmitidas[ncontfacturas].FacturaExpedida.TipoDesglose.desglosefactura.sujeta.Exenta:= vexen;


Yo acabo de adaptarlo y por lo menos el compilador no se queja... :D


Perdón, rectifico, no daba error de compilación pero si un bonito access violation.. ;)
Esta es la línea correcta:


ARegistroLRFacturasEmitidas[ncontfacturas].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.sujeta.Exenta := Exentas;


Saludos...

Sumsuna 03-07-2018 22:35:58

Buenas tardes,

Volviendo con las exentas yo el código que tengo ahora mismo (y que me falla) es esto

Primero defino las variables
vExenB: Exenta; //para operaciones de entrega de bienes
vExenP: Exenta2; //para servicios

Y luego hago

ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose3.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:= TipoConDesgloseType.Create;

if (edtBien_o_Servicio.Text='B') then //bien
begin
setLength(vExenB, 1);
vExenB[0] := DetalleExentaType.Create;
if (edtTipoOperacion.Text='E2') then // exportacion, ceuta y melilla
vExenB[0].CausaExencion := CausaExencionType.E2;
if (edtTipoOperacion.Text='E5') then //intracomunitaria
vExenB[0].CausaExencion := CausaExencionType.E5;
vExenB[0].BaseImponible := edtImporteTotalFactura.Text;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.Exenta := vExenB;
end;

if (edtBien_o_Servicio.Text='S') then //servicios
begin
setLength(vExenP, 1);
vExenP[0] := DetalleExentaType.Create;
if (edtTipoOperacion.Text='E2') then // exportacion, ceuta y melilla
vExenP[0].CausaExencion := CausaExencionType.E2;
if (edtTipoOperacion.Text='E5') then //intracomunitaria
vExenP[0].CausaExencion := CausaExencionType.E5;
vExenP[0].BaseImponible := edtImporteTotalFactura.Text;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios.Sujeta.Exenta := vExenP;
end;

Y el problema es que me da una excepción a la hora de ejecutar cuando llego a la línea

ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.Exenta := vExenB;

¿Sabéis dónde fallo?

Gracias de antemano

pablog2k 04-07-2018 08:30:13

Cita:

Empezado por Sumsuna (Mensaje 527447)
Buenas tardes,

Volviendo con las exentas yo el código que tengo ahora mismo (y que me falla) es esto

Primero defino las variables
vExenB: Exenta; //para operaciones de entrega de bienes
vExenP: Exenta2; //para servicios

Y luego hago

ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose3.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:= TipoConDesgloseType.Create;

if (edtBien_o_Servicio.Text='B') then //bien
begin
setLength(vExenB, 1);
vExenB[0] := DetalleExentaType.Create;
if (edtTipoOperacion.Text='E2') then // exportacion, ceuta y melilla
vExenB[0].CausaExencion := CausaExencionType.E2;
if (edtTipoOperacion.Text='E5') then //intracomunitaria
vExenB[0].CausaExencion := CausaExencionType.E5;
vExenB[0].BaseImponible := edtImporteTotalFactura.Text;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.Exenta := vExenB;
end;

if (edtBien_o_Servicio.Text='S') then //servicios
begin
setLength(vExenP, 1);
vExenP[0] := DetalleExentaType.Create;
if (edtTipoOperacion.Text='E2') then // exportacion, ceuta y melilla
vExenP[0].CausaExencion := CausaExencionType.E2;
if (edtTipoOperacion.Text='E5') then //intracomunitaria
vExenP[0].CausaExencion := CausaExencionType.E5;
vExenP[0].BaseImponible := edtImporteTotalFactura.Text;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios.Sujeta.Exenta := vExenP;
end;

Y el problema es que me da una excepción a la hora de ejecutar cuando llego a la línea

ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.Exenta := vExenB;

¿Sabéis dónde fallo?

Gracias de antemano

creo que te falta crear el nodo de prestación de servicios y sujeta :
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios := TipoSinDesglosePrestacionType.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios.Sujeta := SujetaPrestacionType.Create;

nuevo1234 04-07-2018 09:19:09

Cita:

Empezado por inyu (Mensaje 527434)
¿A alguien más le está dando este mensaje ?

There was no endpoint listening at https://www1.aeat.es/wlpl/SSII-FACT/...iiFactFRV1SOAP that could accept the message.

Sólo me funcionan las de pre-produccion (www7).

El dominio de produccion no es el correcto. Fijate en los ws de que está el endpoint

elguille 04-07-2018 11:59:48

Cita:

Empezado por pablog2k (Mensaje 527450)
creo que te falta crear el nodo de prestación de servicios y sujeta :
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios := TipoSinDesglosePrestacionType.Create;
ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.PrestacionServicios.Sujeta := SujetaPrestacionType.Create;

Yo tengo el mismo error despues de trastear un buen rato, el codigo ya compila y no da error en ejecución, aunque no estoy seguro que sea correcto.
A ver si os sirve para avanzar

Código Delphi [-]
var
  mExenta: DetalleExentaType;

mExenta := DetalleExentaType.Create;
mExenta.CausaExencion := causaexenciontype(valorenum2(dm.TFEMBASESUJETAEXENTACLAVE.asstring));
mExenta.baseimponible := dm.tfemBASESUJETAEXENTAIMPORTE.asstring;
ARegistroLRFacturasEmitidas[mcon].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta := Exenta.Create(nil);
ARegistroLRFacturasEmitidas[mcon].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.Exenta[0] :=mexenta;


La franja horaria es GMT +2. Ahora son las 15:16:11.

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