Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pricing engine sets the scale of price amounts to the respective precision #4376

Closed
metas-ts opened this issue Jul 13, 2018 · 3 comments
Closed

Comments

@metas-ts
Copy link
Member

Is this a bug or feature request?

Feature

What is the current behavior?

The pricing engine goes with the amounts with the respective pricing rules come up with.

Problem with that: we observe that some pricing rules (i suggest a discount related one) keeps adding meaningless zeroes (after the decimal point) to the price.
Also, when we have a pricing result with a particular precision, why not make sure that the price amount themselves have this precision too.

@metas-ts metas-ts self-assigned this Jul 13, 2018
metas-ts added a commit that referenced this issue Jul 13, 2018
Pricing engine sets the scale of price amounts to the respective precision #4376
metas-ts added a commit that referenced this issue Jul 16, 2018
#4376 - pricing engine updates the price amounts to match the precision
@metas-lc metas-lc self-assigned this Jul 16, 2018
@metas-lc
Copy link
Contributor

metas-lc commented Jul 16, 2018

IT (please check step 10)

  1. make sure your pricelist has price precision 2
  2. add a simple orderline, check priceactual, priceentered
    => both prices has precision 2 OK
  3. set discount like 1,0985. Check price actual
    => it was updated and precision is still 2 OK
  4. add a discount bigger than 100% (e.g. 234.2467). Check price actual
    => price is with minus, precision is still 2 OK
  5. set price entered to 2.13, discount to 50. Check price actual
    => 1.07 (precision 2) OK
  6. set price entered to 2.13, discount to 4.258. Check price actual
    => 2.04 (precision 2) OK
    .
  7. create a new discount schema, set break discount (like 3.8632). Set a payment term
  8. set this schema to your bpartner and create a new line
    => discount is set to the one from schema (3.8632)
    => priceactual has precision 2 OK
  9. select the line, actions: pricing conditions. Set a PaymentDiscount, save discount schema
    => priceactual has precision 2 (price didn't change) OK
  10. complete the order, create inout and invoice
  11. check priceactual in invoice
    => the one from HU is 1.000000000000 NOK
    (note: seems it's only happening with HU line. Changing discount in invoiceline on normal product doesn't affect the price precision. In my case, the HU in m_productprice had price 1.000000000000. When i tested with an HU with price 1.00 it was fine)
    .
  12. use the discount schema in a purchase bpartner as well (you cannot set a manual discount in po)
  13. create a new purchase order, add line, check priceactual
    => priceactual has precision 2 OK
    .
  14. go to pricelist and change price precision to 4 and to 0, then check price actual again after setting discounts
    => price has the corresponding precision: 4 or 0 OK

@metas-lc metas-lc removed their assignment Jul 17, 2018
metas-ts added a commit that referenced this issue Aug 1, 2018
Pricing engine sets the scale of price amounts to the respective precision #4376
@metas-lc metas-lc self-assigned this Aug 7, 2018
@metas-lc
Copy link
Contributor

metas-lc commented Aug 7, 2018

IT
Retested IT above.
=> 1-12 OK
(works the same, and price of HU has precision 2)
.
13. went to price list and set the price precision to 4.
created a new sales order, added a new line
=> "ArithmeticException: Rounding necessary" NOK
(is related with the discount schema!
have: Break Discount % 3.8632 and Skonto% 5.00)
rest works fine OK

"org.adempiere.exceptions.AdempiereException: ArithmeticException: Rounding necessary" 1:" at org.adempiere.exceptions.AdempiereException.wrapIfNeeded(AdempiereException.java:89)" 2:" at org.adempiere.exceptions.AdempiereException.wrapIfNeeded(AdempiereException.java:85)" 3:" at org.adempiere.ad.modelvalidator.AnnotatedModelInterceptor.appendAndLogHowtoDisableMessage(AnnotatedModelInterceptor.java:577)" 4:" at org.adempiere.ad.modelvalidator.AnnotatedModelInterceptor.executeNow(AnnotatedModelInterceptor.java:567)" 5:" at org.adempiere.ad.modelvalidator.AnnotatedModelInterceptor.execute(AnnotatedModelInterceptor.java:521)" 6 : " at org.adempiere.ad.modelvalidator.AnnotatedModelInterceptor.execute(AnnotatedModelInterceptor.java:464)" 7 : " at org.adempiere.ad.modelvalidator.AnnotatedModelInterceptor.onModelChange(AnnotatedModelInterceptor.java:442)" 8 : " at org.adempiere.ad.modelvalidator.ModelInterceptor2ModelValidatorWrapper.modelChange(ModelInterceptor2ModelValidatorWrapper.java:123)" 9 : " at org.compiere.model.ModelValidationEngine.invokeModelChangeMethod(ModelValidationEngine.java:970)" 10 : " at org.compiere.model.ModelValidationEngine.invokeModelChangeMethods(ModelValidationEngine.java:947)" 11 : " at org.compiere.model.ModelValidationEngine.fireModelChange0(ModelValidationEngine.java:829)" 12 : " at org.compiere.model.ModelValidationEngine.lambda$fireModelChange$0(ModelValidationEngine.java:784)" 13 : " at org.compiere.model.ModelValidationEngine$1.run(ModelValidationEngine.java:806)" 14 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$3.call(TrxCallableWrappers.java:145)" 15 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$3.call(TrxCallableWrappers.java:135)" 16 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call0(AbstractTrxManager.java:775)" 17 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:688)" 18 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.run(AbstractTrxManager.java:596)" 19 : " at org.compiere.model.ModelValidationEngine.executeInTrx(ModelValidationEngine.java:801)" 20 : " at org.compiere.model.ModelValidationEngine.fireModelChange(ModelValidationEngine.java:784)" 21 : " at org.compiere.model.PO.fireModelChange(PO.java:4846)" 22 : " at org.compiere.model.PO.save0(PO.java:2821)" 23 : " at org.compiere.model.PO.access$100(PO.java:139)" 24 : " at org.compiere.model.PO$1.run(PO.java:2729)" 25 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$3.call(TrxCallableWrappers.java:145)" 26 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$3.call(TrxCallableWrappers.java:135)" 27 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call0(AbstractTrxManager.java:775)" 28 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:688)" 29 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:589)" 30 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:520)" 31 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.run(AbstractTrxManager.java:506)" 32 : " at org.compiere.model.PO.saveEx(PO.java:2723)" 33 : " at org.adempiere.model.POWrapper.save(POWrapper.java:799)" 34 : " at org.adempiere.model.InterfaceWrapperHelper.save(InterfaceWrapperHelper.java:598)" 35 : " at de.metas.adempiere.callout.OrderFastInput.addOrderLine(OrderFastInput.java:315)" 36 : " at de.metas.ui.web.quickinput.orderline.OrderLineQuickInputProcessor.process(OrderLineQuickInputProcessor.java:85)" 37 : " at de.metas.ui.web.quickinput.QuickInput.complete(QuickInput.java:250)" 38 : " at de.metas.ui.web.quickinput.WindowQuickInputRestController.lambda$null$9(WindowQuickInputRestController.java:309)" 39 : " at de.metas.ui.web.quickinput.WindowQuickInputRestController.lambda$forQuickInputWritable$3(WindowQuickInputRestController.java:212)" 40 : " at de.metas.ui.web.window.model.DocumentCollection.forRootDocumentWritable(DocumentCollection.java:288)" 41 : " at de.metas.ui.web.quickinput.WindowQuickInputRestController.forQuickInputWritable(WindowQuickInputRestController.java:205)" 42 : " at de.metas.ui.web.quickinput.WindowQuickInputRestController.lambda$complete$10(WindowQuickInputRestController.java:308)" 43 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$4.call(TrxCallableWrappers.java:193)" 44 : " at org.adempiere.ad.trx.api.impl.TrxCallableWrappers$5.call(TrxCallableWrappers.java:222)" 45 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call0(AbstractTrxManager.java:775)" 46 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:688)" 47 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:589)" 48 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:520)" 49 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:498)" 50 : " at org.adempiere.ad.trx.api.impl.AbstractTrxManager.call(AbstractTrxManager.java:475)" 51 : " at de.metas.ui.web.window.controller.Execution$ExecutionBuilder.lambda$execute$0(Execution.java:194)" 52 : " at de.metas.ui.web.window.controller.Execution$ExecutionBuilder.lambda$execute$2(Execution.java:237)" 53 : " at de.metas.ui.web.window.controller.Execution$ExecutionBuilder.execute(Execution.java:260)" 54 : " at de.metas.ui.web.window.controller.Execution.callInNewExecution(Execution.java:88)" 55 : " at de.metas.ui.web.quickinput.WindowQuickInputRestController.complete(WindowQuickInputRestController.java:307)" 56 : " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)" 57 : " at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)" 58 : " at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)" 59 : " at java.lang.reflect.Method.invoke(Method.java:498)" 60 : " at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)" 61 : " at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)" 62 : " at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)" 63 : " at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)" 64 : " at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)" 65 : " at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)" 66 : " at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)" 67 : " at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)" 68 : " at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)" 69 : " at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)" 70 : " at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)" 71 : " at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)" 72 : " at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)" 73 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)" 74 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 75 : " at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)" 76 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 77 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 78 : " at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)" 79 : " at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)" 80 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 81 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 82 : " at de.metas.ui.web.config.WebConfig$1.doFilter(WebConfig.java:82)" 83 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 84 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 85 : " at de.metas.ui.web.config.ServletLoggingFilter.doFilter(ServletLoggingFilter.java:89)" 86 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 87 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 88 : " at de.metas.ui.web.config.CORSFilter.doFilter(CORSFilter.java:85)" 89 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 90 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 91 : " at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)" 92 : " at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)" 93 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 94 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 95 : " at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)" 96 : " at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)" 97 : " at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)" 98 : " at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)" 99 : " at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)"

@metas-lc metas-lc removed their assignment Aug 8, 2018
metas-ts added a commit that referenced this issue Aug 8, 2018
Pricing engine sets the scale of price amounts to the respective precision #4376
@metas-lc metas-lc self-assigned this Aug 8, 2018
@metas-lc
Copy link
Contributor

metas-lc commented Aug 8, 2018

IT
works now

  • prices have the right precisions
  • no errors
    OK

@metas-lc metas-lc closed this as completed Aug 8, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants