Hi,
The cost price fields works great when i'm logged
in english language on adaxa plugin. But the same doesn't happen when
i'm logged in portuguese (br) language. For example:
When
a I create a sales order / order line, the mask money works with a
decimal point ($ 240.53). We have a flag on language window on idempiere
called decimal point, if this flag are not ticked, the system use
a comma as decimal separator (R$ 240,53), this is the default format in
brazil and the conversion works fine on idempiere webui. but the follow
problem occurs in adaxa plugin:
When I create a
order line and select a product, first the price will be displayed as
"240.53". If I change the quantity, the application will reload the
fields on the form, and the price will be changed for "24053". Debbuging
the application, i get the following code responsable for the
conversion:
if (DisplayType.isNumeric(dt))
{
BigDecimal bd = null;
try
{
Number nn = null;
if (dt == DisplayType.Amount)
nn = wsc.amountFormat.parse(value);
else if (dt == DisplayType.Quantity)
nn = wsc.quantityFormat.parse(value);
else // DisplayType.CostPrice
nn = wsc.numberFormat.parse(value);
if (nn instanceof BigDecimal)
bd = (BigDecimal)nn;
else
bd = new BigDecimal(nn.toString());
}
catch (Exception e)
{
log.warning("BigDecimal: " + columnName + "=" + value + ERROR);
return ERROR;
}
log.fine("BigDecimal: " + columnName + "=" + value + " -> " + bd);
return bd;
}
As
we can see, the code gets the context of the application (including the
language selected on the login), and do the parse. If we track back
this line
nn = wsc.numberFormat.parse(value);
we will get a DecimalFormat.parse() method, and i can't figure out how the context can interfere on this method.
I
developed atemporary solution, the value will not be changed like
before (240.53 to 24053) but the user have to deal with the decimal
point, like in english ($ 240.25 for example)
BigDecimal bd = null;
try
{
Number nn = null;
if (dt == DisplayType.Amount)
nn = Double.parseDouble(value);
else if (dt == DisplayType.Quantity)
nn = Double.parseDouble(value);
else // DisplayType.CostPrice
nn = Double.parseDouble(value);
if (nn instanceof BigDecimal)
bd = (BigDecimal)nn;
else
bd = new BigDecimal(nn.toString());
}
catch (Exception e)
{
log.warning("BigDecimal: " + columnName + "=" + value + ERROR);
return ERROR;
}
log.fine("BigDecimal: " + columnName + "=" + value + " -> " + bd);
return bd;
But this is not good. I'm working on this problem for days and have no idea how solve this, any help will be greatful!