Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formato de Números en xml (https://www.clubdelphi.com/foros/showthread.php?t=92458)

Galahad 05-11-2017 12:59:24

Formato de Números en xml
 
Buenos días.

Tenemos implementado desde hace tiempo el envio de la Factura electronica en España (FacturaE, versión 3.2.1).
Desde hace un par de semanas,un cliente dice que no le aceptan el envio de una factura . Dicen los informáticos que el prob lema es que algunos totales figuran sin dos decimales, aunque si validamos la factura desde el portal de presentación FACE, no detecta ningún problema de validacón.
Precios como 22.20 o totales como 355.30 aparecen en el fichero como 22.2 o 355.3 .
En la implementación del interfaz de la clase, estos elementos aparecen como de tipo 'Double'. No consigo pasar estos importes con los dos decimales. ¿ Existe alguna manera de configurar los decimales en el xml de manera global ?.
Saludos...

newtron 06-11-2017 10:26:30

Cita:

Empezado por Galahad (Mensaje 522262)
Buenos días.

Tenemos implementado desde hace tiempo el envio de la Factura electronica en España (FacturaE, versión 3.2.1).
Desde hace un par de semanas,un cliente dice que no le aceptan el envio de una factura . Dicen los informáticos que el prob lema es que algunos totales figuran sin dos decimales, aunque si validamos la factura desde el portal de presentación FACE, no detecta ningún problema de validacón.
Precios como 22.20 o totales como 355.30 aparecen en el fichero como 22.2 o 355.3 .
En la implementación del interfaz de la clase, estos elementos aparecen como de tipo 'Double'. No consigo pasar estos importes con los dos decimales. ¿ Existe alguna manera de configurar los decimales en el xml de manera global ?.
Saludos...

En el formato FacturaE en particular, si mal no recuerdo, dependiendo del campo hay que pasar una cantidad de decimales u otra. Por ejemplo los artículos deben de ir con 6 decimales, los importes totales con 2 decimales, etc. Con esto te quiero decir que no creo que haya forma de configurar los decimales de manera global, tendrás que montartelo dependiendo del campo.

Saludos

duilioisola 07-11-2017 08:51:58

Yo tengo estas tres funciones en mi implementación: FormatDateISO8601, FormatAmount y la auxiliar RoundAmount.
Dependiendo del dato y de la versión de Facturae que esté haciendo tomo una cantidad de decimales u otra.
Los nodos son siempre texto y cada nodo puede exigir un formato determinado (fecha, maxima longitud, tipo de caracteres, etc.)

Código Delphi [-]
function FormatDateISO8601(const d: TDateTime): string;
begin
  Result := FormatDateTime('yyyy"-"mm"-"dd', d);
end;

function RoundAmount(const d: double; decimales: integer): double;
begin
  Result := RoundTo(d, decimales * (-1));
end;

function FormatAmount(const d: double; decimales: integer): string;
var
  OldDecimalSeparator : char;
begin
  OldDecimalSeparator := DecimalSeparator; // note: not thread-safe
  DecimalSeparator := '.';
  Result := Format('%.' + IntToStr(decimales) + 'f', [RoundAmount(d, decimales)]); // round explicitly, makes sure that RoundAmount and FormatAmount behaves exactly the same
  DecimalSeparator := OldDecimalSeparator;
end;

[...]

  Decimales := 2;
  if (VersionFacturae = '3.2') then
     Decimales := 2
  else
  if (VersionFacturae = '3.2.1') then
     Decimales := 8;

[...]

     // Tipo impositivo. Téngase en cuenta que no siempre son porcentajes. La legislación del impuesto correspondiente permitirá identificar las unidades y dimensiones del tipo impositivo. Hasta ocho decimales.
     Nodo := NodoPadre.AddChild('TaxRate', DOMString);
     Nodo.Text := FormatAmount(TaxRate, Decimales);

[...]

     // Precio de la unidad de bien o servicio servido/prestado, en la moneda indicada en la Cabecera de la Factura. Siempre sin Impuestos. Hasta ocho decimales.
     Nodo := NodoPadre.AddChild('UnitPriceWithoutTax', DOMString);
     if (VersionFacturae = '3.2') then
        Nodo.Text := FormatAmount(UnitPriceWithoutTax, 6);
     if (VersionFacturae = '3.2.1') then
        Nodo.Text := FormatAmount(UnitPriceWithoutTax, 8);


La franja horaria es GMT +2. Ahora son las 22:00:31.

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